• 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

VPS Starter Arubacloud
0 głosów
212 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,660 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,660 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,660 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 545 wizyt
pytanie zadane 27 stycznia 2020 w C i C++ przez dario Nowicjusz (200 p.)
0 głosów
3 odpowiedzi 235 wizyt
pytanie zadane 16 października 2019 w C i C++ przez Olgierd47 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 370 wizyt
pytanie zadane 10 lutego 2020 w JavaScript przez disaster Bywalec (2,120 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...