Test przedmiotowy

Problemy i ich rozwiązania w C++.
a_dresik
Początkujący
Początkujący
Posty: 7
Dołączył(a): poniedziałek, 24 stycznia 2011, 23:43

Test przedmiotowy

Post przez a_dresik »

Witam
Dostałem za zadanie (na studiach) napisanie testu przedmiotowego:
Zrobiłem dosyć prostacką metodą, oprócz struktury ucznia od razu zacząłem ustawiać pytania,
jednak myślę, że mój wymagający profesor nie będzie zadowolony z takiego rozwiązania dlatego prosiłbym o pomoc:
- jak zrobić np. kilka zestawów pytań wczytywanych z plików lub jakieś alternatywne rozwiązanie takie, żeby nie trzeba było zmieniać całego programu, ewentualnie może być tylko losowanie dostępnych pytań
- chciałbym też aby w teście odliczał czas 10 minut - jak to zrobić?
- i może dało by się zrezygnować z tego goto, które widać w załączeniu? bo nie bardzo wiem jakie inne rozwiązanie mógłbym zastosować - za mało jeszcze ćwiczyłem programowanie i nie mi nie przychodzi do głowy :D

Posiadam kurs programowania w C++ więc, może być odp. w postaci która to lekcja ( ja mam chyba starszą wersję bo jest to zwykłe 46 lekcji bez programowania obiektowego)
Załączam aktualny skrypt pytania jaki zastosowałem:

Code: Zaznacz cały

pyt_2:
cout<<"pytanie XXXXXXXXX? \n";
cout<<"A. yyyyyyyyyyyyyyyyyy\n";
cout<<"B. zzzzzzzzzzzzzzzzz\n";
cout<<"C. wwwwwwwwwww\n";
cout<<"D.aaaaaaaaaaa\n";
cin>>u.odp;//wczytuję odpowiedź do programu
if (u.odp=='d'){u.punkty++;}     
    else if (u.odp=='D'){u.punkty++;}// odpowiedź prawidłowa
    else if (u.odp=='a'){}
    else if (u.odp=='b'){}
    else if (u.odp=='c'){}
    else if (u.odp=='A'){}
    else if (u.odp=='B'){}
    else if (u.odp=='C'){}//odpowiedzi nieprwidłowe
    else
    {
    cout<<"Niedozwolony znak wyboru\n\n";
    goto pyt_2; 
    // błąd wyboru użytkownika
     }

/* zastosowałem takie warunki odpowiedzi ponieważ gdy stosowałem operator || (lub) to program głupiał i nawet negatywne odpowiedzi zaliczał dlatego trochę napisałem się ale każde poczynienie użytkownika chyba przewidziałem :) */
Bardzo proszę Was o w miarę szybką pomoc.
pozdrawiam
a dresik to ja mam na [...] no ! :D
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Test przedmiotowy

Post przez Morfidon »

Witam,

Video kurs C++ z 46 lekcjami jest to nowe wydanie i posiada omówioną całą obiektowość na drugiej płycie poczynając od lekcji 33.
jak zrobić np. kilka zestawów pytań wczytywanych z plików lub jakieś alternatywne rozwiązanie takie, żeby nie trzeba było zmieniać całego programu, ewentualnie może być tylko losowanie dostępnych pytań
Zrób to bez pliku. Zrób tablicę trzywymiarową, która w pierwszym wymiarze posiada pytanie, a w drugim wymiarze zestaw pytań, a w 3 niech pamięta gdzie jest prawidłowa odpowiedź (można zrobić dwuwymiarową tablicę, + jednowymiarową gdzie pamięta prawidłową odpowiedź). Następnie stwórz algorytm, który zmieni kolejność odpowiedzi, zapamiętując w miejscu pamiętania prawidłowej odpowiedzi, gdzie jest prawidłowa.

Oglądnij Lekcja 15 - Walidacja danych - 21 min i 1 s, unikniesz goto i zrobisz walidację danych dużo lepiej. Ogólnie oglądnij najpierw cały kurs (przynajmniej pierwszą płytę), a później dopiero zabierz się za ten program, bo bez tych wszystkich umiejętności, które przekazywane są w kursie możesz mieć z tym problem.

