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

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

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);
}