5
Nizovi 76. NCP koji ispisuje 10 ucitanih brojeva unazad. Brojevi se ucitavaju sa standardnog ulaza. #include <stdio.h> main() { int a[10], i; // niz ucitanih brojeva, brojac u ciklusu for (i = 0; i<10; i++) scanf("%d",&a[i]); printf("Unazad : \n"); for (i = 9; i>=0; i--) printf("a[%d]=%d\n",i,a[i]); } 77. NCP koji učitava sa standardnog ulaza broj n (n <=100),a potom elemente n-dimenzionog niza celih brojeva. Program treba da ispiše maksimum unetog niza na standardni izlaz. #include <stdio.h> #define DIM 100 int max( int prvi, int drugi ); main() { int a[DIM], i, n, Max; /*niz celih brojeva sa stdin, brojac u ciklusu, dimenzija niza, maksimum niza */ printf("\nUnesite dimenziju niza: "); scanf("%d", &n); printf("\nUnesite clanove niza: "); for(i=0; i<n; i++) scanf("%d", &a[i]); /* trazenje max clana */ Max=a[0]; for(i=1; i<n; i++) Max=max(Max, a[i]); printf("\nMaksimum niza je %d \n", Max); return 0; } /* max: vraca maksimum dva argumenta */ int max( int prvi, int drugi ) { return ( (prvi>=drugi)?prvi:drugi ); } Zadatak za samostalni rad: NCP koji učitava sa standardnog ulaza broj n (n <=100),a potom elemente n- dimenzionog niza celih brojeva. Program treba da ispiše minimum unetog niza na standardni izlaz. 78. NCP koji će u tekstu sa standardnog ulaza prebrojati koliko puta se pojavila svaka cifra dekadnog brojnog sistema. Rezultat ispisati na standardni izlaz. ulaz (stdin, getchar()) 123 75 abcd efg\13 [enter] ^D izlaz (stdout, putchar()) Broj pojave cifre 1 je 2. Broj pojave cifre 2 je 1. Broj pojave cifre 3 je 2. Broj pojave cifre 5 je 1. Broj pojave cifre 7 je 1. Ostale cifre 0 puta #include <stdio.h> main() { int znak, br; /* znak sa ulaza, brojac u petlji*/ int cifra[10]; /* za i=0..9 i-ti clan niza cuva broj pojava cifre i */ for(br=0; br<10; ++br) cifra[br]=0; while( (znak=getchar())!=EOF ) if( znak >='0' && znak<='9' ) ++cifra[znak-'0']; /* prikaz rezultata */ for( br=0; br<10; ++br ) if (cifra[br]!=0) printf( "Cifra %d se pojavljuje %d puta\n", br,cifra[br] );

nizovi

Embed Size (px)

Citation preview

Page 1: nizovi

Nizovi76. NCP koji ispisuje 10 ucitanih brojeva unazad. Brojevi se ucitavaju sa standardnog ulaza.

#include <stdio.h>main(){ int a[10], i; // niz ucitanih brojeva, brojac u ciklusu for (i = 0; i<10; i++) scanf("%d",&a[i]);printf("Unazad : \n"); for (i = 9; i>=0; i--) printf("a[%d]=%d\n",i,a[i]);

}

77. NCP koji učitava sa standardnog ulaza broj n (n <=100),a potom elemente n-dimenzionog niza celih brojeva. Program treba da ispiše maksimum unetog niza na standardni izlaz.

#include <stdio.h> #define DIM 100 int max( int prvi, int drugi ); main() { int a[DIM], i, n, Max; /*niz celih brojeva sa stdin, brojac u ciklusu, dimenzija niza, maksimum niza */ printf("\nUnesite dimenziju niza: "); scanf("%d", &n); printf("\nUnesite clanove niza: "); for(i=0; i<n; i++) scanf("%d", &a[i]);

/* trazenje max clana */ Max=a[0]; for(i=1; i<n; i++) Max=max(Max, a[i]); printf("\nMaksimum niza je %d \n", Max); return 0; } /* max: vraca maksimum dva argumenta */ int max( int prvi, int drugi ) { return ( (prvi>=drugi)?prvi:drugi ); }

