Witam,
Jestem tutaj nowy jak i zarówno początkujący "programista" ze mnie więc proszę o wyrozumiałość. Postaram się krótko opisać problem, ale prawdopodobnie mi się ta sztuka nie uda :)
Zacznę od tego iż mój program ma być Quizem. 10 pytań wyświetlanych losowo przy każdym uruchomieniu programu, do tego każde z tych pytań ma po 3 losowo wyświetlane odpowiedzi. A na koniec program wyświetla ilość zdobytych punktów oraz ocenę. To zrobiłem - prawdopodobnie w bardzo dziwny sposób, ale działa (przynajmniej na razie).
W czym tkwi problem, a właściwie problemy? Są 2 rzeczy. Z jedną sobie nie umiem poradzić, a na drugą nie mam na razie nawet pomysłu.
-
Program po wyświetleniu wyniku ma się zapytać użytkownika czy przerwać działanie czy powrócić do początku i wykonać quiz jeszcze raz (z nowym losowaniem).
-
Program przy podawaniu wyniku powinien wyświetlić pytania na które udzieliło się złych odpowiedzi, a obok nich pokazać odpowiedzi poprawne.
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <string>
using namespace std;
int punkty=0; // Zmienna globalna zliczajaca punkty
void pytanie_1 ()
{
cout << "\tIle wynosi 2+2 = ?" << endl;
int tab [4];
srand(time(NULL));
for (int i=1; i<=3; i++) // Petla ktora ma za zadanie "wymieszac" kolejnosc odpowiedzi
{
int numer_odp; // Dziala na tej samej zasadzie co petla w main-ie
powrot:
numer_odp = rand()%4;
for (int i=1; i<=3; i++)
{
if (numer_odp==tab[i] || numer_odp==0)
goto powrot;
}
tab [i] = numer_odp;
}
cout << " [1] ";
if (tab[1]==1)
cout << "4" << endl;
else if (tab[1]==2)
cout << "e=mc^2" << endl;
else if (tab[1]==3)
cout << "10000000" << endl;
cout << " [2] ";
if (tab[2]==1)
cout << "4" << endl;
else if (tab[2]==2)
cout << "e=mc^2" << endl;
else if (tab[2]==3)
cout << "10000000" << endl;
cout << " [3] ";
if (tab[3]==1)
cout << "4" << endl;
else if (tab[3]==2)
cout << "e=mc^2" << endl;
else if (tab[3]==3)
cout << "10000000" << endl;
int wybor;
cout << "Podaj odpowiedz: ";
cin >> wybor;
switch (wybor)
{
case 1:
if (tab[wybor]==1)
punkty=punkty+1;
break;
case 2:
if (tab[wybor]==1)
punkty=punkty+1;
break;
case 3:
if (tab[wybor]==1)
punkty=punkty+1;
break;
}
}
void pytanie_2 ()
{
cout << "\tChinska rzeka Huang he to inaczej..." << endl;
int tab [4];
srand(time(NULL));
for (int i=1; i<=3; i++)
{
int numer_odp;
powrot:
numer_odp = rand()%4;
for (int i=1; i<=3; i++)
{
if (numer_odp==tab[i] || numer_odp==0)
goto powrot;
}
tab [i] = numer_odp;
}
cout << " [1] ";
if (tab[1]==1)
cout << "Zolta Rzeka" << endl;
else if (tab[1]==2)
cout << "Tygrysia Rzeka" << endl;
else if (tab[1]==3)
cout << "Boska Rzeka" << endl;
cout << " [2] ";
if (tab[2]==1)
cout << "Zolta Rzeka" << endl;
else if (tab[2]==2)
cout << "Tygrysia Rzeka" << endl;
else if (tab[2]==3)
cout << "Boska Rzeka" << endl;
cout << " [3] ";
if (tab[3]==1)
cout << "Zolta Rzeka" << endl;
else if (tab[3]==2)
cout << "Tygrysia Rzeka" << endl;
else if (tab[3]==3)
cout << "Boska Rzeka" << endl;
int wybor;
cout << "Podaj odpowiedz: ";
cin >> wybor;
switch (wybor)
{
case 1:
if (tab[wybor]==1)
punkty=punkty+1;
break;
case 2:
if (tab[wybor]==1)
punkty=punkty+1;
break;
case 3:
if (tab[wybor]==1)
punkty=punkty+1;
break;
}
}
void pytanie_3 ()
{
cout << "\tGdzie miedzyinnymi poza Antarktyda mozna spotkac pingwiny?" << endl;
int tab [4];
srand(time(NULL));
for (int i=1; i<=3; i++)
{
int numer_odp;
powrot:
numer_odp = rand()%4;
for (int i=1; i<=3; i++)
{
if (numer_odp==tab[i] || numer_odp==0)
goto powrot;
}
tab [i] = numer_odp;
}
cout << " [1] ";
if (tab[1]==1)
cout << "Ameryka Poludniowa" << endl;
else if (tab[1]==2)
cout << "Grenlandia" << endl;
else if (tab[1]==3)
cout << "Kanada" << endl;
cout << " [2] ";
if (tab[2]==1)
cout << "Ameryka Poludniowa" << endl;
else if (tab[2]==2)
cout << "Grenlandia" << endl;
else if (tab[2]==3)
cout << "Kanada" << endl;
cout << " [3] ";
if (tab[3]==1)
cout << "Ameryka Poludniowa" << endl;
else if (tab[3]==2)
cout << "Grenlandia" << endl;
else if (tab[3]==3)
cout << "Kanada" << endl;
int wybor;
cout << "Podaj odpowiedz: ";
cin >> wybor;
switch (wybor)
{
case 1:
if (tab[wybor]==1)
punkty=punkty+1;
break;
case 2:
if (tab[wybor]==1)
punkty=punkty+1;
break;
case 3:
if (tab[wybor]==1)
punkty=punkty+1;
break;
}
}
void pytanie_4 ()
{
cout << "\tPrzez jakie angielskie miasto przebiega zerowy poludnik?" << endl;
int tab [4];
srand(time(NULL));
for (int i=1; i<=3; i++)
{
int numer_odp;
powrot:
numer_odp = rand()%4;
for (int i=1; i<=3; i++)
{
if (numer_odp==tab[i] || numer_odp==0)
goto powrot;
}
tab [i] = numer_odp;
}
cout << " [1] ";
if (tab[1]==1)
cout << "Greenwich" << endl;
else if (tab[1]==2)
cout << "Woking" << endl;
else if (tab[1]==3)
cout << "Gillingham" << endl;
cout << " [2] ";
if (tab[2]==1)
cout << "Greenwich" << endl;
else if (tab[2]==2)
cout << "Woking" << endl;
else if (tab[2]==3)
cout << "Gillingham" << endl;
cout << " [3] ";
if (tab[3]==1)
cout << "Greenwich" << endl;
else if (tab[3]==2)
cout << "Woking" << endl;
else if (tab[3]==3)
cout << "Gillingham" << endl;
int wybor;
cout << "Podaj odpowiedz: ";
cin >> wybor;
switch (wybor)
{
case 1:
if (tab[wybor]==1)
punkty=punkty+1;
break;
case 2:
if (tab[wybor]==1)
punkty=punkty+1;
break;
case 3:
if (tab[wybor]==1)
punkty=punkty+1;
break;
}
}
void pytanie_5 ()
{
cout << "\tStolica Australii to..." << endl;
int tab [4];
srand(time(NULL));
for (int i=1; i<=3; i++)
{
int numer_odp;
powrot:
numer_odp = rand()%4;
for (int i=1; i<=3; i++)
{
if (numer_odp==tab[i] || numer_odp==0)
goto powrot;
}
tab [i] = numer_odp;
}
cout << " [1] ";
if (tab[1]==1)
cout << "Canberra" << endl;
else if (tab[1]==2)
cout << "Sydney" << endl;
else if (tab[1]==3)
cout << "Melbourne" << endl;
cout << " [2] ";
if (tab[2]==1)
cout << "Canberra" << endl;
else if (tab[2]==2)
cout << "Sydney" << endl;
else if (tab[2]==3)
cout << "Melbourne" << endl;
cout << " [3] ";
if (tab[3]==1)
cout << "Canberra" << endl;
else if (tab[3]==2)
cout << "Sydney" << endl;
else if (tab[3]==3)
cout << "Melbourne" << endl;
int wybor;
cout << "Podaj odpowiedz: ";
cin >> wybor;
switch (wybor)
{
case 1:
if (tab[wybor]==1)
punkty=punkty+1;
break;
case 2:
if (tab[wybor]==1)
punkty=punkty+1;
break;
case 3:
if (tab[wybor]==1)
punkty=punkty+1;
break;
}
}
void pytanie_6 ()
{
cout << "\tOd ktorego zwierzecia pochodzi nazwa Wysp Kanaryjskich (hiszp. Islas Canarias)?" << endl;
int tab [4];
srand(time(NULL));
for (int i=1; i<=3; i++)
{
int numer_odp;
powrot:
numer_odp = rand()%4;
for (int i=1; i<=3; i++)
{
if (numer_odp==tab[i] || numer_odp==0)
goto powrot;
}
tab [i] = numer_odp;
}
cout << " [1] ";
if (tab[1]==1)
cout << "Od psa" << endl;
else if (tab[1]==2)
cout << "Od kanarka" << endl;
else if (tab[1]==3)
cout << "Od szczura" << endl;
cout << " [2] ";
if (tab[2]==1)
cout << "Od psa" << endl;
else if (tab[2]==2)
cout << "Od kanarka" << endl;
else if (tab[2]==3)
cout << "Od szczura" << endl;
cout << " [3] ";
if (tab[3]==1)
cout << "Od psa" << endl;
else if (tab[3]==2)
cout << "Od kanarka" << endl;
else if (tab[3]==3)
cout << "Od szczura" << endl;
int wybor;
cout << "Podaj odpowiedz: ";
cin >> wybor;
switch (wybor)
{
case 1:
if (tab[wybor]==1)
punkty=punkty+1;
break;
case 2:
if (tab[wybor]==1)
punkty=punkty+1;
break;
case 3:
if (tab[wybor]==1)
punkty=punkty+1;
break;
}
}
void pytanie_7 ()
{
cout << "\t1024 bajty to..." << endl;
int tab [4];
srand(time(NULL));
for (int i=1; i<=3; i++)
{
int numer_odp;
powrot:
numer_odp = rand()%4;
for (int i=1; i<=3; i++)
{
if (numer_odp==tab[i] || numer_odp==0)
goto powrot;
}
tab [i] = numer_odp;
}
cout << " [1] ";
if (tab[1]==1)
cout << "Mebibajt" << endl;
else if (tab[1]==2)
cout << "Megabajt" << endl;
else if (tab[1]==3)
cout << "Mibibajt" << endl;
cout << " [2] ";
if (tab[2]==1)
cout << "Mebibajt" << endl;
else if (tab[2]==2)
cout << "Megabajt" << endl;
else if (tab[2]==3)
cout << "Mibibajt" << endl;
cout << " [3] ";
if (tab[3]==1)
cout << "Mebibajt" << endl;
else if (tab[3]==2)
cout << "Megabajt" << endl;
else if (tab[3]==3)
cout << "Mibibajt" << endl;
int wybor;
cout << "Podaj odpowiedz: ";
cin >> wybor;
switch (wybor)
{
case 1:
if (tab[wybor]==1)
punkty=punkty+1;
break;
case 2:
if (tab[wybor]==1)
punkty=punkty+1;
break;
case 3:
if (tab[wybor]==1)
punkty=punkty+1;
break;
}
}
void pytanie_8 ()
{
cout << "\t10^600 to..." << endl;
int tab [4];
srand(time(NULL));
for (int i=1; i<=3; i++)
{
int numer_odp;
powrot:
numer_odp = rand()%4;
for (int i=1; i<=3; i++)
{
if (numer_odp==tab[i] || numer_odp==0)
goto powrot;
}
tab [i] = numer_odp;
}
cout << " [1] ";
if (tab[1]==1)
cout << "Centylion" << endl;
else if (tab[1]==2)
cout << "Decylion" << endl;
else if (tab[1]==3)
cout << "Nonylion" << endl;
cout << " [2] ";
if (tab[2]==1)
cout << "Centylion" << endl;
else if (tab[2]==2)
cout << "Decylion" << endl;
else if (tab[2]==3)
cout << "Nonylion" << endl;
cout << " [3] ";
if (tab[3]==1)
cout << "Centylion" << endl;
else if (tab[3]==2)
cout << "Decylion" << endl;
else if (tab[3]==3)
cout << "Nonylion" << endl;
int wybor;
cout << "Podaj odpowiedz: ";
cin >> wybor;
switch (wybor)
{
case 1:
if (tab[wybor]==1)
punkty=punkty+1;
break;
case 2:
if (tab[wybor]==1)
punkty=punkty+1;
break;
case 3:
if (tab[wybor]==1)
punkty=punkty+1;
break;
}
}
void pytanie_9 ()
{
cout << "\tOd ktorego roku internet w Poslce jest oficjalnie dostepny?" << endl;
int tab [4];
srand(time(NULL));
for (int i=1; i<=3; i++)
{
int numer_odp;
powrot:
numer_odp = rand()%4;
for (int i=1; i<=3; i++)
{
if (numer_odp==tab[i] || numer_odp==0)
goto powrot;
}
tab [i] = numer_odp;
}
cout << " [1] ";
if (tab[1]==1)
cout << "1991" << endl;
else if (tab[1]==2)
cout << "1995" << endl;
else if (tab[1]==3)
cout << "1987" << endl;
cout << " [2] ";
if (tab[2]==1)
cout << "1991" << endl;
else if (tab[2]==2)
cout << "1995" << endl;
else if (tab[2]==3)
cout << "1987" << endl;
cout << " [3] ";
if (tab[3]==1)
cout << "1991" << endl;
else if (tab[3]==2)
cout << "1995" << endl;
else if (tab[3]==3)
cout << "1987" << endl;
int wybor;
cout << "Podaj odpowiedz: ";
cin >> wybor;
switch (wybor)
{
case 1:
if (tab[wybor]==1)
punkty=punkty+1;
break;
case 2:
if (tab[wybor]==1)
punkty=punkty+1;
break;
case 3:
if (tab[wybor]==1)
punkty=punkty+1;
break;
}
}
void pytanie_10 ()
{
cout << "\tJak nazywa sie najwiekszy pod wzgledem powierzchni gwiazdozbior na niebie?" << endl;
int tab [4];
srand(time(NULL));
for (int i=1; i<=3; i++)
{
int numer_odp;
powrot:
numer_odp = rand()%4;
for (int i=1; i<=3; i++)
{
if (numer_odp==tab[i] || numer_odp==0)
goto powrot;
}
tab [i] = numer_odp;
}
cout << " [1] ";
if (tab[1]==1)
cout << "Hydra" << endl;
else if (tab[1]==2)
cout << "Wielka Niedzwiedzica" << endl;
else if (tab[1]==3)
cout << "Panna" << endl;
cout << " [2] ";
if (tab[2]==1)
cout << "Hydra" << endl;
else if (tab[2]==2)
cout << "Wielka Niedzwiedzica" << endl;
else if (tab[2]==3)
cout << "Panna" << endl;
cout << " [3] ";
if (tab[3]==1)
cout << "Hydra" << endl;
else if (tab[3]==2)
cout << "Wielka Niedzwiedzica" << endl;
else if (tab[3]==3)
cout << "Panna" << endl;
int wybor;
cout << "Podaj odpowiedz: ";
cin >> wybor;
switch (wybor)
{
case 1:
if (tab[wybor]==1)
punkty=punkty+1;
break;
case 2:
if (tab[wybor]==1)
punkty=punkty+1;
break;
case 3:
if (tab[wybor]==1)
punkty=punkty+1;
break;
}
}
/************************************************************************************************************************/
/* */
/* MAIN */
/* */
/************************************************************************************************************************/
int main ()
{
poczatek:
cout << "Witaj! Przed Toba 10 niezwykle ciezkich, wymagajacych i zakrawajacych o ekspercka wiedze pytan." << endl;
cout << "Mam nadzieje ze jestes na to gotowy!" << endl << endl;
cout << "Prosze, podaj swoje imie: ";
string imie[2];
cin >> imie[0];
cout << "Oraz nazwisko: ";
cin >> imie [1];
cout << endl;
int tab [10]; // Utworzenie tablicy 10 elementowej
srand(time(NULL)); // Losowanie w czasie rzeczywistym, dzieki temu kazde uruchomienie programu daje nowe losowanie (liczby pseudolosowe)
for (int i=0; i<10; i++) // Petla dzieki ktorej do kazdego elementu z tablicy zostana dopisane losowo wybrane cyfry
{
int numer_pytania; // Zmienna ktora ustala kolejnosc pytan
jeszczeraz:
numer_pytania = rand()%10; // Losowanie liczb. Od 0 do 9
for (int i=0; i<10; i++)
{
if (numer_pytania==tab[i])
goto jeszczeraz; // Ponowienie losowania gdy cyfra znajduje sie juz w tablicy
}
tab [i] = numer_pytania; // Przypisanie cyfry do i-tej komorki w tablicy
}
for (int i=0; i<10; i++) // Wywolywanie funkcji zawierajacych pytania
{
if (tab [i] == 0)
pytanie_1();
else if (tab [i] == 1)
pytanie_2();
else if (tab [i] == 2)
pytanie_3();
else if (tab [i] == 3)
pytanie_4();
else if (tab [i] == 4)
pytanie_5();
else if (tab [i] == 5)
pytanie_6();
else if (tab [i] == 6)
pytanie_7();
else if (tab [i] == 7)
pytanie_8();
else if (tab [i] == 8)
pytanie_9();
else if (tab [i] == 9)
pytanie_10();
}
if (punkty <= 4)
{
cout << imie [0] << " " << imie [1] << " - Uzyskales(as): " << punkty << "pkt." << endl;
cout << "Twoja ocena to 2." << endl;
cout << "Postaraj sie lepiej nastepnym razem!" << endl;
}
else if (punkty==5 || punkty ==6)
{
cout << imie [0] << " " << imie [1] << " - Uzyskales(as): " << punkty << "pkt." << endl;
cout << "Twoja ocena to 3." << endl;
cout << "Zawsze mogloby byc lepiej!" << endl;
}
else if (punkty==7 || punkty ==8)
{
cout << imie [0] << " " << imie [1] << " - Uzyskales(as): " << punkty << "pkt." << endl;
cout << "Twoja ocena to 4." << endl;
cout << "Dobry wynik!" << endl;
}
else if (punkty==9)
{
cout << imie [0] << " " << imie [1] << " - Uzyskales(as): " << punkty << "pkt." << endl;
cout << "Twoja ocena to 5." << endl;
cout << "Bardzo dobry wynik!" << endl;
}
else if (punkty==10)
{
cout << imie [0] << " " << imie [1] << " - Uzyskales(as): " << punkty << "pkt." << endl;
cout << "Twoja ocena to 5." << endl;
cout << "Gratuluje! Zdobyles(as) maksymalna ilosc punktow." << endl;
}
cout << endl << "Co chcesz teraz zrobic?" << endl;
short opcja;
cout << "[1] Wykonaj Quiz ponownie." << endl;
cout << "[2] Zakoncz program." << endl;
cin >> opcja;
switch (opcja)
{
case 1:
if (opcja == 1)
goto poczatek;
case 2:
if (opcja == 2)
break;
}
system ("cls");
cout << "Do zobaczenia innym razem!" << endl;
system ("PAUSE");
return 0;
}
Jak widać próbowałem już coś w tym temacie zdziałać za pomocą znienawidzonego przez wszystkich goto. Niby działa, ale nie do końca. :) Kiedy jest wykonywane goto, program wraca do miejsca gdzie jest poczatek:. Wszystkie cout'y są wyświetlone na ekranie, użytkownik wprowadza imię, nazwisko i... w tym momencie program się zacina i nie idzie dalej. Domyślam się, że może to być problem związany z losowaniem liczb? Tylko nie bardzo wiem jak sobie z tym poradzić i tutaj liczę na Wasze wskazówki. Plus, proszę wziąć pod uwagę moje nie-zaawansowanie w programowaniu. ;)