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

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

Други колоквијум 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;
}