Zadatak za samostalni rad: NCP koji učitava sa standardnog ulaza broj n (n <=100),a potom elemente n-dimenzionog niza celih brojeva. Program treba da ispiše minimum unetog niza na standardni izlaz.

78. NCP koji će u tekstu sa standardnog ulaza prebrojati koliko puta se pojavila svaka cifra dekadnog brojnog sistema. Rezultat ispisati na standardni izlaz.

ulaz (stdin, getchar())123 75abcd efg\13[enter]^D

izlaz (stdout, putchar())Broj pojave cifre 1 je 2. Broj pojave cifre 2 je 1. Broj pojave cifre 3 je 2. Broj pojave cifre 5 je 1. Broj pojave cifre 7 je 1. Ostale cifre 0 puta

#include <stdio.h> main() { int znak, br; /* znak sa ulaza, brojac u petlji*/ int cifra[10]; /* za i=0..9 i-ti clan niza cuva broj pojava cifre i */

for(br=0; br<10; ++br) cifra[br]=0;

while( (znak=getchar())!=EOF ) if( znak >='0' && znak<='9' ) ++cifra[znak-'0'];

/* prikaz rezultata */ for( br=0; br<10; ++br ) if (cifra[br]!=0) printf( "Cifra %d se pojavljuje %d puta\n", br,cifra[br] );

Page 2: nizovi

printf("\nOstale cifre 0 puta\n"); }

Par napomena:++cifra[znak-'0']; ISTO KAO cifra[znak-'0']+=1; ISTO KAO cifra[znak-'0']= cifra[znak-'0'] +1; znak-'0' od ascII znak oduzima ascII za nulu, tj. od ascii znak pravi arapsku vrednost, tj.pravi cifruNpr. ako znak='3', onda znak-'0' ima vrednost 3, jer znak-'0'=ASCII(3)-ASCII(0)=51-48=3OPREZ ++cifra[znak] uvecava clan niza na poziciji od 48..57 ++cifra[znak-'0'] uvecava clan niza na poziciji 0..9

79. Sta je rezultat rada sledeceg programa?#include <stdio.h>main(){ int a[] = {1, 2, 3, 4, 5, 6}; char s[] = {'a', 'b', 'c'};int n = sizeof(a)/sizeof(int);int m = sizeof(s)/sizeof(char);int i;for (i = 0; i < n; i++) printf("a[%d]=%d ",i, a[i]);for (i = 0; i < m; i++) printf("s[%d]=%c ",i, s[i]);}

IZLAZ a[0]=1 a[1]=2 a[2]=3 a[3]=4 a[4]=5 a[5]=6 s[0]=a s[1]=b s[2]=c

1. Nizovi a, s inicijalizovani su tako sto su navodene vrednosti u viticasnim zagradama. Dimenzija niza se odredjuje na osnovu broja inicijalizatora2. Ekvivalentno sa char s[] = {'a', 'b', 'c'}; bi bilo char s[] = {97, 98, 99};3. m, n su brojevi elemenata nizova a, s

Zadatak za samostalni rad: NCP koji učitava sa standardnog ulaza broj n (n <=50), a potom elemente n-dimenzionog niza celih brojeva. Program treba da ispiše broj različitih elemenata niza na standardni izlaz.

Prenos nizova u funkciju

80. Šta je rezultat rada sledeceg programa? #include <stdio.h>void pisiNiz(int a[], int n){ int i;for (i = 0; i < n; i++) printf("%d ",a[i]); putchar('\n');/* Obratite paznju na ovo : */ printf("sizeof(a) - u okviru fje : %d\n", sizeof(a));}main(){ int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; printf("sizeof(a) - u okviru main : %d\n", sizeof(a)); pisiNiz(a, sizeof(a)/sizeof(int));}

Izlaz: sizeof(a) - u okviru main : 361 2 3 4 5 6 7 8 9sizeof(a) - u okviru fje : 4

