tutorijal 7 · 2013. 10. 11. · tutorijal 7 4.1. napisati program koji učitava realnu matricu...

82
Tutorijal 7 4.1. Napisati program koji učitava realnu matricu dimenzija 10x10 te pronalazi najmanji element na glavnoj dijagonali. Rješenje. #include <stdio.h> int main() { float A[10][10],min; int i,j; /* Unos matrice */ for (i=0; i<10; i++) { for (j=0; j<10; j++) { printf ("Unesite element A[%d][%d]: ",i,j); scanf ("%f", &A[i][j]); } } /* Trazenje minimuma */ min = A[0][0]; for (i=1; i<10; i++) if (A[i][i]<min) min=A[i][i]; printf ("Najmanji element na glavnoj dijagonali: %.3f\n", min); return 0; } 4.2. Napravite program koji učitava realnu matricu dimenzija AxB (A i B su konstante) te pronalazi sumu elemenata na rubu matrice. Rješenje. #include <stdio.h> #define A 5 #define B 5 int main() { float mat[A][B],suma; int i,j; /* Unos matrice */ for (i=0; i<A; i++) { for (j=0; j<B; j++) { printf ("Unesite element mat[%d][%d]: ",i,j); scanf ("%f", &mat[i][j]); } } suma=0; /* Suma gornje i donje stranice */ for (i=0; i<A; i++) suma += mat[i][0]+mat[i][B-1]; Skinuto sa www.etf.ba

Upload: others

Post on 28-Jan-2021

0 views

Category:

Documents


0 download

