1 / 78

Увод у програмски језик C Предавање 3 Низови скаларних података

Увод у програмски језик C Предавање 3 Низови скаларних података. Електротехнички факултет у Источном Сарајеву. Садржај. Низови (табеле) Дефинисање низова Иницијализација низова Приступање елементима низова. Увод . Типови података који су до сада разматрани су основни: int long int

odetta
Download Presentation

Увод у програмски језик C Предавање 3 Низови скаларних података

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. Увод у програмски језик C Предавање3 Низови скаларних података Електротехнички факултет у Источном Сарајеву

  2. Садржај Низови (табеле) • Дефинисање низова • Иницијализација низова • Приступање елементима низова

  3. Увод • Типови података који су до сада разматрани су основни: • int • long int • double • ... • Зову се основни, јер променљиве садрже једну вредност • Променљиве сложеног типа могу садржати више од једне вредности

  4. Сложени типови података C располаже и типовима података који су описани са више вредности-нескаларни: strukture unije Скаларни и нескаларни подаци у језику C могу бити организовани у групе које се чувају у меморији под једним именом која се зову поља-array (индексиране променљиве): једнодимензионално = НИЗ, дводимензионално = МАТРИЦА, вишедимензионално

  5. Увод • Обрада информација за 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 */

  6. Низови (Аrray) • Синоними: Табеле, Поља, Матрице... • Елементи, чланови низа могу бити описани једном вредношћу (скаларни) или су сложени тип податка-описани са више вредности • Служе и за представљање више-димензионалних података - матрица (вектора), • СВИ ПОДАЦИ У НИЗУ ИМАЈУ ИСТИ ТИП

  7. Низови • Податак унутар низа се назива Елемент низа • Сваки елемент низа има свој редни број, преко кога се идентификује • Ти редни бројеви се називају индексима. • Индекс почиње од нуле (не од јединице!)

  8. Поља података niz[0] niz[1] niz[2] niz[3] niz[4] niz[5] niz[6] niz[7] МЕМОРИЈА Једнодимензионална поља-низови, вектори Низ или вектор је једнодимензионално поље То је скуп података истог типа У меморији се смешта у скуп узастопних локација Сви подаци у низу имају једно име = ИМР НИЗА Име низа представља почетну адресу низа у меморији Сваки елемент низа одређен је: именом низа, и индексом (померај у односу на почетак низа)

  9. Дефинисање низова tip ime_niza [duzina][duzina]... [duzina] • tipбило који тип који је до сада коришћен • ime_nizaу складу са правилима за идентификаторе • duzinaпредставља број елемената низа (цео позитиван број) float Plate[10]; /* 10 elemenata*/ intА[10][5]; /* 10x5 elemenata*/

  10. Дефинисање низова

  11. Иницијализација низова Tip Ime[Duzina] = {vrednost0, vrednost1,…,vrednostDuzina-1}; • vrednost0иницијализујеIme[0],vrednost1иницијализујеIme[1], итд. • vrednostмора бити одговарајућег типа, иначе ће доћи до аутоматске конверзије типова

  12. Декларација низа 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};

  13. Примери иницијализације 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, */

  14. Примери иницијализације • Ако се наведе почетна вредност,duzinaможе да се изостави приликом дефинисања низа. Број вредности одређује дужину низа int tablica [ ]={3, 5, 7, 9};

  15. Примери иницијализације • Ако у дефиницији постоји дужина, број наведених вредности за иницијализацију не сме да буде већи од броја елемената низа! int tablica [3]={3, 5, 7, 9}; /*Greska! Posedice....*/

  16. Примери иницијализације • Ако је број вредности које се додељују мањи од димензија низа оне се дoдељују елементима на почетку низа а остале ће имати вредност нула. int tablica [5]={3, 5, 7, 0, 0}; је исто што и int tablica [5]={3, 5, 7};

  17. Низови-рекапитулација Тип низа (тип података у низу) Вредност елемената у низу (иницијализација низа) (иницијализовање није обавезно) (вредности се раздвајају запетама) Име низа (идентификаторнаписан у складу са синтаксом језика С, важе сва правила као и за скаларне променљиве) Број елемената у низу (целобројна константа) (резервише се потребан број најтова за складиштењедекларисаног броја елемената низа) Декларација низа Општи облик декларације низа tip ime_niza [broj_elemenata] = {lista vrednosti}

  18. Декларација низа 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]; ... }

  19. Приступање елементима низа • Елементи низа се идентификују помоћу редног броја који се назива индекс. • Ако је дужина низа дефинисана преко вредности duzina онда индекс низа може имати вредност од0доduzina-1

  20. Приступање елементима низа int main() { int i, tablica[4]={3, 5, 7, 9}; ...

  21. int main() { int i, tablica[4]={3, 5, 7, 9}; i = tablica[1];

  22. int main() { int i, tablica[4]={3, 5, 7, 9}; i = tablica[1]; tablica [0]=i+1; ... }

  23. int main() { int i, tablica[4]={3, 5, 7, 9}; i = tablica[1]; tablica [0]=i+1; tablica [i-3]=88; ... }

  24. Структураниза S0 S1 S2 S3 S4 S5 S6 S7 S8 S9 • int s[10];премаint s0,s1,...s9 s

  25. Вежба • Са декларацијом: float Sales[10]; x = 1; • Шта је резултат наредби: • Sales[5] = 123.45; • Sales[x] = 100.50; • Sales[x + 5] = 20.31; • Sales[x + 5] = 3.46; • Прикажите вредност низа

  26. Грешке 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 тип*/

  27. Додела вредности ... int niz[10]; int i; ... for(i = 0;i < 10;i++) { niz[i]=5; } ...

  28. Додела вредности ... int mat[4][3]; int i,j; ... for( i = 0; i < 4; i++ ) { for( j = 0; j < 3; j++ ) { mat[i][j]=5 ; } } ...

  29. При индексирању низа може се користити било који израз, који као резултат даје цео број [] je оператор, прво израчуна израз а потом тражи ту локацију у низу Код примене израза мора се проверавати вредност пре употребе: if ((brojE >= 0) && (brojE <= 9)) Zarada[brојЕ] = iznosS; else /* Problem ... */

  30. Стил • Дефинишите константу за дужину низа: #define MAXDUZ 10 • Користите константу у декларацији низа: float Plata[MAXDUZ]; • Користите ту константу у петљама: for (i = 0;i < MAXDUZ;i++) Plata[i]=5345; • Ако треба да се MAXDUZпромени, онда то радите само на једном месту у програму

  31. #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

  32. Пример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]; }

  33. Пример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]; }

  34. Пример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]);

  35. Пример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]); }

  36. Пример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]); }

  37. Пример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]); }

  38. Пример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]); }

  39. Пример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]); }

  40. Пример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

  41. Пример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]); }

  42. Пример 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); }

  43. Пример 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 Решење проблема? Проблем ”великих бројева” решава се тако што се они посматрају као низ цифара!!!

  44. Пример 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 */ }

  45. Пример 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 ...

  46. Пример 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

  47. Пример 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

  48. Пример 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]); }

  49. /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]);

More Related