Nizovi se prenose tako što se prenese adresa njihovog početka. Uglaste zagrade ostaju prazne! Nizove je neophodno prenositi zajedno sa dimenzijom niza(osim niski karaktera)

81. Implementirati iterativnu i rekurzivnu funkciju za izračunavanje sume članova (double) niza a sa n članova, i NCP koji ce pozivati rekurzivnu verziju funkciju za pozitivan ceo broj n koji se unosi sa

Page 3: nizovi

standardnog ulaza i za n članova (double) niza a koji se unose sa standardnog ulaza. Suma se definiše a[0]+a[1]+...+a[n-1]= Sn=a[0] + Sn-1, ako je n >0. Inače, S0=0. U formulaciji zadatka je rečeno da je n > 0. Ako primenimo ovakvu definiciju, onda program sa implementacijom funkcije zbir izgleda:

#include <stdio.h>#define MAX 10/* Rekurzivna funkcija za racunanje zbira elemenata niza. */double zbir (const double a[], int n) { return (n > 0) ? a[0] + zbir (a+1, n-1) : 0;}/*ITERATIVNA VERZIJA double zbir (const double a[], int n) { double s; int i; s=a[0]; for (i = 1; i<n; i++) s += a[i]; return s;}*/main(){ int n,i; double a[MAX]; printf("Unesite n: "); scanf("%d", &n); printf("\nUnesite niz dimenzije %d: ", n); for(i=0; i <n; i++) scanf("%lf", &a[i]); printf("\nS%d = %lf\n", n, zbir(a,n));}82. Implementirati iterativnu verziju i rekurzivnu funkciju za izračunavanje skalarnog proizvoda dva n-dimenziona vektora, i NCP koji ucitava sa standardnog ulaza pozitivan ceo broj n i dva n-dimenziona vektora sa realnim koordinata, izračunava njihov skalarni proizvod i ispisuje na standardni izlaz. Npr. a[3]={1.2, 3, 4} b[3]={0.5,0.2,0.8}=>izlaz je 1.2*0.5+3*0.2+4*0.8=4.4

#include <stdio.h>#define DIM 10/* Rekurzivna funkcija za racunanje skalarnog proizvoda dva vektora */float skalpro (const float a[], const float b[], int n) { return (n > 0) ? a[0] * b[0] + skalpro (a+1, b+1, n-1) : 0;}/*ITERATIVNA VERZIJAfloat skalpro (const float a[], const float b[], int n) { float skal_pro; for (skal_pro=i=0; i<n; i++) skal_pro += a[i] * b[i]; return skal_pro;}*/main () { float a[DIM], b[DIM]; int i, n; while (1) { printf ("\nDuzina vektora (najvise %d)? ", DIM); scanf ("%d", &n); if (n <= 0 || n > DIM) break; printf ("\nUnesite vektor A: "); for (i=0; i<n; scanf ("%f", &a[i++])); printf ("\nUnesite vektor B: "); for (i=0; i<n; scanf ("%f", &b[i++])); printf ("\nSkalarni proizvod A*B= %10.3f\n", skalpro (a, b, n)); }}83. NCP koji učitava dva sortirana niza i njihove dimenzije, formira od njih treći sortirani niz i ispisuje ga na standardni izlaz. Pretpostaviti da ni-zovi nemaju više od 30 članova.#include<stdio.h>

Page 4: nizovi

