Pomoc oko kviza u c++

themarko

Početnik
Poruka
5
Imam zadatak da napravim kviz u C-u ili C++. moram da imam datoteku u kojoj ce biti smestena pitanja.... na ekranu ce biti ispisano pitanje i 4 ponudjena odgovora. konkretno, pomoc mi treba oko toga kad korisnik ukuca a, b, c ili d, kako da proverim da li je tacan ili netacan odgovor. je l' moguc laksi nacin od pozicioniranja u datoteci i provere posto bi trebalo da bude 15tak pitanja sa odgovorima koja ce redom izlaziti kad korisnik "odradi" prethodno itd. mala pomoc oko toga. hvala unapred.
 
pa ako je konzolna aplikacija(msm da jeste) onda to nije problem........evo ovih dana upravo radim 2 kviza, jedan sa 50 pitanja od kojih program nasumicno odabere 10 a drugi koji ima 6 oblasti po devet pitanja............evo kako ja to radim......imam .txt datoteeku u kojoj pise nesto ovako
Kod:
pitanje 1
odgovor 1
odgovor 2 
odgovor 3 
odgovor 4
2

e sada ova dvojka u zadnjem redu govori da je za ovo pitanje tacan odgovor br. 2 i onda samo napravi takvu datoteku i redom citaj u tri niz
Kod:
string NizPitanja[20],NizOdgovora[80];
int NizTacnihOdgovora[20];

stavis #include <conio.h>
procitas
stavis u for petlju
kad postavi svako pitanje
napisi
Kod:
char key;
key=getch();
i provjeri
Kod:
if (key==NizTacnihOdgovora[i]) Poeni++;

eto nije to nista strasno :D :D msm da sam ti uradio to :D
 
e ovako napravio sam ti jedan programicic koji pravi sablonsku *.txt datoteku kakva tebi treba...znaci kad budes pravio fajl pravi ovako kako ovaj program pravi
Kod:
#include <cstdlib>
#include <fstream>

using namespace std;

int main(int argc, char *argv[])
{
    ofstream file("pitanja.txt");
    for (int i=0;i<15;i++)
    {
        file <<i<<"-to pitanje\n";              //pise pitanje u fajl
        file <<i<<"-to pitanje odgovor 1\n";    // pise jedan odgovor u fajl
        file <<i<<"-to pitanje odgovor 2\n"; 
        file <<i<<"-to pitanje odgovor 3\n";    
        file <<i<<"-to pitanje odgovor 4\n";
        file << "a\n";                          //pise index tacnog odgovora a ovo se mora rucno prepraviti. Moze biti u intervalu [1,4]        
        file << "";
    }
    file.close();
    return EXIT_SUCCESS;
}

e ovo ti napravi *.txt i sada imas program tj. kviz koji radi uz pomoc ove datoteke :D

Kod:
//Nikola Ninkovic
//3.1.2011. 00:27
//Tema: Kviz za momka na krsti
//Kod : nije optimizovan
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
#include <conio.h>
using namespace std;

int main(int argc, char *argv[])
{
    ifstream file("pitanja.txt");
    string Pitanje,PomocniString;
    string NizOdgovora[4];
    int Poeni=0;
    char Key='0';
    char TacanOdgovor;
    for (int i=0;i<15;i++)
    {
        getline(file,Pitanje);
        cout << Pitanje<<endl;
        for (int j=0;j<4;j++)
        {
            getline(file,NizOdgovora[j]);
            cout << NizOdgovora[j]<<"\n";
        }
        Key=getch();                  // ovo je iz conio.h
        file  >> TacanOdgovor;
        getline(file,PomocniString);
        if (Key==TacanOdgovor)
        {
           cout << "Tacno!\n";
           Poeni++;
        }
    }
    cout << "Kraj\nOsvojili ste "<<Poeni<<" poena\n";
    file.close();   
    system("PAUSE");
    return EXIT_SUCCESS;
}

i to je to.......ako jos sta treba da se ubaci reci :D........samo mala napomena.....svi tacni odgovori su pod "a" a to moras da izmenis :)) eto :D
 
