Програмирање 2/Блок 2

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

Транспоновање матрице

Саставити на језику 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);
}