PROGRAMIRANJE
Predavanja
dr. sc. Miroslav Slamić, prof. v. šk.
Vježbe
Mr. sc. Mirko Smilevski, pred.
Bojan Nožica, dipli. ing., predavač
Hrvoje Rončević, dipl. ing., asistent
Dvodimenzionalna polja
DVODIMENZIONALNO POLJE - MATRICA
3
BR_RED – broj redaka
BR_STUP – broj stupaca
Indeksiranje članova poljadvodimenzionalna polja
4
Dvodimenzionalno polje (tablica, matrica) npr. float y[M][N];
M – ukupan broj redaka
N – ukupan broj stupaca
redak 1y[0][0] y[0][1] y[0][2] y[0][N-2] y[0][N-1]
redak 2y[1][0] y[1][1] y[1][2] y[1][N-2] y[1][N-1]
. . .
redak my[M-1][0] y[M-1][1] y[M-1][2] y[M-1][N-2] y[M-1][N-1]
ZADATAK
Napiši program u kojem formiraj float polje A
dimenzija M x N (M i N ne smiju biti veći od
10), tako da su elementi polja jednaki aij = i*j.
Nakon toga pomnoţi s konstantom (zadaje se
između 1 do 20) koju ćeš učitati s tipkovnice
ako je ta konstanta veća ili jednaka 5 a manja od
10, odnosno podjeli svaki član polja s
konstantom ako je konstanta veća ili jednaka od
1 a manja od 5. U protivnom ništa ne radi s
elementima polja.
Ispiši rezultat.
RJEŠENJE#include "stdafx.h"
#include <stdio.h>
#define NMAX 10
int main(int argc, char* argv[])
{
float Ocjena = 5;
int A[NMAX][NMAX];
int M, N, KONST;
int temp;
int i, j,k ; /* indeksi polja */
do
{
printf("Upisi broj redaka M i broj stupaca M za kvadratno polje A (manji ili
jednak 10:\n");
scanf("%d %d", &M, &N);
}while( (M<1||M>10) ||(N<1||N>10) );
/*petlja za upis polja A*/
printf("Upisi polje A:\n");
for(i=0; i < M;i++)
{
for(j=0;j<N; j++)
{
A[i][j]=i*j;
}
}
printf("Upisi konstantu između 1 i 20\n");
scanf("%d", &KONST);
/*petlja za rad s konstatnom*/
for(i=0; i < M;i++)
{
for(j=0;j<N; j++)
{
if(KONST>=1 && KONST <5)
A[i][j]=A[i][j]/KONST;
else if (KONST>=5 && KONST <10)
A[i][j]=A[i][j]*KONST;
}
}
/*petlja za ispis*/
printf("Polje A nakon operacije mnoţenja/djeljenja:\n");
for(i=0; i < M;i++)
{
for(j=0;j<N; j++)
{
printf("%d ", A[i][j]);
}
printf("\n");
}
ZADATAK 2 ZA SAMOSTALNI RAD
Napišite program koja će ulaznu cjelobrojnu kvadratnu matricu
proizvoljnih dimenzija promijeniti na način da na glavnu dijagonalu
upiše sumu svih ostalih elemenata iz tog retka matrice.
Primjer:
1610143
1211109
8765
4321
će se promijeniti u:
2110143
1231109
87205
4329
PRIMJER
Učitaj kvadratnu matricu A dimenzija 5 x
5 elemenata. Zatim u toj matrici zamjeni
sve elemente polja zrcalno s obzirom na
glavnu dijagonalu.
RJEŠENJE
// zamjena elemenata matrice zrcalno
//
#include "stdafx.h"
#include <stdio.h>
#define NMAX 10
int main(int argc, char* argv[])
{
int A[NMAX][NMAX]; /* definicija i deklaracija kvadratne matrice na max 10 x 10 elemenata */
int M, N, K, P;
int temp;
int i, j,k ; /* indeksi polja */
do
{
printf("Upisi broj redaka M i broj stupaca N za kvadratno polje
A (manji ili jednak 10:\n");
scanf("%d %d", &M, &N);
/* Ako nije zadana kvadratna matrica M=N , ponovi */
if(N != M)
{
printf("Broj stupaca N polja A, mora biti jednak broju
redaka M polja A\n");
continue;
}
}while( (M<1||M>20) ||(N<1||N>10) ); /* petlja se vrti tako dugo
dok se ne zadaju dimenzije veće od 1 a manje od 20 */
/*petlja za upis polja A - upisuje se element po element po retcima*/
printf("Upisi polje A:\n");
for(i=0; i < M;i++)
{
for(j=0;j<N; j++)
{
scanf("%d", &A[i][j]);
}
}
/*petlja za ispis polja A prije zamjene*/
printf("Polje A prije zamjene elemenata je:\n");
for(i=0; i < M;i++)
{
for(j=0;j<N; j++)
{
printf("%d ", A[i][j]);
}
printf("\n");
}
/*petlja za zamjenu elemenata zrcalno u odnosu na glavnu dijagonalu*/
for(i=0; i < M;i++)
{
for(j=i+1;j<N; j++) /* u svakom retku započinjemo petlju
po stupcima od i + 1 stupca */
{
temp=A[i][j];
A[i][j]=A[j][i];
A[j][i]=temp;
}
/*petlja za ispis*/
printf("Polje A nakon zamjene elemenata je:\n");
for(i=0; i < M;i++)
{
for(j=0;j<N; j++)
{
printf("%d ", A[i][j]);
}
printf("\n");
}
getchar(); /*program čeka dok se ne pritisne bilo koji znak*/
return 0;
}
MNOŢENJE MATRICA
Za mnoţenje dviju matrica potrebno je
ispunjenje uvjeta:
◦ Broj redaka prve matrice mora biti jednak
broju stupaca druge matrice (npr. matrica 2 x
3 i matrica 3 x 2 rezultirati će matricom 2 x 2
◦ Formula za mnoţenje glasi:
◦ Napisati program za mnoţenje dvije matrice
17
PRIMJER
#include "stdafx.h"
#include <stdio.h>
#define NMAX 20
int main(int argc, char* argv[])
{
int A[NMAX][NMAX], B[NMAX][NMAX],
C[NMAX][NMAX];
int M, N, K, P;
int i, j,k ; /* indeksi polja */
18
RJEŠENJEdo
{
printf("Upisi broj redaka M i broj stupaca N za polje A (manji od 20:\n");
scanf("%d %d", &M, &N);
printf("Upisi broj redaka K i broj stupaca P za polje B(manji od 20):\n");
scanf("%d %d", &K, &P);
if(N != K)
{
printf("Broj stupaca N polja A, mora biti jednak broju redaka K
polja B\n");
continue;
}
}while( (M<1||M>20) ||(N<1||N>20) ||(K<1||K>20) ||(P<1||P>20) );
19
/*petlja za upis polja A*/
printf("Upisi polje A:\n");
for(i=0; i < M;i++)
{
for(j=0;j<N; j++)
{
scanf("%d", &A[i][j]);
}
}
printf("Upisi polje B:\n");
for(i=0; i < K;i++)
{
for(j=0;j<P; j++)
{
scanf("%d", &B[i][j]);
}
}
20
/*petlja za mnoţenje*/
for(i=0; i < M;i++)
{
for(k=0; k < P;k++)
{
C[i][k]=0;
for(j=0;j<N; j++)
{
C[i][k] += A[i][j]*B[j][k];
}
}
}
21