C pomoć - Simulacija kviza

mathware

Početnik
Poruka
2
Pozdrav.
Potrebna mi je pomoć oko sledećeg zadatka:

Definisati tip PITANJE kojim se reprezentuje jedno pitanje u nekom kvizu,
a čiji su atributi tekst pitanja (statički string), prvi odgovor (statički string), drugi odgovor (statički string),
treći odgovor (statički string), te redni broj tačnog odgovora (celi broj – 1, 2
ili 3).
Definisati tip KVIZ kojim se reprezentuje jedan kviz, a čiji su atributi broj pitanja (celi broj) i pitanja (dinamički niz).
Definisati funkciju koja dodaje novo pitanje u kviz, a čiji je prototip: void dodaj(KVIZ *k, PITANJE *p);
Definisati funkciju koja prikazuje pitanje (i ponuđene odgovore) čiji je redni broj rb. Prototip funkcije je: void prikazi_pitanje(KVIZ *k, int rb);
Definisati funkciju koja vraća informaciju o tome da li je odgovor, čiji je redni broj rbo, tačan odgovor na pitanje čiji je redni broj rb.
Prototip funkcije je: int tacan(KVIZ *k, int rb, int rbo);
U glavnom programu:
- definisati novi kviz, pa u njega dodati dva pitanja(sa pripadajućim ponuđenim odgovorima),
- korisniku redom prikazivati pitanja na standardni izlaz, a sa standardnog ulaza učitavati odgovore
korisnika. Korisnik odgovara tako što unosi redni broj odgovora: 1, 2 ili 3 (u suprotnom prikazatiporuku o greški i ponovo učitati odgovor na isto pitanje).
- na kraju, kada korisnik odgovori na sva pitanja, prikazati rezultat na standardni izlaz.
Napomena: Ukupan broj pitanja se dinamički alocira (nije unapred poznat ukupan broj pitanja jer korisnik manipuliše izbornikom).
Korisnik može manipulisati samo ponuđenim odgovorima na postavljeno pitanje,
kao i izbornikom koji mu omogućava da li želi da se doda naredno pitanje, prikaže rezultat, ili da korisnik terminira program.
To znači da korisnik sam određuje kad se kviz završava.
Nema korištenja datoteka, sav program se izvršava preko command prompt-a.

Primer izvršavanja programa:
Kod:
1. Koje godine je nastao programski jezik C?
1. 1852
2. 1872
3. 1972
Izaberite odgovor: 6
Greska (dozvoljene vrednosti su 1, 2 i 3)!
Izaberite odgovor: 3
2. Ko je autor programskog jezika C?
1. Bill Gates
2. Dennis Ritchie
3. Steve Jobs
Odgovor: 2
Rezultat: 100%

U ovom zadatku mi nekoliko stvari nije jasno:
1) Kako dodati pitanje u kviz, tj. gde treba definisati tekst pitanja (jer se tekst ne učitava, nego se automatski prikazuje kad korisnik hoće da doda novo pitanje)?
2) Pošto korisnik sam određuje kada će se program terminirati, kako definisati redosled pitanja koja dolaze kada ih korisnik
dodaje jedno po jedno (kada više nema definisanih pitanja valjda bi trebalo da se ispiše poruka o terminiranju programa, je li tako?)?
3) Tekst pitanja se ne definiše u datoteci, pa kako onda da se prikazuju na standarnom izlazu po redosledu kojim dolaze?

Unapred hvala.
 
1. Pitanje ti je klasa, ciji je jedan od clanova tekst pitanja, logicno je da se tekst pitanja inicijalizuje konstruktorom.
Znaci kada napravis klase Pitanja i Kviz kako treba moci ces u main() da uradis ovo:

Kod:
Kviz kviz1= Kviz(2, dimniz);
Pitanje pitanje1= Pitanje("Koje godine je nastao programski jezik C?","1852","1872","1972",3);
dodaj( kviz1,pitanje1);