evo koda sa Pola-Pola pomoci

Kod:
//Nikola Ninkovic
//3.1.2011. 01:05
//Tema: Kviz za momka na krsti
//Kod : nije optimizovan
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
#include <conio.h>
#include <time.h>
using namespace std;

char PomocPolaPola(string oodg[4],char ttacan)
{
     int r1,r2;
     char t;
     r1=rand()%4;
     r2=rand()%2;
     int IndexTacnog;
     if (ttacan=='a') IndexTacnog=0;
     if (ttacan=='b') IndexTacnog=1;
     if (ttacan=='c') IndexTacnog=2;
     if (ttacan=='d') IndexTacnog=3;
     if (r1==IndexTacnog) r1=rand()%4;
     cout << "Pomoc Pola-Pola iskoristena!"<<endl;
     if (r2==0)
     {
               cout <<oodg[IndexTacnog]<<endl;
               cout <<oodg[r1]<<endl;     
               t='a';                
     }
     if (r2==1)
     {
               cout <<oodg[r1]<<endl;
               cout <<oodg[IndexTacnog]<<endl;   
               t='b';                               
     }
     return t;
}


int main(int argc, char *argv[])
{
    cout << "Kviz\nOdgovarate sa : 'a', 'b', 'c', 'd'.\nPomoc pola pola dobijate nakon unosenja 'p'.\n ";
    srand ( time(NULL) );
    ifstream file("pitanja.txt");
    string Pitanje,PomocniString;
    string NizOdgovora[4];
    int Poeni=0;
    char Key='0';
    char TacanOdgovor;
    int PolaPola=0;
    bool PomocIskoristena=false;
    for (int i=0;i<15;i++)
    {
        getline(file,Pitanje);
        cout << Pitanje<<endl;
        for (int j=0;j<4;j++)
        {
            getline(file,NizOdgovora[j]);
            cout << NizOdgovora[j]<<"\n";
        }
        Key=getch();                  // ovo je iz conio.h
        file  >> TacanOdgovor;
        if (Key=='p')
        {
                     if (PomocIskoristena==false)
                     {
                       PomocIskoristena=true;
                       TacanOdgovor=PomocPolaPola(NizOdgovora,TacanOdgovor);
                       Key=getch();
                     }
                     else { cout << "Pomoc pola pola je iskoristena i vise nemate pravo na nju!"<<endl; }
        }       
         
        getline(file,PomocniString);
        
        if (Key==TacanOdgovor)
        {
           cout << "Tacno!\n";
           Poeni++;
        }
    }
    cout << "Kraj\nOsvojili ste "<<Poeni<<" poena\n";
    file.close();   
    system("PAUSE");
    return EXIT_SUCCESS;
}
testiraj ga :D
 
Evo i moje implementacije funkcije za pomoc prijatelja.Nije nesto ali mislim da moze da posluzi.
PS.Sanse da prijatelj pogodi tacan odgovor je 75%.
Kod:
void PomocPr(string oodg[4],char ttacan){
     int odg_p[4],indexT,indexN,i;
     indexN=rand()%4;
     cout << "Upravo ste iskoristili pomoc prijatelja" << endl;
     if(ttacan=='a') indexT=0;
     if(ttacan=='b') indexT=1;
     if(ttacan=='c') indexT=2;
     if(ttacan=='d') indexT=3;
     if(indexT==indexN) indexN=rand()%4;
     i=rand()%4;
     odg_p[0]=indexT;
     odg_p[1]=indexN;
     odg_p[2]=indexT;
     odg_p[3]=indexT;
     cout << "Mislim da je tacan odgovor pod " << oodg[odg_p[i]] << endl;
}
 
Poslednja izmena:
Kod:
//Nikola Ninkovic
//4.1.2011. 21:12
//Tema: Kviz za momka na krsti
//Kod : nije optimizovan
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
#include <conio.h>
#include <time.h>
using namespace std;

