Fakultet elektrotehnike, strojarstva i brodogradnje Sveucilista u Splitu Studij racunarstva Kolegij: Programiranje 1 Sk.god. 2004/2005 Student: _________________________________ DOMACI RAD - VJEZBA 8 1. Kratko opisite a) Po cemu se polje razlikuje od obicne varijable b) Kojim uvjetima moraju udovoljavati svi clanovi polja c) Kako se raspoznaje pojedini clan polja d) Prednost odredjivanja velicine polja primjenom simbolickih konstanti (#define) e) Nacin prijenosa polja u funkcije (razlika u odnosu na prijenos pojedinih varijabli) 2. Odgovorite na sljedeca pitanja: a) Hoce li se promjena vrijednosti clana polja unutar pozvane funkcije odraziti na vrijednost toga clana unutar pozivne funkcije? Pojasnite. b) Moze li se polje vratiti u pozivnu funkciju nalogom return? Pojasnite. c) Kako se definiraju visedimenzionalna polja? d) Kako se navode nacelni argumenti visedimenzionalnoga polja unutar prototipa funkcije. U cemu je razlika u odnosu na jednodimenzionalno polje? e) Moze li se u pozvanu funkciju prenijeti samo jedan clan polja (npr. osmi)? f) Mogu li se clanovima automatskih polja pridati pocetne vrijednosti? 3. Napisite definicije i deklaracije varijabli i polja koja se prenose iz glavne u pozvanu funkciju Fun1: a) cjelobrojne varijable I i K i jednodimenzionalno float polje Sila od 100 clanova b) jednodimenzionalno double polje Temp od 50 clanova i znakovni niz Redak od 80 znakova c) Dvodimenzionalno znakovno polje Sastav od 25 redaka, svaki od 80 znakova i dvodimenzionalno float polje Vrijeme od 50 redaka i 80 stupaca 4. Neka je zadana float matrica A (tablica) od k redaka i m stupaca. Isto tako, neka je zadana druga float matrica B (tablica) od m redaka i n stupaca. Izradite program koji ce odrediti novu k x n matricu C, ciji su clanovi: C[i][j] = A[i][1]*B[1][j] + A[i][2]*B[2][j] + ... + A[i][m]*B[m][j] gdje su: i = 1,2,3,...,k; j = 1,2,3,...,n. Ova operacija je poznata kao mnozenje matrica. Ispisati clanove svih matrica. ------------------------------------------------------------------------------------------------ ODGOVORI / RJESENJA ------------------------------------------------------------------------------------------------ ODGOVORI: ************************************************************************************************ 1) a)Polje je NIZ varijabli istog tipa koji nosi zajedničko ime b)Svi članovi polja moraju biti istog tipa c)Član se raspozaje po indeksu polja d)Lakše se rade izmjene e)Kompajler tumači poziv identifikatora polja bez indeksa kao adresni poziv. Polja se mogu prenijeti jedino pomoću adrese,a ne pomoću vrijednosti. ************************************************************************************************ 2) a)Polja se prenose pomoću adrese.Tako da će sve što se napravi sa poljem u pozvanoj funkciji biti vidljivo i u pozivnoj funkciji. b)Nemoze,jer nema prijenosa vrijednosti.Prenosi se adresa. c)tip_polja ime_polja [d1] [d2]....[dn]; d1...dn-dimenzije Kod definicije višedimenzionalnog polja sve se dimenzije,osim prve, moraju navesti. d) e)Nemoze ************************************************************************************************* 3) a) void Fun1 (int,int,float []) main () { int I,K; float Sila [100]; Fun1 (I,K,Sila); ... } b) void Fun1 (char [],double[]); main () { char Redak[80]; double Temp [50]; Fun1 (Redak,Temp); ...... } c) void Fun1(char[][80],float[][80]); main() { char Sastav[25][80]; float Vrijeme [50][80] ; Fun1 (Sastav,Vrijeme); .... } *************************************************************************************************** 4.) #include // Konstante #define IMAX 20 // Najveci broj redaka #define JMAX 20 // Najveci broj stupaca // Prototipovi funkcija void Mat_unos (int [][JMAX], int, int); void Mat_umnozak (int [][JMAX], int [][JMAX], int [][JMAX], int, int, int, int); // Glavna funkcija main() { // Prijava varijabli int i, j; // Brojac redaka; brojac stupaca int ni1, nj1,ni2,nj2; // Broj redaka; broj stupaca int a[IMAX][JMAX], b[IMAX][JMAX] , c[IMAX][JMAX]; puts("Program mnozi matrice, za kraj CTRL+C"); while (1>0) { // Unos podataka puts ("Broj redaka prve matrice:"); scanf ("%d", &ni1); puts ("Stupaca? "); scanf ("%d", &nj1); puts ("Broj redaka druge matrice:"); scanf ("%d", &ni2); printf ("Broj stupaca druge matrice:"); scanf ("%d", &nj2); if (nj1<0 || nj1>=JMAX || ni1<0 || ni1>=IMAX || ni2<0 || ni2>=IMAX || nj2<0 || nj2>=JMAX) { printf("\n\t\t\t KRIVI UNOS \n\n\t\t\t*******KRAJ******\n"); } else if (nj1!=ni2) { printf("Matrice A i B mozemo pomnoziti samo ako su ulancane,tj.\n" "ako A ima onoliko stupaca koliko B redaka.\n\n\t\t\t*******KRAJ******\n"); } else { printf ("\n*** PRVA MATRICA *** "); Mat_unos ( a, ni1, nj1 ); puts(""); for (i = 0;i < ni1;i++) { for (j = 0;j < nj1;j++) printf ("%4d", a[i][j]); printf ("\n"); } printf ("\n*** DRUGA MATRICA *** "); Mat_unos ( b, ni2, nj2); puts(""); for (i = 0;i < ni2;i++) { for (j = 0;j < nj2;j++) printf ("%4d", b[i][j]); printf ("\n"); } // Mnozenje matrica Mat_umnozak (a,b,c,ni1,nj1,ni2,nj2); // Ispis rezultata printf ("\n\nUmnozak matrica iznosi:\n" ); for (i = 0;i < ni1;i++) { for (j = 0;j < nj2;j++) printf ("%4d", c[i][j]); printf ("\n"); } } } return 0; } // Unos matrice void Mat_unos (int a[][JMAX], int m, int n) { // Prijava varijabli int i, j; // Unos podataka, redak po redak for (i = 0;i < m;i++) // Promjena redaka { printf ("\nUpisite clanove %d. retka \n", i+1); for (j = 0;j < n;j++) // Promjena stupaca scanf ("%d", &a[i][j]); } } // Mnozenje matrica void Mat_umnozak ( int a[][JMAX], int b[][JMAX], int c[][JMAX], int ni1, int nj1, int ni2, int nj2 ) { // Prijava varijabli int i, j,k,z; // Mnozenje clanova matrica for (i = 0;i < ni1;i++) for (j = 0;j < nj2;j++) { z=0; for (k=0;k