Uređivanje niza

Složeniji proces od  pretraživanja niza je uređivanje. Da bi se niz uredio neophodno je da se svaki element uporedi sa ostalim elementima, po potrbi, izvršiti njihovu međusobnu zamenu. Niz može biti sortiran u rastućem i opadajućem redosledu. Postoje nekoliko algoritama za sortiranje nizova.

Metod izbora (selection sort)

Zasniva se na veoma jednostavnoj ideji, izabrati najmanji element niza i dovesti ga na prvo mesto, zatim drugi najmanji, na drugo mesto, itd. do kraja niza.

Primer koji sortira niz u rastućem redosledu

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
int a[10];
int i, j, n, pom;
/* Unos broja elemenata niza*/
cout<<„Unesi broj elemenata niza“<<endl;
cin>>n;
/*Unos elemenata niza*/
for(i=0;i<n;i++)
{
cout<<„Unesi „<<i+1<<“ element niza „;
cin>>a[i];
cout<<endl;
}
/*sortiranje*/
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
pom=a[i];
a[i]=a[j];
a[j]=pom;
}
}
}
/*Ispis niza*/
cout<<„Niz je uredjen u rastu’em redosledu“<<endl;
for(i=0;i<n;i++)
{
cout<<a[i]<<endl;

}
system(„PAUSE“);
return EXIT_SUCCESS;
}

selekt sort

Pr1.

Napravite program koji niz a čiji elementi su celi brojevi uređuje u rastućem redosledu koristeći funkcije?

Rešenje:

#include
#include
using namespace std;
void ucitajniz(int a[], int n)
{
int i;
for (i=0;i<n;i++)
{
cout<<“ Unesi „<<i+1<<“ element niza“<<endl; cin>>a[i];
}
}
void razmeni(int *a, int *b)
{
int pom=*a;
*a=*b;
*b=pom;
}
void sortiraj(int a[], int n)
{
int i, j;
for (i=0;i<n-1;i++)
{
for (j=i+1;j<n;j++) { if (a[i]>a[j])
razmeni(&a[i], &a[j]);
}
}
}
void ispisiniz(int a[], int n)
{
int i;
for (i=0;i<n;i++)
cout<<“ a[„<<i+1<<„] je „<<a[i]<<endl;

}

int main(int argc, char *argv[])
{
int a[10],n;
cout<<„Unesi broj elemenata niza“<<endl; cin>>n;
ucitajniz(a,n);
sortiraj (a,n);
cout<<“ Sortirani niz:“<<endl;
ispisiniz(a,n);
system(„PAUSE“);
return EXIT_SUCCESS;
}

Metod mehuriće (babl sort)

Algoritam sortiranja bubble sort poredi dva susedna elementa niza i ako su pogrešno rasporežđeni zamenjuje im mesta. Posle porežđnja svih susednih parova najmanji od njih će isplivati na kraj niza. Zbog toga se ovaj metod naziva metod mehurića. Da bi se najmanji broj nesortiranog dela niza doveo na svoje mesto treba ponoviti postupak

Primer sortira niz metodom babl sort u rasući redosled

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{

/* deklaracija niza i promenljive koje se koriste*/
int a[10];
int i, j, n, pom;
/* Unos broja elemenata niza*/
cout<<„Unesi broj elemenata niza“<<endl;
cin>>n;
/*Unos elemenata niza*/
for(i=0;i<n;i++)
{
cout<<„Unesi „<<i+1<<“ element niza „;
cin>>a[i];
cout<<endl;
}
/*sortiranje- babl sort*/
for(i=n-1; i>0; i–)
{
for(j=0; j<i; j++)
{
if(a[j]>a[j+1])
{
pom=a[j];
a[j]=a[j+1];
a[j+1]=pom;
}
}
}
/*Ispis niza*/
cout<<„Niz je uredjen u rastu’em redosledu“<<endl;
for(i=0;i<n;i++)
{
cout<<a[i]<<endl;
}
system(„PAUSE“);
return EXIT_SUCCESS;
}

bublesort.JPG

Metod isort

Insert sort, u svakom trenutku je početak niza sortiran a sortiranje se vrši tako što se jedan po jedan element niza sa kraja ubacuje na odgovarajuće mesto.

Primer prikazuje uređivanje niz u opadajućem redosledu metodom isort

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
int a[10];
int i, j, n, pom;
/* Unos broja elemenata niza*/
cout<<„Unesi broj elemenata niza“<<endl;
cin>>n;
/*Unos elemenata niza*/
for(i=0;i<n;i++)
{
cout<<„Unesi „<<i+1<<“ element niza „;
cin>>a[i];
cout<<endl;
}
/*sortiranje*/

