1 / 48

Programiranje 1 programski jezik c

Programiranje 1 programski jezik c. Staša Vujičić Čas 11. Nizovi — osnovni pojmovi. Niz predstavlja kolekciju elemenata istog tipa. Primer deklaracije niza je: int niz[5]; /* niz od 5 elemenata tipa int*/. Unos vrednosti elemenata niza.

raanan
Download Presentation

Programiranje 1 programski jezik c

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programiranje 1 programski jezik c Staša Vujičić Čas 11

  2. Nizovi — osnovni pojmovi • Niz predstavlja kolekciju elemenata istog tipa. Primer deklaracije niza je: • int niz[5]; /* niz od 5 elemenata tipa int*/

  3. Unos vrednosti elemenata niza • Primer unosa vrednosti elemenata niza sa standardnog ulaza: for(i=0; i<5; i++) scanf("%d ", &a[i]);

  4. Štampanje elemenata niza • Štampanje elemenata niza na standardni izlaz. for(i=0; i<5; i++) printf("%d ", a[i]);

  5. Primer 3 –inicijalizacija niza - #include <stdio.h> main() { /* Niz inicijalizujemo tako sto mu navodimo vrednosti u viticasnim zagradama. Dimenzija niza se odredjuje na osnovu broja inicijalizatora */ int a[] = {1, 2, 3, 4, 5, 6}; /* Isto vazi i za niske karaktera */ char s[] = {'a', 'b', 'c'}; /* Ekvivalentno prethodnom bi bilo char s[] = {97, 98, 99};*/

  6. Operator sizeof() je unarni operator koji se može primenjivati na podatke i tipove. • Ako se primeni na tip T, tada je vrednost izraza sizeof(T) broj bajtovakoji zauzima jedan podatak tog tipa. • Ako se primeni na podatak (ili proizvoljan izraz), tada sizeof(izraz) imavrednost broja bajtova koje zauzima podatak, imajući u vidu tip podatka (izraza). • Operator sizeof daje vrednosttipa int. • Vrednost izraza sizeof se računa u vreme prevođenja programa, jer je već tada jasno koja je veličinaobjekta na koji se primenjuje. /* Broj elemenata niza */ int a_br_elem = sizeof(a)/sizeof(int); int s_br_elem = sizeof(s)/sizeof(char);

  7. /* Ispisujemo nizove */ int i; for (i = 0; i < a_br_elem; i++) printf("a[%d]=%d\n",i, a[i]); for (i = 0; i < s_br_elem; i++) printf("s[%d]=%c\n",i, s[i]); }

  8. primer • Program računa skalarni proizvod dva vektora, čije secelobrojne koordinate unose sa ulaza. Program demonstriraupotrebu nizova. • #include <stdio.h> int main() { int a[100], b[100]; int i, n, s;

  9. printf("Unesite dimenziju vektora: "); scanf("%d", &n); printf("Uneti koordinate prvog vektora:\n"); for(i = 0; i < n ; i++) scanf("%d", &a[i]); printf("Uneti koordinate drugog vektora:\n"); for(i = 0; i < n ; i++) scanf("%d", &b[i]); for(i = 0, s = 0; i < n ; i++) s += a[i] * b[i]; printf("Skalarni proizvod vektora: %d\n", s); }

  10. Veza između nizova i pokazivača • U C-u postoji jaka veza između pokazivača i nizova. • Deklaracija int a[10]; definiše niz a veličine 10, odnosno blok od 10 susednih objekata u memoriji sa imenima a[0], a[1],a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9]. • Zapis a[i] ukazuje na i-ti element niza a.

  11. Akoje pa pokazivač na neki ceo broj deklarisan pomoću int *pa; tada dodeljivanje pa = &a[0]; podešava pa da pokazuje na nulti element niza a, to jest, pa sadrži adresu od a[0].

  12. Kako je ime niza sinonim za adresu početnog elementa niza, dodela pa = &a[0]; se može napisati i kao pa = a; • Ako pa pokazuje na određeni element nekog niza, tada pa+1 pokazuje na naredni element pa tako pa+i pokazuje i elemenata iza pa, a pa-i na i elemenata ispred pa.

  13. Dakle, ako pa pokazuje na a[0] onda je *(pa+i) zapravo sadržaj i-tog elementa niza to jest isto je što i a[i]. • pa+i je isto što i &pa[i]. • Ime niza se ponaša kao pokazivač na početni element niza. • Razlika između pokazivača p i a je u tome što a nije pokazivačka promenljiva, pa samim tim ne možemo da joj promenimo vrednost.

  14. Drugim rečima, • izraz p++ je dozvoljen (pomera pokazivač p za jednu poziciju u nizu udesno) • a++ nije dozvoljen, jer a nije promenljiva pokazivačkog tipa, već tipa "niz celih brojeva”koja je samo automatski konvertovana u pokazivač na prvi član niza.

  15. primer #include <stdio.h> int main() { int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, * p = a; int i;

  16. printf("Vrednost izraza a (tipa int *): %p\n", a); printf("Vrednost izraza p (tipa int *): %p\n", p); printf("Vrednost izraza *a (tipa int): %d\n", *a); printf("Vrednost izraza *p (tipa int): %d\n", *p); • Vrednost izraza a (tipa int *): 0xbfd1f11c • Vrednost izraza p (tipa int *): 0xbfd1f11c • Vrednost izraza *a (tipa int): 0 • Vrednost izraza *p (tipa int): 0

  17. for(i = 0; i < 10; i++) { printf("Vrednost izraza &a[%d] (tipa int *): %p\n", i, &a[i]); printf("Vrednost izraza &p[%d] (tipa int *): %p\n", i, &p[i]); printf("Vrednost izraza (a + %d) (tipa int *): %p\n", i, a + i); printf("Vrednost izraza (p + %d) (tipa int *): %p\n", i, p + i); printf("Vrednost izraza a[%d] (tipa int): %d\n", i, a[i]); printf("Vrednost izraza p[%d] (tipa int): %d\n", i, p[i]); printf("Vrednost izraza *(a + %d) (tipa int): %d\n", i, *(a + i)); printf("Vrednost izraza *(p + %d) (tipa int): %d\n", i, *(p + i)); } }

  18. Vrednost izraza &a[0] (tipa int *): 0xbfd1f11c • Vrednost izraza &p[0] (tipa int *): 0xbfd1f11c • Vrednost izraza (a + 0) (tipa int *): 0xbfd1f11c • Vrednost izraza (p + 0) (tipa int *): 0xbfd1f11c • Vrednost izraza a[0] (tipa int): 0 • Vrednost izraza p[0] (tipa int): 0 • Vrednost izraza *(a + 0) (tipa int): 0 • Vrednost izraza *(p + 0) (tipa int): 0 • Vrednost izraza &a[1] (tipa int *): 0xbfd1f120 • Vrednost izraza &p[1] (tipa int *): 0xbfd1f120 • Vrednost izraza (a + 1) (tipa int *): 0xbfd1f120 • Vrednost izraza (p + 1) (tipa int *): 0xbfd1f120 • Vrednost izraza a[1] (tipa int): 1 • Vrednost izraza p[1] (tipa int): 1 • Vrednost izraza *(a + 1) (tipa int): 1 • Vrednost izraza *(p + 1) (tipa int): 1...

  19. Primer- obrtanje nizova - • Program obrće elemente niza.Program demonstrira upotrebu nizova, uz korišćenjeindeksne (nizovske) sintakse. #include <stdio.h> #define MAX 100 int main() { int n; int a[MAX]; int i,j;

  20. /* Unosimo broj elemenata */ printf("Uneti broj elemenata niza (<= 100): "); scanf("%d", &n); /* Proveravamo da li je prekoraceno ogranicenje */ if(n > MAX) n = MAX; /* Unosimo elemente niza */ printf("Uneti elemente niza:\n"); for(i = 0 ; i < n ; i++) scanf("%d", &a[i]);

  21. /* Prikaz niza */ printf("Uneli ste niz:\n"); for(i = 0 ; i < n ; i++) printf("%d ", a[i]); printf("\n"); /* Obrcemo niz */ for(i = 0, j = n - 1 ; i < j ; i++, j--) { int t = a[i]; a[i] = a[j]; a[j] = t; }

  22. /* Prikaz niza */ printf("Niz nakon obrtanja:\n"); for(i = 0 ; i < n ; i++) printf("%d ", a[i]); printf("\n"); }

  23. Primer- Obrtanje niza (pokazivačka sintaksa) - #include <stdio.h> #define MAX 100 int main() { int n; int a[MAX]; int *p, *q; /* Unosimo broj elemenata */ printf("Uneti broj elemenata niza: "); scanf("%d", &n);

  24. /*Proveravamo da li je prekoraceno ogranicenje*/ if(n > MAX) n = MAX; /* Unosimo elemente niza */ printf("Uneti elemente niza:\n"); for(p = a ; p - a < n ; p++) scanf("%d", p); /* Prikaz niza */ printf("Uneli ste niz:\n"); for(p = a ; p - a < n ; p++) printf("%d ", *p); printf("\n");

  25. /* Obrcemo niz */ for(p = a, q = a + n - 1 ; p < q ; p++, q--) { int t = *p; *p = *q; *q = t; } /* Prikaz niza */ printf("Niz nakon obrtanja:\n"); for(p = a ; p - a < n ; p++) printf("%d ", *p); printf("\n"); }

  26. primer • Program za uneti datum utvrđuje redni broj tog dana u datoj godini. Program demonstrira upotrebu nizova,kao i veze nizova i pokazivača. • #include <stdio.h> int main() { int obicna[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; int prestupna[] = {31,29,31,30,31,30,31,31,30,31,30,31};

  27. int dan, mesec, godina; int i, *tekuca; int dan_u_godini = 0; printf("Uneti datum u formatu dd:mm:yyyy: "); scanf("%d:%d:%d", &dan, &mesec, &godina); /* Proveravamo da li je godina prestupna */ if(godina % 400 == 0 || (godina % 100 != 0 && godina % 4 == 0)) tekuca = prestupna; else tekuca = obicna;

  28. /* Sumiramo dane protekle prethodnih meseci. Indeks ide od 0 do mesec - 2, zato sto indeksi u C-u pocinju od 0. Npr, za dan u mesecu martu (treci mesec) treba sabrati broj dana u januaru i februaru (tj. indeks u petlji treba ici od 0 do 1, ukljucujuci i jednicu). */ for(i = 0 ; i < mesec - 1 ; i++) dan_u_godini += tekuca[i]; /* Nakon toga jos treba dodati broj proteklih dana u tekucem mesecu */ dan_u_godini += dan; printf("Uneti datum je %d. dan u godini\n", dan_u_godini); }

  29. Prenos niza u funkciju • Nizovi se prenose u funkciju tako što se prenese adresa njihovog početka. Iz tog razloga oni seMOGU MENJATI u okviru funkcije. • Sve nizove osim niski karaktera (stringova) neophodno je prenositi zajedno sa dimenzijom niza.

  30. primer • Funkcija za ispis niza brojeva - demonstracija prenosa niza brojeva u funkciju.

  31. #include <stdio.h> void print_array(int a[], int n) { int i; for (i = 0; i < n; i++) printf("%d ",a[i]); putchar('\n'); }

  32. main() { int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; print_array(a, sizeof(a)/sizeof(int)); } • Izlaz: • 1 2 3 4 5 6 7 8 9

  33. primer • Skalarni proizvod dva niza brojeva. #include <stdio.h> long mnozi(int x[],int y[],int n); main() { int a[]={1,2,3,4,5,6}, b[]={8,7,6,5,4,3}; printf("Skalarno a*b= %ld\n",mnozi(a,b,6)); }

  34. long mnozi(int x[ ],int y[ ],int n) { int i; long suma=0; for(i=0;i<n;i++) suma=suma+x[i]*y[i]; return suma; } • Izlaz: • Skalarno a*b= 98

  35. primer • Program unosi realne brojeve sa ulaza,i računa zbir i proizvod elemenata, kaoi najveći i najmanji element u nizu. • #include <stdio.h> #define MAX 100

  36. /* Funkcija racuna zbir elemenata niza */ double zbir(double a[], int n) { double s = 0; int i; /* Sumiramo n elemenata niza. */ for(i = 0; i < n ; i++) s=s+a[i]; return s; }

  37. /* Funkcija racuna proizvod elemenata niza */ double proizvod(double a[], int n) { double p = 1; /* Mnozimo n elemenata niza */ for(; n ; n--) p *= *a++; return p; }

  38. /* Funkcija racuna najveci element niza */ double max(double *a, int n) { double max = *a; /* Odredjujemo najveci element */ for(a++, n-- ; n > 0 ; a++, n--) if(*a > max) max = *a; return max; }

  39. /* Funkcija racuna najmanji element niza */ double min(double *a, int n) { double min = a[0]; int i; /* Odredjujemo najmanji element */ for(i = 1 ; i < n ; i++) if(a[i] < min) min = a[i]; return min; }

  40. int main() { double a[MAX]; int n , i; /* Ucitavamo dimenziju niza */ printf("Uneti broj elemenata niza (<= 100): "); scanf("%d", &n); /* Proveravamo da li je dimenzija veca od MAX */ if(n > MAX) n = MAX; /* Ucitavamo elemente niza */ for(i = 0; i < n ; i++) scanf("%lf", a + i);

  41. /* Pozivamo gornje funkcije i prikazujemo vrednosti */ printf("Zbir elemenata niza je: %5.3f\n", zbir(a, n)); printf("Proizvod elemenata niza je: %5.3f\n", proizvod(a, n)); printf("Najveci element u nizu je: %5.3f\n", max(a, n)); printf("Najmanji element u nizu je: %5.3f\n", min(a, n)); }

  42. primer • Program zamenjuje susedne elemente niza naparnim i neparnim pozicijama. Program demonstrira prenos nizova po adresi. #include <stdio.h> /* Deklaracije funkcija */ void zameni(int a[], int n); void prikazi(int a[], int n); int main() { int a[] = {0,1,2,3,4,5,6,7,8,9,10}; int n = sizeof(a)/sizeof(int);

  43. prikazi(a, n); zameni(a, n); prikazi(a, n); return 0; } /* Funkcija zamenjuje susedne elemente niza na parnim i neparnim pozicijama. */ void zameni(int a[], int n) { int i; for(i = 0 ; i < n - 1 ; i += 2) { int t = a[i]; a[i] = a[i + 1]; a[i + 1] = t; } }

  44. /* Funkcija prikazuje niz */ void prikazi(int a[], int n) { int i; for(i = 0 ; i < n ; i++) printf("%d ", a[i]); printf("\n"); }

  45. primer • Program generiše niz Fibonačijevih brojeva. • Program demonstrira vraćanje podataka nizovskogtipa iz funkcije. • #include <stdio.h> #define MAX 46

  46. /* Funkcija izracunava prvih n Fibonacijevih brojeva i smesta ih u niz a */ void fibonaci(int a[], int n) { int i; for(i = 0 ; i < n ; i++) if(i < 2) a[i] = 1; else a[i] = a[i - 1] + a[i - 2]; }

  47. /* Funkcija prikazuje niz */ void prikazi(int a[], int n) { int i; for(i = 0 ; i < n ; i++) printf("%d ", a[i]); printf("\n"); }

  48. int main() { int f[MAX]; int n; /* Ucitavamo dimenziju niza */ printf("Uneti broj Fibonacijevih brojeva (<=46): "); scanf("%d", &n); /* Proveravamo prekoracenje */ if(n > MAX) n = MAX; /* Pozivamo funkciju fibonaci() koja generise niz Fibonacijevih brojeva, i smesta ih u niz f. */ fibonaci(f, n); /* Prikazujemo niz */ prikazi(f, n); }

More Related