Програмирање 2/Блок 2
Transponovanje matrice
Sastaviti na jeziku C program za transponovanje pravougaone matrice celih brojeva. Program na početku učitava broj vrsta i kolona matrice, a zatim i same vrste matrice u zasebnim redovima. Matricu je neophodno smestiti u dinamičku zonu memorije. Postupak treba ponavljati sve dok se za dimenzije matrice ne unesu nekorektne vrednosti. Voditi računa o ispravnom korišćenju dinamičke memorije.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int row, col;
int **matrix;
int **transposed;
while(1)
{
scanf("%d %d", &row, &col);
if(row <= 0 || col <= 0)
break;
matrix = malloc(row*sizeof(int*));
if(!matrix)
exit(0);
for(int i = 0; i < row; i++)
{
matrix[i] = malloc(col*sizeof(int));
for(int j = 0; j < col; j++)
{
scanf("%d", &matrix[i][j]);
}
}
transposed = malloc(col * sizeof(int*));
for(int i = 0; i < col; i++)
transposed[i] = malloc(row * sizeof(int));
for(int i = 0; i < col; i++)
{
for(int j = 0; j < row; j++)
{
transposed[i][j] = matrix[j][i];
printf("%d", transposed[i][j]);
if(j != row-1)
putchar(' ');
}
putchar('\n');
}
for(int i = 0; i < col; i++)
free(transposed[i]);
free(transposed);
for(int i = 0; i < row; i++)
free(matrix[i]);
free(matrix);
}
return 0;
}
Rotacija niza
Prva funkcija
Napisati funkciju na programskom jeziku C sa potpisom int are_equal(int *a, int *b, int count) koja proverava da li su dva niza a i b jednaka. Oba niza sadrže count elemenata. Ukoliko su nizovi jednaki povratna vrednost funkcije je 1, u suprotnom je 0.
int are_equal ( int *a, int *b, int count ) {
for(int i = 0; i < count; i++)
{
int flag = 1;
for(int j = 0; j < count; j++)
{
if(a[i] == b[j])
flag = 0;
}
if(flag)
return 0;
}
return 1;
}
Druga funkcija
Napisati na programskom jeziku C funkciju void r_rotate_one(int *a, int count) koja rotira niz a čija je veličina count za 1 mesto udesno.
void r_rotate_one ( int *a, int count ) {
int val = a[count -1];
for(int i = count; i > 0; i--)
a[i] = a[i-1];
a[0] = val;
}
Treća funkcija
Korišćenjem prethodno realizovanih funkcija napisati na programskom jeziku C funkciju int is_rotation(int *a, int *b, int count) koja proverava da li se prvi niz a može dobiti rotacijom drugog niza b za odgovarajući broj mesta udesno. Oba niza su dužine count. Povratna vrednost funkcije predstavlja broj mesta za koji je potrebno rotirati drugi niz, odnosno -1 ukoliko prvi niz nije moguće dobiti rotacijom drugog niza.
int is_rotation ( int *a, int *b, int count ) {
for(int i = 0; i < count; i++)
{
if(are_equal(a,b,count))
{
return i;
}
r_rotate_one(b, count);
}
return -1;
}
Četvrta funkcija
Korišćenjem prethodno realizovanih funkcija sastaviti na jeziku C program koji učitava dva niza i ispisuje da li od drugog može doći do prvog niza primenom određenog broja rotacija udesno. Program najpre treba da pročita dužinu nizova, a zatim i same nizove. Program na kraju ispisuje koliko je rotacija potrebno da bi se od drugog niza dobio prvi niz. Voditi računa o ispravno korišćenju dinamičke memorije.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int size;
scanf("%d", &size);
int *a = malloc(size*sizeof(int));
int *b = malloc(size*sizeof(int));
for(int i = 0; i < size; i++)
{
scanf("%d", a+i);
}
for(int i = 0; i < size; i++)
{
scanf("%d", b+i);
}
int res = is_rotation(a,b,size);
printf("%d", res);
free(a);
free(b);
}