Niedziałający warunek if

2015-06-15 16:02

Rejestracja: 4 lata temu

Ostatnio: 4 lata temu

0

Witam,
bardzo proszę o pomoc, ponieważ najprawdopodobniej źle zbudowałem warunek if. Program powinien wylosować 1-4 pytanie z puli pytań o trudności 1, 5-8 pytanie z puli o trudności 2 itd., a losuje z całości.

#include <stdio.h>
#include <cstdlib>
#include <string>
#include <iostream>
#include <fstream>
#include <conio.h>
#include <algorithm>
#include <windows.h>
#include <time.h>

using namespace std;
struct baza_pytan 
{
    string poziom;
    string pytanie;
    string odpowiedz1;
    string odpowiedz2;
    string odpowiedz3;
    string odpowiedz4;
    string poprawna;
};

int main()
{
    int losowanie[12];
    int nr_pytania=0, licznik=1, nr_linii=1, wylosowane=0, l=0, poprawne=0;
    string linia, odpowiedz;
    bool flaga;
    //Sprawdzenie ilosci pytan w pliku
    fstream plik;
    plik.open("pomiary.txt", ios::in);

    while(!plik.eof())
    {
        getline(plik, linia);
        licznik++;
    }

    licznik= licznik/7;

    plik.close();

    cout<<"Ilosc pytan w puli: "<<licznik<<endl<<endl;
    //Przepisanie pytan z pliku do struktury
    baza_pytan pytanie[licznik];

    plik.open("pomiary.txt", ios::in);

    while(getline(plik,linia))
    {
        switch(nr_linii)
        {
            case 1: pytanie[nr_pytania].poziom = linia;      break;
            case 2: pytanie[nr_pytania].pytanie = linia;     break;
            case 3: pytanie[nr_pytania].odpowiedz1 = linia;  break;
            case 4: pytanie[nr_pytania].odpowiedz2 = linia;  break;
            case 5: pytanie[nr_pytania].odpowiedz3 = linia;  break;
            case 6: pytanie[nr_pytania].odpowiedz4 = linia;  break;
            case 7: pytanie[nr_pytania].poprawna = linia;    break;
        }

        if (nr_linii==7) 
            {
            nr_linii=0;
            nr_pytania++;
            }
        nr_linii++;
    }
    plik.close();

    //Losowanie pytan!!!

    srand(time(NULL));

    for(int i=0; i<12;i++)
    {
        do
        {

            l=rand()%licznik;
            flaga=true;

            for (int j=0; j<=wylosowane; j++)
            {
                if ((poprawne<5 && pytanie[l].poziom!="1" || l==losowanie[j]) || (poprawne>4 && poprawne<9 && pytanie[l].poziom!="2" || l==losowanie[j]) || (poprawne>8 && poprawne<12 && pytanie[l].poziom!="3" || l==losowanie[j]))
                flaga=false;
            }

            if(flaga=true)
            {
            losowanie[wylosowane]=l;
            wylosowane++;   
            }

        }while(flaga!=true);

        cout<<"Pytanie nr "<<i+1<<":"<<endl;
        cout<<pytanie[l].pytanie<<endl;
        cout<<"A. "<<pytanie[l].odpowiedz1<<endl;
        cout<<"B. "<<pytanie[l].odpowiedz2<<endl;
        cout<<"C. "<<pytanie[l].odpowiedz3<<endl;
        cout<<"D. "<<pytanie[l].odpowiedz4<<endl<<endl;

        cout<<"Twoja odpowiedz (wpisz a-d): ";
        cin>>odpowiedz;
        transform(odpowiedz.begin(), odpowiedz.end(), odpowiedz.begin(), ::tolower);

        if (odpowiedz==pytanie[l].poprawna)
        {
            cout<<"Dobrze! Przechodzisz dalej!"<<endl<<endl;
            poprawne++;
            getchar();getchar();
            system("cls");
        }
        if (odpowiedz!=pytanie[l].poprawna)
        {
            cout<<"Zle! Poprawna odpowiedz: "<<pytanie[l].poprawna<<endl;
            getchar();
            break;
        }
    }

    return 0;
}

Zawartość pliku tekstowego:

1
Jakiego koloru jest czerwony maluch?
Bialy
Zielony
Niebieski
Czerwony
d
1
Jakiego koloru jest zielony maluch?
Bialy
Zielony
Niebieski
Czerwony
b
1
Jakiego koloru jest bialy maluch?
Bialy
Zielony
Niebieski
Czerwony
a
1
Jakiego koloru jest niebieski maluch?
Bialy
Zielony
Niebieski
Czerwony
c
2
Typ zmiennych o nazwie float przechowuje:
liczby calkowite
napisy
liczby zmiennoprzecinkowe
pojedyncze znaki
c
2
Wstrzymanie wykonania programu na czas 2 sekund uzyskasz instrukcja:
Wait(2000)
Stop(2000)
Delay(2000)
Sleep(2000)
d
2
Ktora deklaracja jest zapisana poprawnie?
int x;
integer x;
x:integer;
x=integer;
a
2
Z jakiego przedzialu zostanie wylosowana liczba: rand()%10+2
0..9
2..9
2..11
0..11
c
3
Ile razy wykona sie petla: for (int i=4; i>=-2; i--)
ani razu
nieskonczenie wiele razy
6
7
d
3
Ile metrow ma kilometr?
100
1000
10000
sporo
b
3
Ile wynosi 2+2*2
6
8
222
2
a
3
Jakas nowa tresc
odp a
odp b
odp c
odp d
a

dodanie znacznika <code class="none"> - @furious programming

