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

question-closed Problem z warunkiem if

0 głosów
109 wizyt
pytanie zadane 5 lutego 2019 w C i C++ przez Thanat0s666 Nowicjusz (230 p.)
zamknięte 6 lutego 2019 przez Thanat0s666

Witam mam problem z warunkiem if w poniższym programie. Jest to niemalże kalka z odcinka 7. (https://www.youtube.com/watch?v=h2Taf16gQDI&list=PLOYHgt8dIdoxx0Y5wzs7CFpmBzb40PaDo&index=8), pisana nieco równolegle, ale gdy przyszło do sprawdzenia funkcjonalności mam problem z optymalizacją kodu. Zamiast pisać kolejne case:9, case :10, case :11, case :12... itp chciałbym użyć warunku if(nr==9) { nr=3; i=i+1;}. Natomiast tak jak program pobiera prawidłowo dane z pliku txt, gdy jest pisany na case :10, case:11, case :12... itp to robiąc to ifem już nie działa i nie zczytuje żadnych zmiennych. 

W kodzie problematyczny if zaznaczony jest na czerwono 

if(nr==9) {nr=3; i++;}


Proszę o pomoc pozdrawiam :')

#include <iostream>
#include <iomanip> // du¿e liczby zapis pelny komenda setprecision()
#include <windows.h> /

/ sleep
#include <cstdlib> //system
#include <stdio.h> // getchar
#include <conio.h> // zczytywanie znaków bez potwierdzania ENTEREM
#include <fstream>
#include <conio.h>

using namespace std;
fstream quiz;
string linia;

int nr=1;
int i=0;

string autor;
string temat;
string pytanie[3];
string odpa[3];
string odpb[3];
string odpc[3];
string odpd[3];
string podp[3];

string wybor;

int main()
{
    SetConsoleTitleA("Quiz");
    cout << "Witaj," << endl << "Upewnij sie ze plik 'quiz.txt' znadjude sie w tym samym folderze co Quiz." << endl << endl << "Nacisnij ENETER, aby kontynowac.";
    getchar();
    Sleep(500);
    system("cls");

    quiz.open("quiz.txt",ios::in);
    if(quiz.good()) {
        cout << "Poprawnie wczytano plik 'quiz.txt'" << endl << endl << "Nacisnij ENTER, aby rozpoczac.";
        getchar();
        Sleep(500);
        system("cls");
        }
    else {
        cout << "Wczytywanie pliku 'quiz.txt' zakonczone NIEPOWODZENIEM, upewnij sie ze:" << endl <<"1.Plik znajduje sie w tym samym folderze co Quiz" << endl << "2.Plik ma nazwe 'quiz.txt" << endl << "3.Quiz uruchomiony jest z uprawnieniami Administratora";
        cout << endl << endl << "Gdy wykonasz powyzsze instrukcje, uruchom program ponownie..." << endl << endl << "Nacisnij ENTER, aby zamknac";
        quiz.close();
        return 0;
        }


    while(getline(quiz,linia)) {
        switch(nr) {

                case 1: {
                autor=linia;
                } break;

                case 2: {
                temat=linia;
                } break;

                case 3: {
                pytanie[i] = linia;
                } break;

                case 4: {
                odpa[i] = linia;
                } break;

                case 5: {
                odpb[i] = linia;
                } break;

                case 6: {
                odpc[i] = linia;
                } break;

                case 7: {
                odpd[i] = linia;
                } break;

                case 8: {
                podp[i] = linia;
                } break;

                } //switch

            nr++;


            if(nr==9) {nr=3; i++;}
             } //while


    cout << "Witaj w Quiz'ie autorstwa: "<< autor << " o tematyce: " << temat <<  endl << endl << "Nacisnij ENTER, aby przejsc do pytan.";
    getchar();
    Sleep(500);
    system("cls");


    cout <<pytanie[0] << endl << odpa[0]<<endl <<odpb[0]<< endl << odpc[0] << endl << odpd[0]<< endl << podp[0] << endl << pytanie[1] << endl << odpa[1] << endl << odpb[1] << endl << odpc[1] << endl << odpd[1] << endl << podp[1];
    getchar();

    quiz.close();
    return 0;
}
komentarz zamknięcia: rozwiązany
komentarz 5 lutego 2019 przez MikDal Mądrala (5,180 p.)

Nie za bardzo rozumiem, kompilator pokazuje jakiś błąd? Jeśli tak, to jaki? Czy chodzi o coś innego? Czy można poprosić o przykładowy plik quiz.txt? Prosiłbym również o poprawnie formatowania kodu, tak aby było to czytelniejsze :). Oraz dlaczego break znajduje się po za nawiasem klamrowym?