for(i=1; i<n; i++)
{
for(j=i; (j>0) && (a[j]>a[j-1]); j–)
{

pom=a[j];
a[j]=a[j-1];
a[j-1]=pom;
}
}
/* Ispis niz*/

cout<<„Niz je uredjen u rastu’em redosledu“<<endl;
for(i=0;i<n;i++)
{
cout<<a[i]<<endl;

}
system(„PAUSE“);
return EXIT_SUCCESS;
}

isort.JPG

Pretraživanje nizova

Veoma često javlja se potreba ispitivanja da li određeni element pripada određenom skupu, da li je moguće elemente skupa urediti po nekom kriterijumu? Znamo da skup istih elemenata po tip daju niz, kada je reč o programiranju, pa tehnika pretraživnja i uređivanja nizova čini jednu od najznačajniih grupa obrade podataka.

Za pretraživanje nizova postoje dva algoritma koji se načešće koriste u praksi

Sekcencionalno pretraživanje

Uzastopno upoređivanje elemenata niza sa traženom vrednošću (provera da li se vrednost nalazi  u nizu), sve dok se vrednost ne pronađe ili kada se dođe do kraj niza (tražena vrednost nije u nizu) su karakteristike sekvencionalnog pretraživana. 

Sekvencionalno pretraživanje          Funkcija za sekvencionalno pretraživanje

Da je tražena vrednost pronađena zna se po tome što je ciklus pretraživanja završen pre kraja niza (i<n). Vrednost funkcije je 1 u slučaju uspeha, 0 u slučaju neuspeha.

Jednostavnost je dobra strana pretraživanja, mana je relativno veliki broj proba da bi se došlo do rezultata.

Pr1.

U jednom razredu ima n učenika. Prosečna standardna visina je b. da li u razredu ima učenika sa standardnom visinom?

Rešenje:

#include <cstdlib>
#include <iostream>

using namespace std;

/*Funkcija za pretrazivanje*/
int sektra1 (int a[],int n,int b)
{
int i;
for (i=0;i<n && a[i]==b;i++)
return i<n;
}

/*glavni program*/
int main(int argc, char *argv[])
{
int a[30];
int b, n, i;
cout<<„Unesi standardnu visinu?“<<endl;
cin>>b;
cout<<„Unesi broj ucenika u razredu?“<<endl;
cin>>n;
cout<<„Unesi visine svakog ucenika?“<<endl;
for (i=0;i<n;i++)
{
cout<<„Unesi visinu ucenika sa rednim brojem „<<i+1<<endl;
cin>>a[i];

}
cout <<sektra1(a,n,b);

if (sektra1 (a,n,b)==1)
{
cout <<„Postoje ucenici cija visina je „<< b<< „, prosecna visina „<<endl;
}
else
{
cout <<“ Ne postoje ucenici cija visina je „<< b<< „(prosecna visina) „<<endl;
}
system(„PAUSE“);
return EXIT_SUCCESS;
}

 

Višedimenzionalne matrice

Višedimenzionalne matrice predstavljaju niz nizova. Svi elementi višedimenzionalne matrice moraju da budu istog tipa- važe ista ograničenja kao i kod jednodimenzionalih nizova.

Matrica Anxm je dvodimenzionalni niz. Deklaracija dvodimenzionalnog niza int A[5][4]

A[0][0] A[0][1]A[0][2] A[0][3]

A[1][0] A[1][1]A[1][2] A[1][3]

A[2][0] A[2][1]A[2][2] A[2][3]

A[3][0] A[3][1]A[3][2] A[3][3]

A[4][0] A[4][1]A[4][2] A[4][3]

Znači dvodimenzionalni niz se deklarira na sl. način

tip ime[r][c], 

gde tip označava tip elemenata dvodimenzionalnog niza, ime, ime promenljive, a r i c broj redova i kolona adekvatno.

Indeksi elemenata dvodimenzionalnog niza se kreću od o do r-1 (za redove) i c-1 (za kolone). Pristup elementima dvodimenzionalnog niza je preko naziva niza i indkeksa redova i kolona (a[1][3], a[0][1]…)

pr1.

Napravite program koji prikazuje tablicu množenja od 1-10?

Rešenje:

#include <iostream>

