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

Извор: SI Wiki
< Програмирање 2
Датум измене: 30. октобар 2023. у 03:05; аутор: KockaAdmiralac (разговор | доприноси) (Ispravljen link + uvodni pasus)
Пређи на навигацију Пређи на претрагу

Други колоквијум 2017. године одржан је 24. априла. Задаци и решења доступни су са странице предмета.

Задатак

Прва функција

Реализовати функцију цхар *лоадСтринг() која учитава ред текста са стандардног улаза и враћа показивач на учитани стринг. Стринг треба да заузима само онолико простора колико је неопходно за смештање неопходних знакова.

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

Друга функција

Реализовати функцију инт гетНеxтДигит(цхар *стринг) која вреће позицију прве цифре у стрингу на који показује показивач стринг. У случају да стринг не садржи цифру повратна вредност треба да буде позиција нулл карактера ('\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;
}

Трећа функција

Реализовати функцију цхар* субстринг(цхар *стринг, инт старт, инт енд) која враћа показивач на стринг формиран од карактера стринга стринг који се налазе на позицијама између старт и енд, укључујући и њих. Резултујући стринг треба да заузима онолико простора колико је неопходно за смештање неопходних карактера.

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

Четврта функција

Коришћењем претходно реализованих функција реализовати функцију цхар** сплит(цхар *стринг) која дели низ карактера стринг и враћа показивач на низ подстрингова. Стринг се дели на основу граничника. Декадна цифра се користи као граничник за поделу стринга на делове (подстрингове). Граничник је увек једна декадна цифра, док сами подстрингови не садрже цифре. При томе у низ стрингова улазе само они подстрингови чија дужина је мања или једнака цифри која претходи том подстрингу. На крају обраде резултујући стрингови треба да заузимају само онолико простора колико је потребно за смештање неопходних знакова.

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

Главна функција

Коришћењем претходно реализованоих функција написати главни програм који треба да учита ред текста са стандрадног улаза, подели стринг, испише добијени низ стрингова и понавља описани поступак док се на стандардном улазу не унесе празан стринг.

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