TRANSCRIPT

  • Tutorijal 7

    4.1. Napisati program koji učitava realnu matricu dimenzija 10x10 te pronalazi najmanji element na glavnoj dijagonali.

    Rješenje.

    #include

    int main() {float A[10][10],min;int i,j;

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

  • /* Suma lijeve i desne stranice */for (i=1; i

  • /* Zajedno sa elementom iz "brojaci" pomjeramo element iz "imena" */temp=imena[i];imena[i]=imena[j];imena[j]=temp;

    }}

    }

    /* Ispis */printf ("\n");for (i=1; i

  • 3.2. Napisati program koji provjerava ispravnost unesenog datuma. Korisnik unosi 3 broja koji predstavljaju dan, mjesec i godinu, a program ispituje da li ti brojevi predstavljaju ispravan datum ili ne.

    Rješenje.

    #include #include

    int prost(int x) {/* Pretpostavimo da je prost */int p=1;/* Najveci broj sa kojim moze biti djeljiv prirodan broj x (osim njega

    samog) je korijen iz x.Svaki broj je djeljiv sa 1, pa cemo ga preskociti */for (i=2; i

  • int P(int x, int y) { if (y==1 || x==y)

    return 1; else

    return P(x-1,y)+P(x-1,y-1); }

    int main() { int i,j,n;

    printf ("Unesite broj redova Pascalovog trougla: ");scanf("%d",&n);

    for(i=1; i5 pocne se razvaljivati, ali bi rjesenje bilo prekomplikovano */int br_razmaka = n*2-i-1;for (j=1; j

  • }

    int main() {double x,sin1,sin2;int n;

    /* Unos vrijednosti - za dobre rezultate koristite n>>x */printf ("Unesite x: ");scanf ("%lf",&x); /* double se unosi sa %lf ... */printf ("Unesite n: ");scanf ("%d",&n);

    /* Bibliotecna funkcija */sin1 = sin(x);printf ("math.h: %g\n", sin1); /* ... a ispisuje sa %g ! *//* Nasa funkcija */sin2 = sinus(x,n);printf ("Taylor: %g\n", sin2);

    /* Greska */printf ("Greska: %g\n", fabs(sin1-sin2));

    return 0;}

    Tutorijal 9

    2.1 Napišite funkciju koja, za dati pozitivan cijeli broj x, na ekranu ispisuje najveću i najmanju cifru tog broja. Zatim napravite mali program koji testira tu funkciju.

    Rješenje.

    #include

    void minmax(unsigned broj) {/* Nijedna cifra nije veca od 9 niti manja od 0 */int min=9, max=0,c;while (broj>0) {

    c=broj%10;if (cmax) max=c;broj/=10;

    }printf ("Najveca cifra je %d, a najmanja %d.", max, min);

    }

    int main() {unsigned broj;printf("Unesite broj: ");scanf("%d", &broj);minmax(broj);

    return 0;}

    2.2 Korisnik sa tastature unosi osam realnih brojeva koji predstavljaju mjerenja temperature tokom

    Skinuto sa www.etf.ba

  • jednog dana (temperatura se mjeri svaka 3 sata). Program treba ispisati najveću temperaturu tokom jednog dana te prosječnu temperaturu.

    2.3 Modificirati prethodni program (2.2) tako da broj mjerenja nije konstantan (osam) nego se unosi sa tastature.

    Rješenje. Objavljujemo rješenje samo za 2.3 pošto je 2.2 specijalan slučaj istog zadatka.

    #include

    float maxtemp(float *p, int br) {int i;float max=*p;for (i=1; imax) max=p[i];return max;

    }

    float prtemp(float *p, int br) {int i;float suma=0;for (i=0; i

  • #include

    long unos_cijeli(long min, long max) {long br;do {

    printf ("Unesite broj izmedju %d i %d: ", min, max);scanf("%ld", &br);if (brmax)

    printf ("Broj nije u trazenom opsegu!\n");else

    break;} while(1);return br;

    }

    int main() {int i;float suma;

    for (i=0; i

  • datum ili ne.

    Rješenje.

    #include

    int main() {int d,m,g;

    /* Pretpostavimo da datum jeste ispravan */int ispravan=1;

    printf ("Unesite datum (dan,mjesec,godina): ");scanf("%d,%d,%d",&d,&m,&g);

    if (dbrojdana) ispravan=0;

    if (ispravan)printf ("Datum je ispravan.\n");

    elseprintf ("Datum nije ispravan.\n");

    return 0;}

    Zadatak 3. Napravite sljedeći program: korisnik unosi cijele brojeve (-1 za kraj). Program treba ispisati DA ukoliko je niz brojeva neopadajući, a u suprotnom NE. Broj -1 koji se koristi za završetak unosa se ne računa.

    Skinuto sa www.etf.ba

  • Rješenje.

    #include

    int main() {int broj, prethodni;int neopadajuci=1; /* Pretpostavimo da jeste */

    scanf("%d",&broj);prethodni=broj;while (broj!=-1) {

    if (broj

  • Zadaća br. 3

    Zadatak 1. Pažljivo pregledajte zadatke sa tutorijala 1 do 6. Izaberite tri zadatka za koje smatrate da bi trebali biti realizovani korištenjem funkcija, te ih prepravite na takav način.

    Napišite kratko obrazloženje za svaki od zadataka zašto bi baš taj zadatak trebalo raditi koristeći funkciju / funkcije (koje prednosti donosi korištenje funkcija), te zašto je način na koji ste ga uradili ispravan (zašto je baš taj dio programa trebalo izdvojiti u funkciju). Ovo obrazloženje predajete samo u pismenoj formi.

    Rješenje. Od vas se u principu očekuje da obrazloženjem uvjerite tutora zašto su baš izabrani zadaci oni pravi. Pošto nisu svi predali zadaću u pismenoj formi, ne mogu vam dati primjer obrazloženja, ali navešću primjere zadataka koje je baš zgodno uraditi pomoću funkcije:

    U zadacima Tutorijala 3 može se koristiti funkcija za testiranje da li su brojevi u zadatom rasponu.

    Tutorijal 5, Zadatak 3.1:int djeljiv579(int broj)

    (vraća 1 ako je broj djeljiv sa 5, 7 ili 9, a 0 ako nije - koristi se u zadaći!)

    Tutorijal 5, Zadatak 3.4:int broj_dana_u_mjesecu(int m, int g)

    (koristi se u zadaći!)

    Tutorijal 5, Zadatak 3.5:int prost(int broj)

    (vraća 1 ako je broj prost a 0 ako nije - koristi se u zadaći!)

    Tutorijal 6, Zadatak 3.2:int prebroj_slovo(char* tekst, char slovo)

    Tutorijal 6, Zadatak 3.4:char* unos_stringa(char* string)

    i/iliint broj_rijeci(char* string)

    Ako ste koristili i druge primjere, priznaćemo bodove ako je obrazloženje jako dobro i odgovara načinu na koji je program implementiran.

    Zadatak 2. Iskoristite program za provjeru ispravnosti datuma koji ste napravili u okviru prethodne zadaće (zadatak 2) te napravite program koji računa period između dva datuma. Pri unosu testirajte ispravnost unesenog datuma. U realizaciji programa koristite funkcije.

    Primjer:

    Skinuto sa www.etf.ba

  • Unesite prvi datum (d,m,g): 31,13,2006Neispravan datum!Unesite prvi datum (d,m,g): 31,12,2006Unesite drugi datum (d,m,g): 2,1,2007Izmedju datuma je proteklo 2 dana.

    Rješenje.

    #include

    /* Vraca 1 ako je godina prestupna, u suprotnom 0 */int prestupna(g) {

    return (g%4==0 && g%100!=0 || g%400==0);}

    /* Funkcija vraca broj dana u mjesecu, uzimajuci u obzir prestupne godine */int broj_dana_u_mjesecu(int m, int g) {

    /* Broj dana u mjesecu */int brojdana;switch (m) {

    case 1:case 3:case 5:case 7:case 8:case 10:case 12:

    brojdana=31;break;

    case 4:case 6:case 9:case 11:

    brojdana=30;break;

    case 2:if (prestupna(g))

    brojdana=29;else

    brojdana=28;break;

    default:brojdana=0;

    }return brojdana;

    }

    /* Funkcija vraca 1 ako d,m,g cine ispravan datum, u suprotnom 0 */int datum_ispravan(int d, int m, int g) {

    /* Pretpostavimo da datum jeste ispravan */int ispravan=1;

    if (dbroj_dana_u_mjesecu(m,g)) ispravan=0;

    /* Godine prije 1. su neispravne radi racunanja perioda */if (g

  • /* Funkcija vraca broj dana izmedju datuma d,m,g i 1. 1. 1. godine. Koristimo tip long jer ovaj broj moze biti povelik. */long period(int d, int m, int g) {

    long brdana=0;int i;

    /* Godine */for (i=1; i

  • Rješenje.

    #include

    long okreni(long broj) {long rez=0;

    /* Negativan broj */int negativan=0;if (broj0) {

    rez = rez*10+broj%10;broj/=10;

    }

    if (negativan) rez=-rez;return rez;

    }

    int main() {long broj;

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

    printf ("\n%ld\n", okreni(broj));return 0;

    }

    Neki studenti su se pitali kako riješiti problem kada se broj završava nulama, npr. 123000. Ovo se nije tražilo u zadatku, pa su programi koji ne rješavaju ovaj problem u potpunosti priznati. Inače taj problem se ne može riješiti unutar funkcije, nego samo u main()-u i to na sljedeći način:

    #include

    long okreni(long broj) {long rez=0;

    /* Negativan broj */int negativan=0;if (broj0) {

    rez = rez*10+broj%10;broj/=10;

    }

    if (negativan) rez=-rez;

    Skinuto sa www.etf.ba

  • return rez;}

    int main() {long broj,tmp;int i,brnula=0;

    printf ("Unesite broj: ");scanf("%ld",&broj);printf ("\n");

    /* Ukoliko se broj zavrsava nulama, to se ne moze rijesiti u funkciji jer funkcija vraca long (ili int ili float...) koji automatski

    odbacuje pocetne nule */tmp=broj;while (tmp>0) {

    if (tmp%10==0) brnula++;else break;tmp/=10;

    }for (i=0;i

  • Tutorijal 10

    2.1 Dopunite prethodni zadatak funkcijom sa prototipom:

    int duzina(char* string);

    koja vraća broj slova u stringu. Zatim dodajte poziv ove funkcije u main().

    3.1 U prethodnom programu dodajte funkciju samogl() koja će prebrojati broj samoglasnika u zadatoj riječi. Prototip funkcije samogl() je:

    int samogl (char *string);

    Rješenje.

    #include

    int duzina(char* string) {int d=0;while (*string++!='\0') d++;return d;

    }

    int samogl(char* string) {int s=0;while (*string!='\0') {

    if (*string=='a' || *string=='e' || *string=='i' || *string=='o' || *string=='u' || *string=='A' || *string=='E' || *string=='I' || *string=='O' || *string=='U')

    s++;string++;

    }return s;

    }

    int izbroji(char* string, char znak){

    int b=0;while(*string!='\0'){

    if (*string==znak)b++;

    string++;}return b;

    }

    int main(){

    char a[80],c;printf ("\nUnesite jednu rijec do 80 znakova (bez razmaka): ");scanf ("%s", a);getchar();printf ("\nKoji znak treba prebrojati: ");scanf ("%c", &c);

    Skinuto sa www.etf.ba

  • printf ("\n\nUnesena rijec sadrzi %d znakova\nBroj znakova %c je: %d\nBroj samoglasnika je: %d\n", duzina(a), c, izbroji(a,c), samogl(a));

    return 0;}

    3.2 Napišite funkciju sortiraj() koja slaže po veličini niz realnih brojeva, pri čemu dimenzija niza nije unaprijed poznata nego predstavlja jedan od parametara funkcije. Napravite kratak glavni program koji testira ovu funkciju. Primjer algoritma za sortiranje nalazi se na početku Tutorijala 7.

    Rješenje.

    #include

    void sortiraj(float* niz, int duzina) {int i,j;for (i=0; i

  • for (i=1; i

  • printf ("Druga rijec: ");scanf ("%s",s2);switch (strcmp(s1,s2)) {

    case -1:printf ("\nPrva je prije od druge\n");break;

    case 1:printf ("\nPrva je poslije od druge\n");break;

    case 0:printf ("\nStringovi su identicni\n");break;

    }return 0;

    }

    3.5 Modificirajte funkciju iz prethodnog zadatka tako da prima još jedan parametar:

    int strcmp(const char *s1, const char *s2, int velikamala);

    Parametar velikamala je logička vrijednost koja određuje da li će se pri poređenju uzimati u obzir razlika između velikih i malih slova (velika slova su abecedno ispred malih) ili ne.

    Rješenje.

    #include

    int strcmp(char* s1, char* s2, int velikamala) {char c1,c2;/* Petlja se izvrsava do kraja kraceg stringa */while (*s1!='\0' && *s2!='\0') {

    /* Znakove iz s1 i s2 stavljamo u privremene varijable */c1=*s1; c2=*s2;/* Ako je potrebno, oba pretvaramo u mala */if (!velikamala) {

    if (c1>='A' && c1='A' && c2c2) return 1;if (c1

  • scanf ("%s",s1);printf ("Druga rijec: ");scanf ("%s",s2);getchar();printf ("Zelite li razlikovati velika i mala slova? 1 = DA, 0 = NE: ");scanf ("%d",&vm);switch (strcmp(s1,s2,vm)) {

    case -1:printf ("\nPrva je prije od druge\n");break;

    case 1:printf ("\nPrva je poslije od druge\n");break;

    case 0:printf ("\nStringovi su identicni\n");break;

    }return 0;

    }

    Tutorijal 11

    2.1 Modifikujte prethodni program tako što ćete dodati funkciju za unos vremena:

    struct vrijeme unos_vremena()

    Ova funkcija bi trebala da omogući unos svih komponenti strukture vrijeme sa tastature, ali da se pri tome onemogući unos neispravnog vremena, tj. sati moraju biti u opsegu 0-23, a minute i sekunde u opsegu 0-59. Zatim iskoristite tu funkciju u glavnom programu umjesto davanja konstantnih vremena v1 i v2.

    Rješenje.

    #include

    /* Definicija strukture vrijeme */struct vrijeme {

    int sati;int minute;int sekunde;

    };

    struct vrijeme unos_vremena() {struct vrijeme v;do {

    printf ("Unesite sate: ");scanf ("%d", &v.sati);if (v.sati23)

    printf ("Sati nisu u dozvoljenom opsegu 0-23!\n");else

    break;} while (1);

    do {printf ("Unesite minute: ");scanf ("%d", &v.minute);if (v.minute59)

    printf ("Minute nisu u dozvoljenom opsegu 0-59!\n");

    Skinuto sa www.etf.ba

  • elsebreak;

    } while (1);

    do {printf ("Unesite sekunde: ");scanf ("%d", &v.sekunde);if (v.sekunde59)

    printf ("Sekunde nisu u dozvoljenom opsegu 0-59!\n");else

    break;} while (1);return v;

    }

    int proteklo (struct vrijeme v1, struct vrijeme v2) {int i,sekunde=0;/* Sati */sekunde += (v2.sati-v1.sati)*3600;/* Minute */sekunde += (v2.minute-v1.minute)*60;/* Sekunde */sekunde += v2.sekunde-v1.sekunde;return sekunde;

    }

    int main() {struct vrijeme v1,v2;

    printf ("Unesite vrijeme 1\n");v1 = unos_vremena();printf ("Unesite vrijeme 2\n");v2 = unos_vremena();

    printf ("Izmedju v1 i v2 je proteklo %d sekundi.\n", proteklo(v1,v2));return 0;

    }

    2.2 Modifikujte prethodni program tako da funkcija proteklo() vraća strukturu vrijeme. Podsjetimo se da svi elementi strukture vrijeme moraju biti pozitivni brojevi!

    Rješenje.

    #include #include /* zbog funkcije abs() */

    /* Definicija strukture vrijeme */struct vrijeme {

    int sati;int minute;int sekunde;

    };

    struct vrijeme unos_vremena() {struct vrijeme v;do {

    printf ("Unesite sate: ");

    Skinuto sa www.etf.ba

  • scanf ("%d", &v.sati);if (v.sati23)

    printf ("Sati nisu u dozvoljenom opsegu 0-23!\n");else

    break;} while (1);

    do {printf ("Unesite minute: ");scanf ("%d", &v.minute);if (v.minute59)

    printf ("Minute nisu u dozvoljenom opsegu 0-59!\n");else

    break;} while (1);

    do {printf ("Unesite sekunde: ");scanf ("%d", &v.sekunde);if (v.sekunde59)

    printf ("Sekunde nisu u dozvoljenom opsegu 0-59!\n");else

    break;} while (1);return v;

    }

    struct vrijeme proteklo (struct vrijeme v1, struct vrijeme v2) {int i;struct vrijeme rezultat;

    /* Sati, minute i sekunde */rezultat.sati = v2.sati-v1.sati;rezultat.minute = v2.minute-v1.minute;rezultat.sekunde = v2.sekunde-v1.sekunde;

    /* Ako je rezultat negativan, okrecemo ga naopako */if (rezultat.sekunde

  • /* Da izbjegnemo negativne brojeve, uzimamo apsolutnu vrijednost */sekunde = abs(sekunde);

    /* Pretvaramo u strukturu */rezultat.sati = sekunde/3600;rezultat.minute = (sekunde%3600)/60;rezultat.sekunde = sekunde%60;

    return rezultat;}

    int main() {struct vrijeme v1,v2;

    printf ("Unesite vrijeme 1\n");v1 = unos_vremena();printf ("Unesite vrijeme 2\n");v2 = unos_vremena();

    struct vrijeme v3 = proteklo(v1,v2);printf ("Izmedju v1 i v2 je proteklo %d sati, %d minuta i %d sekundi.\n",

    v3.sati, v3.minute, v3.sekunde);return 0;

    }

    2.3 Modifikujte strukturu vrijeme tako da sada izgleda ovako:struct vrijeme {

    int sati;int minute;int sekunde;int am_pm;

    };Varijabla am_pm može imati vrijednost 0 (AM - ante meridiam, prije podne) ili 1 (PM - post meridiam, poslije podne). Takođe, sada varijabla sati mora biti u opsegu 1-12.

    Rješenje.

    #include #include /* zbog funkcije abs() */

    /* Definicija strukture vrijeme */struct vrijeme {

    int sati;int minute;int sekunde;int am_pm;

    };

    struct vrijeme unos_vremena() {struct vrijeme v;do {

    printf ("Unesite sate: ");scanf ("%d", &v.sati);if (v.sati12)

    printf ("Sati nisu u dozvoljenom opsegu 0-23!\n");else

    Skinuto sa www.etf.ba

  • break;} while (1);

    do {printf ("Unesite minute: ");scanf ("%d", &v.minute);if (v.minute59)

    printf ("Minute nisu u dozvoljenom opsegu 0-59!\n");else

    break;} while (1);

    do {printf ("Unesite sekunde: ");scanf ("%d", &v.sekunde);if (v.sekunde59)

    printf ("Sekunde nisu u dozvoljenom opsegu 0-59!\n");else

    break;} while (1);

    do {printf ("Unesite 0 za AM ili 1 za PM: ");scanf ("%d", &v.am_pm);if (v.am_pm1)

    printf ("Niste unijeli 0 ili 1!\n");else

    break;} while (1);

    return v;}

    /* Posto nema smisla da za period izmedju dva vremena koristimo polje AM/PM, ostavicemo ga na 0, a sati mogu biti veci od 12 */

    struct vrijeme proteklo (struct vrijeme v1, struct vrijeme v2) {int i;struct vrijeme rezultat;

    /* Ako je v1 PM a v2 AM, odmah ih okrecemo naopako */if (v2.am_pmv1.am_pm)

    rezultat.sati+=12;

    /* Ako je rezultat negativan, okrecemo ga naopako */if (rezultat.sekunde

  • /* Ako su sati negativni, znaci da je v2

  • Rješenje.

    #include

    #define MAXVEL 100 /* velicina niza */

    /* Definicija strukture vrijeme */struct osoba {

    char ime[15];char prezime[10];int telefon;

    };

    /* Funkcija za unos nove osobe u imenik */void unos(struct osoba* niz, int* vel) {

    struct osoba a;

    /* Da li ima mjesta u nizu? */if (*vel>=MAXVEL) {

    printf ("Niz je popunjen!\n");return;

    }

    /* Unos osobe A */printf ("Unesite ime: ");scanf("%s",a.ime);printf ("Unesite prezime: ");scanf("%s",a.prezime);printf ("Unesite broj telefona: ");scanf("%d",&a.telefon);/* Ubacujemo osobu u niz i povecavamo vel za 1 */niz[(*vel)++]=a;

    }

    /* Funkcija za ispis imenika */void ispis(struct osoba* niz, int vel) {

    int i;for (i=0; i

  • printf ("Pogresan unos!\n");}

    }

    return 0;}

    3.2 Prepravite program iz zadatka 3.1 tako da je niz osoba u svakom trenutku sortiran. Dakle, niz treba sortirati svaki put nakon unosa nove osobe.

    Rješenje.

    #include #include

    #define MAXVEL 100 /* velicina niza */

    /* Definicija strukture vrijeme */struct osoba {

    char ime[15];char prezime[10];int telefon;

    };

    /* Mozemo samo pozvati funkciju sortiraj() na kraju funkcije unos() */void sortiraj(struct osoba* niz, int vel) {

    int i,j;for (i=0; i0)) {

    struct osoba priv=niz[i];niz[i]=niz[j];niz[j]=priv;

    }}

    }

    /* Funkcija za unos nove osobe u imenik */void unos(struct osoba* niz, int* vel) {

    struct osoba a;

    /* Da li ima mjesta u nizu? */if (*vel>=MAXVEL) {

    printf ("Niz je popunjen!\n");return;

    }

    /* Unos osobe A */printf ("Unesite ime: ");scanf("%s",a.ime);printf ("Unesite prezime: ");scanf("%s",a.prezime);printf ("Unesite broj telefona: ");

    Skinuto sa www.etf.ba

  • scanf("%d",&a.telefon);/* Ubacujemo osobu u niz i povecavamo vel za 1 */niz[(*vel)++]=a;sortiraj(niz,*vel);

    }

    /* Sortiranje se vrsi dvostrukom petljom. Efikasnije rjesenje je da samo ubacimo osobu na pravo mjesto u nizu, bez sortiranja. */void unos2(struct osoba* niz, int* vel) {

    struct osoba a;int i,ubaci;

    /* Da li ima mjesta u nizu? */if (*vel>=MAXVEL) {

    printf ("Niz je popunjen!\n");return;

    }

    /* Unos osobe A */printf ("Unesite ime: ");scanf("%s",a.ime);printf ("Unesite prezime: ");scanf("%s",a.prezime);printf ("Unesite broj telefona: ");scanf("%d",&a.telefon);

    /* Najprije pronalazimo prvu osobu koja je veca od osobe a */for (i=0; i0 || (prez==0 && ime>0)) {

    ubaci=i;break;

    }}/* Zatim pomjeramo sve ostale za jedno mjesto */for (i=*vel; i>=ubaci; i--)

    niz[i+1]=niz[i];

    /* Na upraznjeno mjesto ubacujemo osobu a */niz[ubaci]=a;(*vel)++;

    }

    /* Funkcija za ispis imenika */void ispis(struct osoba* niz, int vel) {

    int i;for (i=0; i

  • unos(imenik,&velicina);break;

    case 2:ispis(imenik,velicina);break;

    case 0:break;

    default:printf ("Pogresan unos!\n");

    }}

    return 0;}

    3.3 Dopunite program iz prethodnog zadatka tako da se imenik može pretraživati po imenu, prezimenu ili broju telefona. U ovom zadatku možete koristiti funkcije iz biblioteke string.h.

    Rješenje.

    #include #include

    #define MAXVEL 100 /* velicina niza */

    /* Definicija strukture vrijeme */struct osoba {

    char ime[15];char prezime[10];int telefon;

    };

    /* Mozemo samo pozvati funkciju sortiraj() na kraju funkcije unos() */void sortiraj(struct osoba* niz, int vel) {

    int i,j;for (i=0; i0)) {

    struct osoba priv=niz[i];niz[i]=niz[j];niz[j]=priv;

    }}

    }

    /* Funkcija za unos nove osobe u imenik */void unos(struct osoba* niz, int* vel) {

    struct osoba a;

    /* Da li ima mjesta u nizu? */if (*vel>=MAXVEL) {

    printf ("Niz je popunjen!\n");return;

    Skinuto sa www.etf.ba

  • }

    /* Unos osobe A */printf ("Unesite ime: ");scanf("%s",a.ime);printf ("Unesite prezime: ");scanf("%s",a.prezime);printf ("Unesite broj telefona: ");scanf("%d",&a.telefon);/* Ubacujemo osobu u niz i povecavamo vel za 1 */niz[(*vel)++]=a;sortiraj(niz,*vel);printf ("\n");

    }

    /* Funkcija za ispis imenika */void ispis(struct osoba* niz, int vel) {

    int i;for (i=0; i

  • /* Glavna programska petlja */while (izbor!=0) {

    printf ("Pritisnite 1 za unos, 2 za ispis, 3 za pretragu, 0 za izlaz: ");

    scanf ("%d", &izbor);switch (izbor) {

    case 1:unos(imenik,&velicina);break;

    case 2:ispis(imenik,velicina);break;

    case 3:pretraga(imenik,velicina);break;

    case 0:break;

    default:printf ("Pogresan unos!\n");

    }}

    return 0;}

    Tutorijal 12

    2.1 Dopunite prethodni zadatak tako da ispisuje:● broj samoglasnika● broj velikih slova● broj cifara

    Rješenje.

    #include #include /* Zbog funkcije exit() */

    int main() {FILE *ulaz;char c, ime[20];int bl=0,br=0,bz=0,p=0,bs=0,bvs=0,bc=0;

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

    printf ("Pogreska kod otvaranja datoteke %s!\n\n", ime);exit (1);

    }while ((c=fgetc(ulaz))!=EOF) {

    if (c!='\n' && c!=' ' && c!='\t')++bz;

    if (c=='\n')++bl;

    if (c==' ' || c=='\n' || c=='\t')p=0;

    else if (p==0) {p=1;

    Skinuto sa www.etf.ba

  • ++br;}if (c=='a' || c=='e' || c=='i' || c=='o' || c=='u' || c=='A' || c=='E' || c=='I' || c=='O' || c=='U')

    ++bs;if (c>='A' && c='0' && c

  • for (i=0; i=MAXVEL) {

    printf ("Niz je popunjen!\n");return;

    }

    /* Unos osobe A */printf ("Unesite ime: ");scanf("%s",a.ime);printf ("Unesite prezime: ");scanf("%s",a.prezime);printf ("Unesite broj telefona: ");scanf("%d",&a.telefon);/* Ubacujemo osobu u niz i povecavamo vel za 1 */niz[(*vel)++]=a;sortiraj(niz,*vel);printf ("\n");

    }

    /* Funkcija za ispis imenika */void ispis(struct osoba* niz, int vel) {

    int i;for (i=0; i

  • printf("Unesite ime ili prezime koje trazite: ");scanf("%s",pretraga);for (i=0; i

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

    brindexa predmet ocjena

    Kreirajte ovu datoteku koristeći Notepad i napunite je nekim testnim podacima. Zatim napravite program koji na ulazu traži broj predmeta, te ispisuje prosječnu ocjenu i prolaznost (procenat studenata koji su položili tj. dobili ocjenu 6 ili više) .

    Rješenje.

    #include #include

    int main() {int br_predmeta;int brindexa,predmet,ocjena;int ukupno=0,polozili=0;float prosjek=0;FILE* ulaz;

    printf ("Unesite broj predmeta: ");scanf("%d", &br_predmeta);

    if ((ulaz=fopen("ispiti.txt","r"))==NULL) {printf("Greska pri otvaranju datoteke ispiti.txt.\n");exit(1);

    }while (fscanf(ulaz, "%d %d %d\n", &brindexa, &predmet, &ocjena)==3) {

    if (predmet==br_predmeta) {prosjek+=ocjena;if (ocjena>=6) polozili++;ukupno++;

    }}printf ("Prosjecna ocjena: %.2f\nProlaznost: %.f%%\n", prosjek/ukupno,

    (float)polozili/ukupno*100);return 0;

    }

    3.3 Dopunite prethodni program tako da korisnik umjesto broja predmeta može unijeti tekstualni naziv predmeta.

    Da biste to postigli, kreirajte datoteku pod nazivom predmeti.txt koja sadrži imena predmeta zajedno sa brojevima.

    Rješenje. Obzirom na ograničenja funkcije scanf(), na tutorijalima sam vam preporučio da u imenima predmeta, umjesto razmaka, koristite znak donja crtica (_). Ipak, biće vam dato i rješenje koje omogućuje unos razmaka.

    #include #include

    int main() {

    Skinuto sa www.etf.ba

  • char ime_predmeta[30], ime_dat[30];int br_predmeta=0,br_dat;

    int brindexa,predmet,ocjena;int ukupno=0,polozili=0;float prosjek=0;FILE* ulaz;

    printf ("Unesite naziv predmeta: ");scanf("%s", ime_predmeta);

    /* Pronalazak predmeta u datoteci predmeti.txt */if ((ulaz=fopen("predmeti.txt","r"))==NULL) {

    printf("Greska pri otvaranju datoteke ispiti.txt.\n");exit(1);

    }while (fscanf(ulaz, "%d %s\n", &br_dat, &ime_dat)==2)

    if (strcmp(ime_predmeta,ime_dat)==0) {br_predmeta=br_dat; break;

    }fclose(ulaz);

    if (br_predmeta==0) {printf ("Predmet %s nije pronadjen u datoteci

    predmeti.txt.\n",ime_predmeta);exit(2);

    }

    /* Pretrada datoteke ispiti */if ((ulaz=fopen("ispiti.txt","r"))==NULL) {

    printf("Greska pri otvaranju datoteke ispiti.txt.\n");exit(3);

    }while (fscanf(ulaz, "%d %d %d\n", &brindexa, &predmet, &ocjena)==3) {

    if (predmet==br_predmeta) {prosjek+=ocjena;if (ocjena>=6) polozili++;ukupno++;

    }}fclose(ulaz);

    if (ukupno==0) printf ("Nije pronadjen nijedan ispit za ovaj predmet.\n");

    elseprintf ("Prosjecna ocjena: %.2f\nProlaznost: %.f%%\n",

    prosjek/ukupno, (float)polozili/ukupno*100);return 0;

    }

    Rješenje 2: Omogućen unos naziva predmeta sa razmacima:

    #include #include

    int main() {char ime_predmeta[30], ime_dat[30];int br_predmeta=0, br_dat;

    int brindexa,predmet,ocjena;int ukupno=0,polozili=0;float prosjek=0;FILE* ulaz;

    Skinuto sa www.etf.ba

  • char c; int i=0;

    /* Unos predmeta uz mogucnost unosa razmaka */printf ("Unesite naziv predmeta: ");do {

    ime_predmeta[i++]=getchar();} while(ime_predmeta[i-1]!='\n' && i=6) polozili++;ukupno++;

    }}fclose(ulaz);

    if (ukupno==0) printf ("Nije pronadjen nijedan ispit za ovaj predmet.\n");

    elseprintf ("Prosjecna ocjena: %.2f\nProlaznost: %.f%%\n",

    prosjek/ukupno, (float)polozili/ukupno*100);return 0;

    }

    3.4 Modifikujte prethodni program - dodajte mogućnost da se unese broj indexa studenta, nakon

    Skinuto sa www.etf.ba

  • čega program ispisuje ukupan broj predmeta koje je student odslušao, broj položenih, te prosječnu ocjenu.

    Rješenje. Modifikovana je varijanta sa scanf-om.

    #include #include

    void studenti() {int brindexa,predmet,ocjena;int index_unos;int izasao=0,polozio=0;float prosjek=0;FILE* ulaz;

    printf ("Unesite broj indexa: ");scanf ("%d", &index_unos);

    /* Pretrada datoteke ispiti */if ((ulaz=fopen("ispiti.txt","r"))==NULL) {

    printf("Greska pri otvaranju datoteke ispiti.txt.\n");exit(3);

    }while (fscanf(ulaz, "%d %d %d\n", &brindexa, &predmet, &ocjena)==3) {

    if (brindexa==index_unos) {if (ocjena>=6) {

    polozio++;prosjek+=ocjena;

    }izasao++;

    }}fclose(ulaz);

    printf ("Student je slusao %d predmeta, a polozio %d (%.f%%).\nProsjecna ocjena polozenih predmeta je %.1f.\n\n", izasao, polozio, (float)polozio/izasao*100, prosjek/polozio);}

    void predmeti() {char ime_predmeta[30], ime_dat[30];int br_predmeta=0,br_dat;

    int brindexa,predmet,ocjena;int ukupno=0,polozili=0;float prosjek=0;FILE* ulaz;

    printf ("Unesite naziv predmeta: ");scanf("%s", ime_predmeta);

    /* Pronalazak predmeta u datoteci predmeti.txt */if ((ulaz=fopen("predmeti.txt","r"))==NULL) {

    printf("Greska pri otvaranju datoteke ispiti.txt.\n");exit(1);

    }while (fscanf(ulaz, "%d %s\n", &br_dat, &ime_dat)==2)

    if (strcmp(ime_predmeta,ime_dat)==0) {br_predmeta=br_dat; break;

    }fclose(ulaz);

    Skinuto sa www.etf.ba

  • if (br_predmeta==0) {printf ("Predmet %s nije pronadjen u datoteci

    predmeti.txt.\n",ime_predmeta);exit(2);

    }

    /* Pretrada datoteke ispiti */if ((ulaz=fopen("ispiti.txt","r"))==NULL) {

    printf("Greska pri otvaranju datoteke ispiti.txt.\n");exit(3);

    }while (fscanf(ulaz, "%d %d %d\n", &brindexa, &predmet, &ocjena)==3) {

    if (predmet==br_predmeta) {prosjek+=ocjena;if (ocjena>=6) polozili++;ukupno++;

    }}fclose(ulaz);

    if (ukupno==0) printf ("Nije pronadjen nijedan ispit za ovaj predmet.\n\n");

    elseprintf ("Prosjecna ocjena: %.2f\nProlaznost: %.f%%\n\n",

    prosjek/ukupno, (float)polozili/ukupno*100);}

    int main() {int izbor=-1;while (izbor!=0) {

    printf ("Unesite 1 za statistiku studenta, 2 za statistiku predmeta, 0 za izlaz: ");

    scanf ("%d",&izbor);switch (izbor) {

    case 1:studenti(); break;

    case 2:predmeti(); break;

    case 0:break;

    default:printf ("Pogresan izbor!\n");

    }}return 0;

    }

    Tutorijal 13

    2.1 U datoteku ORispit.txt dodajte kolonu [brbod2] koja predstavlja broj bodova na drugom parcijalnom ispitu, dok je [brbod1] prvi parcijalni ispit. Dakle:

    [ prezime ] · · · · · · · [ ime ] · · · · · [brbod1] [brbod2]

    Zatim prepravite program tako da:● Struktura student sadrži oba podatka● U datoteku "Usmeni.txt" (obratite pažnju da se datoteka sada zove drugačije!) upisuju se

    studenti koji su položili oba parcijalna ispita (na oba imaju 10 ili više bodova).

    Skinuto sa www.etf.ba

  • ● Datoteka "Usmeni.txt" ima sljedeću strukturu:[ prezime ] · · · · · · · [ ime ] · · · · · [ukupno]

    gdje [ukupno] predstavlja zbir bodova na prvoj i drugoj parcijali.● Ova datoteka mora biti sortirana prema polju [ukupno] od većih prema manjim.

    Rješenje.

    #include #include /* Zbog funkcije exit() */

    struct student {char prezime[15];char ime[15];int brbod1;int brbod2;

    };

    int main() {struct student PPI[300];FILE *fUlaz, *fIzlaz;int i=0,j,k;

    if ((fUlaz=fopen("ORispit.txt","r"))==NULL) {printf("Greska pri otvaranju datoteke ORispit.txt");exit(1);

    }

    if ((fIzlaz=fopen("Usmeni.txt","w"))==NULL) {fclose(fUlaz);printf("Greska pri otvaranju datoteke Sortispit.txt");exit(1);

    }

    while (fscanf(fUlaz,"%15s%10s%2d%2d\n", PPI[i].prezime, PPI[i].ime, &PPI[i].brbod1, &PPI[i].brbod2) != EOF)

    i++;

    for (j=0; j=10)fprintf(fIzlaz,"%-15s%-10s%2d\n", PPI[j].prezime, PPI[j].ime,

    PPI[j].brbod1+PPI[j].brbod2);j++;

    }

    printf ("\nIzlazna datoteka Usmeni.txt je kreirana");fclose(fUlaz);fclose(fIzlaz);return 0;

    }

    Skinuto sa www.etf.ba

  • 3.1 Napravite program za unos podataka putem tastature u datoteku "ORispit.txt" specificiranu u prethodnom zadatku. Ovaj program ne smije da briše postojeću datoteku "ORispit.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.

    Rješenje.

    #include #include /* Zbog funkcije exit() */

    struct student {char prezime[15];char ime[15];int brbod1;int brbod2;

    };

    int main() {struct student PPI[300];FILE *fUlaz;int i=0,j,k;

    if ((fUlaz=fopen("ORispit.txt","r+"))==NULL) {printf("Greska pri otvaranju datoteke ORispit.txt");exit(1);

    }

    while (fscanf(fUlaz,"%15s%10s%2d%2d\n", PPI[i].prezime, PPI[i].ime, &PPI[i].brbod1, &PPI[i].brbod2) != EOF)

    i++;

    /* Unos novih studenata */int izlaz;do {

    struct student novi;printf("Unos novog studenta\nIme: ");scanf("%s", novi.ime);printf("Prezime: ");scanf("%s", novi.prezime);printf("I parcijalni: ");scanf("%d", &novi.brbod1);printf("II parcijalni: ");scanf("%d", &novi.brbod2);PPI[i++] = novi;fprintf(fUlaz,"%-15s%-10s%2d %2d\n", novi.prezime, novi.ime,

    novi.brbod1, novi.brbod2);printf("\nZelite li unijeti jos jednog studenta? (0=DA,1=NE) ");scanf("%d", izlaz);

    } while(!izlaz);

    fclose(fUlaz);

    return 0;}

    3.2 Dopunite program iz prethodnog zadatka tako da podržava sljedeće funkcije:● dodavanje studenta

    Skinuto sa www.etf.ba

  • ● brisanje studenta● izmjena studenta● ispis sadržaja datoteke

    Takođe pobrinite se da datoteka "ORispit.txt" u svakom trenutku bude sortirana.

    Rješenje.

    #include #include /* Zbog funkcije exit() */

    struct student {char prezime[15];char ime[15];int brbod1;int brbod2;

    };

    /* Funkcija koja ucitava podatke iz datoteke u niz */void ucitaj(struct student* niz, int* velicina) {

    FILE *fUlaz;int i=0;

    fUlaz=fopen("ORispit.txt","r");/* Ako datoteka ne postoji, ne radimo nista */if (fUlaz != NULL) {

    while (fscanf(fUlaz,"%15s%10s%2d%2d\n", niz[i].prezime, niz[i].ime, &niz[i].brbod1, &niz[i].brbod2) != EOF)

    i++;fclose(fUlaz);

    }*velicina=i;

    }

    /* Funkcija koja zapisuje sadrzaj niza u datoteku */void zapisi(struct student* niz, int velicina) {

    FILE *fIzlaz;int i=0;

    if ((fIzlaz=fopen("ORispit.txt","w"))==NULL) {printf("Greska pri pisanju u datoteku ORispit.txt");exit(1);

    }

    for (i=0; i

  • niz[j] = priv;}

    }}

    /* Funkcija koja pretrazuje niz studenata po prezimenu, a vraca indeks u nizu */int pretraga(struct student* niz, int velicina) {

    int i,rez=-1;char prezime[15];printf ("Unesite prezime studenta: ");scanf("%s",prezime);for (i=0; i

  • void ispis_datoteke() {FILE *fUlaz;char c;

    if ((fUlaz=fopen("ORispit.txt","r"))==NULL) {printf("Greska pri otvaranju datoteke ORispit.txt. Moguce da

    datoteka jos uvijek ne postoji?");return;

    }

    /* Bukvalno cemo ispisati datoteku na ekranu */while ((c=fgetc(fUlaz)) != EOF)

    printf("%c",c);fclose (fUlaz);printf ("\n");

    }

    int main() {struct student PPI[300];int izbor,velicina=0;/* Najprije ucitavamo podatke iz datoteke */ucitaj(PPI,&velicina);do {

    printf ("MENI\n============\n1 Dodavanje studenta\n2 Brisanje studenta\n3 Izmjena studenta\n4 Ispis sadrzaja datoteke\n0 Izlaz\n\nIzaberite: ");

    scanf("%d",&izbor);

    /* Prilikom svake operacije koja mijenja niz pozivamo funkciju zapisi */

    if (izbor==1) {dodavanje(PPI,&velicina);zapisi(PPI,velicina);

    } else if (izbor==2) {brisanje(PPI,&velicina);zapisi(PPI,velicina);

    } else if (izbor==3) {izmjena(PPI,velicina);zapisi(PPI,velicina);

    } else if (izbor==4) {ispis_datoteke();

    } else if (izbor!=0) {printf ("Pogresan izbor!\n\n");

    }} while(izbor!=0);return 0;

    }

    Zadaća br. 4

    Zadatak 1. Napravite program koji iscrtava vertikalni stupčasti graf (bar graph) datog niza brojeva između -10 i 10 (uključujući i ta dva). Korisnik najprije treba unijeti niz brojeva (odredite neku vrijednost kojom se prekida unos), a zatim program treba iscrtati graf koristeći zvjezdice (*).

    Rješenje.

    #include

    Skinuto sa www.etf.ba

  • #define EKRAN 80 /* velicina terminala je 80 znakova *//* Opseg vrijednosti dat u zadatku */#define MAX 10#define MIN -10

    /* Izcrtavanje bar graph-a. vel je velicina datog niza. */void bargraph(int* niz, int vel) {

    int i,j;/* Pozitivne vrijednosti */for (i=MAX; i>=1; i--) {

    for (j=0; j=i) printf("*"); else printf (" ");

    printf ("\n");}/* Negativne vrijednosti */for (i=-1; i>=MIN; i--) {

    for (j=0; j

  • #define MAX 10000#define VEL 10

    /* Funkcija vraca slucajan broj u opsegu min-max (ukljucujuci i ta dva) */int slucajan(int min, int max) {

    return rand() % (max-min) + min;}

    /* Funkcija vraca sumu cifara datog broja */int sumacifara(int broj) {

    int suma=0;while (broj>0) {

    suma+=broj%10;broj/=10;

    }return suma;

    }

    /* Funkcija za sortiranje niza po sumi cifara. Posto je niz dat preko pokazivaca, nema povratne vrijednosti. vel je velicina niza. */void sort_po_sumi_cifara(int* niz, int vel) {

    int i,j;for (i=0; i

  • koja u datom stringu zamjenjuje sve "whitespace" znakove jednim razmakom. Dakle, novi redovi i tabovi 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. Napravite i kraći program koji demonstrira korištenje ove funkcije.

    Rješenje.

    #include

    /* Max velicina stringa */#define VEL 1000

    /* Funkcija izbacuje iz stringa znak na n-tom mjestu. n mora biti prije kraja stringa*/char* izbaci(char* s, int n) {

    while (s[n+1] != '\0')s[n++]=s[n+1];

    s[n]='\0';return s;

    }

    /* Funkcija zamjenjuje sve whitespace znakove razmakom i sabija vise razmaka u jedan */char* whitespace(char* s) {

    int i=0;

    /* Zamijeni sve tabove i nove redove razmakom */while (s[i] != '\0') {

    if (s[i]=='\n' || s[i]=='\t') s[i]=' ';i++;

    }

    /* Zamijeni visestruke razmake jednim */i=0;while (s[i] != '\0') {

    while (s[i] == ' ' && s[i+1] == ' ')izbaci(s,i+1);

    i++;}

    return s;}

    int main() {char niz[VEL],c;int i=0;

    /* Unos stringa */while (c != '\n') {

    c = getchar();niz[i] = c;i++;if (i==VEL-1) break;

    }niz[i]='\0';

    whitespace(niz);printf ("Tekst glasi: '%s'\n", niz);return 0;

    }

    Skinuto sa www.etf.ba

  • Zadatak 4. 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.

    Rješenje.

    #include

    /* Max velicina stringa */#define VEL 10000

    /* Funkcija koja iz stringa brise dio izmedju indeksa pocetak i kraj */char* brisi_od_do(char* s, int pocetak, int kraj) {

    while (s[kraj] != '\0')s[pocetak++]=s[kraj++];

    s[pocetak]='\0';return s;

    }

    /* Funkcija koja iz datog stringa, koji predstavlja C kod, izbacuje sve komentare. */char* no_comment(char* niz) {

    int i=0,j;while (niz[i] != '\0') {

    /* C-stil komentari */if (niz[i] == '/' && niz[i+1] == '*') {

    j=i+2;/* Ako nije pronadjen zavrsetak komentara, brisemo do kraja */while (niz[j] != '\0') {

    if (niz[j-1] == '*' && niz[j] == '/') break;j++;

    }brisi_od_do(niz,i,j+1);/* Ako se odmah nalazi sljedeci komentar, moramo vratiti i */i--;

    }

    /* C++-stil komentari */if (niz[i] == '/' && niz[i+1] == '/') {

    j=i+2;/* Brisemo sve do novog reda ili kraja */while (niz[j] != '\0' && niz[j] != '\n')

    j++;brisi_od_do(niz,i,j);/* Ako se odmah nalazi sljedeci komentar, moramo vratiti i */i--;

    }i++;

    }return niz;

    }

    int main() {

    Skinuto sa www.etf.ba

  • char niz[VEL],c;int i=0;

    /* Unos stringa */while (c != '\n') {

    c = getchar();niz[i] = c;i++;if (i==VEL-1) break;

    }niz[i]='\0';

    no_comment(niz);printf ("Tekst glasi: '%s'\n", niz);return 0;

    }

    Skinuto sa www.etf.ba

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    24. Napisati C program koji ce ucitati dimenzije (RA x KA) realne matrice A (maksimalno 10 x 10) , dimenzije (RB x KB) realne matrice B (maksimalno 10 x 10), te ucitati elemente tih matrica. Program zatim treba izracunati matricu C koja je proizvod matrica A i B. Na kraju program treba ispisati sve tri matrice: A, B i C. * RA, RB oznacavaju broj redova matrica A i B, respektivno; * KA, KB oznacavaju broj kolona matrica A i B, respektivno. Prilikom unosa dimenzija matrica program treba provjeriti da li su unesene dimenzije u dozvoljenim granicama, tj. da li je RA

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    for (i=0;i

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    25. Napisati C program koji sa standardnog ulaza ucitava elemente realne matrice dimenzija 5 x 5, te izracunava sumu elemenata svake kolone i sumu elemenata svakog reda. Za unos i pohranjivanje matrice koristite dvodimenzionalno polje, dok za pohranjivanje suma po redovima i kolonama trebate koristiti jednodimenzionalno polje. Program takodjer treba pronaci: * u kojoj koloni je najmanja suma, * u kojem redu je najveca suma, te ispisati na standardni izlaz unesenu matricu, redne brojeve i sume pronadjene kolone, odnosno, reda. RJEŠENJE: #include main(){ // Definisanje varijabli float MATRIX[5][5], SUMA[5], sumaR, sumaK; int i,j, Kolona, Red; // Unos elemenata matrice printf("\nUnesi elemente matrice MATRIX[5,5]: \n"); for (i=0;i

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    /* Racunanje suma po kolonama... ista procedura, samo smo zamijenili mjesta brojaca „i, j“ unutar „MATRIX[i][j]“. */ for (i=0;i

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    26. Program ucitava jednu rijec a i znak c koji se treba prebrojati u toj rijeci. Nakon toga program poziva funkcije duzina() i izbroji () i samogl(), te ispisuje dužinu unesene rijeci a i broj pojavljivanja znaka c u toj rijeci, kao i broj samoglasnika u rijeci. RJEŠENJE: #include // Funkcije „duzina“, „izbroji“ i „samogl“ // Funkcija duzina prima pokazivac na prvo slovo nekog stringa, a zatim u while petlji provjerava se koliko znakova ima rijec, kada se dodje do nultog znaka, izlazi se iz petlje, rezultet je varijabla „d“ koja se vraca iz funkcije. int duzina(char *string) { int d=0; while (*string++!='\0') d++; return d; } /* Slicno prvoj funkciji, samo funkcija pored pokazivaca na prvi znak stringa prima i znak koji se broji. I umjesto da broji se broj clanova, umjesto d++ ide uslov (ako je slovo na koje pokazuje pokazivac nase slovo), „b“ se uveca za 1. Kada „dodje“ while petlja do nultog znaka, izlazi se iz petlje a varijabla „b“ se vraca kao rezultat. NAPOMENA: U gornjoj funkciji stoji u uslovu *string++ sto prebaca pokazivac na iduci clan nakon sto while petlja napravi jedan „krug“, dok u drugoj funkciji stoji u uslovu samo *string ali je poslije if petlje uvecan pokazivac za „1“, sto nam daje opet isti efekat. */ int izbroji(char *string, char c) { int b=0; while (*string!='\0') { if (*string==c) b++; string++; } return b; } /* Identicno funkciji izbroji() samo umjesto provjere „*string==c“ ide uslov da li je „*string“ neki od samoglasnika, a ne znak koji unosimo. Funkcija prima samo pokazivac bez znaka. */ int samogl (char *string) { int b=0; while(*string!='\0') { if (*string=='a'||*string=='A'||*string=='E'||*string=='e'||*string=='I'|| *string=='i'||*string=='O'||*string=='o'||*string=='U'||*string=='u') b++; string++; } return b; }

    Skinuto sa www.etf.ba

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    int main() { // Definisanje varijabli char a[80],c; // Unos rijeci bez razmaka i jednog slova koje ce se prebrojavati printf("\nUnesite jednu rijec do 20 znakova (bez razmaka):"); scanf("%s",a); printf("\nKoji znak treba prebrojati:"); scanf("\n%c",&c); // Ispis rjesenja printf("\nUnesena rijec sadrzi %d znakova!",duzina(a)); printf("\nBroj znakova %c je: %d",c,izbroji(a,c)); printf("\nBroj samoglasnika je: %d", samogl(a)); // Kraj programa getch(); return 0; }

    Skinuto sa www.etf.ba

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    27. Napisati program koji u realno polje temp ucitava 10 realnih vrijednosti koje predstavljaju temperature u 10 razlicitih dnevnih termina. Program zatim poziva funkcije maxtemp() i prtemp() koje izracunavaju maksimalnu dnevnu temperaturu i prosjecnu dnevnu temperaturu i ispisuje na standardnom izlazu te vrijednosti.

    RJEŠENJE: #include main () { // Definisanje varijabli float temp[10], *p; int i; // Definisanje prototipa funkcija float maxtemp(float *p); float prtemp(float *p); // Unos 10 temperatura u niz temp[]; for (i=0;i

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    28. Modificirati prethodni program (27) tako da program ucitava cijeli broj n a zatim se sa tastature unosi n vrijednosti za temperature u polje temp. Pretpostaviti da je n

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    29. Napisati funkciju s imenom adresa() koja kao argument uzima dva stringa koji predstavljaju ime i prezime a kao rezultat vraca se novi string koji se dobije tako da se string koji predstavlja prezime promijeni u string koji predstavlja e-mail adresu slijedeceg oblika: [prezime].[ime]@etf.unsa.ba Prototip funkcije je: char *adresa(char *ime, char *prezime) Na primjer, ako su argumenti ime=“Marko“, prezime=“Markovic“ funkcija adresa() vraca pokazivac na rezultirajuci string prezime koji je promijenjen u novi string oblika: [email protected]. Nakon toga, napisati glavni program koji ucitava ime i prezime neke osobe i na standardnom izlazu ispisuje toj osobi pridruženu e-mail adresu koja se dobije pozivom funkcije adresa().

    RJEŠENJE: #include // Funkcija adresa() char *adresa(char *ime, char *prezime) { // Definisanje varijabli potrebnih za rad u funkciji char *p, POMOC[]="@etf.unsa.ba", *POM; /* Pointer „p“ pokazuje na pocetak prezimena, a „POM“ pokazuje na pomocni niz “POMOC“ u kojem se nalazi string „@etf.unsa.ba.“ */ p=prezime; POM=POMOC; // Generisanje email adrese // Ova while petlja pokazivac postavi iza zadnjeg znaka, tj. Na nulti znak. while (*p!='\0') p++; // Umjesto nultog znaka upise se „.“ i predje se na iduci znak *p='.'; p++; // Poslije tacke se ubacaju karakteri iz niza na koji pokazuje pokazivac „ime“ while (*ime!='\0') { *p=*ime; ime++; p++; } // Poslije imena se doda string na koji pokazuje pokazivac „POM“ while (*POM!='\0') { *p=*POM; POM++; p++; } // Vracanje pokazivaca iz funkcije return p; } // Glavni program int main(){ // Definisanje varijabli char *ime, *prezime, *c; char U1[100], U2[100]; // Unos podataka ime i prezime printf("\nUnesi ime:"); scanf("%s", &U1); printf("\nUnesi prezime:"); scanf("%s", &U2); // Postavljanje pokazivaca „c“ na pocetak prezimena c=U2; // Postavljanje pokazivaca ime i prezime na stringove U1 i U2

    Skinuto sa www.etf.ba

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    ime=U1; prezime=U2; // Poziv funkcije „adresa()“ i slanje pokazivaca „ime“ i „prezime“ u funkciju prezime=adresa(ime, prezime); // Ispis Email adrese printf("\nGenerirana korisnikova Email adresa: %s", c); // Kraj programa getch(); return 0; }

    Skinuto sa www.etf.ba

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    30. Napisati funkciju koja kao argument uzima znakovno polje jmbg (jedinstveni maticni broj gradjanina) a kao izlaz vraca strukturnu varijablu koja predstavlja datum rodjenja doticne osobe. Prototip funkcije je: struct datum fdatum(char *jmbg) gdje struct datum predstavlja strukturu definiranu kao: struct datum { int dan; int mjesec; int godina; }; Na primjer, ako je strukturna varijala drodj definirana kao: struct datum drodj; te ako je ulaz u funkciju jmbg=“2405978234567“ poziv funkcije drodj=fdatum(jmbg); treba vratiti strukturnu varijablu koja predstavlja datum 24.05.1978., tj. funkcija vraca slijedece podatke strukturne varijable tipa datum: drodj.dan=24; drodj.mjesec=5; drodj.godina=1978; Nakon toga napišite glavni program koji sa standardnog ulaza ucitava jmbg kao znakovno polje a nakon poziva funkcije fdatum() ispisuje datum rodjeja osobe sa doticnim jedinstvenim maticnim brojem.

    RJEŠENJE: # include // Definisanje strukture datum struct datum { int dan; int mjesec; int godina; }; /* Funkcija koja vraca datum kreiran od znakovnog polja u koje je upisan maticni broj */ struct datum fdatum(char *jmbg){ // Definisanje varijable drodj kao strukturne varijable od datum struct datum drodj; // Definisanje pokazivaca koji pokazuje na strukturnu varijablu struct datum *pd; int i;

    Skinuto sa www.etf.ba

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    // Racunanje varijabli strukturne varijable // Pretpostavka je da je korisnik ciji maticni broj unesete rodjen 1xxx godine drodj.dan=0; drodj.mjesec=0; drodj.godina=1000; // Racunanje jedinice dana for (i=0;i

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    31. Napisati program koji broji rijeci koje imaju n znakova u tekstualnoj datoteci cije ime se unosi sa tastature. Na primjer, ako u direktoriju(folderu) T11 na disku C: postoji datoteka pismo.txt sa slijedecim sadržajem: Lijep pozdrav! Sretnu i uspjesnu Novu godinu zeli Vam kompanija BHKOM. Isto tako se nadamo da ce se dosadasnja uspjesna saradnja nastaviti i u novoj 2006. godini. Direktor: IVIC IVICA program treba nakon unosa imena sa tastature i broja n: Unesite broj znakova: 5 Unesite ime datoteke: C:\T11\pismo.txt dati slijedeci izlaz: Datoteka pismo.txt sadrzi 4 rijeci sa 5 znakova. Napomene: Rijeci sa pet znakova za gore navedenu datoteku su: {Lijep, BHKOM, novoj, IVICA}. Prilikom brojanja znakova ne uzimaju se u obzir znakovi interpunkcije: tacka (.), zarez (,), usklicnik (!) i sl. Prilikom rješavanja zadatka obavezno napravite testnu datoteku pismo.txt i pohranite je u direktorij T11, te tu datoteku koristite za testiranje vašeg rješenja.

    RJEŠENJE: # include main() { // Definisanje varijabli FILE *datoteka; char dat[60], znak; int znakovi, br=0, rez=0; // Unos putanje do datoteke printf("Unesi putanju do datoteke: "); scanf("%s", &dat); // Ispituje se da li datoteka postoji, ako postoji, ide se dalje u program u // suprotnom se ispisuje error poruka i izlazi iz programa if ( (datoteka = fopen (dat, "r")) == NULL) { printf("Greska kod otvaranja datoteke %s !\n", dat); getch(); exit(1); } // Unos broja znakova printf("Unesi broj znakova: "); scanf("%d", &znakovi); /* While petlja vrti se i uzima se znak po znak iz datoteke sve dok ne dodje se do kraja datoteke i kada stignemo na kraj izlazi se iz programa. Ukoliko je uneseni karakter razlicit od znakova ? ! . \n , \t i blanko znaka onda se varijabla br uveca za jedan, u suprotnom se provjeri da li je broj br jednak broju znakova koji smo unjeli, i ako jeste varijabla rez se uveca za jedan, i onda se br postavi na 0. Kada stignemo do kraja datoteke izlazi se iz petlje.*/

    Skinuto sa www.etf.ba

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    while((znak=fgetc(datoteka))!=EOF){ if ((znak=='?')||(znak=='!')||(znak==' ') ||(znak=='.')||(znak=='\n')||(znak==',')||(znak=='\t')) { if (br==znakovi) rez++; br=0;} else br++; } /* Ukoliko zadnja rijec se sastoji od trazenog broja znakova, ona nece biti uracunata jer smo izasli iz petlje, pa je potrebno dodati ovaj uslov iza petlje da bi smo imali 100% tacan program*/ if (br==znakovi) rez++; //Zatvaranje datoteke fclose(datoteka); // Izlaz iz programa printf("Datoteka %s sadrzi %d rijeci sa %d znakova.", dat, rez, znakovi); getch(); return 0; }

    Skinuto sa www.etf.ba

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    32. Napravite tekstualnu datoteku “ORPodaci.txt“ (pomocu programa Notepad ili slicnog) slijedeceg formata: [prezime ]· · · · · ·[ime] · · · · ·[brbod1] · · · · · ·[brbod2] gdje : - kolona [prezime] zauzima 15 mjesta; - kolona [ime] zauzima 10 mjesta; - kolona [brbod1] zauzima 4 mjesta i predstavlja broj bodova na prvom parcijalnom ispitu - kolona [brbod2] zauzima 4 mjesta i predstavlja broj bodova na drugom parcijalnom ispitu - U datoteku “ORPodaci.txt“ unesite podatke za 15 studenata. - Spasite datoteku “ORPodaci.txt“ u direktorij C:\T12. - VAŽNO: Prilikom kreiranja datoteke “ORPodaci.txt“ budite precizni u zauzimanju mjesta za pojedine kolone. Zatim, napisati program koji ucitava sadržaj tekstualne datoteke “ORPodaci.txt” i na temelju te datoteke kreira novu datoteku pod imenom “Polozili.txt” u kojoj se treba nalaziti sortiran (od veceg prema manjem) spisak onih studenata koji su položili oba parcijalna ispita (to su oni studenti koji imaju na oba parcijalna 10 ili više bodova). Datoteka “Polozili.txt” je slijedeceg formata: [prezime ]· · · · · · · ·[ime] · · · · · · ·[ukupno] gdje : - kolona [prezime] zauzima 15 mjesta; - kolona [ime] zauzima 10 mjesta; - kolona [ukupno] zauzima 4 mjesta i predstavlja ukupan broj bodova sa oba parcijalna ispita.

    RJEŠENJE: #include #include /* Definisanje strukture forma koja se sastoji iz varijabli prezime i ime tipa char i prvi i drugi tipa integer */ struct forma { char prezime[15]; char ime[10]; int prvi; int drugi; }; main(){ /* Definisanje varijabli: Neo - pokazivac na fajl koji se cita Trinity - pokazivac na fajl u koji se pise

    Skinuto sa www.etf.ba

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    podaci[15] - strukturni niz podaci u koji ce se upisati svi podaci koji se ucitaju iz fajla, maksimalno 15... Love - pomocna strukturna varijabla i,j,k - potrebni projaci za sortiranje, i jos ponesta :) */ FILE *Neo, *Trinity; struct forma podaci[15]; struct forma Love; int i=0, j=0, k=0; /* Otvaranje datoteke ORPodaci.txt i pridruzivanje pokazivacu Neo, ako ne postoji datoteka izlazi se iz programa */ if ((Neo=fopen("C:\\T12\\ORPodaci.txt","r"))==NULL) { printf("Greska pri otvaranju datoteke"); exit(1); } /* Datoteka polozili.txt se kreira i pridruzuje pokazivacu Trinity */ Trinity = fopen ("c:\\T12\\Polozili.txt", "w"); /* Citanje podataka iz datoteke i upisivanje istih u strukturu podaci. Varijabla i se vraca kao broj koji oznacava broj studenata koji su polozili obe parcijale. podaci[i].prvi se automatski sabira sa podaci[i].drugi i ukupna vrijednost postaje ustvari podaci[i].prvi!*/ while(fscanf(Neo,"%15s%10s%4d%4d",&podaci[i].prezime,&podaci[i].ime,&podaci[i].prvi,&podaci[i].drugi) != EOF ) { if ((podaci[i].prvi>=10)&&(podaci[i].drugi>=10)) podaci[i].prvi+=podaci[i].drugi; else i--; i++; } // Proces sortiranja... objasnjen u jednom od zadataka ranije... for(j=0;j

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    33. Napisati funkciju okreni() koja kao argument uzima neki string i okrece sadržaj tog stringa naopako. Prototip funkcije okreni() treba biti: void okreni(char* p) Zatim napravite glavni program koji sa standardnog ulaza ucitava neki string, te ga ispisuje naopako. Primjer: Unesite string: Sarajevo Naopako: ovejaraS

    RJEŠENJE: #include // Funkcija okreni void okreni(char *p){ // Definisanje pomocnih varijabli char pom; int i=0, j=0, br=0; // Brojanje slova rijeci, pointer „odlazi“ na kraj rijeci. while (*p!='\0') {br++; p++;} /* Pointer je „otisao“ na kraj rijeci, a nama treba u nastavku da je na pocetku, pa cemo ga vratiti na pocetak tako sto ga pomaknemo za isti broj mjesta nazad, za koji smo ga while petljom pomjerili naprijed! */ p=p-br; // Glavni dio programa, ALGORITAM. /* Recimo da smo unjeli rijec LOVE. Rijec koju trebamo dobiti kao rezultat je EVOL. Znaci potrebno je zamjeniti zadnje slovo sa prvim, i drugo sa predzadnjim. Brojac „i“ nam predstavlja znak do kojeg smo dosli sprijeda, a brojac „j“ straga. Na pocetku ce biti i=0, j=3 (jer je br=3, nemojte se zbuniti sto je 3 a ne 4, tu su ipak cetiri clana 0,1,2,3). Znaci nakon sto se for petlja jednom izvrsi „i“ se uveca za 1 i postaje 1, a j se umanji za 1 i postane 2. Znaci u prvom slucaju pomocu pomocne varijable „pom“ mijenjamo znakove na 0 i 3 poziciji, drugi put ce se zamjeniti znakovi na 1 i 2 poziciji. I dobili smo trazenu rijec. Mozda zbunjuje uslov i

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    // Postavljanje pokazivaca „t“ na „NIZ“ t=NIZ; // Pozivanje funkcije i slanje pokazivaca „t“ u funkciju okreni(t); /* Ispis stringa NIZ preuredjenog funkcijom (printa se „t“, a „t“ nam pokazuje na „NIZ“). */ printf("%s", t); // Kraj programa getch(); return 0; }

    Skinuto sa www.etf.ba

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    34. Napisati funkciju ubaci5() koja kao argument uzima neki prirodni broj n i dva broja a i b, a zatim vraca se broj koji bi nastao zamjenom cifri na mjestu a i b cifrom 5 (gledano s desne strane). Funkcija ne treba ništa ispisivati. Funkcija ubaci5() treba imati prototip: int ubaci5(int n,int a,int b); Pretpostaviti da su a i b valjano unesene vrijednosti koje imaju smisla. Primjeri ulaznih argumenata i vracenih vrijednosti: Primjer1: za ulazne argumente n=123321, a=2, b=3 funkcija vraca broj 123551. Primjer 2: za ulazne argumente n=23455, a=3, b=5 funkcija vraca broj 53555. RJEŠENJE: #include // Funkcija ubaci5(); int ubaci5(int n,int a,int b) { // Definisanje varijabli int c=0,t=1,o,i; /* Brojac „i“ krece od 1(prvi znak straga) i ide dok broj „n“ koji smo primili u funkciju ne postane 0. Svaki put kada for petlja se izvrsava ponovo, uzima se ostatak dijeljenja sa 10, odnosno uzima se zadnja cifra broja „n“, i pridruzuje varijabli „o“. Zatim se broj „n“ podijeli sa 10, cime mu se odbije zadnja cifra. Suma „c“ se uvecava za „t*o“ gdje t se mijenja kao 1,10,100,1000. Kada i bude jednako „a“ ili „b“ onda se umjesto „t*o“ doda „t*5“ i time se na „a-to/b-to“ mjesto doda broj 5 umjesto broja koji je bio na toj poziciji. Naredba „continue;“ ce vratiti na pocetak for petlje kako se nebi izvrsile i linije ispod, jer bi time dobili ubacivanje brojeva, a ne zamjenu!!! Savjet: Probajte napisati recimo petocifren broj, i skontajte malo na papiru prvo kako biste te zamjene uradili, skontajte ulogu varijabli „o“ i „t“!!! */ for (i=1;n>0;i++){ o=n%10; n=n/10; if (i==a) {c=c+t*5; t=t*10; continue;} if (i==b) {c=c+t*5; t=t*10; continue;} c=c+t*o; t=t*10;} return c;} main(){ // Definisanje varijabli a,b,n int n, a, b; // Unos brojeva a,b,n printf("Unesi prirodan bron n:"); scanf("%d", &n); printf("Unesi brojeve a,b:"); scanf("%d,%d", &a, &b); /* Poziv funkcije, slanje n,a,b u funkciju, a rezultat se pridruzuje varijabli n, koja se printa u iducoj liniji. */ n=ubaci5(n,a,b); printf("%d", n); // Kraj programa. getch(); return 0; }

    Skinuto sa www.etf.ba

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    35. Napisati program koji ucitava podatke iz ulazne formatirane tekstualne datoteke „gradovi.txt“ i kreira izlaznu datoteku „prosjeci.txt“ koja sadrži spisak gradova s prosjecnom temperaturom za prva tri mjeseca. Datoteka „gradovi.txt“ je sljedeceg formata: [grad] [JAN] [FEB] [MAR] gdje je: [grad] kolona u kojoj su zapisani nazivi gradova i koja zauzima 15 mjesta; [JAN], [FEB], [MAR] kolona u kojoj su zapisane cjelobrojne prosjecne temperature za mjesec januar, februar i mart, respektivno. Ove kolone zauzimaju po 10 mjesta. Datoteka „prosjeci.txt“ je slijedeceg formata: [grad] [PRTEMP] gdje je: [grad] kolona u kojoj su zapisani nazivi gradova i koja zauzima 15 mjesta; [PRTEMP] kolona u kojoj su zapisane prosjecne temperature koristeci dva decimalna mjesta i maksimalno dva mjesta prije decimalne tacke. Primjer sadržaja datoteke „gradovi.txt“: TRAVNIK 0 1 2 ZENICA 2 3 4 TUZLA 2 5 5 SARAJEVO 0 3 1 Primjer sadržaja datoteke „prosjeci.txt“: TRAVNIK 1.00 ZENICA 3.00 TUZLA 4.00 SARAJEVO 1.33 RJEŠENJE: #include main(){ // Definisanje varijabli FILE *Neo, *Trinity; char grad[15]; float JAN, FEB, MAR, PRO; /* Provjera da li postoji datoteka gradovi.txt i ako ne postoji ispis greske, u suprotnom se nastavlja program */ if ((Neo=fopen("C:\\gradovi.txt","r"))==NULL) { printf("Greska pri otvaranju datoteke"); return 0; } // Otvaranje datoteke prosjeci.txt Trinity=fopen("C:\\prosjeci.txt","w"); /* Citanje podataka iz datoteke gradovi.txt izracunavanje prosjecne temperature PRO i printanje u datoteku prosjeci.txt */

    Skinuto sa www.etf.ba

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    while(fscanf(Neo,"%15s%10f%10f%10f", &grad, &JAN, &FEB, &MAR) != EOF ) { PRO=(JAN+FEB+MAR)/3; fprintf(Trinity,"%-15s%2.2f\n", grad, PRO); } // Kraj programa close(Neo); close(Trinity); getch(); return 0; }

    Skinuto sa www.etf.ba

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    36. Napisati funkciju izbacip() koja kao argument uzima neki prirodni broj n, a zatim vraca broj koji bi nastao izbacivanjem parnih cifri iz tog broja. Funkcija ne treba ništa ispisivati. Funkcija izbacip() treba imati prototip: int izbacip(int n); Na primjer, za argument 123420 funkcija treba vratiti broj 13. RJEŠENJE: // Funkcija izbacip() prima neki integer broj int izbacip(int n){ /* Definisanje varijabli, „t“ je tezisnica koja se svaki put kada dodajemo neku cifru pomnozi sa 10, „o“ je ostatak, „i“ je brojac, a „c“ je broj koji ce funkcija vratiti kao rezultat */ int c=0,t=1,o,i; /* „i“ se uvecava za 1 i for petlja se vrti sve dok broj „n“ bude jednak 0 */ for (i=1;n>0;i++){ /* Uzima se ostatak dijeljenja sa 10, odnosno zadnja cifra broja */ o=n%10; // „Odbije“ se zadnja cifra broja „n“ dijeljenjem sa 10 n=n/10; /* Ako je broj paran, vraca se na pocetak petlje i time se izbacaju parne cifre */ if (o%2==0) continue; // Dodavanje cifre na broj „c“ c=c+t*o; // Mnozenje tezisnice sa 10 t=t*10; } // Vracanje varijable c return c; }

    Skinuto sa www.etf.ba

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    37. Napisati funkciju ispis_preko_a() koja kao argment uzima neko cjelobrojno polje i dva prirodna broja a i d, a zatim ispisuje sve elemente polja koji su veci od broja a. Broj d predstavlja broj elemenata polja. Funkcija treba imati slijedeci prototip: void ispis_preko_a(int *polje, int a, int d) Na primjer, za ulazne argumente int polje[]={4,5,7,20,8,10,2,-2}, a=6, d=8 trebaju se ispisati brojevi: 7, 20, 8, 10 RJEŠENJE: // Funkcija prima pokazivac na polje, i dva cijela broja „a“,“d“ void ispis_preko_a(int *polje, int a, int d) { // Definisanje brojaca „i“ int i; /* For petlja se „vrti“ sve dok brojac i koji krece od 0 ne bude veci od broja „d“ koji je funkcija primila. */ for (i=0; i

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    38. Napisati funkciju zamijeni() koja ce u jednodimenzionalnom polju A velicine d zamijeniti i-ti element sa minimalnim elementom u polju A. Elementi polja A su vec definirani u glavnom programu. Funkcija treba imati prototip: void zamijeni(int *A, int i, int d) Na primjer, ako su elementi polja A: int A[]={3, 7, 10, 20, 18, 4,10, 2, 20], a argumenti i i d imaju slijedece vrijednosti i=3, d=9 funkcija zamijeni() promjeni polje A u polje sa slijedecim elementima: 3, 7, 2, 20, 18, 4, 10, 2, 20 (na trece mjesto se stavlja minimalni element iz polja a to je 2) RJEŠENJE: // U funkciju se prima niz brojeva „A“, broj „i“, broj „d“. void zamijeni(int *A, int i, int d) { // Definisanje brojaca „j“ i varijable „min“ int j,min; // Postavljanje vrijednosti „min“ na prvi clan niza min=A[0]; /* Trazenje najmanjeg elementa u nizu. Pretpostavili smo da je to prvi broj, i sada trebamo ispitati da li postoji neki broj krenuvsi od drugog (j=1 umjesto j=0 u for petlji) i ako postoji neki manji postavi se da je taj broj „min“. */ for (j=1; jA[j]) min=A[j]; /* Postavljanje na i-tu poziciju vrijednosti „min“ (i=1 ide jer nam je i-ti clan ustvari broj za jedan manje, jer nam je prvi clan nulti clan! */ A[i-1]=min; // Ispis niza for (j=0; j

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    39. Data je tekstualna datoteka c:\pismo.txt. Napisati funkcije za: a) ispis datoteke na standardni izlaz zadržavajuci strukturu po redovima; b) prepis datoteke u novu mijenjajuci mala i velika slova; c) ispisati datoteku u obrnutom redosljedu na izlaz (prva postaje zadnja, druga postaje pretposljednja rijec...) d) ispitati da li je neka rijeè palindrom (isto znacenje kada se cita i u obrnutom smjeru)

    RJEŠENJE: # include // Ispis datoteke na standardni izlaz zadržavajuci strukturu po redovima... void ispis(FILE *datoteka){ char znak; printf("\nSadrzaj datoteke je: \n\n"); while(fscanf(datoteka,"%c", &znak)!=EOF){ printf("%c", znak); } } /* Ispitati da li je neka rijec palindrom (isto znacenje kada se cita i u obrnutom smjeru) */ void palindrom(FILE *datoteka){ char znak[100]; char *p, *t; int i, br=0, ispit=0; printf("\n\nProvjera palindroma: \n"); while(fscanf(datoteka,"%s", &znak)!=EOF){ p=znak; t=znak; br=0; while(*p!='\0') {p++; br++;} p--; ispit=1; for(i=0;i64)&&(znak96)&&(znak

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    /* Ispisati datoteku u obrnutom redosljedu na izlaz (prva postaje zadnja, druga postaje pretposljednja rijec...) */ void ispisobrnuto(FILE *datoteka){ char znak, matrix[1000][1000], pok[1000]; int i=0, j=0, br=0, k=0, niz[100]; printf("\n\nSadrzaj datoteke je (naopako): \n"); while(fscanf(datoteka,"%c", &znak)!=EOF){ if (znak==' ') {br++; j++; i=0; continue;} if (znak=='\n') {br++; niz[k]=j; j++; k++; i=0; continue;} matrix[j][i]=znak; i++; } niz[k]=j; j=0; for (i=br;i>=0;i--) { if((i==niz[k-j])&&(k-j!=-1)) { printf("\n"); j++;} printf("%s ", matrix[i]); } } main() { // Definisanje pokazivaca na datoteku FILE *datoteka; // Otvaranje datoteke za citanje datoteka=fopen("c:\\pismo.txt","r"); // Poziv funkcije za ispis datoteke na ekran... ispis(datoteka); fclose(datoteka); // Otvaranje datoteke za citanje datoteka=fopen("c:\\pismo.txt","r"); // Poziv funkcije za prepis datoteke u novu mijenjajuci mala i velika slova. ispisunovu(datoteka); fclose(datoteka); // Otvaranje datoteke za citanje datoteka=fopen("c:\\pismo.txt","r"); /* Poziv funkcije za ispis datoteke u obrnutom redosljedu na izlaz (prva postaje zadnja, druga postaje pretposljednja rijec...) */ ispisobrnuto(datoteka); fclose(datoteka); // Otvaranje datoteke za citanje datoteka=fopen("c:\\pismo.txt","r"); /* Poziv funkcije za ispitivanje da li je neka rijec palindrom (isto znacenje kada se cita i u obrnutom smjeru) */ palindrom(datoteka); fclose(datoteka); // Kraj programa... getch(); return 0; }

    Skinuto sa www.etf.ba

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    40. Napisati program koji cita više linija teksta sa ulaza i štampa koliko rijeci je dužine 2 3 4 i više slova. Štampu realizovati pomocu funkcije STAM_REZ u datoteku ili na ekranu. Iz datoteke rezultata dati izvještaj o ukupnom broju rijeci i prosjecnoj dužini rijeci. RJEŠENJE: #include // Funkcija koja kreira datoteku sa rezultatima void STAM_REZ(char *tekst, int br){ // Definisanje pokazivaca na fajl FILE *rezultati; // Definisanje varijabli int i,b=0,dva=0,tri=0,cetiri=0,vise=0, brojslova=0, prosjek=0; // Otvaranje datoteke u koju cemo pisati podatke rezultati=fopen("c:\\rezultati.txt","w"); // For petlja vrti se "br" puta... for (i=0;i1 broj slova ce se sabrati sa brojem slova rijeci koja se trenutno obradjuje, ako je b=2 onda se varijabla dva koja broji rijeci sa 2 slova uveca za 1. Ako je tri onda se varijabla tri uveca za 1... ako je preko 4 onda se varijabla vise uveca za 1... primjetite da se brojac vraca na 0 izlaskom iz uslova, nebitno da li je bilo b=0 ili 1 ili 2 ili ... */ if (b>1) brojslova=brojslova+b; if (b==2) {dva++; b=0;} else if (b==3) {tri++; b=0;} else if (b==4) {cetiri++; b=0;} else if (b>4) {vise++; b=0;} else b=0; } else b++; } // Upis podataka u datoteku... fprintf(rezultati,"Rijeci sa 2 slova: %d\n", dva); fprintf(rezultati,"Rijeci sa 3 slova: %d\n", tri); fprintf(rezultati,"Rijeci sa 4 slova: %d\n", cetiri); fprintf(rezultati,"Rijeci sa preko 4 slova: %d\n", vise); prosjek=brojslova/(dva+tri+cetiri+vise); fprintf(rezultati,"PROSJEK: %d\n", prosjek);

    Skinuto sa www.etf.ba

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    /* Zatvaranje datoteke i izlaz iz funkcije... „void“ funkcija ne vraca nista!!! Izlaskom je sve sto se u njoj desavalo zaboravljeno, ali zato imamo sve rezultate pohranjene u datoteci iz koje cemo po povratku u program citati podatke.*/ fclose(rezultati); } // Glavni program main(){ // Definisanje varijabli int br=0, i=0, p=0, dva, tri, cetiri, vise, prosjek; char tekst[1000]; // Definisanje pokazivaca na fajl FILE *izvjestaj; /* Unos teksta (koristio sam while petlju koja upisuje znak po znak, a ne %s koja upisuje cijeli string odjednom, a zasto? pa jednostavno jos uvijek neznam drugi nacin da izbjegnem situaciju kad upisete prvi razmak, a program to shvati kao kraj stringa i racuna samo da je string prva rijec, a ostalo kao da niste unjeli. Ovako se ucita sve sto unesete sa tastature, sto nam i treba. U zadatku nije naznaceno sta ce biti prekid unosa, pa sam ja stavio tacku :) )*/ printf("Unesi tekst[i], (Tacka za kraj unosa!):"); while (tekst[i-1]!='.') { scanf("%c", &tekst[i]); i++; br++;} /* Poziv funkcije u koju saljemo tekst koji smo unijeli kao i brojac „br“ koji je prebrojao broj unesenih karaktera, mogli smo i bez njega, al eto ja nekako vise volim for petlje od while petlji :) */ STAM_REZ(tekst, br); // Otvaranje datoteke za citanje i pridruzivanje pokazivacu izvjestaj. izvjestaj=fopen("c:\\rezultati.txt","r"); // Citanje podataka iz datoteke... formati isti kao pri upisu :) fscanf(izvjestaj,"Rijeci sa 2 slova: %d\n", &dva); fscanf(izvjestaj,"Rijeci sa 3 slova: %d\n", &tri); fscanf(izvjestaj,"Rijeci sa 4 slova: %d\n", &cetiri); fscanf(izvjestaj,"Rijeci sa preko 4 slova: %d\n", &vise); fscanf(izvjestaj,"PROSJEK: %d", &prosjek); // Ispis izvjestaja na ekranu. printf("\n\nIZVJESTAJ: "); printf("\n\nUkupno rijeci: %d", dva+tri+cetiri+vise); printf("\nProsjecna duzina rijeci: %d", prosjek); // Zatvaranje datoteke i kraj programa fclose(izvjestaj); getch(); return 0; }

    Skinuto sa www.etf.ba

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    41. Program treba unjeti 2 broja i ispisati NZD... najveci zajednicki djeljilac... RJEŠENJE: #include main() { // Definicija varijabli int i,a,b,min,nzd=1; // Unos dva prirodna broja printf("Unesi dva broja: "); scanf("%d,%d", &a, &b); // Pridruzuje se varijabli min manji od unesena 2 broja if (a0;i--){ if (((a%i)==0)&&((b%i)==0)) {nzd=i; break;} } // Ispis NZD-a printf("\nNajveci zajednicki sadrzilac je: %d" , nzd); // Kraj programa getch(); return 0; }

    Skinuto sa www.etf.ba

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    42. Ispis sljedeceg znaka na ekranu... +++++-+++++ ++++---++++ +++-----+++ ++-------++ +---------+ ++-------++ +++-----+++ ++++---++++ +++++-+++++ #include main() { int k,i,j,a=11; // a predstavlja dimenzije znaka for (k=0;k

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    43. Unesite broj clanova niza cijelih brojeva, a zatim i clanove niza a zatim ih sortirajte od najveceg ka najmanjem i ispisite sortirano na ekran. RJEŠENJE: # include main(){ // Definisanje varijabli int n,i,j,niz[100],pom; // Unos broja clanova niza printf("\n Unesite broj clanova: "); scanf("%d", &n); /* Unos niza */ for (i=0;i

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    44. Zadatak br. 43. (prethodni) na drugi nacin... RJEŠENJE: # include main(){ // Definisanje varijabli int n,i,j,niz[100],pom; // Unos broja clanova niza printf("\n Unesite broj clanova: "); scanf("%d", &n); /* Unos niza */ for (i=0;i

  • * * * C * C * * O * M * G * C * C * G * M * O * * C * C * * * Autor: Murtic Nirmel * * C C * * R G A M N * * + + * * N M A G R * * C C * * www.etf.ba * C * * P * R * I * * * + * * * I * R * P * * C *

    Email: [email protected] ; MSN: [email protected]

    45. Unosi se sa ulaza broj clanova. Zatim se unese IME, PREZIME i broj bodova svakog clana. Na izlazu treba ispisati clanove sortirane po broju bodova. RJEŠENJE: # include // Definisanje strukture struct struktura { char ime[100]; char prezime[100]; int bodovi; }; main(){ // Definisanje varijabli int n,i,j; struct struktura spisak[100]; struct struktura pom; // Unos broja clanova niza printf("\n Unesite broj imena: "); scanf("%d", &n); /* Unos imena, prezimena, bodova i direktan upis u strukturu*/ for (i=0;i