using namespace std;
int main()
{
int tm[10][10];
for (int i=0; i<=10; i++)
for (int j=0; j<=10; j++)
{
m[i][j] = i*j;
}
for (int i=1; i<=10; i++)
{
for (int j=1; j<=10; j++)
cout << m[i][j] << "";
 }
cout << endl;
}
system(„PAUSE“);
return 0;
}

pr 2.

Napravite program koji kreira i izdaje jedinečnu matricu A5x5?

Rešenje:

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
int i,j;
int a[5][5]={0};
// Kreiranje jedine;nu matricu//
for (i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if(i=j)
{
a[i][j]=1;
}
}
}
// Prikay jedinicne matrice//
for (i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
cout<<a[i][j]<<“ „;
}
cout<<“ „<<endl;
}
system(„PAUSE“);
return EXIT_SUCCESS;
}

pr3.

Napravite program koji prikazuje na monitaru računara 

1*1*1 = 1      1*1*2 = 2      1*1*3 = 3      1*1*4 = 4      1*1*5 = 5
1*2*1 = 2      1*2*2 = 4      1*2*3 = 6      1*2*4 = 8      1*2*5 = 10
1*3*1 = 3      1*3*2 = 6      1*3*3 = 9      1*3*4 = 12     1*3*5 = 15
1*4*1 = 4      1*4*2 = 8      1*4*3 = 12     1*4*4 = 16     1*4*5 = 20
1*5*1 = 5      1*5*2 = 10     1*5*3 = 15     1*5*4 = 20     1*5*5 = 25
– – – – – – – – – – – – – – –
2*1*1 = 2      2*1*2 = 4      2*1*3 = 6      2*1*4 = 8      2*1*5 = 10
2*2*1 = 4      2*2*2 = 8      2*2*3 = 12     2*2*4 = 16     2*2*5 = 20
2*3*1 = 6      2*3*2 = 12     2*3*3 = 18     2*3*4 = 24     2*3*5 = 30
2*4*1 = 8      2*4*2 = 16     2*4*3 = 24     2*4*4 = 32     2*4*5 = 40
2*5*1 = 10     2*5*2 = 20     2*5*3 = 30     2*5*4 = 40     2*5*5 = 50
– – – – – – – – – – – – – – –
3*1*1 = 3      3*1*2 = 6      3*1*3 = 9      3*1*4 = 12     3*1*5 = 15
3*2*1 = 6      3*2*2 = 12     3*2*3 = 18     3*2*4 = 24     3*2*5 = 30
3*3*1 = 9      3*3*2 = 18     3*3*3 = 27     3*3*4 = 36     3*3*5 = 45
3*4*1 = 12     3*4*2 = 24     3*4*3 = 36     3*4*4 = 48     3*4*5 = 60
3*5*1 = 15     3*5*2 = 30     3*5*3 = 45     3*5*4 = 60     3*5*5 = 75
– – – – – – – – – – – – – – –
4*1*1 = 4      4*1*2 = 8      4*1*3 = 12     4*1*4 = 16     4*1*5 = 20
4*2*1 = 8      4*2*2 = 16     4*2*3 = 24     4*2*4 = 32     4*2*5 = 40
4*3*1 = 12     4*3*2 = 24     4*3*3 = 36     4*3*4 = 48     4*3*5 = 60
4*4*1 = 16     4*4*2 = 32     4*4*3 = 48     4*4*4 = 64     4*4*5 = 80
4*5*1 = 20     4*5*2 = 40     4*5*3 = 60     4*5*4 = 80     4*5*5 = 100
– – – – – – – – – – – – – – -?

Rešenje:

#include <iostream>

using namespace std;
int main()
{
int t[5][6][6] = {0};
for (int i=1; i<=4; i++)
{
for (int j=1; j<=5; j++)
{
for (int k=1; k<=5; k++)
{
t[i][j][k] = i*j*k;
cout << i << "*" << j << "*" << k;
cout << " = " << t[i][j][k] << "\t";
}
cout << endl;
}
cout << "- - - - - - - - - - - - - - -" << endl;
}
 system(„PAUSE“);
return 0;
}

#include <iostream>
using namespace std;

int main()
{
int t[5][6][6] = {0};

for (int i=1; i<=4; i++)
{
for (int j=1; j<=5; j++)
{
for (int k=1; k<=5; k++)
{
t[i][j][k] = i*j*k;
cout << i << „*“ << j << „*“ << k;
cout << “ = “ << t[i][j][k] << „\t“;
}

cout << endl;
}

cout << „- – – – – – – – – – – – – – -“ << endl;
}

system(„PAUSE“);
return 0;
}

