• 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.

Object Storage Arubacloud
0 głosów
603 wizyt
pytanie zadane 16 lutego 2018 w Offtop przez Paweł123 Nałogowiec (33,500 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,500 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,500 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,500 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,500 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,500 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,165 wizyt
pytanie zadane 30 marca 2019 w C i C++ przez waslaw89 Nowicjusz (150 p.)
0 głosów
1 odpowiedź 455 wizyt
pytanie zadane 12 marca 2019 w C i C++ przez Rokhar Nowicjusz (170 p.)
0 głosów
1 odpowiedź 1,281 wizyt
pytanie zadane 3 marca 2019 w SQL, bazy danych przez polonez11212 Początkujący (350 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,939 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!

...