Pozdrawiam serdecznie,

Arkadiusz Włodarczyk
a_dresik
Początkujący
Początkujący
Posty: 7
Dołączył(a): poniedziałek, 24 stycznia 2011, 23:43

Re: Test przedmiotowy

Post przez a_dresik »

dziękuję Panu za odpowiedź w temacie, bardzo fajne są te lekcje :)
Ogólnie oglądnij najpierw cały kurs (przynajmniej pierwszą płytę)
Właśnie niestety ostatnio nie bardzo miałem czas na programowanie bo inne przedmioty trzeba było się pouczyć...
Chciałem się zapytać odnośnie tablic, bo mój uparty profesor nie lubi ich, dla niektórych nawet nie chciał sprawdzać programu jak widział tablice :shock:
nie wiem dlaczego, plotka jest taka, że dlatego bo tablice zajmują pamięć operacyjną (-przecież dziś mamy jej pod dostatkiem) niektórzy próbowali z plikiem tymczasowym ale sam nie wiem.
I jeszcze jedno mam pytanie jak zrobić żeby wyniki testu zapisywał? do pliku bo dopiero dowiedziałem się o tym wymogu a całość mam zrobić na czwartek :D
i czy da się zrobić żeby program odliczał czas w czasie testu? np. użytkownik ma 10 minut na wypełnienie?

pozdrawiam
a dresik to ja mam na [...] no ! :D
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Test przedmiotowy

Post przez Morfidon »

Niestety sam zapis do pliku jest omówiony w video kursie C++ - obsługa plików, a jeśli miałbym Ci to omawiać wszystko co jest w kursie tutaj, to zajęłoby to za dużo czasu.

Program bez tablic, nie będzie taki elastyczny i będzie wykonywał się dłużej i pewnie niektóre funkcjonalności będą jeszcze trudniejsze do napisania. Im więcej użyjesz pamięci operacyjnej tym najczęściej programy będą wykonywały się w późniejszym okresie czasu szybciej bo nie będziesz musiał wykonywać tak wielu operacji (wystarczy, że odwołasz się do pamięci) - w końcu po to ona jest. W odwrotnej sytuacji: im mniej użyjesz pamięci operacyjnej, tym najczęściej będziesz musiał wykonać więcej operacji na bieżąco, przez co program będzie wymagał non stop dużo zasobów procesora przez co będzie trochę wolniejszy. Zwróć uwagę oczywiście na to że używam słowa "najczęściej".
i czy da się zrobić żeby program odliczał czas w czasie testu? np. użytkownik ma 10 minut na wypełnienie?
Niby możesz to zrobić, aczkolwiek problem polega na tym, że z tego co mi wiadomo, nie ma możliwości odświeżenia tylko kawałka "tekstu" w konsoli, przez co musisz wyczyścić całą konsolę: system("cls"); i wypisać całą zawartość testu + czas, który zmieniłby się o 1s, co pewnie domyślasz się jest mało optymalne i spowodowałoby to "migotanie". Musiałbyś użyć jakieś graficznej biblioteki. Można by w sumie zrobić to mniej więcej tak:

Code: Zaznacz cały

#include <iostream>
#include <windows.h>

using namespace std;