#define MAX 50void citaj(int a[], int *n); //ucitava niz a dimenzije nvoid pisi(int a[], int n); //ispis niza a dimenzije nint main(){ int a[MAX], b[MAX], c[2*MAX]; int m,n; //dimenzije nizova a,b int i,j,k; //brojaci u ciklusu citaj(a,&n); citaj(b,&m); //ucesljavanje nizova a,b if (b[m-1]<a[n-1]) b[m]=a[n-1]+1; //ako max niza b, a je a[n-1] else a[n]=b[m-1]+1; //ako max niza b, a je b[m-1] for(i=0,j=0,k=0; k<m+n;k++) if(b[i]<a[j]) c[k]=b[i++]; else c[k]=a[j++]; pisi(c,m+n); return 0;}void citaj(int a[], int *n){ int i; printf("\nUnesite dimenziju i clanove niza:\n"); scanf("%d",n); for(i=0;i<*n;i++) scanf("%d", &a[i]);}void pisi(int a[], int n){ int i; printf("\nNovi niz\n"); for (i=0; i<n; i++) printf("%d ",a[i]); printf("\n");}Zadatak za samostalni rad: Napisati program koji učitava dva sortirana strogo rastuća niza i njihove dimenzije, formira od njih treći nerastući niz i ispisuje ga na standardni izlaz. Pretpostaviti da nizovi nemaju više od 30 članova. Neka je prvi niz 1 2 3 100, drugi niz 2 5 102. Program treba da ispiše niz 102 100 5 3 2 2 1Sortiranje i vremenska slozenost

Pri analizi složenosti algoritama uvodi se parametar "dimenzije problema". Na primer, kada se obrađuju nizovi, onda dimenziju problema predstavlja duzi-na niza n, a kada su u pitanju kvadratne matrice, onda je dimenzija matrice istovremeno i dimenzija problema. Ako je n dimenzija problema, onda se efika-snost korištenja memorije može opisati funkcijom M(n), a vreme izvršenja al-goritma funkcijom T(n). Funkcija T(n) se često naziva vremenska složenost algoritma (engl. time com-plexity), dok je M(n) prostorna složenost. Funkciji T(n) se pridaje znatno više značaja nego veličini M(n), te se pod skraćenim pojmom "složenost" (eng. complexity) obično podrazumeva vremenska složenost. Razlog tome je iskustvo u razvoju algoritama, koje je pokazalo da je zauzeće memorije znatno manji problem od postizanja prihvatljivog vremena obrade. Analiza brzine izvršenja programa se radi tako da se odredi ukupan broj operacija koje dominantno troše procesorsko vreme. Na primer, u programu za sabiranje elemenata kvadratne matrice, dimenzija nxn, označen je broj ponavljanja naredbi u kojima se vrši sabiranje.

Page 5: nizovi

Ako se uzme da prosečno vreme izvršenja jedne naredbe iznosi t0, dobije se da ukupno vreme izvršenja algoritma iznosi: T(n) = (2n2 + n)*t0Veličina T(n) je posebno važna za velike vrednosti od n. U tom slučaju je:T(n) ≤ konst * n2

Ovaj se zaključak piše u obliku tzv. notacije "veliko-O": T(n) = O(n2)i kaže se da je T(n) "veliki O od n2". Funkcija f(n) = n2 predstavlja red složenosti algoritma. Složenost algoritma u notaciji "veliko-O" formulise se na sledeći način: T(n) = O( f(n) ), (čita se: T je veliko-O od f), ako postoje pozitivne konstante C i n0, takove da je 0 ≤ T(n) ≤ C * f(n), za sve vrednosti n ≥n0.Klasifikacija algoritama prema redu funkcije složenosti za najpoznatije klase algoritama prikazana je u tablici. Ova je tablica uređena po kriterijumu rastuće složenosti algoritama.Tip algoritama f(n)konstantan constlogaritamski log2nlinearan nlinearno-logaritamski n*log2nkvadratni n2

stepeni nk, k>2eksponencijalni kn, k>1faktorijalni n!

Pri izradi algoritama cilj je nalaženje rješenja koje je manjeg reda složenosti, a posebno je značajan rezultat kada se pronađe polinomsko ili logaritamsko rješenje nekog od eksponencijalnih problema. Konstantni algoritmiKonstantni algoritmi su klasa algoritama kod kojih je vreme rada približno konstantno i ne zavisi od veličine problema. Ovo je najpoželjniji, ali i najređi tip algoritama. Primer je algoritam umetanje na početak povezane liste. Taj algoritam ima konstatnu vremensku složenost, bez obzira na broj elemenata povezane liste.