A sto se tice prikazivanja, ako je zaisto potrebno da se automatski prikazuje mozes u konstruktoru pitanja odmah da uradis jedan cout , a mozes da napravis i funkciju prikazipitanje() u kojoj ce cout da bude, a mozes i da clana clase napravis kao public, pa direktno ga ispisujes.

2. Pise u tekstu da se pitanja prikazuju redom, a korisnik ne dodaje jedno po jedno pitanje, to radi programer. Korisnik samo bira da li hoce jos pitanja (kada programer napravi novi objekat klase Pitanje i doda ga u dinamicki niz objekta Klase kviz) ili nece, kada se izlazi iz programa. Ako se proslo kroz sva pripremljena pitanja, onda dobije neku poruku "Nema vise pitanja" i izlazi se iz programa. I u pravim kvizovima ukupan broj pitanja je ogranicen :)

3. Pa definises ih u main-u umesto u datoteci, najbolje u konstruktorima, mada mozes i kao staticke promenljive, pa onda konstruktor inicijalizujes promenljivom umesto direktno pitanjem, kao sto sam ja gore

Lep ti je zadatak, nadam se da sam pomogla ;)
 
Poslednja izmena:
Evo kako sam uradio zadatak koristeći jednostruku listu:
Kod:
#include <stdio.h>
#include <stdlib.h>
#define MAX 100000//maksimalan broj karaktera

typedef struct
{
    char tekst[MAX];
    char prvi[MAX],drugi[MAX],treci[MAX];
    int rb;//redni broj pitanja
    int rbto;//redni broj tacnog odgovora
}PITANJE;

typedef struct cvor_liste
{
    PITANJE pe;
    struct cvor_liste *next;
}CVOR_LISTE;//kviz se reprezentuje listom

void dodaj(CVOR_LISTE **glava,PITANJE *pe)//dodavanje pitanja u kviz(dodavanje u listu)
{
    CVOR_LISTE *novi=(CVOR_LISTE *)malloc(sizeof(CVOR_LISTE));
    novi->pe=*pe;
    if(*glava == 0 || (*glava)->pe.rb > pe->rb)
    {
        novi->next=*glava;
        *glava=novi;
    }
    else
    {
       CVOR_LISTE *p;
       for(p=*glava;p->next && p->next->pe.rb < pe->rb;p=p->next);
       novi->next=p->next;
       p->next=novi;
    }
}

CVOR_LISTE* pretrazivanje(CVOR_LISTE *glava,int rb)//pretrazivanje liste po rednom broju pitanja (1 ili 2)
{
   while(glava && glava->pe.rb != rb)
        glava=glava->next;
   return glava;
}