void gotoxy(int x, int y)
{
   COORD coord;
   coord.X = x;
   coord.Y = y;
   SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

int main()
{
    
    cout << "alslala \n";
    cout << "ta linia zniknie \n";
    gotoxy(0,1);
    system("pause");
    return 0;
}
Tylko tam gdzie jest linia, która "znika" trzeba by asynchronicznie aktualizować czas.
a_dresik
Początkujący
Początkujący
Posty: 7
Dołączył(a): poniedziałek, 24 stycznia 2011, 23:43

Re: Test przedmiotowy

Post przez a_dresik »

a mam jeszcze pytanka, a właściwie prośbę, bo tablice jeszcze mam słabo opanowane - mógłby Pan dać przykład jak powinna wyglądać taka tablica z pytaniami i odpowiedziami? bardzo bym prosił...
i jak mogę zapisać potem z tych tablic wyniki do plików?

podrawiam
a dresik to ja mam na [...] no ! :D
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Test przedmiotowy

Post przez Morfidon »

Hmm najprościej i najczytelniej będzie jednak tak:

Code: Zaznacz cały

    string questions[10];
    string answers[10][4];
    int position_of_right_answer[10] = {0}; //tablica przyjmuje cztery wartości 0,1,2,3 i symbolizuje gdzie znajduje się prawidłowa odpowiedź w tablicy answers
    
    questions[0] = "co to jest google?";
    answers[0][0] = "okulary (moja babcia ma takie)";
    answers[0][1] = "wyszukiwarka";
    answers[0][2] = "przeglądarka";
    answers[0][3] = "nie wiem, jestem jaskiniowcem";    
    
    position_of_right_answer[0] = 1;
Co do zapisu, wszystko jest w kursie C++ obsługa plików.
a_dresik
Początkujący
Początkujący
Posty: 7
Dołączył(a): poniedziałek, 24 stycznia 2011, 23:43

Re: Test przedmiotowy

Post przez a_dresik »

dziękuję bardzo za pomoc myślę, że już sobie poradzę :d
sedecznie pozdrawiam
a dresik to ja mam na [...] no ! :D
a_dresik
Początkujący
Początkujący
Posty: 7
Dołączył(a): poniedziałek, 24 stycznia 2011, 23:43

Re: Test przedmiotowy

Post przez a_dresik »

przepraszam za post pod postem ale nie działa, a muszę oddać na jutro :!: bardzo pilnie, zrezygnowałem z tablic jednak bowiem niektórzy nie zaliczali ćwiczeń jak się wkurzył profesor dlatego zrobiłem tak jak było cout i if, dałem funkcję kilku zestawów pytań, Pana lekcja z walidacją danych bardzo pomogła, ale coś mi nie wychodzi. ;(
Zrobiłem coś takiego:

Code: Zaznacz cały

do
{
cout<<"Pytanieaaaaaaaaaaaaa?\n";
cout<<"A.ssssssss zle\n";
cout<<"B. ddddddzle\n";
cout<<"C. xxxxxxzle\n";
cout<<"D.zzzzzzz dobra odpowiedz\n";
cin>>u.odp;//wczytuję odpowiedź do programu
if (u.odp=='d'){u.punkty++;}     
    else if (u.odp=='D'){u.punkty++;}// odpowiedź prawidłowa
    else if (u.odp=='a'){}
    else if (u.odp=='b'){}
    else if (u.odp=='c'){}
    else if (u.odp=='A'){}
    else if (u.odp=='B'){}
    else if (u.odp=='C'){}//odpowiedzi nieprwidłowe
   }while (u.odp!='a' || u.odp!='b' || u.odp!='c' || u.odp!='d' || u.odp!='A' || u.odp!='B' || u.odp!='C' || u.odp!='D');
    // błąd wyboru użytkownika
coś źle zrobiłem z pętlą tylko nie mam pojęcia co - program przy wpisaniu dowolnej litery, nawet prawidłowej powtarza wkółko to samo pytanie i nie przechodzi dalej, "można się wyżyć ;D " ale nie chciałbym tego robić w ten sposób ;)

błagam o jak najszybszą pomoc
a dresik to ja mam na [...] no ! :D
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Test przedmiotowy

Post przez Morfidon »

Alternatywa jest prawdziwa gdy przynajmniej jeden argument jest prawdziwy. Oglądnij Lekcja 6.3 - Operatory logiczne - 9 min i 3 s
a_dresik
Początkujący
Początkujący
Posty: 7
Dołączył(a): poniedziałek, 24 stycznia 2011, 23:43

Re: Test przedmiotowy

Post przez a_dresik »

tak, tak pamiętam, to źle jest? bo to przecież negacja A, b itd. Może już mi się coś miesza....
warunek się spełni gdy odpowiedź nie będzie równa ani a ani b itd. więc pętla powinna się zakończyć przy odp. a b c lub d bo warunek nie jest spełniony
a dresik to ja mam na [...] no ! :D
Post Reply