• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wybór automatyczny bez entera w przypadku quizu

Object Storage Arubacloud
0 głosów
735 wizyt
pytanie zadane 27 sierpnia 2015 w C i C++ przez mystery.of.silence Nowicjusz (230 p.)

Witam :) Jestem na etapie odcinka 7 z programowania w c++ o zapisie i odczycie z pliku źródłowego. Wykonalam włsny quiz na wzór podanego, ale chciałam go troche udoskonalić. Chodzi o automatyczny wybór odpowiedzi (A,B,C lub D) bez konieczności naciśnięcia entera. Próbowałam to zrobić funkcją getch(), niestety nie potrafię tego wykonać odpowednio. 

Narazie wygląda to tak, oczywiscie z funkcją getch() tu raczej mocno poknociłam, ale po prostu nie wiem jak użyć jej w takiej sytuacji ;)

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

using namespace std;

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

fstream plik;
plik.open("G://c++//test//test.txt", ios::in);

if(plik.good()==false)
{ cout<<"Blad programu"<<endl;
exit(0);
}

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;	break;
		}	
		
		if(nrLinii==7)
		{
			nrLinii=1;
			nrPyt++;	
		}
		nrLinii++;
}

cout<< "Witaj w krotkim quizie. Masz przed soba 6 pytan. Powodzenia !" << endl << "Podaj swoj nick: "<<endl;
cin>> nick;
	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 !"<<endl;
		punkty++;
	}
	else 
		cout<<"Niestety zle! :( Poprawna odpowiedz to: "<< poprawna[i]<<endl;	
	getchar();getchar();
	system("cls");
}
cout<<endl;
cout<<nick<<", gratulacje! Ukonczyles/as quiz! :) Ilosc zdobytych punktow: "<< punkty<<endl;

plik.close();

return 0;
}

 

2 odpowiedzi

+1 głos
odpowiedź 27 sierpnia 2015 przez Buby Pasjonat (19,590 p.)
wybrane 27 sierpnia 2015 przez mystery.of.silence
 
Najlepsza
@Edit:

Twój kod wygląda poprawnie. Jedynym problemem jest wypełnienie tablicy znaków - przypisujesz do pojedynczego znaku obiekt string, więc to nie ma opcji zadziałać. Zamień przypisanie poprawna[nrPyt]=linia, na poprawna[nrPyt]=linia[0].
komentarz 27 sierpnia 2015 przez mystery.of.silence Nowicjusz (230 p.)
Rzeczywiście, po tej zamianie wszystko dziala, tak jak chciałam :) Ale w zasadzie nie bardzo rozumiem dlaczego skoro nie zainicjowałam wcześniej "string linia" jako tablicę.
komentarz 27 sierpnia 2015 przez Buby Pasjonat (19,590 p.)
No właśnie stąd ;p

Widzisz, pobierając metodą getline tekst do obiektu string tworzysz łańcuch. Zaczinjmy od podstaw - czym jest obiekt string? Jest to klasa hermetyzująca dynamicznie alokowaną tablicę znaków - char[]. Tablica znaków przechowuje łańcuch znaków - innymi słowy, gdy zapisujesz jakieś słowo, np. "C++", to ten zapis sprawia, że tablica przechowuje 4 elementy, a nie 3 - ['C' '+' '+' '\0'], ostatni znak, czyli null, to zakonczenie łańcucha. Więc jeśli pobierasz z pliku tą metodą do stringa pojedyńczą literę, to jej postać w tablicy char jest następująca - ['A' '\0']. Jesli zastosujesz przeciążony operator ['index w tablicy'] dla obiektu string, to uzyskasz typ char, którego potrzebujesz. Pozycja 0 odpowiada pierwszemu elementowi tablicy, a w Twoim przypadku odpowiedniej literze. :)

W razie niejasności pisz. :)
komentarz 28 sierpnia 2015 przez mystery.of.silence Nowicjusz (230 p.)
No tak, teraz wszystko jasne, nie wpadłabym na to :) Dziękuję bardzo za pomoc :)
0 głosów
odpowiedź 27 sierpnia 2015 przez Krawiec91 Pasjonat (19,600 p.)
Jeśli chcesz wprowadzać odpowiedź bez Entera, można skorzystać z funkcji kbhit() z biblioteki conio.h. Tylko w takim wypadku trzeba by było tą funkcję w pętli umieścić, gdyż nie czeka ona na wprowadzenie znaku.

Podobne pytania

+1 głos
1 odpowiedź 1,295 wizyt
+1 głos
1 odpowiedź 126 wizyt
pytanie zadane 24 stycznia 2021 w C i C++ przez Wiktor Koźlik Użytkownik (950 p.)
0 głosów
3 odpowiedzi 497 wizyt
pytanie zadane 25 lutego 2018 w C i C++ przez noel1402 Użytkownik (630 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,965 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...