int main()
{
    CVOR_LISTE *glava=0;
    char izbornik;
    int rb;
    int ubp=0;//ukupan broj pitanja
    int ubtop=0;//ukupan broj tacno odgovorenih pitanja
    float rezultat;//ukupan rezultat u procentima
    PITANJE p1={"Koje godine je nastao programski jezik C?","1852","1872","1972",1,3};
    PITANJE p2={"Ko je autor programskog jezika C?","Bill Gates","Dennis Ritchie","Steve Jobs",2,2};
    PITANJE pe;

    printf("Opcija 'A': Dodaj prvo pitanje.\n");
    printf("Opcija 'B': Dodaj drugo pitanje.\n");
    printf("\n");

    do
    {
      printf("Izaberite opciju: ");
      scanf("%c",&izbornik);
      fflush(stdin);

       if(izbornik == 'A')
      {
            CVOR_LISTE *t1=pretrazivanje(glava,p1.rb);
            if(t1){
                t1->pe=p1;
                ubp++;}
            else{
                dodaj(&glava,&p1);//dodaj pitanje 'p2'
                ubp++;}
      }

      else if(izbornik == 'B')
      {
            CVOR_LISTE *t2=pretrazivanje(glava,p2.rb);
            if(t2){
                t2->pe=p2;
                ubp++;}
            else{
                dodaj(&glava,&p2);//dodaj pitanje 'p2'
                ubp++;}
      }

      else if(izbornik == 'P')
      {
         int odgovorKorisnika;//odgovor na prikazano pitanje koje se ucitava
         printf("Redni broj pitanja: ");
         scanf("%d",&rb);
         CVOR_LISTE *p=pretrazivanje(glava,rb);
         if(p)//ako pitanje sa unesenim rednim brojem postoji, prikazi ga i ucitaj odgovor korisnika
        {
           printf("%d %s\n 1. %s\n 2. %s\n 3. %s\n",
                    p->pe.rb, p->pe.tekst, p->pe.prvi, p->pe.drugi, p->pe.treci);

           do
           {
                printf("Izaberite odgovor: ");
                scanf("%d",&odgovorKorisnika);
                if(odgovorKorisnika != 1 && odgovorKorisnika != 2 && odgovorKorisnika != 3)
                    printf("Greska (dozvoljene vrednosti su 1,2 i 3).\n");
           }
           while(odgovorKorisnika != 1 && odgovorKorisnika != 2 && odgovorKorisnika != 3);

           if(odgovorKorisnika == p->pe.rbto){
                    printf("Odgovor na pitanje sa rednim brojem %d je tacan.\n",rb);
                    ubtop++;
                    fflush(stdin);
                    }
           else{
                    printf("Odgovor na pitanje sa rednim brojem %d nije tacan.\n",rb);
                    fflush(stdin);
               }
        }
         else
         {
            printf("Nema podataka o pitanju sa rednim brojem %d.\n",rb);
            fflush(stdin);
         }
      }

       else if(izbornik != '0')
      {
        printf("Nepoznata opcija.\n");
        fflush(stdin);
      }

    }
    while(izbornik != '0');

    rezultat=((float)ubtop * 100)/ubp;
    printf("Rezultat: %.2f%%",rezultat);

    return 0;
}

Međutim, ne znam da ga rešim primenom nizova (nizovi čija je dimenzija nepoznata, funkcije malloc/calloc i realloc).
Takođe, pogrešio sam u početnoj definiciji zadatka. Korisnik može da manipuliše samo ponuđenim odgovorima na postavljena pitanja (što se vidi iz primera izvšavanja programa u originalnom postu), tako da i u tom slučaju
prednost nad listom ima niz (lista zahteva izbornik sa opcijama).

Ako bi neko znao da modifikuje navedeni program sa listom u niz, bio bih zahvalan.
 
Evo kako sam uradio zadatak koristeći jednostruku listu:
Kod:
#include <stdio.h>
#include <stdlib.h>
#define MAX 100000//maksimalan broj karaktera

typedef struct
{
    char tekst[MAX];
    char prvi[MAX],drugi[MAX],treci[MAX];
    int rb;//redni broj pitanja
    int rbto;//redni broj tacnog odgovora
}PITANJE;

typedef struct cvor_liste
{
    PITANJE pe;
    struct cvor_liste *next;
}CVOR_LISTE;//kviz se reprezentuje listom

void dodaj(CVOR_LISTE **glava,PITANJE *pe)//dodavanje pitanja u kviz(dodavanje u listu)
{
    CVOR_LISTE *novi=(CVOR_LISTE *)malloc(sizeof(CVOR_LISTE));
    novi->pe=*pe;
    if(*glava == 0 || (*glava)->pe.rb > pe->rb)
    {
        novi->next=*glava;
        *glava=novi;
    }
    else
    {
       CVOR_LISTE *p;
       for(p=*glava;p->next && p->next->pe.rb < pe->rb;p=p->next);
       novi->next=p->next;
       p->next=novi;
    }
}

CVOR_LISTE* pretrazivanje(CVOR_LISTE *glava,int rb)//pretrazivanje liste po rednom broju pitanja (1 ili 2)
{
   while(glava && glava->pe.rb != rb)
        glava=glava->next;
   return glava;
}

