Програмирање 2/К2 2019
Други колоквијум 2019. године одржан је 22. априла. Задаци и решења доступни су са странице предмета.
Задатак
Прва функција
Написати функцију цхар** лоадМап(инт *роwс) која најпре чита број врста матрице и смешта прочитану вредност на локацију на коју показује показивач роwс, након тога формира матрицу карактера димензија роwс x 2 и попуњава је по врстама карактерима које чита из једног реда са стандардног улаза.
#include <stdlib.h>
#include <stdio.h>
char** loadMap ( int *rows ) {
scanf("%d", rows);
char** matrix = malloc(*rows*sizeof(char*));
for(int i = 0; i < *rows; i++)
{
matrix[i] = malloc(2*sizeof(char));
scanf(" %c %c", &matrix[i][0], &matrix[i][1]);
}
return matrix;
}
Друга функција
Написати функцију инт цхарТоДигит(цхар ц, цхар **мап, инт роwс) која карактер ц пресликава у одговарајућу цифру на основу матрице пресликавања мап. Димензије матрице пресликавања су роwс x 2. Уколико не постоји пресликавање за одговарајући карактер вратити 0.
int charToDigit ( char c, char **map, int rows ) {
for(int i = 0; i < rows; i++)
{
if(map[i][0] == c)
return map[i][1] - '0';
}
return 0;
}
Трећа функција
Коришћењем претходно реализоване функције реализовати функцију инт стрингТоИнт(цхар *wорд, цхар **мап, инт роwс) која стринг wорд пресликава у цео број тако што сваки карактер из стринга wорд преслика у одговарајућу цифру на осново матрице пресликавања мап.
#include <stdlib.h>
int stringToInt ( char *string, char **map, int rows ) {
char* tmp = string;
int num = 0;
while(*tmp)
{
int dig = charToDigit(*tmp, map, rows);
num = num*10 + dig;
tmp++;
}
return num;
}
Четврта функција
Написати функцију цхар* реадЛине() која чита један ред са стандрадног улаза. Приликом читања заузети само онолико простора колико је неопходно за смештање свих карактера једног реда.
#include <stdlib.h>
#include <stdio.h>
char* readLine ( ) {
char *line = NULL;
int size = 0;
char c = getchar();
while(c != '\n')
{
line = realloc(line, (size+1)*sizeof(char));
line[size++] = c;
c = getchar();
}
line = realloc(line, (size+1)*sizeof(char));
line[size] = '\0';
return line;
}
Главна функција
Коришћењем претходно реализованих функција написати главни програм који прво чита број врста матрице пресликавања, потом и саме елементе матрице, а након тога три речи, сваку у засебном реду, и на крају исписује „ДА“ уколико дата једнакост важи, а „НЕ“ у супротном случају.
#include <stdlib.h>
#include <stdio.h>
int main()
{
int rows;
char **map = loadMap(&rows);
char *f, *s, *t;
f = readLine();
s = readLine();
t = readLine();
int n1 = stringToInt(f, map, rows);
int n2 = stringToInt(s, map, rows);
int n3 = stringToInt(t, map, rows);
free(f);
free(s);
free(t);
for(int i = 0; i < rows; i++)
free(map[i]);
free(map);
if(n3 == n1 + n2)
printf("DA");
else
printf("NE");
return 0;
}