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

Obiektowy C++ odc. 2 zadanie domowe.

0 głosów
1,180 wizyt
pytanie zadane 16 lutego 2018 w Offtop przez Paweł123 Nałogowiec (33,540 p.)

Witam, właśnie przerabiam kurs Obiektowy C++ odc. 2: Struktura projektu obiektowego i chciałbym zrobić zadanie domowe.

Dodałem coś takiego do kodu

 while(getline(plik, linia))
    {
        if(aktualny_nr==nr_linii) tresc=linia;
        if(aktualny_nr==nr_linii+1) a=linia, A=linia;
        if(aktualny_nr==nr_linii+2) b=linia, b=linia;
        if(aktualny_nr==nr_linii+3) c=linia, C=linia;
        if(aktualny_nr==nr_linii+4) d=linia, D=linia;
        if(aktualny_nr==nr_linii+5) poprawna=linia;

        aktualny_nr++;
    }

 

 string a,A,b,B,C,c,D,d;

Jednak nie działa i nie wiem dlaczego? 

komentarz 16 lutego 2018 przez hhh Gaduła (4,110 p.)

nie działa

Doprecyzuj, kompilator wywala błąd? Jeśli tak, to jaki? Program się wysypuje po odpaleniu?

komentarz 16 lutego 2018 przez Paweł123 Nałogowiec (33,540 p.)
kompilator  nie wywala błędów, tylko podczas wprowadzania odpowiedzi "A" nie działa przyznawanie punktów, ale kiedy dam literkę "a" to już działa.
komentarz 16 lutego 2018 przez hhh Gaduła (4,110 p.)
Jeżeli nie działa przyznawanie punktów tylko dla 'A', to chyba problem leży w innym fragmencie kodu. Mógłbyś podlinkować całość/fragment z przyznawaniem punktów?

Tak swoją drogą, nie lepiej przekonwertować wprowadzane dane od użytkownika na tylko duże/tylko małe zaraz po ich dostaniu? Nie musiałbyś wtedy uwzględniać obu przypadków w if-ach.
komentarz 16 lutego 2018 przez Paweł123 Nałogowiec (33,540 p.)

main.cpp

#include <iostream>
#include "pytanie.h"

using namespace std;

int main()
{
    Pytanie p[5];
    int suma=0;
    for(int i=0; i<=4; i++)
    {
    p[i].nr_pytania=i+1;
    p[i].wczytaj();
    p[i].zadaj();
    p[i].sprawdz();

    suma+=p[i].punkt;
    }
    cout<<"Koniec quizu! Punkty = "<<suma;

    return 0;
}

pytanie.h

#include <iostream>

using namespace std;

class Pytanie
{
public:

    string tresc;
    string a,A,b,B,C,c,D,d;
    int nr_pytania;
    string poprawna;
    string odpowiedz;
    int punkt;// 1 lub 0

    void wczytaj();
    void zadaj();
    void sprawdz();

};

pytanie.cpp

#include <iostream>
#include "pytanie.h"
#include <fstream>
#include <cstdlib>

using namespace std;

void Pytanie::wczytaj()
{
    fstream plik;
    plik.open("quiz.txt", ios::in);

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

    int nr_linii=(nr_pytania-1)*6+1;
    int aktualny_nr=1;
    string linia;

    while(getline(plik, linia))
    {
        if(aktualny_nr==nr_linii) tresc=linia;
        if(aktualny_nr==nr_linii+1) a=linia, A=linia;
        if(aktualny_nr==nr_linii+2) b=linia, b=linia;
        if(aktualny_nr==nr_linii+3) c=linia, C=linia;
        if(aktualny_nr==nr_linii+4) d=linia, D=linia;
        if(aktualny_nr==nr_linii+5) poprawna=linia;

        aktualny_nr++;
    }

    plik.close();

}

void Pytanie::zadaj()
    {
        cout<<endl<<tresc<<endl;
        cout<<a<<endl;
        cout<<b<<endl;
        cout<<c<<endl;
        cout<<d<<endl;
        cout<<"------------------------"<<endl;
        cout<<endl<<"Odpowiedz: ";
        cin>>odpowiedz;
    }


void Pytanie::sprawdz()
    {
        if(odpowiedz==poprawna)
        {
            punkt=1;
        }
        else punkt=0;
    }

 

3 odpowiedzi

0 głosów
odpowiedź 16 lutego 2018 przez hhh Gaduła (4,110 p.)
if(aktualny_nr==nr_linii+2) b=linia, b=linia;

Tu zamiast jednego "b" powinno być jedno duże "B".

if(aktualny_nr==nr_linii+5) poprawna=linia;
if(odpowiedz==poprawna)
        {
            punkt=1;
        }
        else punkt=0;

