Skocz do zawartości

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Mystery Of Silence

Wysypywanie się programu

Rekomendowane odpowiedzi

Witam :) Próbuję zaprogramować taki mały mini quiz z użyciem osobnego pliku tekstowego zapisanego w notatniku. Po kolei zapisane pytania z odpowiedziami oraz odpowiedzią poprawną, a program sczytuje getlinem linia po linii. W skrócie mniej więcej coś takiego. Ale chciałam go trochę udoskonalić dodając jakieś małe zmiany. Jedną z nich było utworzenie dwóch quizów na dwa rożne tematy w dwóch osobnych plikach tekstowych. Użytkownik na początku uzyskuje możliwość wyboru jednego z nich. I to również działa bez zarzutów. Problem natomiast pojawił się, gdy chciałam umożliwić powrót do wyboru kategorii po zakończonym quizie. Program owszem wraca do menu, ale gdy próbuję wtedy już ponownie wybrać kategorię, pojawia się błąd i program się wyłącza. Nie mam pojęcia, co może to powodować i dlaczego ten schemat nie działa tak jak powinien. Dodaję, że dopiero się uczę programowania, więc moja wiedza póki co jest raczej znikoma ;)

 

Załączam niżej kod ;)

 

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <stdio.h>
#include <conio.h>
#include <windows.h>

using namespace std;

