Програмирање 2/К2 2018
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;
}