komentarz 6 lutego 2019 przez Thanat0s666 Nowicjusz (230 p.)
edycja 6 lutego 2019 przez Thanat0s666
Oto układ plików txt:

Miroslaw Zelent
Programowanie C++
Typ zmiennych o nazwie float przechowuje:
liczby calkowite
napisy
liczby zmiennoprzecinkowe
pojedyncze znaki
c
Wstrzymanie wykonania programu na czas 2 sekund uzyskasz instrukcja:
Wait(2000)
Stop(2000)
Delay(2000)
Sleep(2000)
d
Ktora deklaracja jest zapisana poprawnie?
int x;
integer x;
x:integer;
x=integer;
a

Kompilator nie wyrzuca błędu i program uruchamia się ale działa nie poprawnie - przestaje wczytywać dane, podczas próby wrzucenia ich na ekran dostaję informacje "Process returned -1073741819 (0xC0000005)   execution time : 3.660 s" czyli tak jak by zakończył pracę mimo że ma jeszcze instrukcje do wykonania
komentarz 6 lutego 2019 przez MikDal Mądrala (5,180 p.)

Na podanych danych testowych u mnie wszystko działa. Był tylko jeden drobny błąd, mianowicie brak na początku linijki #include <string>.

I jeszcze jedno, bo teraz pojawiła się rozbieżność. W pytaniu padło, że program przestaje wczytywać, a tutaj, w komentarzu, napisane zostało, że program przeszedł przez wczytywanie ale ma problem z wyświetlaniem, to jak to w końcu jest?

komentarz 6 lutego 2019 przez Thanat0s666 Nowicjusz (230 p.)

Wyglądało na to, że problem leżał po stronie pliku .txt nie dokońca wiedziałem co jest nie tak więc napisałem go ode zera z głowy zamiast pytań w pliku tekstowym używając 1,2,3,4,5,6,7 itp żeby zobaczyć po kolei co dzieje sie z którymi zmiennymi... i? I jak zrobiłem to drugi raz  to zaczęło faktycznie działać tutaj jest kod, sformatowany przejrzystrzy i nieco przystępniejszy jeśli komuś kiedyś pomoże cieszę się niezmiernie. Natomiast ciekawy jestem o co chodzi z tą biblioteką string której mi brakuje? za co ona odpowiada? Pytam z ciekawości gdyż program wydaje się

#include <iostream>
#include <windows.h> // Sleep;
#include <cstdlib> //   system;
#include <stdio.h> //   getchar();
#include <conio.h> //   zczytywanie znaków bez potwierdzania ENTEREM getch();
#include <fstream> //   strumnien wejscia

using namespace std;
fstream quiz;
string linia;

string autor;
string temat;
string pytanie[3];
string odpa[3];
string odpb[3];
string odpc[3];
string odpd[3];
string podp[3];

string imie;

string wybor;

int menu=0;


