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

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

Drugi kolokvijum 2019. godine održan je 22. aprila. Zadaci i rešenja dostupni su sa stranice predmeta.

Zadatak

Prva funkcija

Napisati funkciju char** loadMap(int *rows) koja najpre čita broj vrsta matrice i smešta pročitanu vrednost na lokaciju na koju pokazuje pokazivač rows, nakon toga formira matricu karaktera dimenzija rows x 2 i popunjava je po vrstama karakterima koje čita iz jednog reda sa standardnog ulaza.

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

Druga funkcija

Napisati funkciju int charToDigit(char c, char **map, int rows) koja karakter c preslikava u odgovarajuću cifru na osnovu matrice preslikavanja map. Dimenzije matrice preslikavanja su rows x 2. Ukoliko ne postoji preslikavanje za odgovarajući karakter vratiti 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;
}

Treća funkcija

Korišćenjem prethodno realizovane funkcije realizovati funkciju int stringToInt(char *word, char **map, int rows) koja string word preslikava u ceo broj tako što svaki karakter iz stringa word preslika u odgovarajuću cifru na osnovo matrice preslikavanja map.

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

Četvrta funkcija

Napisati funkciju char* readLine() koja čita jedan red sa standradnog ulaza. Prilikom čitanja zauzeti samo onoliko prostora koliko je neophodno za smeštanje svih karaktera jednog reda.

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

Glavna funkcija

Korišćenjem prethodno realizovanih funkcija napisati glavni program koji prvo čita broj vrsta matrice preslikavanja, potom i same elemente matrice, a nakon toga tri reči, svaku u zasebnom redu, i na kraju ispisuje „DA“ ukoliko data jednakost važi, a „NE“ u suprotnom slučaju.

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