int main(){
string temat, pyt[6], odpA[6], odpB[6], odpC[6], odpD[6], linia;
char poprawna[6];
char wybor;
char wybor2;
char wybor3;
int nrLinii=1;
int nrPyt = 0;
int punkty = 0;
string nick;

cout<< "Witaj w naszym quizie! " <<endl<<"Na poczatek podaj swoj nick: "<<endl;
cin>> nick;
system("cls");

do{


cout<<"Wybierz kategorie (klikajac na klawiaturze 1 badz 2): "<<endl<<endl;
fstream plik;
cout<<"1. Historia Polski"<<endl<<"2. Kosmos"<<endl<<endl;
wybor2=getch();

switch(wybor2)
{
case '1' : plik.open("Historia.txt", ios::in);
		if(plik.good()==false)
			{ cout<<"Blad programu"<<endl;
			exit(0);
			}		
	break;
case '2' : 	plik.open("Kosmos.txt", ios::in);
		if(plik.good()==false)
			{ cout<<"Blad programu"<<endl;
			exit(0);
			}		
	break;		

default: cout<< "Nie ma takiej opcji w menu! Program zostanie wylaczony!"<<endl;
		getchar();getchar();
		exit(0);
			break;		
}

system("cls");

while (getline(plik, linia))
{
switch (nrLinii)
{
	case 1: temat=linia; 				break;
	case 2: pyt[nrPyt]=linia; 			break;
	case 3: odpA[nrPyt]= linia;			break;
	case 4: odpB[nrPyt]= linia; 		break;
	case 5: odpC[nrPyt]=linia; 			break;
	case 6: odpD[nrPyt]= linia; 		break;
	case 7: poprawna[nrPyt]=linia[0];	break;
	}	

	if(nrLinii==7)
	{
		nrLinii=1;
		nrPyt++;	
	}
	nrLinii++;
}

cout<< "Masz przed soba 6 pytan." <<endl<< "Pamietaj, aby na pytania NIE odpowiadac wielkimi literami!!! Powodzenia! " << endl<<endl;
system("cls");

for(int i=0; i<=5; i++)
{
cout<<endl;
cout<< i+1 << " pytanie: "<<pyt[i]<<endl;
cout<< "A. "<< odpA[i]<<endl;
cout<< "B. "<< odpB[i]<<endl;
cout<< "C. "<< odpC[i]<<endl;
cout<< "D. "<< odpD[i]<<endl;
cout<<endl;
wybor=getch();


if(wybor==poprawna[i])
{	
	cout<<"Brawo! Zdobywasz punkt !"<<"\a"<<endl<<endl;
	punkty++;
		Sleep(990);	
}

else if(wybor!='a'&& wybor!='b'&& wybor!='c'&& wybor!='d')
{
	cout<<"Uzyles/as zlego znaku z klawiatury. Sprobuj jeszcze raz wybierajac jeden sposrod A,B,C badz D"<<endl<<endl;
	i--;
	system("pause");
}

else 
	{
	cout<<"Niestety zle!  Poprawna odpowiedz to: "<< "\a"<<poprawna[i]<<endl<<endl;	
		Sleep(990);	
	}



//system("pause");
system("cls");
}
cout<<endl;
cout<<nick<<", gratulacje! Ukonczyles/as quiz! " <<endl<< "Ilosc zdobytych punktow: "<< punkty<<"/6"<<endl<<endl;

plik.close();


cout<<"Co teraz? "<< endl;
cout<<"1. Powrot do menu"<<endl<<"2. Zakoncz program"<<endl;
wybor3=getch();
system("cls");


} while (wybor3=='1');

if (wybor3 =='2')
exit(0);



return 0;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Z tego co widzę to nie zamykasz pliku po powrocie do menu. Zamiast wybór == 'a' lepiej używaj enumow oraz zamiast tablic jakiś klas typu kontener np. vector.

Spróbuj z korzystać z opcji debugowania w IDE(Visual studio ma dobry i łatwy w obsłudze debug) w celu odnalezienia błędu, możesz przejść przez program linijka po linijce co ułatwia znalezienie błędu :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

zacznij od sformatowania kodu bo tego nie chce się nawet czytać

miło jakbyś też wywalił nieprzenośne nagłówki

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Warto podawać jakie błędy są zwracane i nauczyć się co oznaczają.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

podpowiedź:

 

    int nrLinii=1;
   int nrPyt = 0;

 

a teraz zobacz jakie wartości przyjmują te indeksy w kolejnej iteracji quizu

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

  • Tematy

  • Odpowiedzi

    • Ale mi ciśnienie podniósł durny babol  W pewnym zadaniu po odszukaniu części należy wykonać prototyp z technologią z zamierzchłych czasów ale nie mogłem zrobić bo NPC z zadania stanął mi przy warsztacie i musiałem fast-travelem iść gdzie indziej sobie uklepać Co za głupota cały stół obleciałem to się nie da bo baran tak mi się ustawił... nosz k....   
    • Przejściowo można, jako obniżenie emisji, ale docelowo do osiągnięcia net zero to już nie. Trzeba będzie wynaleźć jakieś tanie i powszechnie technologie magazynowania albo wychwytu,
    • Karta 3070 8GB nie ma 6GB. Chłodzenie średnie, ale jak zrobisz UV procesora to podejrzewam, że wystarczy do utrzymania przyzwoitych warunków pracy.
    • DG2 to kopia jedynki, w jedynce mam więcej przegrane niż w DG2, i widzę, że to ładniejsza" kopia, plus znerfione kilka elementów z jedynki, ale nie wiem zna stanu gry na premierę, czy np eternal ferrystone było, czy wprowadzili z czasem, jest też normalna jego wersja, w porównaniu do dwójki, w jedynce dawaj nieograniczony teleport do miejsca gdzie odkryliśmy, lub postawiliśmy portal- ten portal w dwójce jest w mikropłatnościach, w jedynce mam w cholerę kamieni teleportacji do przywołania pionków, w dwójce, widzę, że w tym samym czasie co w jedynce zdobywam go dużo wolniej i mniej, ale obstawiam, że podnieśli poziom trudności plus dodali opcję kupienia tego w mikropłatnościach, stąd jest go bardzo mało. Jak się podoba jedynka to i dwójka się spodoba, mi się podoba, jest dużo bardziej urozmaicona, mimo tego cyrku z DLC, ale one nie muszę wpływać na naszą grę, gra jest tak stworzona, jedynce było to samo, tylko jak piszę, pewne elementy są znerfione i ograniczone, zapewne pod próbę wciskania graczowi mikropłatności, zapewne to trafne moje domysły i nie tylko. Gra ma kilka mankamentów, jak prawie w kółko walczymy z tymi samymi, w jedynce to samo, walki, gobliny, bandyci, o cyklop, troll i koniec, czasem harpie, w dwójce to samo, plus kilka nowych zagrożeń, ale w dwójce jestem na początku przygody. Nie wiem co Kiszak opowiada, bo nie chcę sobie spoilerować, ale podglądałem jego wcześniejsze wywody z gry, i cóż ciężko się nie zgodzić z kilkoma rzeczami, ale były one już podawane w temacie.
    • I dobrze bo ER jest świetny.Podziwiam skila i wytrwałość ludzi pokonujących takich bossów bez lvl postaci
  • Aktywni użytkownicy

×
×
  • Dodaj nową pozycję...