Zadanie domowe Pasja informatyki Obiektowy C++ odc.2

0

Dzień dobry
Mam problem z zadaniem domowym i nie chodzi tutaj sticte o jego rozwiązanie,a pytanie dotyczące kompilatora. Jestem na początku swojej drogi w programowaniu i odkąd to robię używam do pisania kodu Visual Studio Code na ubuntu. Program to quiz, który przyznaje punkt za poprawna odpowiedz. Podczas oglądania lekcji z programowania obiekotwego zadaniem widza jest do napisanego kodu dodać linie, które spowodują że program bedzie rozpoznawal poprawną odpowiedź podaną z klawiatury zarówno z małych jak i duzych liter. Problem polega na tym, że kod na Windowsie dokładnie w CodeBlocks działa poprawnie, jednak ten sam kod na ubuntu (VSC) przyznaje tylko jeden punkt w ostatniej odpowiedź jeżeli była poprawna. We wcześniejszych pytaniach program przynaje 0 punktów mimo udzielonej poprawnej odpowiedźi. Moje pytanie brzmi jak powinien wyglądać kod na linuxie w VSC i dlaczego program inaczej działa na różnych kompilatorach mimo bardzo prostego kodu. Poniżej załączam kod źródłowy. Pozdrawiam

Plik 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;
      if(aktualny_nr==nr_linii+2) b=linia;
      if(aktualny_nr==nr_linii+3) c=linia;
      if(aktualny_nr==nr_linii+4) 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()
{
   duza=odpowiedz;
   for ( unsigned long i = 0; i < 1; i++ ){  // zadanie dodatkowe
       duza[i]+=0x20;
   }
   //std::cout<<duza<<std::endl;
   
   if(odpowiedz==poprawna||duza==poprawna)
   {
      punkt=1;
   }
   else punkt=0;
   //std::cout<<punkt<<std::endl;
}

/*void Pytanie::zliczaj(int n){
   if(odpowiedz==poprawna||duza==poprawna){
      n++;
   }
   else{
      n+=0;
   }
   
   cout<<n<<endl;
}
*/

Plik pytanie.h

#include <iostream>

using namespace std;

class Pytanie
{
   public:

   string tresc;
   string a,b,c,d;
   int nr_pytania;
   string poprawna;
   string odpowiedz;
   int punkt;
   string duza;


   void wczytaj(); //wczytuje pytania z pliku
   void zadaj(); //pokazuje pytanie, czyta odpowiedz
   void sprawdz(); //sprawdza poprawnosc odpowiedzi
   //void zliczaj(int n);
};

Plik main.cpp

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

using namespace std;

int main()
{  int suma=0;

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

   cout<<"KONIEC QUIZU! PUNKTY = "<<suma<<std::endl;
   

   return 0;
}

Dołączam również treść quizu w .txt
Pozdrawiam

0

Poprawna odpowiedź ładuje się z pliku poprawnie?

Próbowałeś to może debbugować?

2

Masz Windowsowe końce linii, tzn "\r\n". Przez to, na Windowsie czytanie linii wczyta wszystko poza "\r\n", podczas gdy na Linuksie przeczytana linijka będzie się kończyć przez '\r'.

0
Czitels napisał(a):

Poprawna odpowiedź ładuje się z pliku poprawnie?

Próbowałeś to może debbugować?

@Czitels: Tak wszystko ładuje się poprawnie, tylko warunek if (odpowiedz==poprawna) działa inaczej niż powinno na linuxie.

Nie, nie próbowałem debugować.

1

To idealny moment żeby się nauczyć. Ustaw breakpointa na 58 linii i zobacz co jest z ifem nie tak że nie wchodzi do niego. Jak się tego nauczysz to większość problemów będziesz potrafił naprawić sam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1