char PomocPolaPola(string oodg[4],char ttacan)
{
     int r1,r2;
     char t;
     r1=rand()%4;
     r2=rand()%2;
     int IndexTacnog;
     if (ttacan=='a') IndexTacnog=0;
     if (ttacan=='b') IndexTacnog=1;
     if (ttacan=='c') IndexTacnog=2;
     if (ttacan=='d') IndexTacnog=3;
     if (r1==IndexTacnog) r1=rand()%4;
     cout << "Pomoc Pola-Pola iskoristena!"<<endl;
     if (r2==0)
     {
               cout <<oodg[IndexTacnog]<<endl;
               cout <<oodg[r1]<<endl;     
               t='a';                
     }
     if (r2==1)
     {
               cout <<oodg[r1]<<endl;
               cout <<oodg[IndexTacnog]<<endl;   
               t='b';                               
     }
     return t;
}



void PomocPr(string oodg[4],char ttacan){
     int odg_p[4],indexT,indexN,i;
     indexN=rand()%4;
     cout << "Upravo ste iskoristili pomoc prijatelja" << endl;
     if(ttacan=='a') indexT=0;
     if(ttacan=='b') indexT=1;
     if(ttacan=='c') indexT=2;
     if(ttacan=='d') indexT=3;
     if(indexT==indexN) indexN=rand()%4;
     i=rand()%4;
     odg_p[0]=indexT;
     odg_p[1]=indexN;
     odg_p[2]=indexT;
     odg_p[3]=indexT;
     cout << "Mislim da je tacan odgovor pod " << oodg[odg_p[i]] << endl;
}


char Ispisi_Uzmi(string oodg[4])
{
     char k;
     for (int i=0;i<4;i++)
     {
         cout << oodg[i]<<endl;
     }
     cout << "Unesite odgovor: \n";
     k=getch();
     return k;
}


int main(int argc, char *argv[])
{
    cout << "Kviz\nOdgovarate sa : 'a', 'b', 'c', 'd'.\nPomoc pola pola dobijate nakon unosenja 'p'.\nPomoc kompjutera dobijate nakon unosenja 'q'\n ";
    srand ( time(NULL) );
    ifstream file("pitanja.txt");
    string Pitanje,PomocniString;
    string NizOdgovora[4];
    int Poeni=0;
    char Key='0';
    char TacanOdgovor;
    int PolaPola=0;
    bool PomocIskoristenaPP=false,PomocIskoristenaPF=false;
    for (int i=0;i<15;i++)
    {
        getline(file,Pitanje);
        cout << Pitanje<<endl;
        for (int j=0;j<4;j++)
        {
            getline(file,NizOdgovora[j]);
            cout << NizOdgovora[j]<<"\n";
        }
        Key=getch();                  // ovo je iz conio.h
        file  >> TacanOdgovor;
        if (Key=='p')
        {
                     if (PomocIskoristenaPP==false)
                     {
                       PomocIskoristenaPP=true;
                       TacanOdgovor=PomocPolaPola(NizOdgovora,TacanOdgovor);
                       Key=getch();
                     }
                     else { 
                          cout << "Pomoc pola pola je iskoristena i vise nemate pravo na nju!"<<endl;
                          Key=Ispisi_Uzmi(NizOdgovora);
                          }
        }       
         
        if (Key=='q')
        {
                     if (PomocIskoristenaPF==false)
                     {
                         PomocIskoristenaPF==true;
                         PomocPr(NizOdgovora,TacanOdgovor);
                         cout << "Sada imate pravo da odogovorite ponovo! "<<endl;
                         for (int i=0;i<4;i++)
                         {
                             cout << NizOdgovora[i]<<"\n";
                         }
                         Key=getch();
                     }
                     else {
                          cout << "Pomoc prijatelja je iskoristena i vise nemate pravo na nju!\n";
                          Key=Ispisi_Uzmi(NizOdgovora);
                          }
        }
        getline(file,PomocniString);
        
        if (Key==TacanOdgovor)
        {
           system("CLS");
           cout << "Tacno!\n";
           Poeni++;
        }
        else 
        {
             system("CLS");
             cout << "Netacno\n";
        }
        
    }
    cout << "Kraj\nOsvojili ste "<<Poeni<<" poena\n";
    file.close();   
    system("PAUSE");
    return EXIT_SUCCESS;
}



