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

Извор: SI Wiki
< Програмирање 2
Датум измене: 28. јул 2020. у 17:47; аутор: Ivan Pešić (разговор | доприноси) (Dodato resenje zadatka)
(разл) ← Старија измена | Тренутна верзија (разл) | Новија измена → (разл)
Пређи на навигацију Пређи на претрагу

Задаци и решења на сајту.

Задатак

Прва функција

Реализовати функцију инт исЦолумнЕмптy(цхар **м, инт цолумн, инт стартРоw, инт ленгтх) која проверава да ли је део колоне цолумн матрице м који почиње од врсте стартРоw и који је дужине ленгтх празан, односно да ли се у том делу налазе само карактери '#'. Функција враћа вредност 1 уколико је део празан, а 0 у супротном.

Функција не треба да учитава податке. Сматрати да ће добити оне вредности које су наведене у колони Инпут.

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

Друга функција

Реализовати функцију инт исРоwЕмптy(цхар **м, инт роw, инт стартЦолумн, инт ленгтх) која проверава да ли је део врсте роw матрице м који почиње од колоне стартЦолумн и који је дужине ленгтх празан, односно да ли се у том делу налазе само карактери '#'. Функција враћа вредност 1 уколико је део празан, а 0 у супротном.

Функција не треба да учитава податке. Сматрати да ће добити оне вредности које су наведене у колони Инпут.

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

Трећа функција

Коришћењем претходно реализованих функција реализовати функцију цхар** лоадМатриx(инт *роwс, инт *цолумнс) која најпре чита димензије роwс и цолумнс са стандардног улаза, а потом формира матрицу карактера и попуњава је речима које чита са стандардног улаза, под условом да учитана реч може да стане у матрицу на задатој позицији. Функција као повратну вредност враћа показивач на новоформирану матрицу.

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

Четврта функција

Коришћењем претходно реализованих функција реализовати функцију цхар** цомпресс(цхар**м, инт *роwс, инт *цолумнс) која треба из матрице м димензија роwс и цолумнс да избаци све празне редове и празне колоне. Ред и колона се састоје искључиво од карактера '#'. Функцију као повратну вредност враћа показивач на измењену матрицу.

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

Главна функција

Реализовати главни програм који, коришћењем претходно реализованих функција, најпре учитава матрицу, затим из ње избацује празне редове и колоне, а потом је исписује прво по врстама, а затим по колонама.

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