Znakovni nizovi

Niz znakova se kreira na isti način kao i sve ostale jednodimenzionalne nizove:

char ime[N];- deklaracija znakovnog niza

ime – označava ime promenljive, a N označava broj znakova  (koliko elemenata ima niz sa nazivom ime). Jedan od N znakova koji su elementi niza je  ‘ ‘ – i predstavlja  null знак или null terminator. Ovaj znak označava kraj tekstualnog podataka, t.j omogućava da niz ima manje od N znakova.  Prikaz znakova u nizu:

Na ovaj način štampaju se  znakove niza sve dok se ne stigne do ‘ ‘. Svi znaci posle ‘ ‘ su nebitni i ne koriste se.

Inicijalizacija nizova

char niz[]={‘D’,’a’,’r’,’k’,’o’,“}         //Navodi se null znak,//

char niz[]=“Darko“           // znak se podrazumeva//

PR.

#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
char array[] = „Darko“;
array[0] = ‘M’; //obican niz

cout << array << endl; //stampa ‘Marko’

char text[100];

cout << „Unesi rec: „;
cin >> text; //unosi niz
cout << text; //stampa unetu rec

system(„PAUSE“);
return EXIT_SUCCESS;
}

U programu, naredbom cin >> text, čita reč koja se unosi preko tastature i dodeljuje se promenljivoj text. Na kraju teksta se automatski unosi i znak null. Znači cin>> čita podatke sve do prvog pojavljivanja praznog mesta. Ako je potrebno pročitati ceo red uvodi se funkcija  cin.getline(char[], N).

Funkcije koje omogućavaju rada sa tekstualnim nizovima

  • strlen(char[] niza)– vrednost funkcije je dužina niza bez znak null
  • strcpy(char[] destinacija, char[] izvor)– kopira tekstualni niz sa izvora do destinacije uključujući i znak null
  • strncpy(char[] destinacija, char[] izvor, int N)– kopira najviše N znakova od izvora do destinacije, znak null se kopira samo ako spada u N znakova, inače se uvodi sam. Napomena: niz destinacija mora da bude dovoljno velik da bi primio sve znakove sa izvora
  • strcmp(char[] prva, char[] druga)– upoređuje niz prvi i niz drugi i kao vrednost daje 0 ako su nizovi jednaki
  • strncmp(char[] prva, char[] druga, int N)– upoređuje N znakova niza prvi i drugi i ako su isti dodeljuje vrednost 0
  • strcat(char[] prva, char[] druga)– dodaje nizu prvi niz drugi, niz prvi treba da bude dovoljno velik da prihvati i znakove niza drugi
  • strncat(char[] prva, char[] vtora, int N)– nadovezije prvih N znakova niza drugi nizu prvi

Pr1:

#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{

char a[] = „prva niza“;
char b[] = „druga niza“;

char c[] = „tekst“;
char d[] = „tekst“;

cout << strlen(a) << endl; //stampa ‘9’
cout << strlen(c) << endl; //stampa ‘5’

char t[100];
strcpy(t, „Nekoja vrednost“); //t=“Nekoja vrednost“
strcpy(t, „Neshto drugo“); //t=“Neshto drugo“

strcpy(t, a); //t=“prva niza“
strncpy(t, b, 4); //t=“drugdruga niyae kopira se )
t[4] = “; //t=“drug“

strcat(t, b); //t=“druga niza“

cout << t << endl; //stampa „druga niza

cout << strcmp(t, a) << endl; //stampa 1
cout << strcmp(c, d) << endl; //stampa „0“

system(„PAUSE“);
return EXIT_SUCCESS;
}

Pr2:

Resenje:

#include <iostream>

#include <string>
using namespace std;
int main()
{
string a, b;
a = "prva";
b = "druga";
cout << a.size() << endl; //stampa'4'
cout << b.size() << endl; //stampa'5'
a = a + " " + b;
cout << a << endl; //stampa'prva druga'
b = b + b;
cout << b << endl; //stampa'drugadruga';
return 0;
}

Nizovi

Nizovi -niz promenljivih istog tipa koje se  u nizu nalaze u  memoriji.

niy Int a=20; naredbom int a=20 u računaru se određenom registru Ram memorije dodeljjuje vrednost 20, t.j promenljiva a dobija  vrednost 20