Sprawdzasz tutaj jedynie czy odpowiedz podana przez użytkownika jest równa tej z pliku - jeżeli ktoś poda "A", a poprawną odpowiedzią w pliku będzie "a", to wtedy nie zaliczy poprawnej odpowiedzi. Moim zdaniem należałoby to przebudować, ustalić jakie literki są w pliku, i przy wejściu konwertować wprowadzoną wartość, by zgadzała się z formatem przyjętym w pliku (np.: funkcja "tolower()").

komentarz 16 lutego 2018 przez hhh Gaduła (4,110 p.)
P.S.: Jeżeli używasz zmiennej i przyjąłeś, że chcesz do niej zapisywać tylko 2 stany, np.: 0 i 1, to rozważ użycie zmiennej typu "bool". Przechowuje wartości TRUE i FALSE, w warunkach sprawdzasz czy są równe tym wartościom logicznym. Zajmuje to znacznie mniej pamięci operacyjnej, i nie wpiszesz tam przez przypadek czegoś innego, np 144, co może ułatwić szukanie błędów w przyszłości.
komentarz 17 lutego 2018 przez Paweł123 Nałogowiec (33,540 p.)

@Vellur, Poprawiłem, ale nadal nie działa.

komentarz 17 lutego 2018 przez hhh Gaduła (4,110 p.)
W sensie dalej nie liczy tego "A"?
komentarz 17 lutego 2018 przez Paweł123 Nałogowiec (33,540 p.)
Tak, nie przydziela punktów z duże "A". Przydziela punkty tylko za małe "a".
komentarz 17 lutego 2018 przez hhh Gaduła (4,110 p.)
Na pewno wszystko zrobiłeś dobrze? Wrzuć tu może ten poprawiony kod.
komentarz 17 lutego 2018 przez Paweł123 Nałogowiec (33,540 p.)

pytanie.cpp

#include <iostream>
#include "pytanie.h"
#include <fstream>
#include <cstdlib>

using namespace std;

void Pytanie::wczytaj()
{
    fstream plik;
    plik.open("quiz.txt", ios::in);

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

    int nr_linii=(nr_pytania-1)*6+1;
    int aktualny_nr=1;
    string linia;

    while(getline(plik, linia))
    {
        if(aktualny_nr==nr_linii) tresc=linia;
        if(aktualny_nr==nr_linii+1) a=linia, A=linia;
        if(aktualny_nr==nr_linii+2) b=linia, B=linia;
        if(aktualny_nr==nr_linii+3) c=linia, C=linia;
        if(aktualny_nr==nr_linii+4) d=linia, D=linia;
        if(aktualny_nr==nr_linii+5) poprawna=linia;

        aktualny_nr++;
    }

    plik.close();

}

void Pytanie::zadaj()
    {
        cout<<endl<<tresc<<endl;
        cout<<a<<endl;
        cout<<b<<endl;
        cout<<c<<endl;
        cout<<d<<endl;
        cout<<"------------------------"<<endl;
        cout<<endl<<"Odpowiedz: ";
        cin>>odpowiedz;
    }


void Pytanie::sprawdz()
    {

        if(odpowiedz==poprawna)
        {
            punkt=1;
        }
        else punkt=0;
    }

 

0 głosów
odpowiedź 15 grudnia 2019 przez Bartosz Chodyła Nowicjusz (140 p.)

Myślę, że najprościej po prostu dodać linijkę z funkcją transform po wczytaniu odpowiedzi od użytkownika w metodzie zadaj():

#include <string>
#include <algorithm>

using namespace std;

cin >> odpUzytkownika;
transform(odpUzytkownika.begin(),odpUzytkownika.end(),odpUzytkownika.begin(),::tolower);

 

0 głosów
odpowiedź 26 lipca 2020 przez DziarskiHenk Nowicjusz (180 p.)

Należy dodać w pliku pytanie.cpp do metody sprawdzającej 2 linijki z funkcją transform, najlepiej dla obu atrybutów "odpowiedz" i "poprawna", oraz 2 biblioteki wymagane do działania funkcji transform.

 

#include <string>
#include <algorithm>

void Pytanie::sprawdz()
{
    transform(odpowiedz.begin(), odpowiedz.end(), odpowiedz.begin(), ::tolower);
    transform(poprawna.begin(), poprawna.end(), poprawna.begin(), ::tolower);

    if (odpowiedz==poprawna) punkt=1;
    else punkt=0;
}

 

Podobne pytania

0 głosów
1 odpowiedź 1,694 wizyt
pytanie zadane 30 marca 2019 w C i C++ przez waslaw89 Nowicjusz (150 p.)
0 głosów
1 odpowiedź 1,429 wizyt
pytanie zadane 12 marca 2019 w C i C++ przez Rokhar Nowicjusz (170 p.)
0 głosów
1 odpowiedź 1,981 wizyt
pytanie zadane 3 marca 2019 w SQL, bazy danych przez polonez11212 Początkujący (350 p.)

93,778 zapytań

142,737 odpowiedzi

323,388 komentarzy

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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...