Niedziałający warunek if

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

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 ;)

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

  2. 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 ;)

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

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 ?

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.

0

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

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");
        } 
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;
				
			}
		}

	}

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