Niz predstavlja konačni skup promenljive istog tipa niy

int a[4]={20,20,30,40}- deklaracija niza a koji ima 4 elemenata; razlika između promenljive a i niza a prilikom deklarisanja se sastoji u tome što mora u vitičastim zagradama da se unese maksimalni broj elemenata niza.

Evo kako se moze deklarisati niz od 10 promenljivih tipa int:
int broj[10];
Uglaste zagrade( [] ) ukazuju da se radi o nizu a ne o samo jednoj promenljivoj. Tako sada imamo promenljivu broj[5], broj[2], broj[7] ... dakle broj mora imati index. Index je broj unutar uglastih zagrada.
Navedenom deklaracijom nije deklarisana promenljiva broj sa indexom 10 ( dakle ne postoji broj[10] ). Razlog ovome je taj sto index prvog broja nije 1, vec 0( nula) ( broj[0] broj[1] broj[3] broj[4] …. broj[9]).Ako se napiše samo broj,bez ikakvog indexa,  to će  imati isti efekat kao da je napisano broj[0], dakle pristupa se  prvoj promenljivoj niza.
Kao sto je moguće da se inicijalizuju vrednosti „obicnih“ promenljivih tako je moguće inicializovati i vrednosti nizovsnih promenljivih.

Primer:
int broj[4] = { 4679, 1, -3555, -8 };
Tako se inicializuju nizovne promenljive; broj[0] će imati vrednost 4679, broj[2] ce biti -3555 idt..
int broj[10] = { 0 };
Svi elementi niza biće inicializovani vrednošću nula.

int a[4]={10,20,30,40}- deklaracija niza a koji ima 4 elemenata; razlika između promenljive i niza prilikom deklarisanja se sastoji u tome što mora u vitičastim zagradama da se unese maksimalni broj elemenata niza.

Sadržaj nizovne promenljive  se izdaje na slićan način kao i sadržaj bilo koje promenljive, cout<<a[0]<<a[1],  razlika je u tome što pored naziva nizovne promenljive mora da se navede u uglastim zagradama i pozicija umanjena za jedan.

Primer.

Cout<<a[0]- ispisuje prvi element niza

Cout<<a[1]<<a[2]<<endl– ispisuje drugi i treći element niza.

Primeri prikaza elemenata niza različtog tipa

Primer 1.

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
int broj[3]={10, 20, 30};

cout<<broj[0]<<endl;

cout<<broj[1]<<endl;

cout<<broj[2]<<endl;

system(„PAUSE“);
return EXIT_SUCCESS;

}

Primer 2.

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
float broj[3]={10.56, 20.36, 30.58};

cout<<broj[0]<<endl;

cout<<broj[1]<<endl;

cout<<broj[2]<<endl;

system(„PAUSE“);
return EXIT_SUCCESS;

}

Primer 3.

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
char broj[3]=“P“, „O“, L“, „J“, „E“};

cout<<broj[0]<<endl;

cout<<broj[1]<<endl;

cout<<broj[2]<<endl;

system(„PAUSE“);
return EXIT_SUCCESS;

}

Primećuje se da je ispis elemenata niza brojačka programska petlja, znači koliko ima elemente niza, toliko puta izdajemo njihov sdržaj.

Primer:

#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
int broj[3]={10, 20, 30};

int i;

for (i=0;i<3;i++)

cout<<broj[i]<<endl;

system(„PAUSE“);
return EXIT_SUCCESS;

}

Na isti način se unose i konkretne vrednosti elemenata niza.

Primer.

Program koji sabire elemente niza (niz ima 5 elemenata)

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
int broj[5];

for (int i=0; i<5; i++)
{
cout<<„Unesi „<<i+1<<“ element niza“<<endl;
cin >> broj[i];
}

int s=0;

for (int i=0; i<5; i++)
{
s+=broj[i];
}
cout << „Zbir je: “ << s << endl;
system(„PAUSE“);
return EXIT_SUCCESS;
}

