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

problem z wczytaniem z pliku tekstowego do

Konkurs Mistrz Programowania
+5 głosów
633 wizyt
pytanie zadane 6 listopada 2017 w C i C++ przez Cacek Nowicjusz (210 p.)

Witam,

Z uwagi, że jest to mój pierwszy post chciałbym się przedstawić. Mam na imię Łukasz i interesuje się programowaniem od 1 miesiąca. Po przerobieniu 7 odcinków kursu C++ postanowiłem stworzyć swój pierwszy, autorski program. Padło na program odpytujący ze słówek z j. angielskiego, które będą pobierane z pliku tekstowego. Plik tekstowy będzie miał strukturę: 

widelec (słówko PL)

fork (słówko Ang.) 

krzesło (słówko PL)

chair (słówko Ang.)

itd.

Teraz chciałbym, żeby program wczytał i wyświetlał w konsoli słówko polskie, ja wprowadzam jego odpowiednik z j. angielski. Program dalej dokonuje porównania, czy odpowiedź jest poprawna. Jak tak, otrzymuje stosowny komunikat, jak nie to program komunikuje błędną odpowiedź i podaje poprawne słówko angielskie.

Poniżej zamieszczam kod, który się kompiluje, ale są w nim dwa problemy:

1. Pytania i odpowiedzi nie są wczytywane linijka po linijce do odpowiednich tablic.

2. Nie następuje poprawne porównanie odpowiedzi z wartościami jakie powinny być zaczytane z pliku tekstowego.

Spędziłem 2h na analizie, co poszło źle, ale bez skutecznie. Wciąż jestem w tym samym miejscu. Będę wdzięczny za pomoc lub info. co jest napisane źle.

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

using namespace std;
string ang[5], pl[5], poprawna[5];
string odpowiedz;

int main()
{

    fstream plik;
    plik.open("slowka.txt", ios::in);

    if(plik.good()==false)
    {
        cout<<"Nie udalo sie otworzyc pliku!";
        exit(0);
    }

    int nr_linii=0;
    string linia;

    while(getline(plik,linia))
    {
        switch(nr_linii)
        {
            case 1: pl[nr_linii] = linia;        break;
            case 2: ang[nr_linii] = linia;       break;
        }

        if(nr_linii==2) {nr_linii=1;}
        nr_linii++;
    }
    plik.close();

    for(int j=0; j<=4; j++){

    {
        cout<< pl[j] <<endl;
        cout <<"Twoja odpowiedz: " << endl;
        cin >> odpowiedz;
    }

        if(ang[j]==odpowiedz){cout << "Dobrze!" << endl;}
        else{cout << "Zle, brak punktu! Poprawna odpowiedz to: " << ang[j] << endl;}
    }
    cout<< "Koniec quizu";
    return 0;
}


 

 

komentarz 6 listopada 2017 przez Patrycjerz Mędrzec (192,320 p.)

Może pierwszy post, ale jaka jakość. Przedstawiłeś się, ładnie opisałeś problem, wrzuciłeś kod w specjalny bloczek… kulturka pełną gębą smiley

komentarz 6 listopada 2017 przez draghan VIP (106,230 p.)

Popieram Patrycjerza, masz moją łapkę. yes Witamy na Forum. smiley

3 odpowiedzi

0 głosów
odpowiedź 6 listopada 2017 przez kuba1176 Początkujący (340 p.)
W linii 35 pod nr_linii przypisz 0.

Pod koniec kodu pod pętlą for masz strasznie dużo dziwnych klamer.
0 głosów
odpowiedź 6 listopada 2017 przez Patrycjerz Mędrzec (192,320 p.)
Źle zliczasz numer linii. Powinien się on zaczynać od 1, nie od 0. Po drugie po przypisaniu do licznika jedynki od razu go inkrementujesz i potem zawsze numer linii jest dwójką. Dodaj else do fragmentu kodu z nr_linii++ lub inkrementuj licznik cały czas, licząc jedynie modulo z 2.
0 głosów
odpowiedź 7 listopada 2017 przez Cacek Nowicjusz (210 p.)

Dzięki za miłe przywitanie i podpowiedzi.

Finalnie, 2 roboczo/godziny później problem rozwiązany:

- poprawiłem wartość początkową nr_linii na 1,

- potraktowałem każdą parę wyrazów jako oddzielne pytanie i dodałem zmienną nr_pytania, która się zmienia +1 po przekroczeniu nr_linii==2. Teraz wszystko już się ładnie zapisuje do tablic.

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

using namespace std;
string ang[5], pl[5], poprawna[5];
string odpowiedz;

int main()
{
    fstream plik;
    plik.open("slowka.txt", ios::in);

    if(plik.good()==false)
    {
        cout<<"Nie udalo sie otworzyc pliku!";
        exit(0);
    }

    int nr_linii=1;
    int nr_pytania=0;
    string linia;

    while(getline(plik,linia))
    {
        switch(nr_linii)
        {
            case 1: pl[nr_pytania] = linia;        break;
            case 2: ang[nr_pytania] = linia;       break;
        }
        if(nr_linii==2) {nr_linii=0; nr_pytania++;}
        nr_linii++;
    }
    plik.close();

    for(int j=0; j<=4; j++){

    {
        cout<< pl[j] <<endl;
        cout <<"Twoja odpowiedz: " << endl;
        cin >> odpowiedz;
    }

        if(ang[j]==odpowiedz){cout << "Dobrze!" << endl<<endl;}
        else{cout << "Zle, brak punktu! Poprawna odpowiedz to: " << ang[j] << endl << endl;}
    }
    cout<< "Koniec quizu";
    return 0;
}

W sumie wyszła lekko zmodyfikowana kalka kurs #7 C++ zadanie "Quiz".

Podobne pytania

+1 głos
2 odpowiedzi 762 wizyt
0 głosów
1 odpowiedź 186 wizyt
pytanie zadane 1 lutego 2017 w C i C++ przez Don Corleone Obywatel (1,210 p.)
0 głosów
1 odpowiedź 654 wizyt
pytanie zadane 20 kwietnia 2016 w C i C++ przez DragonCoder Nałogowiec (36,500 p.)

93,655 zapytań

142,575 odpowiedzi

323,099 komentarzy

63,171 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

Kursy INF.02 i INF.03
...