evo ubacili smo i pomoc prijatelja ali je meni prilikom testiranja stalno za pomoc prijatelja izbacivalo ili prvi ili zadnji odgovor ( a ili d).......nzm probacu da vidim u cemu je problem:D


EDIT: Sve je ok svaka cast bravo za fiju hvala :D
 
Poslednja izmena:
evo da ti objasnim
ako u pitanja.txt imas nesto poput ovoga
Kod:
1-to pitanje
1-to pitanje odgovor 1
1-to pitanje odgovor 2
1-to pitanje odgovor 3
1-to pitanje odgovor 4
a
kada bi hteo da procitas tacan odgovor stavio bi:
Kod:
file >> TacanOdgovor
i sada to bi odradilo posao medjutim ostaje ti skoro cela jedna linija iza karaktera 'a' u pitanja.txt
i kada nebi bilo te linije koda sledeci put za prvo pitanje bi ti ucitao prazan red upravo zato sto se ove datoteke citaju linijski ili kako se vec kaze.......
probaj da uklonis
Kod:
getline(file,PomocniString)
pa ces da vidis dali sam u pravu :D
 
znam, probao sam bez toga, i kao sto kazete, nema pitanja...
znaci ono samo posle tacnog odgovora pokupi red do kraja i pozicionira na sledeci red? a zasto toga nema kod ostalih redova? sta se sa njima desava?

i da, ove promenljive za cuvanje pitanja i odgovora tipa string, posto ja nigde ne mogu da nadjem koji je to tip, koliko ima mesta itd, cak mi ga VB i ne prepoznaje kao sluzbenu rec (ali radi)... posto to sve treba skolski da bude odradjeno :) da probam sa char[max], s tim sto bi za odgovore trebao da imam dvodimenzijalni niz char [4][max]; a?
 
pa moze to svakako sa char[4][max] msm....i ja bih to uradio ali mi nisi precizirao sa ne smijem koristiti string klasu......medjutim to je glupost ne vidim sto nebi trebalo koristiti string iako nije jedan od osnovnih tipova.......al ok....:D.....smaram......samo ubaci char[4][max] umesto string NizTacnihOdgovora[4] :D......a ovo za getline().......ono pokupi red do kraja uvek.......bez obzira dali je odg. tacan ili ne :D
 
e ljudi pomagajte ako znate da radite u visual-u ... i c++ ... treba mi za maturu ... inace to me nikad nije zanimalo , pa ga nisam ni ucio .. ali sada mi treba ..... molim vas nek se neko javi ako zna .... treba da uradim zadatak ... poz
 
Evo i moje implementacije funkcije za pomoc prijatelja.Nije nesto ali mislim da moze da posluzi.
PS.Sanse da prijatelj pogodi tacan odgovor je 75%.
Kod:
void PomocPr(string oodg[4],char ttacan){
     int odg_p[4],indexT,indexN,i;
     indexN=rand()%4;
     cout << "Upravo ste iskoristili pomoc prijatelja" << endl;
     if(ttacan=='a') indexT=0;
     if(ttacan=='b') indexT=1;
     if(ttacan=='c') indexT=2;
     if(ttacan=='d') indexT=3;
     if(indexT==indexN) indexN=rand()%4;
     i=rand()%4;
     odg_p[0]=indexT;
     odg_p[1]=indexN;
     odg_p[2]=indexT;
     odg_p[3]=indexT;
     cout << "Mislim da je tacan odgovor pod " << oodg[odg_p[i]] << endl;
}

