Skocz do zawartości

Witaj!

Zaloguj lub Zarejestruj się aby uzyskać pełny dostęp do forum.

Zdjęcie
- - - - -

C++ program nie działa jak należy (xcode)


  • Zaloguj się, aby dodać odpowiedź
4 odpowiedzi w tym temacie

#1 Slidor

Slidor
  • 20 postów

Napisano 15 lipca 2016 - 22:08

Witam,
Mam kolejny problem z programem, który w zasadzie przepisałem z kursu na YT. Zawiera on odczytywanie z pliku tekstowego, to jest taki quiz z pytaniami. Prosiłbym o pomoc w prześledzeniu, dlaczego nie działa tak, jak miał działać, jak przedstawiono na filmie. Załączę dany plik .txt, który jest też tam używany.

 

P. S. Wybaczcie za ewentualny brak profesjonalizmu - uczę się dopiero :) Nie wiem, czy jest dobrej jakości ten kod, po prostu ciekawi mnie, dlaczego u mnie nie działa

#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
#include <cstdlib>

using namespace std;

string temat, nick;
string tresc[5];
string odpA[5], odpB[5], odpC[5], odpD[5];
string poprawna[5];
string odpowiedz;
int punkty=0;

int main()
{
    string linia;
    int nr_linii=1;
    int nr_pytania=0;
    
    fstream plik;
    plik.open("quiz.txt", ios::in);
    
    if (plik.good()==false)
    {
        cout << "Nie udało się otworzyć pliku!" << endl;
        exit(0);
    }
    
    while (getline(plik, linia))
    {
        switch (nr_linii)
        {
            case 1: temat = linia;                     break;
            case 2: nick = linia;                      break;
            case 3: tresc[nr_pytania] = linia;         break;
            case 4: odpA[nr_pytania] = linia;          break;
            case 5: odpB[nr_pytania] = linia;          break;
            case 6: odpC[nr_pytania] = linia;          break;
            case 7: odpD[nr_pytania] = linia;          break;
            case 8: poprawna[nr_pytania] = linia;      break;
        }
        
        if (nr_linii==8)
        {
            nr_linii=2;
            nr_pytania++;
        }
        
        
        nr_linii++;
    }
    plik.close();
    
    cout << "QUIZ" << endl;
    
    for (int i=0; i<=4; i++)
    {
        cout << endl << tresc[i] << endl;
        cout << "A. " << odpA[i] << endl;
        cout << "B. " << odpB[i] << endl;
        cout << "C. " << odpC[i] << endl;
        cout << "D. " << odpD[i] << endl;
        
        cout << "Twoja odpowiedź to: ";
        cin >> odpowiedz;
        
        transform(odpowiedz.begin(), odpowiedz.end(), odpowiedz.begin(), ::tolower);
        
        if (odpowiedz==poprawna[i])
        {
            cout << "Dobrze! Zdobywasz punkt!" << endl;
            punkty++;
        }
        else cout << "Źle! Brak punktu! Poprawna odpowiedź to: " << poprawna[i] << endl;
        
        
    }
    
    cout << endl << "Koniec quizu! Zdobyte punkty: " << punkty << endl;
    
    return 0;
}

Załączony plik  quiz.txt   556 bajtów   4 Ilość pobrań


Nie doprecyzowałem - sorry - wszystko się ładnie wyświetla - pierwsze pytanie, odpowiedzi, wpisuję swoją po zapytaniu i mimo że wpisałem "c" (bez cudzysłowu) np., to i tak pokazuje zła odpowiedź, poprawna to: c... 



#2 zeelus

zeelus
  • 47 postów

Napisano 01 września 2016 - 08:13

Poprawiona wersja

//
//  main.cpp
//  testQuiz
//

#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
#include <cstdlib>

using namespace std;

string temat, nick;
string tresc[5];
string odpA[5], odpB[5], odpC[5], odpD[5];
string poprawna[5];
string odpowiedz;
int punkty=0;