OBJSNJENJE:
U prvoj liniji  pomocu direktive #include ukljucili ste standardne biblioteke.
Zatim sledi funkcija main(). Ona predstavlja polaznu tacku svakog programa, te je svaki program mora imati.
Prva stvar koja se radi unutar tela main()-a je deklaracija promenljivih koje se koriste. Promenljiva broj je tipa int i ona je niz od ukupno 5 elemenata(prvi element se nalazi na indexu 0 a posledji na indexu 4).
Petlja for-Prvom naredbom( i = 0 ) postavlja se vrednost promenljive i na nulu. Druga naredba pretstavlja uslov da bi se petlja ponavljala. Treca naredba se kao i druga, izvrsava pri svakom ponavljanju tela petlje i njom inkrementiramo „i“. U telu petlje nalaze se dve naredbe, prvom kazujemo korisniku sta treba da unese dok drugom prihvatamo podatke koje ce korisnik uneti.
Sledi jos jedna petlja for,  njena uloga je da sabere sve elemente niza promenljive broj.
Na kraju,se  ispisuje rezultat.

 Pogledajte video o nizovima

Primeri!!!!

Pr1.

Kreirajte program koji kreira jediničnu matricu Anxn?

Rešenje:

#include<stdio.h>;
int a[10][10];
main()
{
int i,j,n;
printf(„Unesite broj vrst(kolona)matrice?“);
scanf(„%d“,&n);
/*Kreiranje jedinecne matrice reda n*/
for (i=0;i<n;i++)
a[i][i]=1;
/*Prikaz jedinicne matrice*/
for(i=0;i<n;i++)
{
for (j=0;j<n;j++)
printf(„%d“,a[i][j]);
printf(„\n“);
}
return 0;
}

Pr2. Kreiraj niz  B koji ima n elementa, elemente niya B su inveryni elementima niya A?

Rešenje:

#include<stdio.h>
int A[10], B[10];
main()
{
/*unos elemenata niza A i kreiranje niza B*/
int i,j,n;printf(„Unesi broj elemenata niza?\n“);
scanf(„%d“,&n);
for(i=0;i<n; i++)
{
printf(„Unesi %d element niza\n „,i+1);
scanf(“ %d“,&A[i]);
B[i]=-A[i];
}
/*Prikaz starog i novoformiranog niza*/
printf(„Elementi niza A\n“);
for (i=0;i<n;i++)
printf(„%d\n“,A[i]);
printf(„Elementi niza B\n“);
for (i=0;i<n;i++)
printf(„%d\n“,B[i]);
return 0;
}

Pr.3

Napravi program koji sumira elemente matrice Amxm na glavnoj dijagonali?

Rešenje:

#include<stdio.h>
float a[10][10];
main()
{
int i,j,m,n;
float suma=0.0;
printf(„Unesite broj vrsta\n“,m);
scanf(„%d“,&m);
printf(„Unesi broj kolona\n“,n);
scanf(„%d“,&n);
/*Unos elemenata matrice*/
for (i=0;i<m;i++)
{
printf(„Unesi elemente %d vrste\n“,i+1);
for (j=0;j<n;j++);
scanf(„%f“,&a[i][j]);

}
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
suma+=a[i][i];
}
printf(„zbir elemenata matrice a na glavnoj dijagonali je%d „,suma);
return 0 ;
}

PR4. 

Napraviti program koji iydaje min element niya A kao i njegov indeks?

Rešenje:

/*Program koji izdaje min element niza i njegov index*/
#include <stdio.h>
/*deklaracija niza*/
int broj[5] ;

main()
{
int i,min,sn=0;

/* unos konkretne vrednosti preko tastature elemenima niza*/

for(i=0;i<5;++i)
{
printf(„Unesi %d broj“,i+1);
scanf(„%d“,&broj[i]);

}
/*Pronalazenje min od svih elemenata niza*/
min=broj[0]; sn=1;
for(i=0;i<5;++i)
{
if (broj[i]<min)
min=broj[i];sn=i;
}

printf(„minimalni element niza je %d\n“,min);
printf(„rec je o %d\ elementu niza“,sn);
return(0);
}

Pr5.

Napravite program koji unosi string i izdaje isti?

Rešenje:

#include<stdio.h>
main()
{
char s[100],*pok;
printf(„unesi string\n“);
gets(s);
pok=s;
while(*pok)
putchar(*pok++);
return 0;
}

Дводимензионални низови (матрице)- решени задаци!

Задатак1. Матрицом реда N дата је табела јесенјег дела фудбалског шампионата чији су елементи : 0– ако је екипа i изгубила од екипе ј; 1– ако је нересено; 2 ако је екипа i победила екипу ј. Написати програм којим се израчунава:

а) бројекипа који су имали више победе него пораза

б) број екипа које немају пораз у првенству

(садржај на главној дијагонали занемарите)?

Решење:

а)

#include<stdio.h>

int a[10][10];
int brojp[10];
int broji[10];
main()
{
int i,j,n,bp,bi;
bi=0;
bp=0;
printf(„Unesi broj ekipa“);
scanf(„%d“,&n);
/*Unos elemenata matrice*/
for (i=0;i<n;i++)
{
printf(„Rezultate ekipe[%d]“,i+1);
for (j=0;j<n;j++)

scanf(„%d“,&a[i][j]);
printf(„\n“);
}
/* ukupno pobeda i poraza ekipa */
for (i=0;i<n;i++)
{

for (j=0;j<n;j++)
if((i!=j) && (a[i][j]==2))
{
bp++;
}
else
{
if ((i!=j) && (a[i][j]==0))
bi++;
}
/*printf(„pobede ekipe[%d] %d\n“,i+1,bp);*/
/*printf(„porazi ekipe[%d] %d\n“,i+1,bi); */
brojp[i]=bp;
broji[i]=bi;
bp=0;
bi=0;

}
/*broj pobeda i poraza*/
for(i=0;i<n;i++)

{if (brojp[i]>broji[i])
bp++;
else
bi++;
}
if (bp>=bi)
printf(„Vise pobeda nego poraza imaju %d ekipe“,bp);
else
printf(„Ne postoje ekipe sa vise pobeda od poraza“);
return 0;
}

б) број екипа без пораза

#include<stdio.h>
int a[10][10];
int brojp[10];
int broji[10];
main()
{
int i,j,n,bp,bi;
bi=0;
bp=0;
printf(„Unesi broj ekipa“);
scanf(„%d“,&n);
/*Unos elemenata matrice*/
for (i=0;i<n;i++)
{
printf(„Rezultate ekipe[%d]“,i+1);
for (j=0;j<n;j++)

scanf(„%d“,&a[i][j]);
printf(„\n“);
}
/* ukupno pobeda i poraza ekipa */
for (i=0;i<n;i++)
{

for (j=0;j<n;j++)
if((i!=j) && (a[i][j]==2))
{
bp++;
}
else
{
if ((i!=j) && (a[i][j]==0))
bi++;
}
/*printf(„pobede ekipe[%d] %d\n“,i+1,bp);*/
/*printf(„porazi ekipe[%d] %d\n“,i+1,bi); */
brojp[i]=bp;
broji[i]=bi;
bp=0;
bi=0;

}
/*broj pobeda i poraza*/
for(i=0;i<n;i++)
{
if (brojp[i]>=n-1)
bp++;
}
printf(„Broj ekipa bey poraza je %d „,bp);
return 0;
}

Задатак2. Направите програм који креира јединичну матрицу А(nxn), за n<10?

Решење:

(матрица је јеинична ако ван главне дијагонале има нуле, а на дијагонали јединице)

#include<stdio.h>;
int a[10][10];
main()
{
int i,j,n;
printf(„Unesite broj vrst(kolona)matrice?“);
scanf(„%d“,&n);
/*Kreiranje jedinecne matrice reda n*/
for (i=0;i<n;i++)
a[i][i]=1;
/*Prikaz jedinicne matrice*/
for(i=0;i<n;i++)
{
for (j=0;j<n;j++)
printf(„%d“,a[i][j]);
printf(„\n“);
}
return 0;
}

Задатак3. дата је матрицакоја има м редова и н колона, Направите програм који сумира елементе матрице на дијагонали?

Решење:

#include<stdio.h>
float a[10][10];
main()
{
int i,j,m,n;
float suma=0.0;
printf(„Unesite broj vrsta\n“,m);
scanf(„%d“,&m);
printf(„Unesi broj kolona\n“,n);
scanf(„%d“,&n);
/*Unos elemenata matrice*/
for (i=0;i<m;i++)
{
printf(„Unesi elemente %d vrste\n“,i+1);
for (j=0;j<n;j++);
scanf(„%f“,&a[i][j]);

}
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
suma+=a[i][i];
}
printf(„zbir elemenata matrice a na glavnoj dijagonali je%d „,suma);
return 0 ;
}

 

Вишедимензионални низови

Много проблема могу веома ефикасно да се реше ако се употребе вошедимензионални низови. Пр. табела са две или више колоне може да се представи као дводимензионални низ, а више табела као тродимензионални низ.

пр. Потребно је да се у метеролошком заводу обради статистика месечних падавина за прва три месеца у години за неког града за период од 5 године (од 199101995). Циљ обраде је просечне месечне и годишње падавине. Да би се обрадили просечне падавине треба сумирати податке у одговарајућој врсти и поделити са 3, а за месечне падавине треба сабрати податке по колони за дати месец и затим поделити са 5.

Година јан
0
феб
1
март
2
Просек
91-0 xx xx xx
92-1 xx xx xx
93-2 xx xx xx
94-3 xx xx xx
95-4 xx xx xx
Просек

Матрица, појам који се користи у математици,  дводимензионални низ ; приказије се унутар угластих заграда и дефинисана је са бројем редова и колона.  Приступ елементима матрице је преко индекса редова и колона.

Значи, предходни пробле се своди на  дводимензионалну матрицу реда 5*3, 3 врсте и 3 колоне.

За решавање проблема користе се низ низова. Основни низ има 5 елемената, који су низови од 3 елемената. Декларишемо на сл. начин:

kisa[5][3]; 

Елемент матрице kisa[1][3] оперише са количуном падавина за јануар 1992год. Променом дригог индекса кретанје је по врсти, а променом првог индекса кретанје је по колони. Збир количине падавина за март 1991 и 1994 се представлја као klasa[0][3]+klasa[3][3].

Иницијализација дводимензионалних низова- иницијализовани елементи се наводе по врстама.

пр.

static int tabela[3][4]={{1,1,1,1}, {2,2,2,2},{3,3,3,3}}  ili

static int tabela[3][4]={

{1,1,1,1},

                                                        {2,2,2,2},

                                                        {3,3,3,3},

                                                         };

пр.

static int A[2][3]={

{1,2},

{3,4},

};

Реч је о матрици А чији су елементи 1 2 0

                                                                                3 4 0

Пр.

Декларација матрице А 2*3  са елементима 1 2 3

                                                                                    4 0 0

Static int A[2][3]={1,2,3,4}

Решење примера :

#include<stdio.h>
#include<math.h>
float kisa[5][12];
main()
{

/* deklaracija dvodimenzionalnog niza*/

/*deklaracija jednogdimenzionalnog niza*/
static float mesecp[12],godp[5];
int i, j;
mesecp[0]=0;
godp[0]=0;

printf(„Unesite podatke iz tabelu vrstu po vrstu“);
for (i=0;i<3;i++)
{
printf(„podaci za %d godinu\n“,i+1991);
for (j=0;j<3;j++)
{
scanf(„%f“,&kisa[i][j]);
mesecp[j]+=kisa[i][j];
godp[i]+=kisa[i][j];

}
godp[i]+=kisa[i][j];
godp[i]/=3;
}
printf(„godisnji proseci su:\n“);
for (i=0;i<5;i++)
printf(„Za %d g prosek %15.3f\n“,i+1991,godp[i]);
printf(„Mesecni proseci su :\n“);
for (j=0;j<3;j++)
printf(„za %d mesec prosek %15.3f\n“, j+1,mesecp[j]/5);
return 0;
}

Funkcije i nizovi!

zad. Koliko je učesnika takmičenja imalo natprosečne rezultate?

Rešenje:

Rasčlanjujemo problem na sledeće module:

1. Učitavanje vrednosti elemenata niza

2. Izračunavanje prosečnog rezultata

3. Prebrojavanje natprosečnih reyultata

4. Izveštaj!

Za izračunavanje proseka koristimo funkciju prosek(); deklaracija x[] u funkciji kreira ne niz  već pokazivač na niz

#include <stdio.h>
/*deklaracija niza*/

float prosek(int x[],int n)
{
int i, suma;
suma=0;
for(i=0;i<n,suma+=x[i];i++);
return((float)suma/n);
}

main()
{
int n,i,broj, ocena[50];
float prosek;

printf(„Uunesi broj takmicara?“);
scanf(„%d“,&n);
/*Ucitavanje elemente niza*/
for(i=0;i<n;i++);
{
printf(„ocena[%d]=“,i);
scanf(„%d“,&ocena[i]);
}
/* Prebrojavanje nadprosecnih rezultata*/
broj=0;
for(i=0;i<n;i++)
{

if (ocena[i] >prosek(ocena,n))
broj++;
};
Printf(„Prosecni rezultat je %f\n“,prosek(ocena,n));
printf(„Nadprosecne rezultate je imalo %dtakmicara \n“,broj);

return 0;
}

Prenos jednodimenzionalnog niza se ostvaruje navodjenjem imena niza u poyivu funkcije bez indeksa. Oni se prenose iskljucivo po adresi. Prenos nizova  kao vrednosnih  parametara nije moguć u C-u