int main()
{
    SetConsoleTitleA("Quizv2");
    cout << "Witaj," << endl << "Upewnij sie ze plik 'quiz.txt' znadjude sie w tym samym folderze co Quiz.exe" << endl << endl << "Nacisnij ENETER, aby kontynowac.";
    getchar();
    Sleep(500);
    system("cls");
    while(true) {
        quiz.open("quiz.txt",ios::in);
        if(quiz.good()) {
            cout << "Poprawnie wczytano plik 'quiz.txt'" << endl << endl << "Nacisnij ENTER, aby kontynuowac.";
            getchar();
            system("cls");
                        }
        else {
            cerr << "Wczytywanie pliku 'quiz.txt' zakonczone NIEPOWODZENIEM, upewnij sie ze:" << endl <<"1.Plik znajduje sie w tym samym folderze co Quiz.exe" << endl << "2.Plik ma nazwe 'quiz.txt" << endl << "3.Quiz.exe uruchomiony jest z uprawnieniami Administratora";
            cerr << endl << endl << "Gdy wykonasz powyzsze instrukcje, uruchom program ponownie..." << endl << endl << "Nacisnij ENTER, aby zamknac" << endl << endl;
            getchar();
            quiz.close();
            return 0;
            }
        int nr=1;
        int i=0;
        while(getline(quiz,linia)) {
            switch(nr){
                case 1: {
                    autor=linia;
                        } break;
                case 2: {
                    temat = linia;
                        } break;
                case 3:{
                    pytanie[i]=linia;
                        } break;
                case 4: {
                    odpa[i]=linia;
                        } break;
                case 5: {
                    odpb[i]=linia;
                        } break;
                case 6: {
                    odpc[i]=linia;
                        } break;
                case 7: {
                odpd[i]=linia;
                        } break;
                case 8: {
                    podp[i]=linia;
                        } break;
                      }       //switch
                nr++;
                if(nr==9) {
                    nr=3;
                    i++;
                          }
                                    }  //while

        quiz.close();
        if(menu==0) {
            menu=1;
            cout << "Podaj swoje imie: ";
            cin >> imie;
            Sleep(500);
            system("cls");
                    }
        cout << "Witaj w quiz'ie autorstwa: " << autor << " o tematyce " << temat << "!"<< endl << endl;
        Sleep(1500);

        int ptk=0;
        for(i=0;i<=2;i++) {
            cout << "Pytanie nr." << i+1 << " " << pytanie[i] << endl << "a) " << odpa[i] << endl << "b) " << odpb[i] << endl << "c) " << odpc[i] << endl << "d) " << odpd[i] << endl;
            cin >> wybor;
            if (wybor==podp[i]) {
                cout << endl <<"Dobrze! Zdobywasz 1 punkt!" << endl << endl;
                ptk++;
                                }
            else {
                cout << endl <<"Niestety, prawidlowa odpowiedz to: '" << podp[i] <<"'" << endl << endl;
                 }
                           } //for

        if (ptk==(i)) {
            cout << endl << "Gratulacje, udalo Ci sie uzyskac maksymalna liczbe punktow! " << ptk << "/" << i;
                       }
        else if (ptk==0) {
            cout << endl << "Gratulacje, ukonczenia Quizu, niestety nie udalo Ci sie zdobyc zadnych punktow " << ptk << "/" << i;
                         }
        else {
            cout << endl << "Gratulacje, ukonczenia Quizu, udalo ci sie uzyskac: " << ptk << "/" << i << " punktow";
             }
        Sleep(1000);
        cout << endl << endl << "Jesli chcesz zagrac ponownie --> [WYBIERZ '1']" << endl << "Jesli chcesz zmienic baze pytan --> [WYBIERZ '2']" << endl;
        cin >> menu;
        Sleep(500);
        quiz.open("wyniki.txt", ios::out | ios:: app);
        quiz << imie << " --> " << ptk << "/" << i << endl;
        quiz.close();
        if (menu==2) {
            quiz.close();
            return 0;
                     }
                  }   //while true
    quiz.close();
    cout << "Blad przerwania petli, tryb odczytu dysku zamkniety, ENTER, aby zamknac: ";
    getchar();
    return 0;
}

działać bez niej, a może inna biblioteka przejęła jej rolę? 

komentarz 6 lutego 2019 przez MikDal Mądrala (5,180 p.)
1) To co wrzuciłeś w komentarzu nie jest czytelniejsze w żadnym stopniu, wręcz przeciwnie czyta się to jeszcze gorzej... Zapoznać się z jakimś gotowym stylem pisania, może to pomoże: http://www.mini.pw.edu.pl/~mkobos/wp-content/uploads/2010/12/CPP-styl.pdf.

2) Biblioteka string udostępnia funkcję getline(), możliwe, że twój kompilator ładuje ją domyślnie, czy coś innego. U mnie VC++ wymagało aby ją dodał jawnie.

3) Skoro już wiesz, gdzie leży problem, to zamknij temat, bo tu już chyba nie ma nic do roboty...

Podobne pytania

0 głosów
2 odpowiedzi 155 wizyt
pytanie zadane 27 stycznia 2020 w C i C++ przez dario Nowicjusz (200 p.)
0 głosów
3 odpowiedzi 172 wizyt
pytanie zadane 16 października 2019 w C i C++ przez Olgierd47 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 131 wizyt
pytanie zadane 10 lutego 2020 w JavaScript przez disaster Bywalec (2,020 p.)

86,448 zapytań

135,207 odpowiedzi

300,348 komentarzy

57,196 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...