790 likes | 989 Views
Увод у програмски језик C Предавање 3 Низови скаларних података. Електротехнички факултет у Источном Сарајеву. Садржај. Низови (табеле) Дефинисање низова Иницијализација низова Приступање елементима низова. Увод . Типови података који су до сада разматрани су основни: int long int
E N D
Увод у програмски језик C Предавање3 Низови скаларних података Електротехнички факултет у Источном Сарајеву
Садржај Низови (табеле) • Дефинисање низова • Иницијализација низова • Приступање елементима низова
Увод • Типови података који су до сада разматрани су основни: • int • long int • double • ... • Зову се основни, јер променљиве садрже једну вредност • Променљиве сложеног типа могу садржати више од једне вредности
Сложени типови података C располаже и типовима података који су описани са више вредности-нескаларни: strukture unije Скаларни и нескаларни подаци у језику C могу бити организовани у групе које се чувају у меморији под једним именом која се зову поља-array (индексиране променљиве): једнодимензионално = НИЗ, дводимензионално = МАТРИЦА, вишедимензионално
Увод • Обрада информација за 20, 200 или 2000 студената • Може се дефинисати 20, 200 или 2000 променљивих int st1, st2, st3, st4, st5, … st2000; st1 = 0; st2 = 0; …; st2000 = 0; • То је много напоран посао... • Да ли може да се користити индексирање: sti- примена индекса iза приступ сваком податку • Тада би иницијализација и обрада била у два реда for (i=0; i < 2000; i++) • sti = 0; /* za 20 000 studenata bi • samo promenili • jedan broj */
Низови (Аrray) • Синоними: Табеле, Поља, Матрице... • Елементи, чланови низа могу бити описани једном вредношћу (скаларни) или су сложени тип податка-описани са више вредности • Служе и за представљање више-димензионалних података - матрица (вектора), • СВИ ПОДАЦИ У НИЗУ ИМАЈУ ИСТИ ТИП
Низови • Податак унутар низа се назива Елемент низа • Сваки елемент низа има свој редни број, преко кога се идентификује • Ти редни бројеви се називају индексима. • Индекс почиње од нуле (не од јединице!)
Поља података niz[0] niz[1] niz[2] niz[3] niz[4] niz[5] niz[6] niz[7] МЕМОРИЈА Једнодимензионална поља-низови, вектори Низ или вектор је једнодимензионално поље То је скуп података истог типа У меморији се смешта у скуп узастопних локација Сви подаци у низу имају једно име = ИМР НИЗА Име низа представља почетну адресу низа у меморији Сваки елемент низа одређен је: именом низа, и индексом (померај у односу на почетак низа)
Дефинисање низова tip ime_niza [duzina][duzina]... [duzina] • tipбило који тип који је до сада коришћен • ime_nizaу складу са правилима за идентификаторе • duzinaпредставља број елемената низа (цео позитиван број) float Plate[10]; /* 10 elemenata*/ intА[10][5]; /* 10x5 elemenata*/
Иницијализација низова Tip Ime[Duzina] = {vrednost0, vrednost1,…,vrednostDuzina-1}; • vrednost0иницијализујеIme[0],vrednost1иницијализујеIme[1], итд. • vrednostмора бити одговарајућег типа, иначе ће доћи до аутоматске конверзије типова
Декларација низа A[0] A[2] A[1] 1 3 2 B[0] B[2] B[3] B[1] 1 3 4 2 C[0] C[2] C[3] C[4] C[1] 10 0 0 0 0 D[0] D[2] D[3] D[4] D[1] 0 0 0 0 0 Примеридекларацијеса иницијализацијом: int A[3]={1,2,3}; intB[]={1,2,3,4}; int C[5]={10}; int D[5]={0};
Примери иницијализације int tablica [4]={3, 5, 7, 9}; longa1[6]={3, 5, 7, 9, 0, 0}; int NumDays1[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; /* Jan je 0, Feb je 1, ... */ int NumDays2[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30,31 }; /* Jan je 1, Feb je 2, */
Примери иницијализације • Ако се наведе почетна вредност,duzinaможе да се изостави приликом дефинисања низа. Број вредности одређује дужину низа int tablica [ ]={3, 5, 7, 9};
Примери иницијализације • Ако у дефиницији постоји дужина, број наведених вредности за иницијализацију не сме да буде већи од броја елемената низа! int tablica [3]={3, 5, 7, 9}; /*Greska! Posedice....*/
Примери иницијализације • Ако је број вредности које се додељују мањи од димензија низа оне се дoдељују елементима на почетку низа а остале ће имати вредност нула. int tablica [5]={3, 5, 7, 0, 0}; је исто што и int tablica [5]={3, 5, 7};
Низови-рекапитулација Тип низа (тип података у низу) Вредност елемената у низу (иницијализација низа) (иницијализовање није обавезно) (вредности се раздвајају запетама) Име низа (идентификаторнаписан у складу са синтаксом језика С, важе сва правила као и за скаларне променљиве) Број елемената у низу (целобројна константа) (резервише се потребан број најтова за складиштењедекларисаног броја елемената низа) Декларација низа Општи облик декларације низа tip ime_niza [broj_elemenata] = {lista vrednosti}
Декларација низа tekst 10*1B = 10B tekst[1] tekst[0] tekst[9] niz[4] niz[3] niz niz[2] 5*2B = 10B niz[1] niz[0] MEMORIJA Пример декларације: int niz[5]; chartekst[10]; Пример декларације: #define MAX 5 #define LEN 10 main() { intniz[MAX]; chartekst[LEN]; ... }
Приступање елементима низа • Елементи низа се идентификују помоћу редног броја који се назива индекс. • Ако је дужина низа дефинисана преко вредности duzina онда индекс низа може имати вредност од0доduzina-1
Приступање елементима низа int main() { int i, tablica[4]={3, 5, 7, 9}; ...
int main() { int i, tablica[4]={3, 5, 7, 9}; i = tablica[1];
int main() { int i, tablica[4]={3, 5, 7, 9}; i = tablica[1]; tablica [0]=i+1; ... }
int main() { int i, tablica[4]={3, 5, 7, 9}; i = tablica[1]; tablica [0]=i+1; tablica [i-3]=88; ... }
Структураниза S0 S1 S2 S3 S4 S5 S6 S7 S8 S9 • int s[10];премаint s0,s1,...s9 s
Вежба • Са декларацијом: float Sales[10]; x = 1; • Шта је резултат наредби: • Sales[5] = 123.45; • Sales[x] = 100.50; • Sales[x + 5] = 20.31; • Sales[x + 5] = 3.46; • Прикажите вредност низа
Грешке float Sales[10]; Неправилно додељивање вредности: Sales = 17.50; /* недостаје индекс */ Sales[-1] = 17.50; /* индекс ван опсега */ Sales[10] = 17.50; /* индекс ван опсега */ Sales[7.0] = 17.50; /* тип индекса */ Sales[’a’] = 17.50;/* тип индекса */ Sales[7] = ’A’; /* тип подaтка */ Аутоматска конверзија: Sales[7] = 17; /* 17.00, float тип*/
Додела вредности ... int niz[10]; int i; ... for(i = 0;i < 10;i++) { niz[i]=5; } ...
Додела вредности ... int mat[4][3]; int i,j; ... for( i = 0; i < 4; i++ ) { for( j = 0; j < 3; j++ ) { mat[i][j]=5 ; } } ...
При индексирању низа може се користити било који израз, који као резултат даје цео број [] je оператор, прво израчуна израз а потом тражи ту локацију у низу Код примене израза мора се проверавати вредност пре употребе: if ((brojE >= 0) && (brojE <= 9)) Zarada[brојЕ] = iznosS; else /* Problem ... */
Стил • Дефинишите константу за дужину низа: #define MAXDUZ 10 • Користите константу у декларацији низа: float Plata[MAXDUZ]; • Користите ту константу у петљама: for (i = 0;i < MAXDUZ;i++) Plata[i]=5345; • Ако треба да се MAXDUZпромени, онда то радите само на једном месту у програму
#define RADNICI 4 float Plate[RADNICI] = {117.0, 129.95, 276.22, 201.10}; float zbir; int i; zbir = 0.0; for(i = 0; i < RADNICI; i++) zbir += Plate[i]; printf(“Za isplatu: %.2f\n", zbir); Plate 117.00 Plate[0] 129.95 Plate[1] 276.22 Plate[2] 201.10 Plate[3] Пример 1 Збир елемената низа Za isplatu:724.47
Пример2 Максимална вредност низа #define RADNICI 4 float Plate[RADNICI] = {117.0, 129.95, 201.10, 276.22}; float maxP int i; maxP = Plate[0]; for (i = 1; i < RADNICI; i++) { if (Plate[i] > maxP) maxP = Plate[i]; }
Пример3 Минимална вредност низа #define RADNICI 4 float Plate[RADNICI] = {117.0, 129.95, 201.10, 276.22}; float minP int i; minP = Plate[0]; for (i = 1; i < RADNICI; i++) { if (Plate[i] < minP) minP = Plate[i]; }
Пример4 Испис вредности низа #define RADNICI 4 float Plate[RADNICI] = {117.0, 129.95, 201.10, 276.22}; int i; printf(“Radnik broj Zarada\n”); printf(“--------------------\n”); for (i= 0; i < RADNICI; i++) printf(“%4d%17.2f\n”, i, Plate[i]);
Пример5 n < 1 LAŽ n i = 1, n ISTINA niz[i-1] POČETAK i = 0, n-1 niz[i] KRAJ Учитати низ одnцелих бројева, а затим их исписати у једном реду истим редоследом којим су учитани. #include <stdio.h> #define MAX 100 main() { int niz[MAX]; int i,n; do { printf(”n=”); scanf(”%d”, &n); } while (n<1); for (i=1 ; i<=n ; i++) { printf(”Unesite %d. broj:”); scanf(”%d”, &niz[i-1]); } printf(”Uneli ste: ”); for (i=0 ; i<n ; i++) printf(” %d, ”, niz[i]); }
Пример6 n < 1 LAŽ n i = 1, n ISTINA niz[i-1] POČETAK i = n, 1 niz[i-1] KRAJ Учитати низ одnцелих бројева, а затим их исписати у једном реду обрнутим редоследом од оног којим су учитани. #include <stdio.h> #define MAX 100 main() { int niz[MAX]; int i,n; do { printf(”n=”); scanf(”%d”, &n); } while (n<1); for (i=1 ; i<=n ; i++) { printf(”Unesite %d. broj:”); scanf(”%d”, &niz[i-1]); } printf(”Uneli ste: ”); for (i=n ; i>=1 ; i--) printf(” %d, ”, niz[i-1]); }
Пример7 n < 1 T LAŽ n as = s/n ISTINA i = 0, n-1 s = 0 POČETAK ISTINA LAŽ niz[i]>as i = 0, n-1 niz[i] niz[i] s = s + niz[i] T KRAJ Учитати низ одnцелих бројева, а затим израчунати исписати њихову аритметичку средину, и оне бројеве који су већи од средње вредности. #include <stdio.h> #define MAX 100 main() { int niz[MAX]; int i,n,s=0; float as; do { printf(”n=”); scanf(”%d”, &n); } while (n<1); for (i=0;i<=n-1;i++) { printf(”Unesite broj:”); scanf(”%d”, &niz[i]); s+=niz[i]; } as=(float)s / n; printf(”Sredina: %7.3f\n”,as); printf(”Veci su: ”); for (i=0 ; i<n ; i++) if (niz[i]>as) printf(” %d”, niz[i]); }
Пример8 Учитати низ одnцелих бројева, а затим израчунати и исписати њихову аритметичку средину и онај елемент низа који јој је најближи. #include <stdio.h> #include <math.h> #define MAX 100 main() { int niz[MAX], i, rb=0, n, s=0; float as; do { printf(”n=”); scanf(”%d”, &n); } while (n<1); for ( i=0; i<=n-1; i++ ) { printf(”Unesite broj:”);scanf(”%d”, &niz[i]); s+=niz[i]; } as=(float)s / n; for (i=1 ; i<n ; i++) if ( fabs(niz[i]-as) < fabs(niz[rb]-as) ) rb=i; printf(” Sredina je: %7.3f\n”, as); printf(” Najblizi je %d. po redu\n”, rb+1); printf(” To je broj: %d”, niz[rb]); }
Пример9 Учитати низ A одnцелих бројева, затим формирати низ B, тако да је елемент biједнак највећој цифри елемента ai. #include <stdio.h> #define MAX 100 main() { int a[MAX], b[MAX], i, n, pom, c; do { printf(”n=”); scanf(”%d”, &n); } while ((n<1) || (n>MAX)); for ( i=0; i<=n-1; i++ ) { printf(”Unesite broj:”);scanf(”%d”, &a[i]); } for (i=0 ; i<n ; i++) { b[i]=0; pom=a[i]; do { c=pom%10; pom/=10; if (c>b[i]) b[i]=c; } while (pom); } printf(”\n A:”); for (i=0 ; i<n ; i++) printf(” %d”, a[i]); printf(”\n B:”); for (i=0 ; i<n ; i++) printf(” %d”, b[i]); }
Пример10 анализа Учитати коефицијенте два полиномаAиB, степенаmиn, респективно, (m , n < 10), а затим израчунава и исписује производ та два полинома. Polinom A: Am(x) = amxm + am-1xm-1 +...+ a1x + a0 Polinom B: Bn(x) = bnxn + bn-1xn-1 +...+ b1x + b0 Množenje dva monoma: aixi * bjxj = ai*bjxi+j Proizvod polinoma A i polinoma B: Cm+n(x) = cm+nxm+n + cm+n-1xm+n-1 +...+ c1x + c0
Пример10 Учитати коефицијенте два полиномаAиB, степенаmиn, респективно, (m , n < 10), а затим израчунава и исписује производ та два полинома. #include <stdio.h> #define MAX 10 main() { int a[MAX], b[MAX], c[2*MAX]={0}; int i,j,m,n; printf(”Polinom A:\n”); do { printf(”Stepen polinoma A (m) je:”); scanf(”%d”, &m); } while ((m<0) || (m>=MAX)); for ( i=m; i>=0; i-- ) { printf(”Unesite koeficijent a%d: ”,i); scanf(”%d”, &a[i]); }
Пример 10 printf(”Polinom B:\n”); do { printf(”Stepen polinoma B (n) je:”); scanf(”%d”, &n); } while ((n<0) || (n>=MAX)); for ( i=n; i>=0; i-- ) { printf(”Unesite koeficijent b%d: ”,i); scanf(”%d”, &b[i]); } for ( i=0; i<=m; i++ ) for ( j=0; j<=n; j++ ) c[i+j] += a[i] * b[j]; printf(”Proizvod:\n”); for ( i=m+n; i>=0; i-- ) printf(” %da%d ”, c[i], i); }
Пример 11 f[9] f[9] f[9] f[9] f[9] f[7] f[7] f[7] f[7] f[7] f[5] f[5] f[5] f[5] f[5] f[8] f[8] f[8] f[8] f[8] f[6] f[6] f[6] f[6] f[6] f[4] f[4] f[4] f[4] f[4] f[2] f[2] f[2] f[2] f[2] f[0] f[0] f[0] f[0] f[0] f[3] f[3] f[3] f[3] f[3] f[1] f[1] f[1] f[1] f[1] 0 0 0 0 0 0 0 0 1 0 0 2 0 2 0 4 0 6 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1!= 3!= 4!= 2!= 5!= Учитати природан бројn (n<100), а затим исписатиn! Напомена: Стандардни прости типови (int, long) омогућавају највише 12!=479001600 Решење проблема? Проблем ”великих бројева” решава се тако што се они посматрају као низ цифара!!!
Пример 11 Учитати природан бројn (n<100), а затим исписатиn! #include <stdio.h> #define MAXCIF 1000 main() { int f[MAXCIF]={1}; int i,j,n, pom, prenos; do { printf(”n=”); scanf(”%d”, &n); } while ((n<1) || (n>100)); for ( i=2; i<=n; i++ ) for ( j=0, prenos=0; j<MAXCIF; j++ ) { pom = f[j]*i + prenos; f[j] = pom % 10; prenos = pom / 10; } printf(”%d!=”,n); for ( j=MAXCIF-1; f[j]==0; j-- ); /* preskace vodece nule */ for (; j>=0; j-- ) printf(”%d”,f[j]); /* ispisuje cifre */ }
Пример 12 Учитати низ целих бројева, а затим га спртирати и исписати у растућем редоследу. Sortiranje niza: Sortiranje je postupak kojim se menja poredak elemenata u nizu, kako bi se podaci doveli u željeni redosled: rastući (ascending) opadajući (descending) Rešenje problema? Postoji velik broj algoritama za sortiranje Najpopularniji algoritmi za sortiranje: select-sort bubble-sort quick-sort shell-sort stack-sort ...
Пример 12 a[0] a[2] a[4] a[1] a[3] 7 2 6 3 2 Polazni niz 1. Prolaz: sređivanje prve pozicije (niz[0]) 2<7 2<2 6<2 3<2 ??? 0 1 1 1 1 indeks podobnog elementa 2. Prolaz: sređivanje druge pozicije (niz[1]) a[0] a[2] a[4] a[1] a[3] 6<7 3<6 2<3 2 ??? 2 7 6 3 2 Niz nakon 1. prolaza 1 2 3 4 indeks podobnog elementa 2 2 6 3 7 Niz nakon 2. prolaza SELECT-SORT: uzastopni izbor (selekcija) odgovarajućeg elementa
Пример 7 a[0] a[2] a[4] a[1] a[3] 2 2 6 3 7 Niz nakon 2. prolaza 3. Prolaz: sređivanje treće pozicije (niz[2]) 7<3 7<6 2 2 ??? 2 3 3 indeks podobnog elementa 2 2 3 6 7 Niz nakon 3. prolaza 4. Prolaz: sređivanje četvrte pozicije (niz[3]) 2 2 3 ??? 3<6 3 indeks podobnog elementa 3 2 2 3 6 7 Niz nakon 4. prolaza
Пример 12 Учитати низ бројева, а затимга сортирати и исписати га у растућем редоследу. #include <stdio.h> #define MAX 100 main() { int niz[MAX]; int i,j,n, rb, pom; do { printf(”n=”); scanf(”%d”, &n); } while ((n<1) || (n>100)); for ( i=1; i<=n; i++ ) { printf(”Unesite broj:”);scanf(”%d”, &niz[i-1]); } for ( i=0; i<n-1; i++ ) { for ( j=i+1, rb=i; j<n; j++ ) if (niz[j] < niz[rb]) rb=j; if (rb!=i) { pom=niz[i]; niz[i]=niz[rb]; niz[rb]=pom; } } printf(”Sortirani niz:”); for ( i=0; i<n; i++ ) printf(” %d”,niz[i]); }
/primer12_1.c/ /Sortiranjesvakogzadatognizacelihbrojeva/ /uneopadajuciporedak, METODОМ IZBORA/ #include <stdio.h> #define MAX 10 main() { int i, j, n, pom, niz[MAX]; while(1) { /Zadavanje duzine niza/ printf("\n\nUnesite broj elemenata niza n (n<=%d): ",MAX); scanf("%d", &n); if(n<1 || n>MAX)break;/prekid izvršenja programa/ /Zadavanje elemenata niza/ printf("Unesite celobrojne vrednosti elemenata niza: "); for(i=0; i<n; i++) scanf("%d", &niz[i]); /Prikaz na ekranu originalnog niza/ printf("\nOriginalni niz:\t"); for(i=0; i<n; i++) printf("%d ",niz[i]);