Programiranje 2/K2 2017

Izvor: SI Wiki
Pređi na navigaciju Pređi na pretragu

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

Zadatak

Prva funkcija

Realizovati funkciju char *loadString() koja učitava red teksta sa standardnog ulaza i vraća pokazivač na učitani string. String treba da zauzima samo onoliko prostora koliko je neophodno za smeštanje neophodnih znakova.

#include <stdlib.h>
#include <stdio.h>

char* loadString() {
    char *string = NULL;
    int size = 0;
    
    char c = getchar();
    while(c != '\n')
    {
        string = realloc(string, (size+1)*sizeof(char));
        if(!string)
            exit(0);
        string[size++] = c;
        c = getchar();
    }
    string = realloc(string, (size+1)*sizeof(char));
    if(!string)
        exit(0);
        
    string[size] = '\0';
        
    return string;
}

Druga funkcija

Realizovati funkciju int getNextDigit(char *string) koja vreće poziciju prve cifre u stringu na koji pokazuje pokazivač string. U slučaju da string ne sadrži cifru povratna vrednost treba da bude pozicija null karaktera ('\0').

#include <string.h>
#include <ctype.h>

int getNextDigit(char *string) {
    int i;
    for(i = 0; i < strlen(string); i++)
    {
        if(isdigit(string[i]))
            return i;
    }
    return i;
}

Treća funkcija

Realizovati funkciju char* substring(char *string, int start, int end) koja vraća pokazivač na string formiran od karaktera stringa string koji se nalaze na pozicijama između start i end, uključujući i njih. Rezultujući string treba da zauzima onoliko prostora koliko je neophodno za smeštanje neophodnih karaktera.

#include <string.h>
#include <stdlib.h>

char* substring(char *string, int start, int end) {
    char* sub = malloc((end-start+2)*sizeof(char));
    strncpy(sub, string+start, end-start+1);
    sub[end-start+1] = '\0';
    return sub;
}

Četvrta funkcija

Korišćenjem prethodno realizovanih funkcija realizovati funkciju char** split(char *string) koja deli niz karaktera string i vraća pokazivač na niz podstringova. String se deli na osnovu graničnika. Dekadna cifra se koristi kao graničnik za podelu stringa na delove (podstringove). Graničnik je uvek jedna dekadna cifra, dok sami podstringovi ne sadrže cifre. Pri tome u niz stringova ulaze samo oni podstringovi čija dužina je manja ili jednaka cifri koja prethodi tom podstringu. Na kraju obrade rezultujući stringovi treba da zauzimaju samo onoliko prostora koliko je potrebno za smeštanje neophodnih znakova.

#include <stdlib.h>
#include <string.h>

char** split(char *string) {
    char **c = NULL;
    int size = 0;
    int i = 0;
    while(string[i])
    {
        int len = 0;
        int num = string[i] - '0';
        i++;
        int start = i;
        while(string[i] >= 'a' && string[i] <= 'z' || string[i] >= 'A' && string[i] <= 'Z')
        {
            len++;
            i++;
        }
        if(len <= num)
        {
        char *sub = substring(string, start, i-1);
        c = realloc(c, (size+1)*sizeof(char*));
        c[size++] = sub;    
        }
        
    }
    c = realloc(c, (size+1) * sizeof(char*));
    c[size] = NULL;
    return c;
}

Glavna funkcija

Korišćenjem prethodno realizovanoih funkcija napisati glavni program koji treba da učita red teksta sa standradnog ulaza, podeli string, ispiše dobijeni niz stringova i ponavlja opisani postupak dok se na standardnom ulazu ne unese prazan string.

#include <stdio.h>
#include <stdlib.h>

int main() {

       char *in = loadString();
       
       char **splitted = split(in);
       int i = 0;
       while(splitted[i])
        {
            printf("%s", splitted[i++]);
            free(splitted[i-1]);
            if(splitted[i])
                putchar('\n');
        }
        free(splitted);
        free(in);
  
}