Програмирање 2/К2 2018
Други колоквијум 2018. године одржан је 23. априла. Задаци и решења доступни су са странице предмета.
Задатак
Прва функција
Реализовати функцију инт исЦолумнЕмпт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;
}