Učlanjen(a)
13.05.2016
Poruka
1
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.
 
Član
Učlanjen(a)
18.12.2011
Poruka
15
Ako ne može da se koristi datoteka, mogao bi da koristiš klase da rešiš ovaj problem.
 
Učlanjen(a)
07.01.2014
Poruka
10
Misliš strukture? Klasa nema u C (ovo nije C++). U zadatku se traži, koliko vidim, da napravi dve strukture i sa typedef napravi tipove, ali ni meni iz teksta nije jasno odakle se učitavaju pitanja. Ja sam shvatio da korisnik sam treba da unese pitanja i odgovore i onda da ih, pretpostavljam, neko drugi rešava.
 
Član
Učlanjen(a)
10.11.2009
Poruka
1.654
Kod:
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    char pitanje[100];
    char prvi[100];
    char drugi[100];
    char treci[100];
    int rb;
} PITANJE;

typedef struct {
    PITANJE *pitanja;
    int n;
} KVIZ;

void dodaj(KVIZ *k, PITANJE *p) {
    if(k->n == 0) {
        k->pitanja = (PITANJE*)malloc(sizeof(PITANJE));
    }
    else {
        realloc(k->pitanja, sizeof(PITANJE) * (k->n + 1));
    }
    k->pitanja[k->n] = *p;
    k->n++;
}

void prikazi_pitanje(KVIZ *k, int rb) {
    printf("%d. %s\n", rb, k->pitanja[rb - 1].pitanje);
    printf("\t1. %s\n", k->pitanja[rb - 1].prvi);
    printf("\t2. %s\n", k->pitanja[rb - 1].drugi);
    printf("\t3. %s\n", k->pitanja[rb - 1].treci);
}

int tacan(KVIZ *k, int rb, int rbo) {
    return k->pitanja[rb - 1].rb == rbo;
}

int main()
{
    PITANJE p1 = {"Koje godine je nastao programski jezik C?", "1852", "1872", "1972", 3};
    PITANJE p2 = {"Ko je autor programskog jezika C?", "Bill Gates", "Dennis Ritchie", "Steve Jobs", 2};
    PITANJE p3 = {"Funkciju kojeg imena mora da sadrzi svaki C program?", "func", "glavna", "main", 3};

    KVIZ k;

    dodaj(&k, &p1);
    dodaj(&k, &p2);
    dodaj(&k, &p3);

    int t = 0, i;

    for(i = 1; i <= k.n; i++) {
        prikazi_pitanje(&k, i);
        int rb = -1;
        do {
            if(rb != -1) {
                printf("Greska (dozvoljene vrijednosti su 1, 2 i 3)!\n");
            }
            printf("Odgovor: ");
            scanf("%d", &rb);
        } while(rb > 3 || rb < 1);
        if(tacan(&k, i, rb)) {
            t++;
        }
    }
    printf("------------------------\n");
    printf("REZULTAT: %.2f%%", (float)t / k.n * 100);
    free(k.pitanja);
    return 0;
}
 
Učlanjen(a)
07.01.2014
Poruka
10
Kod:
void dodaj(KVIZ *k, PITANJE *p) {
    if(k->n == 0) {
        k->pitanja = (PITANJE*)malloc(sizeof(PITANJE));
    }
    else {
        realloc(k->pitanja, sizeof(PITANJE) * (k->n + 1));
    }
    k->pitanja[k->n] = *p;
    k->n++;
}

}

Ovo nije pravilno korišćenje funkcije
Kod:
realloc()
. Potrebno je preuzeti pokazivač koji ona vraća.

Druga stvar, zbog koje program puca, je što polje n u strukturi KVIZ se nigde ne inicijalizuje.
 
Član
Učlanjen(a)
21.09.2009
Poruka
243
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.
Evo definicija struktura i funkcija koje opisuju pitanje i kviz, kao i glavni program koji koristi te funkcije:
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STRING_LENGTH 100

// Struktura za pitanje
typedef struct {
    char tekst_pitanja[MAX_STRING_LENGTH];
    char prvi_odgovor[MAX_STRING_LENGTH];
    char drugi_odgovor[MAX_STRING_LENGTH];
    char treci_odgovor[MAX_STRING_LENGTH];
    int tacan_odgovor;
} PITANJE;