Ovo čini mi se daje 25% šanse da prijatelj pogodi tačan odgovor. Mislim da bi bilo bolje nešto ovako:
double sansa[15];
sansa[0] = 98;
sansa[1] = 95;
sansa[2] = 92;
sansa[3] = 87;
sansa[4] = 80;
sansa[5] = 73;
...
sansa[13] = 34;
sansa[14] = 30; // najmanja šansa da će pogoditi, jer je 25% šansa da bez ikakvog znanja pogodi tačan odgovor, pa je ovo malo više.

Ovo su šanse da će prijatelj pogoditi tačan odgovor. Onda stavimo rand da vraća vrijednost od 0 do 100. Sve što preostaje jeste da stavimo

if ((rand() - sansa[rbroj]) > 0)
kod u kojem prijatelj odabere tačan odgovor;
else
kod u kojem prijatelj odabere random jedan od 3 preostala netačna odgovora;
ispiši odgovor;

Odabir jednog od 3 preostala netačna odgovora može da se realizuje kao rand() % 4, pri čemu to ponavljamo dok god je rezultat rand() % 4 operacije jednak broju tačnog odgovora. Rezultat je da ako rand() % 4 vrati npr. 1, a drugi odgovor (sa indeksom 1) je tačan, onda ponavlja traženje nasumičnog broja.

Naravno, u slučaju da je već iskorištena pomoć pola-pola imamo jedan tačan i jedan netačan odgovor, pa ako nije uspjela šansa da pogodimo tačan odgovor onda će ponavljati ovu rand operaciju dok god je rezultat indeks tačnog odgovora ili indeks odgovora koji je izbačen uz pomoć pola-pola.

Pri tome još treba uzeti u obzir da kad ima duplo manje odgovora nakon pola-pola onda je veća šansa da će prijatelj pogoditi tačan odgovor. Ja bih ovdje to izračunao tako što bih rekao da je šansa da prijatelj pogriješi duplo manja nego kad nema pola-pola pomoći. To znači da će nakon pola-pola šansa za tačan odgovor prijatelja biti:
sansa1[0] = 99;
sansa1[1] = 97;
sansa1[2] = 96;
sansa1[3] = 93;
sansa1[4] = 90;
sansa1[5] = 86;
...
sansa[13] = 68;
sansa[14] = 65;

Ovo meni lično ne bi bilo dovoljno, smatram da bi trebala za par procenata šansa tačnog pogotka da bude niža za teža pitanja, ali nema veze, može i ovo. A uvijek se može i ovaj niz šansi ručno inicijalizovati, što uopšte nije problem.

Sad onaj gore dio malo izmjeniti:
bool pola; // true ako smo iskoristili pola-pola pomoć, false ako nismo

if ( (!pola) && ((rand() - sansa[rbroj]) > 0) || (pola && ((rand() - sansa1[rbroj]) > 0) )
kod u kojem prijatelj odabere tačan odgovor;
else
kod u kojem prijatelj odabere random jedan dostupan, a netačan odgovor;
ispiši odgovor;

Ovim smo postigli da će prijatelj odgovoriti tačno ako:
- nismo iskoristili pola-pola i računa se obična šansa za pogodak ili
- jesmo iskoristili pola-pola i računa se izmjenjena, nešto veća, šansa za pogodak

Što se tiče koda za random netačan odgovor to je najbolje preko f-ja za netačan odgovor, pri čemu jedna ima dva argumenta više nego druga i od toga da li smo iskoristili pola-pola pomoć zavisi koju pozivamo. Npr:

if ( (!pola) && ((rand() - sansa[rbroj]) > 0) || (pola && ((rand() - sansa1[rbroj]) > 0) )
kod u kojem prijatelj odabere tačan odgovor;
else if (!pola)
netacan1 (argument,..., tačanodg); // argument po imenu tačanodg služi da bi funkcija znala koji odgovor je tačan i da ponavlja postupak traženja ako se potrefi taj odgovor
else
netacan2 (argument,..., tačanodg, pola1, pola2); // tačanodg isto kao i gore + još i pola1 i pola2 kao indeksi ona dva odgovora koja su izbačena pozivom pomoći pola-pola
ispiši odgovor;
 

Back
Top