480 likes | 674 Views
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.
E N D
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 • Primer unosa vrednosti elemenata niza sa standardnog ulaza: for(i=0; i<5; i++) scanf("%d ", &a[i]);
Štampanje elemenata niza • Štampanje elemenata niza na standardni izlaz. for(i=0; i<5; i++) printf("%d ", a[i]);
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};*/
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);
/* 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]); }
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;
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); }
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.
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].
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.
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.
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.
primer #include <stdio.h> int main() { int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, * p = a; int i;
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
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)); } }
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...
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;
/* 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]);
/* 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; }
/* Prikaz niza */ printf("Niz nakon obrtanja:\n"); for(i = 0 ; i < n ; i++) printf("%d ", a[i]); printf("\n"); }
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);
/*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");
/* 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"); }
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};
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;
/* 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); }
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.
primer • Funkcija za ispis niza brojeva - demonstracija prenosa niza brojeva u funkciju.
#include <stdio.h> void print_array(int a[], int n) { int i; for (i = 0; i < n; i++) printf("%d ",a[i]); putchar('\n'); }
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
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)); }
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
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
/* 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; }
/* 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; }
/* 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; }
/* 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; }
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);
/* 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)); }
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);
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; } }
/* Funkcija prikazuje niz */ void prikazi(int a[], int n) { int i; for(i = 0 ; i < n ; i++) printf("%d ", a[i]); printf("\n"); }
primer • Program generiše niz Fibonačijevih brojeva. • Program demonstrira vraćanje podataka nizovskogtipa iz funkcije. • #include <stdio.h> #define MAX 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]; }
/* Funkcija prikazuje niz */ void prikazi(int a[], int n) { int i; for(i = 0 ; i < n ; i++) printf("%d ", a[i]); printf("\n"); }
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); }