// Struktura za kviz
typedef struct {
    int broj_pitanja;
    PITANJE* pitanja;
} KVIZ;

// Funkcija za dodavanje novog pitanja u kviz
void dodaj(KVIZ* k, PITANJE* p) {
    k->broj_pitanja++;
    k->pitanja = (PITANJE*)realloc(k->pitanja, k->broj_pitanja * sizeof(PITANJE));
    k->pitanja[k->broj_pitanja - 1] = *p;
}

// Funkcija za prikazivanje pitanja
void prikazi_pitanje(KVIZ* k, int rb) {
    if (rb < 0 || rb >= k->broj_pitanja) {
        printf("Pitanje sa rednim brojem %d ne postoji.\n", rb);
        return;
    }

    PITANJE* p = &(k->pitanja[rb]);

    printf("Pitanje: %s\n", p->tekst_pitanja);
    printf("1. %s\n", p->prvi_odgovor);
    printf("2. %s\n", p->drugi_odgovor);
    printf("3. %s\n", p->treci_odgovor);
}

// Funkcija koja proverava da li je odgovor tačan
int tacan(KVIZ* k, int rb, int rbo) {
    if (rb < 0 || rb >= k->broj_pitanja) {
        printf("Pitanje sa rednim brojem %d ne postoji.\n", rb);
        return 0;
    }

    PITANJE* p = &(k->pitanja[rb]);

    return (rbo == p->tacan_odgovor);
}

int main() {
    KVIZ kviz;
    kviz.broj_pitanja = 0;
    kviz.pitanja = NULL;

    // Dodavanje prvog pitanja
    PITANJE pitanje1;
    strcpy(pitanje1.tekst_pitanja, "Koji je glavni grad Francuske?");
    strcpy(pitanje1.prvi_odgovor, "London");
    strcpy(pitanje1.drugi_odgovor, "Pariz");
    strcpy(pitanje1.treci_odgovor, "Rim");
    pitanje1.tacan_odgovor = 2;
    dodaj(&kviz, &pitanje1);

    // Dodavanje drugog pitanja
    PITANJE pitanje2;
    strcpy(pitanje2.tekst_pitanja, "Ko je napisao roman 'Rat i mir'?");
    strcpy(pitanje2.prvi_odgovor, "Fjodor Dostojevski");
    strcpy(pitanje2.drugi_odgovor, "Mihail Bulgakov");
    strcpy(pitanje2.treci_odgovor, "Lav Tolstoj");
    pitanje2.tacan_odgovor = 3;
    dodaj(&kviz, &pitanje2);

    int rb = 0; // Redni broj trenutnog pitanja

    while (1) {
        prikazi_pitanje(&kviz, rb);

        int rbo;
        printf("Unesite redni broj odgovora: ");
        scanf("%d", &rbo);

        if (rbo < 1 || rbo > 3) {
            printf("Pogrešan unos. Unesite redni broj od 1 do 3.\n");
            continue;
        }

        if (tacan(&kviz, rb, rbo)) {
            printf("Tačan odgovor!\n");
        } else {
            printf("Netačan odgovor.\n");
        }

        rb++; // Prelazak na sledeće pitanje

        char izbor;
        printf("Da li želite da nastavite sa sledećim pitanjem (N/n za kraj)? ");
        scanf(" %c", &izbor);

        if (izbor == 'N' || izbor == 'n') {
            break;
        }
    }

    // Oslobađanje memorije
    free(kviz.pitanja);

    return 0;
}

Ovaj program omogućava korisniku da unosi odgovore na postavljena pitanja i prikazuje rezultat na kraju. Pitanja se dodaju u kviz pomoću funkcije dodaj, a zatim se korisniku redom prikazuju pitanja i unose odgovori. Odgovori se proveravaju pomoću funkcije tacan, a kviz se završava kada korisnik unese 'N' ili 'n' kao odgovor na pitanje da li želi da nastavi sa sledećim pitanjem.

Napomena: U ovom programu nije obuhvaćena validacija korisničkog unosa u smislu grešaka pri unosu broja ili neispravnog odgovora na pitanje. Takođe, ovde se koristi statički niz za čuvanje stringova pitanja i odgovora, sa pretpostavkom da neće premašiti unapred definisanu maksimalnu dužinu MAX_STRING_LENGTH.
 
Natrag
Top