int main()
{
    CVOR_LISTE *glava=0;
    char izbornik;
    int rb;
    int ubp=0;//ukupan broj pitanja
    int ubtop=0;//ukupan broj tacno odgovorenih pitanja
    float rezultat;//ukupan rezultat u procentima
    PITANJE p1={"Koje godine je nastao programski jezik C?","1852","1872","1972",1,3};
    PITANJE p2={"Ko je autor programskog jezika C?","Bill Gates","Dennis Ritchie","Steve Jobs",2,2};
    PITANJE pe;

    printf("Opcija 'A': Dodaj prvo pitanje.\n");
    printf("Opcija 'B': Dodaj drugo pitanje.\n");
    printf("\n");

    do
    {
      printf("Izaberite opciju: ");
      scanf("%c",&izbornik);
      fflush(stdin);

       if(izbornik == 'A')
      {
            CVOR_LISTE *t1=pretrazivanje(glava,p1.rb);
            if(t1){
                t1->pe=p1;
                ubp++;}
            else{
                dodaj(&glava,&p1);//dodaj pitanje 'p2'
                ubp++;}
      }

      else if(izbornik == 'B')
      {
            CVOR_LISTE *t2=pretrazivanje(glava,p2.rb);
            if(t2){
                t2->pe=p2;
                ubp++;}
            else{
                dodaj(&glava,&p2);//dodaj pitanje 'p2'
                ubp++;}
      }

      else if(izbornik == 'P')
      {
         int odgovorKorisnika;//odgovor na prikazano pitanje koje se ucitava
         printf("Redni broj pitanja: ");
         scanf("%d",&rb);
         CVOR_LISTE *p=pretrazivanje(glava,rb);
         if(p)//ako pitanje sa unesenim rednim brojem postoji, prikazi ga i ucitaj odgovor korisnika
        {
           printf("%d %s\n 1. %s\n 2. %s\n 3. %s\n",
                    p->pe.rb, p->pe.tekst, p->pe.prvi, p->pe.drugi, p->pe.treci);

           do
           {
                printf("Izaberite odgovor: ");
                scanf("%d",&odgovorKorisnika);
                if(odgovorKorisnika != 1 && odgovorKorisnika != 2 && odgovorKorisnika != 3)
                    printf("Greska (dozvoljene vrednosti su 1,2 i 3).\n");
           }
           while(odgovorKorisnika != 1 && odgovorKorisnika != 2 && odgovorKorisnika != 3);

           if(odgovorKorisnika == p->pe.rbto){
                    printf("Odgovor na pitanje sa rednim brojem %d je tacan.\n",rb);
                    ubtop++;
                    fflush(stdin);
                    }
           else{
                    printf("Odgovor na pitanje sa rednim brojem %d nije tacan.\n",rb);
                    fflush(stdin);
               }
        }
         else
         {
            printf("Nema podataka o pitanju sa rednim brojem %d.\n",rb);
            fflush(stdin);
         }
      }

       else if(izbornik != '0')
      {
        printf("Nepoznata opcija.\n");
        fflush(stdin);
      }

    }
    while(izbornik != '0');

    rezultat=((float)ubtop * 100)/ubp;
    printf("Rezultat: %.2f%%",rezultat);

    return 0;
}

Međutim, ne znam da ga rešim primenom nizova (nizovi čija je dimenzija nepoznata, funkcije malloc/calloc i realloc).
Takođe, pogrešio sam u početnoj definiciji zadatka. Korisnik može da manipuliše samo ponuđenim odgovorima na postavljena pitanja (što se vidi iz primera izvšavanja programa u originalnom postu), tako da i u tom slučaju
prednost nad listom ima niz (lista zahteva izbornik sa opcijama).

Ako bi neko znao da modifikuje navedeni program sa listom u niz, bio bih zahvalan.
u koju srednju ides? posto vam je profa bas zahtevan
 

Back
Top