Or II Parcijala Tutorijali

Embed Size (px)

Citation preview

  • 8/17/2019 Or II Parcijala Tutorijali

    1/60

    Osnove računarstva  Tutorijal 6

    Berina Cocalić 

    Potrebno je napisati program koji će vršiti unos i sortiranje niza cjelobrojnih brojeva. Elemente niza treba

    sortirati od najmanjeg ka najvećem, a potom je potrebno ispisati sortirani niz. Za sortiranje koristiti Bubble sort  

    algoritam.

    sortiranje niza od manjeg ka većem  sortiranje niza od većeg ka manjem 

    #include #define velicina 10

     /*Za duzinu niza se koristi simbolicka konstanta*/  

    int main() { 

    int niz[velicina]; int i; 

     /* Unos niza*/  for ( i = 0; i

  • 8/17/2019 Or II Parcijala Tutorijali

    2/60

    Osnove računarstva  Tutorijal 6

    Berina Cocalić 

    Napisati program koji traži da se unesu dva niza cijelih pozitivnih brojeva A i B čija dužina ne prelazi 10

    elemenata. Nakon unosa, nizove A i B je potrebno spojiti u novi niz C koji je potrebno ispisati na ekranu. Prilikom

    unosa nizova A i B koristiti koristiti unos broja -1 kao kraj unosa.

    #include  

    #define velicina 10  /* Za duzinu niza se koristi simbolicka konstanta*/  

    int main() { 

    int A[velicina]; int a_vel = 0; 

     /*Unos niza A.*/  printf("Unesite elemente niza A:"); do { 

    scanf("%i", &A[a_vel]); } while (A[a_vel] != -1 && ++a_vel

  • 8/17/2019 Or II Parcijala Tutorijali

    3/60

    Osnove računarstva  Tutorijal 6

    Berina Cocalić 

    Potrebno je napisati program koji de iz unesenog niza izbaciti elemente koji imaju određenu vrijednost. Odkorisnika se traži da unese niz pozitivnih cijelih brojeva koji ima maksimalnu dužinu od 100 elemenata, a potom

    se traži da se unese broj koji je potrebno izbaciti. Program treba da iz unesenog niza izbaci sve pojave unesenog

    broja, i potom ispiše novi niz na ekranu. Prilikom unosa niza, koristiti unos broja -1 kao kraj unosa.

    #include  #define velicina 100 

     /* Za duzinu niza se koristi simbolicka konstanta*/  

    int main() { 

    int niz[velicina]; int niz_vel = 0;  /*Varijabla koja cuva broj unesenih elemenata*/  

     /*Unos niza*/  printf("Unesite niz od maksimalno 100 elemenata (-1 + ENTER za kraj unosa): "); do { 

    scanf("%i", &niz[niz_vel]); } while ( niz[niz_vel] != -1 && ++niz_vel

  • 8/17/2019 Or II Parcijala Tutorijali

    4/60

    Osnove računarstva  Tutorijal 6

    Berina Cocalić 

    Napisati program koji učitava realnu matricu dimenzija 10 x 10 te pronalazi najmanji/najveći element na glavnojdijagonali.

    najmanji element na glavnoj dijagonali najveći element na glavnoj dijagonali 

    #include  #define velicina 10 

     /* Za velicinu matrice se koristi simbolicka

    konstanta*/  

    int main() { 

    float matrica[velicina][velicina]; int i, j; 

     /*Unos matrice*/  printf("Unesite matricu dimenzija 10 x 10: "); for (i = 0; i

  • 8/17/2019 Or II Parcijala Tutorijali

    5/60

    Osnove računarstva  Tutorijal 6

    Berina Cocalić 

    Napisati program koji učitava realnu matricu dimenzija A x B (gdje su A i B konstante), a potom pronalazi sumuelemenata na rubu matrice. Rub mat rice sačinjavaju elementi prvog i zadnjeg reda, te prve i zadnje kolone. Pri

    sabiranju voditi računa da elementi u ćoškovima ne budu uračunati dva puta. 

    #include  #define A 4 

    #define B 4  /* Za velicinu matrice se koriste se simbolicke konstante*/  

    int main() { 

    float matrica[A][B]; int i, j; 

     /*Unos matrice*/  printf("Unesite matricu dimenzija %i x %i: ", A, B); for (i = 0; i

  • 8/17/2019 Or II Parcijala Tutorijali

    6/60

    Osnove računarstva  Tutorijal 6

    Berina Cocalić 

    Napisati program koji učitava matricu dimenzija 10 x 10, a potom nalazi red sa najvećim i najmanjim elementommatrice. Ako su oba elementa u ist om redu, program treba ispisati odgovarajuću poruku i završiti sa radom. U

    suprotnom, potrebno je u matrici zamijeniti pronađene redove i potom ispisati rezultirajuću matricu.

    #include  #define velicina 10 

     /* Za dimenziju matrice se koristi simbolicka konstanta*/  

    int main() { 

    int matrica[velicina][velicina]; int i, j; 

     /*Unos matrice*/  printf("Unesite matricu dimenzija %i x %i: ", velicina, velicina); for ( i = 0; i

  • 8/17/2019 Or II Parcijala Tutorijali

    7/60

    Osnove računarstva  Tutorijal 7

    Berina Cocalić 

    Pot rebno je napisati program koji će učitati niz od pet cijelih brojeva, a potom iscrtati grafikon koji prikazuje te

    brojeve. Za iscrtavanje je potrebno napisati funkciju. Pokušajte prepraviti program tako da se grafikon iscrtava

    koristeći neke druge znak ove osim zvjezdica.

    #include  #define velicina 5 

     /*Funkcija za crtanje zvjezdica*/  void crtaj (int broj) { 

    int i = 0; for ( i = 0; i

  • 8/17/2019 Or II Parcijala Tutorijali

    8/60

    Osnove računarstva  Tutorijal 7

    Berina Cocalić 

    Potrebno je napraviti funkciju koja računa faktorijel datog broja, a potom iskoristiti tu funkciju za računanjevrijednosti sljećedeg konačnog reda:

    ∑ !

    =  + 2! +

    3! +

    4! + ⋯ +

    !

     

    #include  

     /*Funkcija za racunanje faktorijela*/  long faktorijel (int broj) { 

    int i; long fakt = 1; for ( i = 1; i

  • 8/17/2019 Or II Parcijala Tutorijali

    9/60

    Osnove računarstva  Tutorijal 7

    Berina Cocalić 

    Potrebno je napraviti funkciju koja kao rezultat vraća 1 ako je proslijeđeni broj prost, a u slučaju da broj nijeprost, funkcija vraća rezultat 0. Prototip funkcije treba da izgleda ovako: int prost (int broj) .

    Potom je potrebno iskoristiti napravljenu funkciju kako bi se napravio program koji ispisuje sve proste brojeve

    između 1 i 100. 

    #include  

     /*Funkcija za ispitivanje proslijedjenog broja*/  int prost (int broj) { 

    int i; 

    for ( i = 2; i

  • 8/17/2019 Or II Parcijala Tutorijali

    10/60

    Osnove računarstva  Tutorijal 7

    Berina Cocalić 

    Napraviti funkciju koja računa sinus broja koristeći sljedeći Taylorov razvoj:

    ∑(1)− −

    (21)!

    3! +5!

    7! + ⋯ +

    −(21)!

     

    Za računanje stepena broja koristiti funkciju pow 

     koja se nalazi u bibliotecimath.h

    . Prototip funkcije zaračunanje sinusa treba da izgleda ovako: double sinus (double x, int n) .

    Nakon što napravite funkciju, potrebno je testirati tako što napravite program koji će rezultate funkcije poreditisa rezultatima ugrađene f unkcije sin koja se nalazi u biblioteci math.h.

    #include  #include  

     /*Funkcija za racunanje faktorijela*/  double faktorijel (int broj) { 

    int i; double fakt = 1; for ( i = 1; i

  • 8/17/2019 Or II Parcijala Tutorijali

    11/60

    Osnove računarstva  Tutorijal 7

    Berina Cocalić 

    Potrebno je napraviti program koji na ekranu ispisuje vrijednosti Pascalovog trougla. Svaki broj u Pascalovom

    trouglu je jednak sumi dva broja koji se nalaze iznad njega. Program treba da traži unos broja redova, a potom

    treba da ispiše vrijednosti članova trougla.

    #include  

    int trougao(int a, int b) { 

     /*Ako je u pitanju prva kolona, ili dijagonala, vrati 1*/  if ( b==1 || a==b ) 

    return 1; else  /*Ako nije, vrati zbir elemenata iznad.*/  

    return trougao(a-1,b) + trougao(a-1,b-1); }

    int main() { 

    int i, j, n; 

    printf ("Unesite broj redova trougla: "); 

    scanf("%d", &n);

     /*Ispisivanje elemenata pozivanjem funkcije koja odredjuje svaki sljedeci*/  for(i = 1; i

  • 8/17/2019 Or II Parcijala Tutorijali

    12/60

    Osnove računarstva  Tutorijal 8

    Berina Cocalić 

    Napisati funkciju koja će, za dati pozitivan cijeli broj x , na ekranu ispisati najveću i najmanju cifru tog broja. Potom

    napisati program koji testira tu funkciju.

    #include  

    void minmax(int a) { 

    int najveca = 0, najmanja = 9; 

    while (a > 0) { 

     /*Odredjivanje najvece i najmanje cifre*/  if (a%10 > najveca) 

    najveca = a%10; 

    if (a%10 

  • 8/17/2019 Or II Parcijala Tutorijali

    13/60

    Osnove računarstva  Tutorijal 8

    Berina Cocalić 

    Napisati funkciju koja kao rezultat vraća njoj proslijeđen pozitivni cijeli broj okrenut naopako. Primjerice, ako se

    funkciji proslijedi broj 12345, funkcija treba da kao rezultat vrati broj 54321. Za rješavanje problema ne koristiti

    nizove. Potom napisati program koji testira napisanu funkciju.

    #include  

    int rikverc(int a) { 

    int naopaki = 0; 

    while (a > 0) { 

    naopaki = naopaki*10 + a%10; a/=10; 

    return naopaki; } 

    int main() { int broj; 

     /*Unos broja*/  printf ("Unesite broj: "); scanf("%d", &broj); 

     /*Poziv funkcije koja okrece broj*/  printf("Broj okrenut naopako glasi: %i", rikverc(broj)); 

    return 0; } 

  • 8/17/2019 Or II Parcijala Tutorijali

    14/60

    Osnove računarstva  Tutorijal 8

    Berina Cocalić 

    Napisati funkciju koja će, za dati pozitivan cijeli broj  x , kao rezultat vratiti razliku najveće i najmanje cifre broja.

    Primjerice, ako se funkciji kao argument proslijedi broj 12345, ona kao rezultat treba da vrati broj 4 jer je najveća

    cifra broja 5, a najmanja je 1. Potom napisati program koji testira tu funkciju.

    #include  

    void minmax(int a) { 

    int najveca = 0, najmanja = 9; 

    while (a > 0) { 

     /*Odredjivanje najvece i najmanje cifre*/  if (a%10 > najveca) 

    najveca = a%10; 

    if (a%10 

  • 8/17/2019 Or II Parcijala Tutorijali

    15/60

    Osnove računarstva  Tutorijal 8

    Berina Cocalić 

    Napisati program koji traži od korisnika da unese osam realnih brojeva koji predstavljaju mjerenja temperature

    tokom jednog dana. Program potom treba da ispiše najveću i prosječnu izmjerenu temperaturu. Za rješavanje

    problema napraviti dvije funkcije. Prva funkcija treba da pronađe najveću temperaturu u proslijeđenom nizu i

    treba da ima sljedeći prototip: float maksimum(float temperature[8]);. 

    Druga funkcija treba da pronađe prosječnu temperaturu koristeći proslijeđeni niz i treba da ima sljedeći prototip:

    float prosjek(float temperature[8]);.

    Modifikovati rješenje zadatka tako da broj mjerenja nije konstantan, nego se unosi sa tastature. Da bi ove

    funkcije znale koliko je elemenata korisnik unio, potrebno im je taj broj proslijediti kao parametar. Sa takvom

    modifikacijom, prototip za funkciju koja nalazi najveću temperaturu će sada izgledati ovako:

    float maksimum(float temperature[], int broj_unosa);

    verzija 1 verzija 2 

    #include  #define vel 8 

    float maksimum(float temperature[8]) { float najveca=temperature[0]; int i; 

     /*Trazenje najvece temperature*/  for(i = 0; i  najveca) najveca = temperature[i]; 

    return najveca; }

    float prosjek(float temperature[8]) { 

    float suma = 0; int i; 

     /*Racunanje prosjecne temperature*/  for (i = 0; i

  • 8/17/2019 Or II Parcijala Tutorijali

    16/60

    Osnove računarstva  Tutorijal 8

    Berina Cocalić 

    Napraviti funkciju koja u datom nizu cijelih brojeva pronalazi drugi element po veličini i vraća indeks tog člana

    u nizu.

    #include  #define vel 100 /*Maksimalni broj elemenata niza*/ 

    int drugi (int niz[], int velicina) { 

    int najveci = 0; int i = 0, flag = 0, indeks; 

     /*Trazenje najveceg elementa*/  for (i = 0; i = najveci) najveci = niz[i]; 

    int drugi = 0; 

     /*Trazenje drugog najveceg elementa, ako ima vise istih vracamo drugi najveci sa lijeve strane.*/  for (i = velicina - 1; i >= 0; i--) { 

    if (niz[i] >= drugi && niz[i] != najveci) { 

    drugi = niz[i]; indeks = i; flag = 1;  /*Ako je vrijednost varijable 'drugi' makar jednom promijenjena, znaci da nisu svi

    elementi niza isti*/  } 

     /*Provjera da li su svi elementi isti*/  if (najveci == 0 || flag == 0) 

    indeks = -1; 

    return indeks; } 

    int main () { 

    int niz[vel]; int i = 0; 

     /*Unos niza*/  printf("Unesite niz brojeva:"); 

    do 

    {  scanf("%i", &niz[i]); } while (niz[i] != -1 && i++ 

  • 8/17/2019 Or II Parcijala Tutorijali

    17/60

    Osnove računarstva  Tutorijal 9

    Berina Cocalić 

    Potrebno je napisati funkciju koja kao parametar prima niz realnih brojeva proizvoljne dužine, a zatim sve

    brojeve u nizu zaokružuje na jednu decimalu. Pri rješavanju zadatka je obavezno korištenje pokazivačke

    aritmetike. Dakle, u programu nije dozvoljeno pristupati članovima niza korištenjem uglastih zagrada. 

    #include  

    #define vel 100 

    void zaokruzi(float* pok, int velicina) 

    int i; 

    float temp; 

     /*Zaokruzivanje brojeva na jednu decimalu*/  

    for(i=0; i

  • 8/17/2019 Or II Parcijala Tutorijali

    18/60

    Osnove računarstva  Tutorijal 9

    Berina Cocalić 

    Potrebno je napisati funkciju sortiraj koja slaže po veličini niz realnih brojeva, pri čemu se dužina niza funkciji

    prosljeđuje kao argument. Nakon pisanja funkcije, napraviti kratki program koji je testira. Kao i u prethodnom

    zadatku, za rješavanje je obavezno korištenje pokazivačke aritmetike. 

    #include  

    #define vel 100 

    void sortiraj(float* pok, int velicina) 

    int i,j; 

     /*Sortiranje*/  

    for(i=0; i

  • 8/17/2019 Or II Parcijala Tutorijali

    19/60

    Osnove računarstva  Tutorijal 9

    Berina Cocalić 

    Napisati funkciju koja prima dvodimenzionalni niz cijelih brojeva i ispisuje ga na ekranu kao tabelu. Zadatak

    riješite korištenjem nizova, a potom korištenjem pokazivačke aritmetike. 

    korištenjem nizova  korištenjem pokazivačke aritmetike 

    #include  

    #define vel 3 

    void ispisi(int matrica[][vel]) 

    int i,j; 

     /*Ispis*/  

    for(i=0; i

  • 8/17/2019 Or II Parcijala Tutorijali

    20/60

    Osnove računarstva  Tutorijal 9

    Berina Cocalić 

    Napisati funkciju koja vrši zamjenu dva broja. Primjerice, ako je funkcija pozvana sa varijablama a=3 i b=5 ,

    nakon poziva funkcije vrijednosti tih varijabli trebaju biti a=5  i b=3.

    #include  

    void zamijeni(int* a, int* b) 

    int temp; 

    temp=*a; 

    *a=*b; *b=temp; 

    int main() 

    { int a, b; 

     /*Unos dva broja*/  

    printf("Unesite broj a:"); 

    scanf("%i", &a); 

    printf("Unesite broj b:"); scanf("%i", &b); 

     /*Poziv funkcije koja mijenja*/  

    zamijeni(&a, &b); 

    printf("\nBroj a je: %i, a broj b je %i.", a, b); 

    return 0; 

  • 8/17/2019 Or II Parcijala Tutorijali

    21/60

    Osnove računarstva Tutorijal 10

    Berina Cocalić 

    Potrebno je napisati program koji učitava niz znakova (string) koristeći funkciju unos. Potom program treba da

    traži unos znaka i pozove funkciju  prebrojavanje koja treba da nađe broj ponavljanja znaka u datom stringu.

    Dopuniti program funkcijom koja prebrojava koliko ukupno ima slova u stringu. Potom dodati poziv ove funkcije

    u glavnu funkciju programa. Prototip funkcije bi trebao biti sljedeći: int duzina(char* string) . 

    Dopuniti program dodavanjem funkcije samoglasnici koja će kao rezultat vraćati broj samoglasnika uproslijeđenom stringu. Pri implementaciji funkcije je potrebno paziti na mala i velika slova. Nakon dodavanja

    funkcije, dodati poziv iste u glavnu funkciju programa. Prototip funkcije treba da bude sljedeći:int samoglasnici (char* string) . 

    #include  

     /*Funkcija za unos novog stringa*/  void unos(char* string, int duzina) { 

    int i = 0; 

    char c; 

    do { 

    c = getchar(); string[i] = c; i++; 

    } while(c != '\n' && i = 'A' && *(string) = 'a' && *(string) 

  • 8/17/2019 Or II Parcijala Tutorijali

    22/60

    Osnove računarstva Tutorijal 10

    Berina Cocalić 

    Napisati funkciju k oja u proslijeđenom stringu sva mala slova pretvara u velika. Rezultat funkcije treba da budepokazivač na prvi znak stringa, tj. isti koji  je i proslijeđen funkciji; ovo omogućava lančano pozivanje ovakvih

    funkcija. Nakon toga napisati program koji poziva ovu funkciju. Prototip funkcije treba da bude sljedeći:char* velika(char* string) . 

    #include  

     /*Funkcija za unos stringa*/  void unos(char* string, int duzina) { 

    int i = 0; char c; 

    do { 

    c = getchar(); string[i] = c; i++; 

    } while(c != '\n' && i ='a' && *string

  • 8/17/2019 Or II Parcijala Tutorijali

    23/60

    Osnove računarstva Tutorijal 10

    Berina Cocalić 

    Napisati funkciju koja vraća broj riječi koje se nalaze u proslijeđenom stringu. Radi jednostavnosti zadatka,

    pretpostaviti da je riječ bilo koji niz znakova razdvojen znakom razmaka. Prototip funkcije treba da bude

    sljedeći: int broj_rijeci(char* string) .

    #include  

     /*Funkcija za unos stringa*/  void unos(char* string, int duzina) { 

    int i = 0; char c; 

    do { 

    c = getchar(); string[i] = c; i++; 

    } while(c != '\n' && i

  • 8/17/2019 Or II Parcijala Tutorijali

    24/60

    Osnove računarstva Tutorijal 10

    Berina Cocalić 

    Potrebno je implementirati funkciju iz biblioteke string.h Funkcija vrši poređenje dva stringa po abecedi i vraćacjelobrojnu vrijednost: 0 ako su stringovi jednaki, broj manji od nule ako je prvi string abecedno ispred drugog,

    broj veći od nule ako je drugi string abecedno ispred prvog. Ako su dva stringa različite dužine, a identični su do

    kraja kraćeg stringa, smatra se da je kraći string ispred prvog. Funkcija treba da ima sljedeći prototip:int strcmp(const char* prvi, const char* drugi) .

    #include  #define vel 15 

    void unos(char* string) { 

    int i = 0; char c; 

     /*Unos stringa*/  do { 

    c = getchar(); string[i] = c; i++; 

    } while(c != '\n' && i

  • 8/17/2019 Or II Parcijala Tutorijali

    25/60

    Osnove računarstva Tutorijal 10

    Berina Cocalić 

    Prepraviti prethodni program tako da funkcija prima i parametar koji predstavlja logičku vrijednost kojaodređuje da li de se pri poređenju uzimati u obzir razlika između velikih i malih slova ili ne. Prototip funkcije

    sada treba da izgleda ovako: int strcm(const char* prvi, const char* drugi, int velikamala) .

    #include  #define vel 15 

    void unos(char* string) { 

    int i = 0; char c; 

     /*Unos stringa*/  do { 

    c = getchar(); string[i] = c; i++; 

    } while(c != '\n' && i ='A' && *(prvi+i)='A' && *(drugi+i

    )

  • 8/17/2019 Or II Parcijala Tutorijali

    26/60

    Osnove računarstva  Dodatni zadaci iz stringova

    Berina Cocalić 

    Napisati funkciju rot13() koja vrši šifrovanje i ujedno dešifovanje primljenog stringa po ROT13 algoritmu.

    ROT13 algoritam znači da se svako slovo u primljenom t ekstu zamjenjuje slovom koje je udaljeno za 13 mjesta uengleskoj abecedi. Npr. slovo A se zamjenjuje slovom N, slovo B slovom O itd. Ako se pri brojanju mjesta dođe do

    slova Z, brojanje se nastavlja od početka, pa se npr. slovo M zamjenjuje slovom Z, a slovo N se zamjenjuje slovomA jer smo krenuli od početka abecede, slovo O se zamjenjuje slovom B itd. Iz ovoga vidimo da ista funkcija radi i

    šifrovanje i dešifrovanje teksta pošto engleska abeceda ima tačno 26 slova. 

    Pazite da se u funkciji velika slova zamjenjuju velikim, a mala malim, dok ostale znakove (razmake, brojeve itd.)

    ostavljate nepromijenjenim. Funkcija treba da prima string preko pokazivača a ne vraća ništa (tipa je void). Napišite i glavni program u kojem se unosi string, poziva funkcija i zatim ispisuje (de)šifrovani string. 

    #include  #define vel 15 

    void unos(char* string) { 

    int i = 0; char c; 

     /*Unos stringa*/  do { 

    c = getchar(); string[i] = c; i++; 

    } while(c != '\n' && i ='A' && *string='a' && *string='N' && *string='n' && *string

  • 8/17/2019 Or II Parcijala Tutorijali

    27/60

    Osnove računarstva  Dodatni zadaci iz stringova

    Berina Cocalić 

    Napraviti funkciju koja prima string koji predstavlja rečenicu i neki cijeli broj n, a zatim iz rečenice izbacuje n-

    tu po redu riječ. Ako je n manje od jedan ili veće od broja riječi u stringu, f unkcija ne treba uraditi ništa. 

    Riječ se u ovom zadatku definiše kao neprekinuti niz velikih i malih slova. Svaki drugi karak ter u stringu (tačka,

    zarez, minus itd.) smatraće se prekidom riječi. Npr. ako je dat string "Auto-Stop", smatraće se da se on sastoji iz

    dvije riječi od po četiri slova. Napravite i kraći glavni program koji demonstrira korištenje ove funkcije. 

    #include  #define duzina 50 

    void unos (char* string) { 

    char c; int i=0; 

    do 

    { c=getchar(); string[i]=c; i++; 

    } while(c != '\n' && i  'Z' && *string  'Z' && *(string+i) = 'A' && *(string+i+1) <= 'Z') || (*(string+i+1) >= 'a' && *(string+i+1)<='z') || *(string+i+1)=='\0')) 

    { i++; k++; 

     /*Brisanje rijeci, tj. pomjeranje ostatka stringa

    ulijevo za broj slova u rijeci*/  if (++broj_rijeci == rijec) { 

    do { 

    *(string+i-k) = *(string+i); string++; 

    } while (*(string+i-k)!='\0'); *(string+i-k)='\0'; break; 

     /*k pamti duzinu zadnje rijeci pa se

    nakon svake rijeci restartuje*/  k = 0; 

    k++; i++; 

    } } 

    int main() { 

    char recenica[duzina]; printf("Unesite recenicu: "); unos(recenica); 

    int n; printf("Unesite koju rijec zelite

    izbaciti:"); scanf("%i", &n); 

    izbaci(recenica, n); 

     /*Ispis promijenjene recenice*/  printf("\nRecenica: %s", recenica); 

    return 0; }

     

  • 8/17/2019 Or II Parcijala Tutorijali

    28/60

    Osnove računarstva  Dodatni zadaci iz stringova

    Berina Cocalić 

    Napraviti funkciju sa prototipom: char*  whitespace (char*  string)  koja u datom stringu zamjenjuje sve

    "whitespace" znakove jednim razmakom. Dakle, novi redovi ('\n') i tabovi ('\t') trebaju biti zamijenjeni

    razmakom. Takođe, ukoliko se javlja više razmaka zaredom, treba ih zamijeniti jednim razmakom. Ovo uključuje

    i kombinacije razmak-tab ili razmak-novi red.

    #include  #define duzina 100 

    void unos (char* string) { 

    char c; int i=0; do { 

    c=getchar(); string[i]=c; i++; 

    } while(c != '\n' && i

  • 8/17/2019 Or II Parcijala Tutorijali

    29/60

    Osnove računarstva  Dodatni zadaci iz stringova

    Berina Cocalić 

    Napraviti funkciju koja iz datog stringa, koji predstavlja C kod, izbacuje sve komentare. Funkcija treba da

    podržava komentare u C stilu: /* komentar */ i u C++ stilu: // komentar.....

    Napravite i kraći program koji demonstrira korištenje ove funkcije. U zadatku je zabranjeno korištenje funkcija

    iz biblioteke string.h.

    #include  #define duzina 100 

    void unos (char* string) { 

    char c; int i=0; 

    do { 

    c=getchar(); string[i]=c; i++; 

    } while(c != '\n' && i

  • 8/17/2019 Or II Parcijala Tutorijali

    30/60

    Osnove računarstva  Dodatni zadaci iz stringova

    Berina Cocalić 

    Napraviti funkciju koja u datom stringu sve riječi dužine 10 ili više slova pretvara u skraćeni oblik - prva tri

    slova i znak tačka.

    Primjer:

    Ulaz: Za vrijeme promjena specifikacija moze doci do poremecaja tolerancije izlaznog proizvoda.

    Izlaz: Za vrijeme promjena spe. moze doci do por. tol. izlaznog proizvoda.Radi jednostavnosti, ne trebate posebno tretirati znakove interpunkcije. Riječ je svaki dio teksta koji je

    ograničen sa jednim ili više razmaka. 

    #include  #define vel 100 

     /*Funkcija za unos stringa*/  void unos (char* string) { 

    char c; int i=0; 

    do { c=getchar(); string[i]=c; i++; 

    } while(c != '\n' && i 9) { 

    int k=3; *(s+k)='.'; k++; 

    while(*(s+k)!='\0') 

    {  *(s+k)=*(s+j); k++; j++; 

    } *(s+k)=*(s+j); 

    } } s++; 

    } return pok; 

    int main() 

    {  char string[vel]; 

    printf("Unesite recenicu: ");  /*Unos strina.*/  unos(string); 

     /*Ispis stringa nakon poziva funkcije.*/  printf("String: %s", skrati(string)); 

    return 0; }

     

  • 8/17/2019 Or II Parcijala Tutorijali

    31/60

    Osnove računarstva  Dodatni zadaci iz stringova

    Berina Cocalić 

    Napisati funkciju s imenom adresa koja kao argument uzima dva stringa koji predstavljaju ime i prezime a kao

    rezultat vraća novi string koji se dobije tako da se string koji predstavlja prezime promijeni u string koji

    predstavlja e-mail adresu slijedećeg oblika: [ime].[prezime]@etf.unsa.baPrototip funkcije je: char* adresa(char *ime, char *prezime) Na primjer, ako su argumenti ime="Marko", prezime="Markovic" funkcija adresa() vraća pokazivač na

    rezultirajući string prezime koji je promijenjen u novi string oblika: [email protected]. Nakon toga,napisati glavni program koji učitava ime i prezime neke osobe i na standardnom izlazu ispisuje toj osobi

    pridruženu e-mail adresu koja se dobije pozivom funkcije adresa().

    #include  

    void unos (char* string, int vel) { 

    char c; int i=0; do { 

    c=getchar(); string[i]=c; i++; 

    } while(c != '\n' && i =0); 

    i=0;  /*Petlja koja dodaje ime ispred prezimena

    (ukljucujuci tacku)*/  do 

    { *(prezime+p)=*(ime+p); p++; 

    } while(*(ime+p)!='\0'); 

    int k = 0; 

     /*Ukidanje razmaka i mijenjanje velikih slova

    u mala*/  do { 

    if (*(prezime+k) == ' ') { 

    int l = k+1; 

    do { *(prezime+l-1) = *(prezime+l); l++; 

    } while (*(prezime+l-1) != '\0'); } 

    if (*(prezime+k) >= 'A' && *(prezime+k) <= 'Z') 

    *(prezime+k) = *(prezime+k)+32; k++; 

    } while (*(prezime+k) != '\0'); *(prezime+k) = '\0'; 

    return pok; } 

    int main() { 

    char ime[15], prezime [50];  /*Unos imena.*/  printf("Unesite ime: "); unos(ime, 15); 

     /*Unos imena.*/  printf("Unesite prezime: "); unos(prezime, 20); 

     /*Ispis adrese*/  printf("Adresa: %s", adresa(ime, prezime)); 

    return 0; } 

  • 8/17/2019 Or II Parcijala Tutorijali

    32/60

    Osnove računarstva  Tutorijal 11

    Berina Cocalić 

    Potrebno je napisati program koji će omogućiti unos tačke i kružnice sa tastature. Tačku i kružnicu je potrebno

    predstaviti kao strukture, a za unos je potrebno napraviti dvije funkcije koje de vršiti unos podataka i vraćati te

    strukture kao rezultat. Nak on unosa, program treba da ispiše da li se unesena tačka nalazu unutar, na granici ili

    izvan kružnice.

    #include  

     /* Definicija struktura tačke i kružnice */  struct Tacka{ 

    float x, y; }; struct Kruznica{ 

    struct Tacka centar; float poluprecnik; 

    }; 

     /* Funkcije za unos */  struct Tacka unos_tacke() 

    { struct Tacka t; printf ("Unesite koordinate tacke (x, y): "); scanf ("%f %f", &t.x, &t.y); return t; 

    } struct Kruznica unos_kruznice() { 

    struct Kruznica k; printf ("Unesite centar kruznice: \n"); k.centar = unos_tacke(); printf ("Unesite poluprecnik kruznice: "); scanf("%f", &k.poluprecnik); return k; 

     /* Funkcija za udaljenost izmedju dvije tačke */  float udaljenost(struct Tacka t1, struct Tacka t2) { 

    return sqrt((t1.x - t2.x) * (t1.x - t2.x) + (t1.y - t2.y) * (t1.y - t2.y)); } 

     /* Glavni program: Da li je tačka unutar kružnice */  int main() { 

    struct Kruznica k; struct Tacka t; float d; 

    printf ("Unesite kruznicu: \n"); k = unos_kruznice(); 

    printf ("Unesite neku tacku: \n"); t = unos_tacke(); 

     /* Tačka se nalazi unutar kružnice ako je udaljenost tačke od centra kruznice manja od poluprečnika kružnice */  d = udaljenost(t, k.centar); if (d

  • 8/17/2019 Or II Parcijala Tutorijali

    33/60

    Osnove računarstva  Tutorijal 11

    Berina Cocalić 

    Prepraviti zadatak dodavanjem funkcija koje računaju obim i površinukružnice. U glavnu funkciju programa

    dodati kod koji poziva ove funkcije i ispisuje rezultat.

    #include  #define PI 3.14 

     /* Definicija struktura tačke i kružnice */  struct Tacka{ 

    float x, y; 

    }; 

    struct Kruznica{ 

    struct Tacka centar; float poluprecnik; 

    }; 

     /* Funkcije za unos */  struct Tacka unos_tacke() { 

    struct Tacka t; 

    printf ("Unesite koordinate tacke (x, y): "); scanf ("%f %f", &t.x, &t.y); 

    return t; } 

    struct Kruznica unos_kruznice() { 

    struct Kruznica k; 

    printf ("Unesite centar kruznice:\n"); k.centar = unos_tacke(); 

    printf ("Unesite poluprecnik kruznice: "); scanf("%f", &k.poluprecnik); 

    return k; } 

     /* Funkcija za udaljenost izmedju dvije tačke */  float udaljenost(struct Tacka t1, struct Tackat2) { 

    return sqrt((t1.x-t2.x) * (t1.x-t2.x) + (t1.y-t2.y) * (t1.y-t2.y)); } 

    float obim_kruznice(struct Kruznica k) { 

    return 2*PI*k.poluprecnik; } 

    float povrsina_kruznice(struct Kruznica k) { 

    return PI*k.poluprecnik*k.poluprecnik; } 

     /* Glavni program: Da li je tačka unutar kružnice

    */  int main() { 

    struct Kruznica k; struct Tacka t; float d; 

    printf ("Unesite kruznicu:\n"); k = unos_kruznice(); 

    printf ("Unesite neku tacku:\n"); t = unos_tacke(); 

     /* Tačka se nalazi unutar kružnice ako je

    udaljenost tačke od centrakruznice manja od

     poluprečnika kružnice */  d = udaljenost(t, k.centar); 

    if (d

  • 8/17/2019 Or II Parcijala Tutorijali

    34/60

    Osnove računarstva  Tutorijal 11

    Berina Cocalić 

    Prepraviti program dodavanjem strukture koja predstavlja pravougaonik, a potom dodati funkcije za unos i

    računanje obima i površine istog. Nakon toga dodati kod koji koristi ove funkcije, kao i kod koji provjerava da li

    se unesena tačka nalazi unutar unesenog pravougaonika. 

    #include  

    #define PI 3.14 

     /* Definicija struktura tačke i kružnice */  struct Tacka{ 

    float x, y; }; 

    struct Kruznica{ 

    struct Tacka centar; float poluprecnik; 

    }; 

    struct Pravougaonik{ 

    struct Tacka koordinata1; struct Tacka koordinata2; struct Tacka koordinata3; struct Tacka koordinata4; 

    }; 

     /* Funkcije za unos */  struct Tacka unos_tacke() { 

    struct Tacka t; 

    printf ("Unesite koordinate tacke (x, y): "); 

    scanf ("%f %f", &t.x, &t.y); 

    return t; } 

    struct Kruznica unos_kruznice() { 

    struct Kruznica k; 

    printf ("Unesite centar kruznice:\n"); k.centar = unos_tacke(); 

    printf ("Unesite poluprecnik kruznice: "); scanf("%f", &k.poluprecnik); 

    return k; } 

    struct Pravougaonik unos_pravougaonika() { 

    struct Pravougaonik p; 

    do { 

    printf ("Unesite koordinate gornje lijeve tacke:\n"); p.koordinata1 = unos_tacke(); 

    printf ("Unesite koordinate gornje desne tacke:\n"); 

    p.koordinata2 = unos_tacke(); 

    printf ("Unesite koordinate donje desne tacke:\n"); p.koordinata3 = unos_tacke(); 

  • 8/17/2019 Or II Parcijala Tutorijali

    35/60

    Osnove računarstva  Tutorijal 11

    Berina Cocalić 

    printf ("Unesite koordinate donje lijeve tacke:\n"); p.koordinata4 = unos_tacke(); 

    } while(p.koordinata1.y!=p.koordinata2.y || p.koordinata2.x!=p.koordinata3.x || p.koordinata3.y!=p.koor

    dinata4.y ||p.koordinata1.x!=p.koordinata4.x); 

    return p; 

     /* Funkcija za udaljenost izmedju dvije tačke */  float udaljenost(struct Tacka t1, struct Tacka t2) { 

    return sqrt((t1.x-t2.x) * (t1.x-t2.x) + (t1.y-t2.y) * (t1.y-t2.y)); } 

    float obim_kruznice(struct Kruznica k) { 

    return 2*PI*k.poluprecnik; } 

    float povrsina_kruznice(struct Kruznica k) { 

    return PI*k.poluprecnik*k.poluprecnik; } 

    float obim_pravougaonika(struct Pravougaonik p) { 

    float a, b; a=udaljenost(p.koordinata1,p.koordinata2); b=udaljenost(p.koordinata2,p.koordinata3); 

    return 2*a+2*b; } 

    float povrsina_pravougaonika(struct Pravougaonik p) { 

    float a, b; a=udaljenost(p.koordinata1,p.koordinata2); b=udaljenost(p.koordinata2,p.koordinata3); 

    return a*b; } 

     /* Glavni program: Da li je tačka unutar kružnice */  int main() { 

    struct Kruznica k; 

    struct Tacka t; struct Pravougaonik p; float d; 

    printf ("Unesite kruznicu:\n"); k = unos_kruznice(); 

    printf ("Unesite pravougaonik:\n"); p = unos_pravougaonika(); 

    printf ("Unesite neku tacku:\n"); t = unos_tacke(); 

     /* Tačka se nalazi unutar kružnice ako je udaljenost tačke od centrakruznice manja od poluprečnika

    kružnice */  d = udaljenost(t, k.centar); 

    if (d

  • 8/17/2019 Or II Parcijala Tutorijali

    36/60

    Osnove računarstva  Tutorijal 11

    Berina Cocalić 

    else if (d == k.poluprecnik) printf("Tacka je na kruznici.\n"); 

    else printf("Tacka je izvan kruznice.\n"); 

    if(t.xp.koordinata1.x && t.yp.koordinata4.y) printf("Tacka je unutar pravougaonika.\n"); 

    else if ((t.x==p.koordinata1.x && (t.y=p.koordinata4.y)) || (t.x==p.koordina

    ta2.x && (t.y=p.koordinata3.y)) || (t.y==p.koordinata1.y && (t.x=p.koordinata1.x)) || (t.y==p.koordinata3.y &&(t.x=p.koordinata1.x))) 

    printf("Tacka je na pravougaoniku.\n"); 

    else printf("Tacka je izvan pravouganika.\n"); 

    printf("Obim kruznice je %.2f, a povrsina kruznice je%.2f.", obim_kruznice(k), povrsina_kruznice(k)); 

    printf("Obim pravougaonika je %.2f, a povrsina pravougaonika je%.2f.", obim_pravougaonika(p), povrsina_pravougaonika(p)); 

    return 0; 

  • 8/17/2019 Or II Parcijala Tutorijali

    37/60

    Osnove računarstva  Tutorijal 11

    Berina Cocalić 

    Data je slijedeća struktura:struct Vrijeme{ 

    int sati; int minute; int sekunde; 

    }; 

    Napraviti program koji vrši unos dvije varijable koje su tipa struct Vrijeme, a potom određuje koliko je sekundiprošlo između ta dva vremena. Koristiti funkcije unos vremena()  i  proteklo()  i paziti na slučaj kada je drugo

    vrijeme ispred prvog. Prepraviti program tako da određuje koliko je sati, minuta i sekundi proteklo između dva

    vremena.

    u sekundama u satima, minutama i sekundama#include  

    struct Vrijeme{ 

    int sati; int minute; int sekunde; 

    }; 

    struct Vrijeme unos_vremena() { 

    struct Vrijeme v; 

    scanf ("%i %i%i", &v.sati, &v.minute, &v.sekunde); 

    return v; } 

    float proteklo(struct Vrijeme v1, struct Vrijeme

    v2) { 

    return ((v1.sati*3600+v1.minute*60+v1.sekunde)-(v2.sati*3600+v2.minute*60+v2.sekunde)); } 

    int main() { 

    struct Vrijeme v1; struct Vrijeme v2; int sekunde; 

    printf ("Unesite prvo vrijeme:\n"); 

    v1 = unos_vremena(); printf ("Unesite drugo vrijeme:\n"); v2 = unos_vremena(); 

    sekunde=proteklo(v1, v2); 

    if(sekunde

  • 8/17/2019 Or II Parcijala Tutorijali

    38/60

    Osnove računarstva  Tutorijal 11

    Berina Cocalić 

    Data je sljedeća struktura podataka:struct Osoba{ 

    char ime[duzina]; char prezime[duzina]; int telefon; 

    }; 

    Napraviti program koji sadrži niz od 100 osoba i omogućava unos osoba, kao i ispis do sada unesenih osoba.Korisniku se nakon svakog unosa ili ispisa prikazuje meni koji mu nudi da izabere da li će da vrši unos, ispis ili

    izlaz.

    #include  #define vel 101 #define duzina 15 

     /*Ciscenje buffera*/  void Ocisti () { 

    char c; while((c=getchar()) != '\n' && c != EOF); 

    struct Osoba{ 

    char ime[duzina]; char prezime[duzina]; int telefon; 

    }; 

     /*Unos stringa*/  void unos (char* string) { 

    char c; int i=0; 

    do { 

    c=getchar(); string[i]=c; i++; 

    } while (c != '\n' && i

  • 8/17/2019 Or II Parcijala Tutorijali

    39/60

    Osnove računarstva  Tutorijal 11

    Berina Cocalić 

    Napisati funkciju koja proslijeđeni string mijenja tako da se pri ispisu istog ispiše samo prva riječ stringa.

    Funkcija treba da kao rezultat vrati pokazivač na početak tog stringa. Prototip funkcije treba da izgleda ovako:char* rijec(char* string) .

    #include  

    #define vel 50 

    void unos (char* string) { 

    int i=0; char c; do { 

    c=getchar(); string[i]=c; i++; 

    } while(c != '\n' && i ='A' && *(string)='a' && *(string)

  • 8/17/2019 Or II Parcijala Tutorijali

    40/60

    Osnove računarstva  Tutorijal 12

    Berina Cocalić 

    Potrebno je napisati program koji za neku tekstualnu datoteku (čije se ime učitava sa tastature) određuje broj

    redova, broj riječi i broj znak ova. Pri brojanju znakova se ne računaju razmaci (obični razmak, tab karakter i znak

    za novi red).

    #include  #include  

    int main () { 

    FILE* ulaz; char znak, ime[50]; int broj_redova = 0, broj_rijeci = 0, broj_znakova = 0, razmak = 1; 

    printf("Unesite ime datoteke: "); scanf("%s", ime); 

    ulaz = fopen(ime, "r"); 

     /*Provjera da li je uspjelo otvaranje datoteke*/  if(ulaz == NULL) 

    {  printf("Greška prilikom otvaranja datoteke '%s'! \n", ime); exit(1); 

    while((znak = fgetc(ulaz)) != EOF) { 

     /* Ako je znak novi red, povecaj broj linija za jedan */  if(znak == '\n') 

    broj_redova++; 

     /* Da li je znak razmak? */  if(znak == ' ' || znak == '\n' || znak == '\t') 

    razmak = 1; 

    else {  /* Ako je prethodni znak bio razmak, a ovaj nije,  povecaj broj rijeci za jedan */  broj_znakova++; if(razmak == 1) 

    broj_rijeci++; razmak = 0; 

    } } if(broj_znakova != 0) 

    broj_redova++; 

    printf("Broj redova: %d \n", broj_redova); printf("Broj rijeci: %d \n", broj_rijeci); printf("Broj znakova: %d \n", broj_znakova); 

     /*Zatvaranje datoteke*/  fclose(ulaz); 

    return 0; }

  • 8/17/2019 Or II Parcijala Tutorijali

    41/60

    Osnove računarstva  Tutorijal 12

    Berina Cocalić 

    Prepraviti program iz tako da ispisuje broj samoglasnika, broj velikih slova i broj cifara.

    #include  #include  

    int main () { 

    FILE* ulaz; char znak, ime[50]; int broj_redova = 0, broj_rijeci = 0, broj_znakova = 0; int  razmak = 1, broj_samoglasnika = 0, velika_slova = 0, broj_cifara = 0; 

    printf("Unesite ime datoteke: "); scanf("%s", ime); ulaz = fopen(ime, "r"); 

     /*Provjera da li je uspjelo otvaranje datoteke*/  if(ulaz == NULL) { 

    printf("Greška prilikom otvaranja datoteke '%s'! \n", ime); exit(1); 

    while((znak = fgetc(ulaz)) != EOF) { 

     /* Ako je znak novi red, povecaj broj linija za jedan */  if(znak == '\n') 

    broj_redova++; 

     /*Brojanje velikih slova*/  else if ( znak >= 'A' && znak = '0' && znak

  • 8/17/2019 Or II Parcijala Tutorijali

    42/60

    Osnove računarstva  Tutorijal 12

    Berina Cocalić 

    Data je datoteka ispiti.txt  čiji redovi imaju sljedeću strukturu: 

    broj_indeksa predmet ocjena

    Pri tome broj_indexa predstavlja broj indeksa studenta koji je polagao ispit,  predmet  pretstavlja predmet za koji

    se polagao ispit, a ocjena predstavlja rezultat ispita. Primjer sadržaja datoteke je: 

    12345 3 10

    12345 4 9

    12233 4 10

    13579 2 8

    Prvi red označava da je student  sa brojem indeksa 12345 iz predmeta broj 3 (to mogu biti Osnove računarstva)

    dobio ocjenu 10 itd. Ako je isti student položio više predmeta, jednostavno se dodaje još jedan red sa istim brojem 

    indeksa, ali drugim predmetom. Potrebno je kreirati ovu datoteku i napuniti je nekim testnim podacima. Potom

    je potrebno napraviti program koji traži od korisnika da unese broj predmeta, te zatim ispisuje prosječnu ocjenu

    i prolaznost na predmetu (procenat studenata koji su na ispitu dobili ocjenu 6 ili više). 

    #include  #include  #define velicina 100 

    struct Student{ 

    int indeks; int predmet; int ocjena; 

    }; 

    int main () { 

    FILE* ulaz; 

    ulaz = fopen("ispiti.txt", "r"); 

     /*Provjera da li je uspjelo otvaranje

    datoteke*/  if(ulaz == NULL) { 

    printf("Greška prilikom otvaranjadatoteke ispiti.txt! \n"); 

    exit(1); } 

    int i = 0; struct Student osoba[velicina]; 

     /*Ucitavanje podataka iz datoteke u nizstruktura*/  

    while (fscanf(ulaz, "%i %i%i\n", &osoba[i].indeks, &osoba[i].predmet, &osoba[i].ocjena) != EOF && i  5) broj_prolaza++; 

    suma_ocjena += osoba[j].ocjena; broj_izlazaka++; 

    } while ( j++ 

  • 8/17/2019 Or II Parcijala Tutorijali

    43/60

    Osnove računarstva  Tutorijal 12

    Berina Cocalić 

    Dopuniti prethodni program tako da se od korisnika ne traži broj predmeta, nego njegov naziv. Za ovu svrhu

    napraviti datoteku pod nazivom predmeti.txt koja sadrži imena predmeta zajedno sa njihovim brojevima. Primjer

    sadržaja datoteke je: 

    1 Inzenjerska matematika I

    2 Inzenjerska fizika I

    3 Linearna algebra i geometrija

    4 Osnove racunarstva

    5 Osnove elektrotehnike

    Kada korisnik unese naziv predmeta, program treba da provjeri da li se taj naziv nalazi u datoteci  predmeti.txt .

    Ako naziv nije u toj datoteci, ispisuje se greška. U suprotnom slučaju se ispisuju podaci predmeta.

    #include  #include  #include  #define velicina 100 #define vel 6 

    struct Student{ 

    int indeks; int predmet; int ocjena; 

    }; 

    struct Predmet{ 

    int redni_broj; char ime[50]; 

    }; 

    void unos (char* string, int duzina) { 

    char c; int i = 0; 

    do { 

    c = getchar(); *(string+i) = c; i++; 

    } while (c != '\n' && i

  • 8/17/2019 Or II Parcijala Tutorijali

    44/60

    Osnove računarstva  Tutorijal 12

    Berina Cocalić 

     /*Ucitavanje podataka iz datoteke u niz struktura*/  while (fscanf(ulaz, "%i %i

    %i\n", &osoba[i].indeks, &osoba[i].predmet, &osoba[i].ocjena) != EOF && i

  • 8/17/2019 Or II Parcijala Tutorijali

    45/60

    Osnove računarstva  Tutorijal 12

    Berina Cocalić 

    broj_prolaza++; 

    suma_ocjena += osoba[j].ocjena; broj_izlazaka++; 

    } } while ( j++ 

  • 8/17/2019 Or II Parcijala Tutorijali

    46/60

    Osnove računarstva  Tutorijal 12

    Berina Cocalić 

    Prepraviti prethodni program dodavanjem mogućnosti da se unese broj indeksa studenta, nakon čega program

    ispisuje ukupan broj predmeta za koje je student polagao ispite, broj položenih ispita, te prosječnu ocjenu. 

    #include  #include  #include  

    #define velicina 100 #define vel 6 

    struct Student{ 

    int indeks; int predmet; int ocjena; 

    }; 

    struct Predmet{ 

    int redni_broj; char ime[50]; 

    }; 

    void unos (char* string, int duzina) { 

    char c; int i = 0; 

    do { 

    c = getchar(); *(string+i) = c; i++; 

    while (c != '\n' && i

  • 8/17/2019 Or II Parcijala Tutorijali

    47/60

    Osnove računarstva  Tutorijal 12

    Berina Cocalić 

    int izbor; 

    do { 

    printf("\nUnesite 1 za statistiku studenta, 2 za statistiku predmeta, 0 za izlaz:"); scanf("%i", &izbor); Ocisti(); 

    if ( izbor == 1) { 

    int br_indeksa; int l; int izasao = 0; int polozio = 0; float suma_polozenih = 0.0; 

    printf("Unesite broj indeksa:"); scanf("%i", &br_indeksa); Ocisti(); 

     /*Brojanje ispita na koje je student izasao, koje je polozio i prosjecne ocjene*/  for (l = 0; l  5) { 

    suma_polozenih += osoba[l].ocjena; polozio++; 

    izasao++; } 

    if (izasao == 0) 

    printf("Osoba sa tim brojem indeksa ne postoji."); 

    else printf("Student je polagao ispite iz %i predmeta, a polozio je %i (%.2f %%).\n Prosjecnaocjena polozenih predmeta je %.2f.",izasao, polozio, (polozio*100.)/izasao, suma_polozenih/polozio); 

    else if ( izbor == 2 ) { 

     /*Otvaranje datoteke predmeti*/  ulaz = fopen("predmeti.txt", "r"); 

     /*Provjera da li je uspjelo otvaranje datoteke*/  if(ulaz == NULL) { 

    printf("Greška prilikom otvaranja datoteke predmeti.txt! \n"); 

    exit(1); } 

     /*Ucitavanje datoteke u niz*/  int j = 0; struct Predmet imena[vel]; do { 

    fscanf(ulaz, "%i ", &imena[j].redni_broj); fgets (imena[j].ime, 50, ulaz); imena[j].ime[strlen (imena[j].ime)-1] = '\0'; j++; 

    } while (j

  • 8/17/2019 Or II Parcijala Tutorijali

    48/60

    Osnove računarstva  Tutorijal 12

    Berina Cocalić 

     /*Odabir predmeta*/  char ime_predmeta[50]; int podudarnost = 0; int broj_predmeta; 

    int k; do { 

     /*Unos predmeta i ispit postojanja istog*/  

    printf("Unesite predmet: "); unos(ime_predmeta, 50); 

    for (k = 0; k  5) broj_prolaza++; 

    suma_ocjena += osoba[j].ocjena; broj_izlazaka++; 

    } } while ( j++ 

  • 8/17/2019 Or II Parcijala Tutorijali

    49/60

    Osnove računarstva  Tutorijal 13

    Berina Cocalić 

    Potrebno je napraviti program koji učitava podatke iz datoteke ispit.txt , sortira ih, i potom ih ispisuje u datoteku

    ispit_sortiran.txt .

    Potrebno je napraviti datoteku ispit.txt formatiranu na sljedeći način: 

     prezime ime broj_bodova

    pri čemu prezime zauzima 15 mjesta, ime zauzima 10 mjesta a broj_bodova zauzima 2 mjesta. Pazite da svaki

    podatak u datoteci zauzima predviđeni broj mjesta! Za prezime je potrebno rezervirati tačno 15 mjesta. Ako je

    prezime kraće od 15 slova, dopuniti ostatak prostora razmacima. Ako je duže, skratite ga. 

    #include  #include  #define name 10 #define lname 15 #define velicina 100 

    struct Osoba { 

    char ime[name+1], prezime[lname+1]; int broj_bodova; 

    }; 

     /*Funkcija koja ucitava datoteku i podatke iz nje

    kopira u niz struktura.*/  int ucitaj (struct Osoba o[]) { 

    FILE* ulaz; int br_unesenih = 0; 

    ulaz = fopen("ispit.txt", "r"); 

     /*Ako otvaranje datoteke nije uspjelo, javigresku.*/  

    if ( ulaz == NULL ) { 

    printf("Datoteka ispiti.txt ne moze bitiucitana."); 

    exit(1); } 

     /*Ako je otvaranje uspjelo, ucitaj podatke u

    niz struktura*/  else 

    { while (fscanf(ulaz,"%15s %15s %2i\n", 

    o[br_unesenih].prezime, o[br_unesenih].ime, &o[br_unesenih].broj_bod

    ova) != EOF && br_unesenih++ 

  • 8/17/2019 Or II Parcijala Tutorijali

    50/60

    Osnove računarstva  Tutorijal 13

    Berina Cocalić 

    U datoteku ispit.txt  dodati kolonu broj_bodova_2 koja predstavlja broj bodova na drugom parcijalnom ispitu,

    dok broj_bodova_1 predstavlja bodove na prvom parcijalnom ispitu.

     prezime ime broj_bodova_1 broj_bodova_2

    Potom je potrebno prepraviti program tako da:

    -  Struktura Student sadrži oba podatka za bodove. 

    U datoteku usmeni.txt  uspisuju se studenti koji su položili oba parcijalna ispita (na oba imaju 10 ili višebodova)

    -  Datoteka usmeni.txt treba imati sljedeću strukturu: 

     prezime ime ukupno

    i pri tome treba biti sortirana po koloni ukupno, od većih prema manjim vrijednostima. 

    #include  #include  #include  #define name 10 #define lname 15 #define velicina 100 

    struct Osoba { char ime[name+1], prezime[lname+1]; int broj_bodova_1, broj_bodova_2; 

    }; 

     /*Funkcija koja ucitava datoteku i podatke iz nje

    kopira u niz struktura.*/  int ucitaj (struct Osoba o[]) { 

    FILE* ulaz; int br_unesenih = 0; ulaz = fopen("ispit.txt", "r"); 

     /*Ako otvaranje datoteke nije uspjelo, javigresku.*/  

    if ( ulaz == NULL ) { 

    printf("Datoteka ispiti.txt ne moze bitiucitana."); 

    exit(1); } 

     /*Ako je otvaranje uspjelo, ucitaj podatke u

    niz struktura, ali samo onih studenata koji su

     položili oba parcijalna;*/  else { 

    while (fscanf(ulaz,"%15s %15s %2i %2i\n", o[br_unesenih].prezime, o[br_unesenih].ime, &o[br_unesenih].broj_bodova_1

    , &o[br_unesenih].broj_bodova_2

    ) != EOF && br_unesenih++ 

  • 8/17/2019 Or II Parcijala Tutorijali

    51/60

    Osnove računarstva  Tutorijal 13

    Berina Cocalić 

    Napraviti program za unos podataka putem tastature u datoteku ispit.txt  specificiranu u prethodnom zadatku.

    Ovaj program ne smije da briše postojeću datoteku ispit.txt  nego treba dodavati nova polja u nju. Program treba

    da vrši kontrolu ispravnosti podataka i traži ponovan unos ako su podaci neispravni.

    #include  #include  

    #include  #define name 10 #define lname 15 #define velicina 100 

    struct Osoba { char ime[name+1], prezime[lname+1]; int broj_bodova_1, broj_bodova_2; 

    }; 

     /*Funkcija cisti BUFFER.*/  void Ocisti () { 

    char c; 

    while((c=getchar()) != '\n' && c != EOF); 

     /*Funkcija za unos stringa*/  void unos(char* string, int vel) { 

    int i=0; char c; 

    do { 

    c = getchar(); *(string+i) = c; 

    i++; } while (c != '\n' && i

  • 8/17/2019 Or II Parcijala Tutorijali

    52/60

    Osnove računarstva  Tutorijal 13

    Berina Cocalić 

    fclose (ulaz); 

    return br_unesenih; } 

     /*Funkcija za unos novih studenata na kraj datoteke*/  int unesi () { 

    FILE* dodavanje; struct Osoba novi; 

    dodavanje = fopen("ispit.txt", "a"); 

    if ( dodavanje == NULL ) return -1; 

    printf("Unesite prezime:\n"); unos(novi.prezime, lname); printf("Unesite ime:\n"); unos(novi.ime, name); 

    printf("Unesite broj bodova na prvom parcijalnom:"); 

    do { 

    if ((scanf("%i", &novi.broj_bodova_1))!= 1 || novi.broj_bodova_1  20) printf("Unesite ponovo!\n"); 

    Ocisti(); 

    } while (novi.broj_bodova_1  20); 

    printf("Unesite broj bodova na drugom parcijalnom:"); do { 

    if (( scanf("%i", &novi.broj_bodova_2)!= 1 || novi.broj_bodova_2  20)) printf("Unesite ponovo!\n"); 

    Ocisti(); 

    } while (novi.broj_bodova_2  20); 

    fprintf(dodavanje, "%-15s %-15s %-2i %-2i\n", novi.prezime, novi.ime, novi.broj_bodova_1, novi.broj_bodova_2); 

    fclose (dodavanje); return 0; 

     /*Kreiranje datoteke usmeni.txt.*/  int zapisi (struct Osoba o[], int vel) { 

    FILE* sortiranje; int i, j; 

    sortiranje = fopen("ispit.txt", "w"); 

    if ( sortiranje == NULL ) return -1; 

     /*Sortiranje niza*/  for (i = 0; i = 10) &&(o[j].broj_bodova_2 >=10))) { struct Osoba temp = o[i]; o[i] = o[j]; o[j] = temp; 

  • 8/17/2019 Or II Parcijala Tutorijali

    53/60

    Osnove računarstva  Tutorijal 13

    Berina Cocalić 

    } } 

     /*Unos sortiranog niza u postojecu datoteku*/  for (i = 0; i

  • 8/17/2019 Or II Parcijala Tutorijali

    54/60

    Osnove računarstva  Tutorijal 13

    Berina Cocalić 

    Dopuniti program iz prethodnog zadatka tako da podržava sljedeće funkcije: 

    -  dodavanje studenata

    -  brisanje studenata

    -  izmjena studenata

    -  ispis sadržaja datoteke 

    Također se potrebno pobrinuti da datoteka ispit.txt  u svakom trenutku bude sortirana.

    #include  #include  #include  #define name 10 #define lname 15 #define velicina 100 

    struct Osoba { char ime[name+1], prezime[lname+1]; int broj_bodova_1, broj_bodova_2; 

    }; 

     /*Funkcija cisti BUFFER.*/  void Ocisti () { 

    char c; while((c=getchar()) != '\n' && c != EOF); 

     /*Funkcija za unos stringa*/  void unos(char* string, int vel) { 

    int i=0; char c; 

    do { 

    c = getchar(); *(string+i) = c; i++; 

    } while (c != '\n' && i

  • 8/17/2019 Or II Parcijala Tutorijali

    55/60

    Osnove računarstva  Tutorijal 13

    Berina Cocalić 

    o[br_unesenih].prezime, o[br_unesenih].ime, &o[br_unesenih].broj_bodova_1, &o[br_unesenih].broj_bodova_2) != EOF && br_unesenih++ 

  • 8/17/2019 Or II Parcijala Tutorijali

    56/60

    Osnove računarstva  Tutorijal 13

    Berina Cocalić 

    (((o[j].broj_bodova_1 + o[j].broj_bodova_2) == (o[i].broj_bodova_1 + o[i].broj_bodova_2)) && (o[j].broj_bodova_1 >= 10) &&(o[j].broj_bodova_2 >=10))) 

    { struct Osoba temp = o[i]; o[i] = o[j]; o[j] = temp; 

    } } 

     /*Unos sortiranog niza u postojecu datoteku*/  for (i = 0; i

  • 8/17/2019 Or II Parcijala Tutorijali

    57/60

    Osnove računarstva  Tutorijal 13

    Berina Cocalić 

    int i; 

    for (i = 0; i

  • 8/17/2019 Or II Parcijala Tutorijali

    58/60

    Osnove računarstva  Tutorijal 13

    Berina Cocalić 

    if (dodaj() == -1 || br_osoba >= velicina) { 

    printf("Dodavanje nije uspjelo!"); exit(1); 

    else { 

    br_osoba++; 

    ucitaj(student); } 

    else if (izbor == 2) { 

    if (obrisi(student, br_osoba) == 1) { 

    printf("Student obrisan!\n"); br_osoba--; 

    else printf("Student ne postoji!"); } 

    else if (izbor == 3) { 

    if (izmijeni(student, br_osoba) == 1) printf("Student izmijenjen."); 

    else printf("Student ne postoji.\n"); } 

    else if (izbor == 4) ispisi(student, br_osoba); 

    zapisi (student, br_osoba); 

    } while ( izbor != 0 ); 

    return 0; } 

  • 8/17/2019 Or II Parcijala Tutorijali

    59/60

    Osnove računarstva  Tutorijal 13

    Berina Cocalić 

    Dopuniti program Imenik  sa tutorijala 11 tako da podatke drži u datoteci. Cilj ove dopune je da se imena ne

    moraju ponovo unositi svaki put kad se pokrene program, nego da program pamti imena unesena posljednji

    put.

    #include  #include  

    #define vel 101 #define duzina 15 

     /*Ciscenje buffera*/  void Ocisti () { 

    char c; while((c=getchar()) != '\n' && c != EOF); 

    struct Osoba{ 

    char ime[duzina]; char prezime[duzina]; 

    int telefon; }; 

     /*Unos stringa*/  void unos (char* string) { 

    char c; int i=0; 

    do { 

    c=getchar(); string[i]=c; i++; 

    } while (c != '\n' && i

  • 8/17/2019 Or II Parcijala Tutorijali

    60/60

    Osnove računarstva  Tutorijal 13 /*Ucitavanje podataka iz datoteke*/  int ucitaj(struct Osoba os[]) { 

    FILE* ulaz; int br_unesenih = 0; 

    ulaz=fopen("imenik.txt", "r"); 

     /*Ako je ucitavanje datoteke uspjelo, smjeste se podaci iz nje u niz struktura*/  if (ulaz != NULL ) { 

    do { 

    printf("%i", br_unesenih); } while ( fscanf(ulaz,"%s %s

    %i",os[br_unesenih].ime, os[br_unesenih].prezime, &os[br_unesenih].telefon) != EOF && br_unesenih++