int main(int argc, const char * argv[]) {
    string linia;
    int nr_linii=1;
    int nr_pytania=0;
    
    fstream plik;
    plik.open("quiz.txt", ios::in);
    
    if (plik.good()==false)
    {
        cout << "Nie udało się otworzyć pliku!" << endl;
        exit(0);
    }
    
    while (getline(plik, linia))
    {
        switch (nr_linii)
        {
            case 1: temat = linia;                     break;
            case 2: nick = linia;                      break;
            case 3: tresc[nr_pytania] = linia;         break;
            case 4: odpA[nr_pytania] = linia;          break;
            case 5: odpB[nr_pytania] = linia;          break;
            case 6: odpC[nr_pytania] = linia;          break;
            case 7: odpD[nr_pytania] = linia;          break;
            case 8: poprawna[nr_pytania] = linia;      break;
        }
        
        if (nr_linii==8)
        {
            nr_linii=2;
            nr_pytania++;
        }
        
        
        nr_linii++;
    }
    plik.close();
    
    cout << "QUIZ" << endl;
    
    for (int i=0; i<=4; i++)
    {
        cout << endl << tresc[i] << endl;
        cout << "A. " << odpA[i] << endl;
        cout << "B. " << odpB[i] << endl;
        cout << "C. " << odpC[i] << endl;
        cout << "D. " << odpD[i] << endl;
        
        cout << "Twoja odpowiedź to: ";
        cin >> odpowiedz;
        
        transform(odpowiedz.begin(), odpowiedz.end(), odpowiedz.begin(), ::tolower);
        
        if (odpowiedz[0] == poprawna[i][0])
        {
            cout << "Dobrze! Zdobywasz punkt!" << endl;
            punkty++;
        }
        else cout << "Źle! Brak punktu! Poprawna odpowiedź to: " << poprawna[i] << endl;
        
        
    }
    
    cout << endl << "Koniec quizu! Zdobyte punkty: " << punkty << endl;
    
    return 0;

}

W zmienej odpowiedz masz zapisane np. "c\r" i próbujesz to porównać do "c", dlatego zawsze zwraca false. W odpowiedz[0] == poprawna[i][0] wyciągam pierwsze znaki i porównuje.


Użytkownik zeelus edytował ten post 01 września 2016 - 08:14


#3 Slidor

Slidor
  • 20 postów

Napisano 06 września 2016 - 21:14

Wybacz za pewnie głupią prośbę, ale mógłbyś mi to bardziej wyjaśnić, dlaczego u Ciebie ta linijka wygląda tak:

if (odpowiedz[0] == poprawna[i][0])

a u mnie jest tak:

if (odpowiedz==poprawna[i])

?

Dlaczego program to inaczej odbiera?



#4 Biz1k

Biz1k
  • 44 postów

Napisano 07 września 2016 - 07:17



Wybacz za pewnie głupią prośbę, ale mógłbyś mi to bardziej wyjaśnić, dlaczego u Ciebie ta linijka wygląda tak:

if (odpowiedz[0] == poprawna[i][0])

a u mnie jest tak:

if (odpowiedz==poprawna[i])

?

Dlaczego program to inaczej odbiera?

Zmienna "odpowiedz" jest typu string. String można iterować jak tablicę. Dlatego "odpowiedz[0]" to będzie pierwsza litera tego stringa.

"poprawna" jest tablicą, "poprawna[i]" to i-ty string zawarty w tej tablicy, dlatego możemy tak samo jak powyżej odwołać się do pierwszego znaku.

 

Potrzeba użycia takiej konstrukcji jest prosta. Chodzi nam o jedną literkę jaką wpisał użytkownik. Wprowadzając tekst w terminalu, może on być zakończony jakimiś białymi znakami, np: znakiem nowej lini. Wtedy "poprawna[i]" = "b", a to co wpisał użytkownik będzie (czyli zmienna "odpowiedz") "b\n". Czyli są to różne odpowiedzi, porównując tylko pierwszy znak unikamy tego problemu.



#5 Slidor

Slidor
  • 20 postów

Napisano 07 września 2016 - 17:33

Dzięki, działa! :)






Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych