Програмирање 2/К2 2018

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

Drugi kolokvijum 2018. godine održan je 23. aprila. Zadaci i rešenja dostupni su sa stranice predmeta.

Zadatak

Prva funkcija

Realizovati funkciju int isColumnEmpty(char **m, int column, int startRow, int length) koja proverava da li je deo kolone column matrice m koji počinje od vrste startRow i koji je dužine length prazan, odnosno da li se u tom delu nalaze samo karakteri '#'. Funkcija vraća vrednost 1 ukoliko je deo prazan, a 0 u suprotnom.

Funkcija ne treba da učitava podatke. Smatrati da će dobiti one vrednosti koje su navedene u koloni Input.

int isColumnEmpty(char **m, int column, int startRow, int length) {
    for(int i = startRow; i < startRow + length; i++)
    {
        if(m[column][i] != '#')
            return 0;
    }
    return 1;
}

Druga funkcija

Realizovati funkciju int isRowEmpty(char **m, int row, int startColumn, int length) koja proverava da li je deo vrste row matrice m koji počinje od kolone startColumn i koji je dužine length prazan, odnosno da li se u tom delu nalaze samo karakteri '#'. Funkcija vraća vrednost 1 ukoliko je deo prazan, a 0 u suprotnom.

Funkcija ne treba da učitava podatke. Smatrati da će dobiti one vrednosti koje su navedene u koloni Input.

int isRowEmpty(char **m, int row, int startColumn, int length) {
    for(int i = startColumn; i < startColumn + length; i++)
        if(m[row][i] != '#')
            return 0;
    return 1;
}

Treća funkcija

Korišćenjem prethodno realizovanih funkcija realizovati funkciju char** loadMatrix(int *rows, int *columns) koja najpre čita dimenzije rows i columns sa standardnog ulaza, a potom formira matricu karaktera i popunjava je rečima koje čita sa standardnog ulaza, pod uslovom da učitana reč može da stane u matricu na zadatoj poziciji. Funkcija kao povratnu vrednost vraća pokazivač na novoformiranu matricu.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char** loadMatrix ( int *rows, int *columns ) {
    scanf("%d %d\n", rows, columns);
    char **matrix = malloc(*rows * sizeof(char*));
    if(!matrix)
        exit(0);
        
    for(int i = 0; i < *rows; i++)
    {
        matrix[i] = malloc(*columns * sizeof(char));
        if(!matrix[i])
            exit(0);
        for(int j = 0; j < *columns; j++)
        matrix[i][j] = '#';
    }
    
    char* string = malloc(10*sizeof(char));
    while(1)
    {
        int size = 0;
        char c = getchar();
        while(c != ' ')
        {
            string[size++] = c;
            c = getchar();
        }
        
        int r, co;
        scanf("%d%d\n", &r, &co);
        
        if(r < 0 || co < 0 || r > *rows || co > *columns || size > *columns)
            break;
        
        if(isRowEmpty(matrix, r, co, size))
           strncpy(&matrix[r][co], string, size);
    }
    free(string);
    return matrix;
}

Četvrta funkcija

Korišćenjem prethodno realizovanih funkcija realizovati funkciju char** compress(char**m, int *rows, int *columns) koja treba iz matrice m dimenzija rows i columns da izbaci sve prazne redove i prazne kolone. Red i kolona se sastoje isključivo od karaktera '#'. Funkciju kao povratnu vrednost vraća pokazivač na izmenjenu matricu.

#include <stdlib.h>

char** compress ( char **m, int *rows, int *columns  ) {
    int i = 0;
    while(i < *rows)
    {
        if(isRowEmpty(m, i, 0, *columns))
        {
            free(m[i]);
            for(int j = i; j < *rows - 1; j++)
            {
                m[j] = m[j+1];
            }
            m = realloc(m, (*rows-1)*sizeof(char*));
            (*rows)--;
        }
        else
            i++;
    }
    i = 0;
    while(i < *columns)
    {
        if(isColumnEmpty(m, i, 0, *rows))
        {
            for(int j = 0; j < *rows; j++)
            {
                for(int k=i; k < *columns - 1; k++)
                {
                    m[j][k] = m[j][k+1];
                }
                m[j] = realloc(m[j], (*columns-1)*sizeof(char));
            }
            (*columns)--;
        }
        else
            i++;
    }
    return m;
}

Glavna funkcija

Realizovati glavni program koji, korišćenjem prethodno realizovanih funkcija, najpre učitava matricu, zatim iz nje izbacuje prazne redove i kolone, a potom je ispisuje prvo po vrstama, a zatim po kolonama.

#include <stdio.h>
#include <stdlib.h>

int main() {
    
    char **m;
    int rows, columns;
    
    m = loadMatrix(&rows, &columns);
    compress(m, &rows, &columns);
    
    for(int i = 0; i < rows; i++) {
        for(int j = 0; j < columns - 1; j++){
            printf("%c", m[i][j]);
        }
        printf("%c\n", m[i][columns - 1]);
    }
    putchar('\n');
    for(int i = 0; i < columns; i++) {
        for(int j = 0; j < rows - 1; j++) {
            printf("%c", m[j][i]);
        }
        printf("%c\n", m[rows-1][i]);
    }
    for(int i = 0; i < rows; i++) {
        free(m[i]);
    }
    free(m);
    return 0;
}