Програмирање 2/Блок 2
Транспоновање матрице
Саставити на језику C програм за транспоновање правоугаоне матрице целих бројева. Програм на почетку учитава број врста и колона матрице, а затим и саме врсте матрице у засебним редовима. Матрицу је неопходно сместити у динамичку зону меморије. Поступак треба понављати све док се за димензије матрице не унесу некоректне вредности. Водити рачуна о исправном коришћењу динамичке меморије.
#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;
}
Ротација низа
Прва функција
Написати функцију на програмском језику C са потписом инт аре_еqуал(инт *а, инт *б, инт цоунт) која проверава да ли су два низа а и б једнака. Оба низа садрже цоунт елемената. Уколико су низови једнаки повратна вредност функције је 1, у супротном је 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;
}
Друга функција
Написати на програмском језику C функцију воид р_ротате_оне(инт *а, инт цоунт) која ротира низ а чија је величина цоунт за 1 место удесно.
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;
}
Трећа функција
Коришћењем претходно реализованих функција написати на програмском језику C функцију инт ис_ротатион(инт *а, инт *б, инт цоунт) која проверава да ли се први низ а може добити ротацијом другог низа б за одговарајући број места удесно. Оба низа су дужине цоунт. Повратна вредност функције представља број места за који је потребно ротирати други низ, односно -1 уколико први низ није могуће добити ротацијом другог низа.
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;
}
Четврта функција
Коришћењем претходно реализованих функција саставити на језику C програм који учитава два низа и исписује да ли од другог може доћи до првог низа применом одређеног броја ротација удесно. Програм најпре треба да прочита дужину низова, а затим и саме низове. Програм на крају исписује колико је ротација потребно да би се од другог низа добио први низ. Водити рачуна о исправно коришћењу динамичке меморије.
#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);
}