edytowany 1x, ostatnio: furious programming, 2015-06-16 00:51
Konkretne tagi - bez bzdetów typu if. Następnym razem będzie kosz! - olesio 2015-06-17 14:59

Pozostało 580 znaków

2015-06-15 18:18

Rejestracja: 5 lat temu

Ostatnio: 1 dzień temu

0
  1. Ta linijka to masakra, wątpię by komukolwiek kto będzie chciał Ci pomóc będzie się chciało to czytać

    if ((poprawne<5 && pytanie[l].poziom!="1" || l==losowanie[j]) || (poprawne>4 && poprawne<9 && pytanie[l].poziom!="2" || l==losowanie[j]) || (poprawne>8 && poprawne<12 && pytanie[l].poziom!="3" || l==losowanie[j]))

    Spróbuj to inaczej zapisać, będzie łatwiej innym i Tobie samemu ;)

  2. Czy plik tekstowy musi wyglądać w ten sposób? Można go napisać inaczej, przystępniej do pisania pod niego kodu.

  3. Ogólnie rozwiązaniem (pomijając rzekomą instrukcję if) może być napisanie kodu tak, by liczył linie w pliku i za każdym razem dotarcia do linijki zawierającej cyfrę określającą poziom trudności sprawdzał czy zgadza się on z zadaną. Jeśli tak - wyświetlaj, nie - losuj dalej.
    Napisz sobie jakiś prosty pseudokod i spróbuj to ugryźć nieco inaczej ;)

Pozostało 580 znaków

2015-06-15 20:29

Rejestracja: 4 lata temu

Ostatnio: 4 lata temu

0

Rozwiązałem już problem, oczywiście było to coś to najtrudniej wykryć, a mianowicie:

 if(flaga=true)
            {
            losowanie[wylosowane]=l;
            wylosowane++;    
            }

flaga=true zamiast flaga==true

tj. jak przedstawić jedną linijkę za pomocą 5, z dodatkowym wtfem - spartanPAGE 2015-06-15 20:40
Kolega chyba miał na myśli co innego :D W kodzie wyżej jest flaga=true a powinno być flaga==true - Narkan 2015-06-15 20:41
spartanPAGE nie wierze w to że to było zamierzone :D - hipekk 2015-06-15 22:05
if(flaga==true) { losowanie[wylosowane]=l; wylosowane++;} A co, miałem tak to zapisać? Jest to w moim przekonaniu mniej czytelne. - mafik1 2015-06-16 11:08
if(flaga) losowanie[wylosowane++] = l; - spartanPAGE 2015-06-16 11:10

Pozostało 580 znaków

2015-06-15 21:20

Rejestracja: 7 lat temu

Ostatnio: 33 minuty temu

0

mafik1 mam nadzieje że wiesz o tym że ten if (i istnienie tej flagi) w tej postaci traci sens i jest zawsze spełniony ?

Poprawne jest flaga== true, a nie flaga=true i działa. - mafik1 2015-06-16 11:10
Dokładnie, źle zrozumiałem Twój poprzedni post. Myślałem że zamieniłeś == na = :) - hipekk 2015-06-16 11:21

Pozostało 580 znaków

2015-06-16 11:06

Rejestracja: 4 lata temu

Ostatnio: 4 lata temu

0

Wszystko działa, więc if raczej jest ok, spełnia swoją funkcję, czyli sprawdza, czy taki numer pytania był już wylosowany oraz czy pytanie zostało wylosowane z odpowiedniego poziomu trudności. Jedyne co to może optymalizacja tego kodu, ale mój poziom programowania jest zbyt niski, żeby samemu sobie z tym poradzić, samo to, że udało mi się sprawić, że działa to jak należy już jest dla mnie sukcesem.

Pozostało 580 znaków

2015-06-16 11:10

Rejestracja: 16 lat temu

Ostatnio: 1 godzina temu

0

nie ma potrzeby pisania if(flaga==true), wystarczy if (flaga)

Pozostało 580 znaków

2015-06-17 12:04

Rejestracja: 4 lata temu

Ostatnio: 4 lata temu

0

Gra działa już całkiem fajnie, tylko czasem zawiesza się po 3 pytaniu, jakieś sugestie co do przyczyny? Czasem bez problemu można przejść 12 pytań, a czasem po 3 pytaniu jest pusta konsola. Może to być spowodowane podwojonym getcharem? Przy testowaniu odpowiadam dość szybko i szybko klikam entery, może wtedy getchar coś psuje.

 if (odpowiedz==pytanie[l].poprawna)
        {
            cout<<"Dobrze! Przechodzisz dalej!"<<endl<<endl;
            poprawne++;
            getchar();getchar();
            system("cls");
        } 

Pozostało 580 znaków

2015-06-18 19:00

Rejestracja: 4 lata temu

Ostatnio: 4 lata temu

0

Mam jeszcze jeden problem. Czy wie ktoś może jaki może być powód, że sortowanie działa rosnąco, ale gdy zmienię znak, by zrobić malejąco to już program się crashuje.


string pom;
    int pomwynik=0;

    for (int nr=0; nr<licznik; nr++)
    {
        for (int j=0; j<licznik-nr; j++)
        {
            if(top[j].wynik>top[j+1].wynik)
            {
                pom=top[j].nick;
                pomwynik=top[j].wynik;
                top[j].wynik=top[j+1].wynik;
                top[j].nick=top[j+1].nick;
                top[j+1].wynik=pomwynik;
                top[j+1].nick=pom;

            }
        }

    }

Pozostało 580 znaków

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