Programski-jezici-i-strukture-podataka / zbirka-zadataka

Zbirka sačinjena od zadataka koji su davani na testovima u sklopu predispitnih obaveza na predmetu "Programski jezici i strukture podataka", na smerovima E1, E2 i PSI.
2 stars 0 forks source link

zbirka-zadataka/zadaci/2022/t12/poslednji-karakter/index #7

Open utterances-bot opened 1 year ago

utterances-bot commented 1 year ago

Poslednji karakter — Zbirka zadataka dokumentacija

https://programski-jezici-i-strukture-podataka.github.io/zbirka-zadataka/zadaci/2022/t12/poslednji-karakter/index.html

andrejvujic commented 1 year ago

Poštovani, primjer rješenja ne daje dobre rezultate kada polazni string počinje ili završava sa razmacima ili kada se između riječi nalazi više od jednog razmaka.

Primjeri grešaka

Ako je polazni string " test" (razmak na početku):

Unesite polazni string:  test
Unesite karakter: t

Udeo reci u polaznom stringu koji se zavrsavaju karakterom 't' je 50.00%.
String nakon modifikacije:  tEsT


Ako je polazni string "test " (razmak na kraju):

Unesite polazni string: test 
Unesite karakter: t

Udeo reci u polaznom stringu koji se zavrsavaju karakterom 't' je 50.00%.
String nakon modifikacije: TeSt 


Ako je polazni string "test test" (dva razmaka izmedju riječi):

Unesite polazni string: test  test
Unesite karakter: t

Udeo reci u polaznom stringu koji se zavrsavaju karakterom 't' je 66.67%.
String nakon modifikacije: TeSt  TeSt

Prijedlog izmjena

#include <stdio.h>
#include <string.h>

#define DUZINA 100 + 1

int main()
{
    char polazni[DUZINA], krajnji[DUZINA], k;
    int brojac = 0, broj_reci = 0, i, ki = 0;

    printf("Unesite polazni string: ");
    fgets(polazni, DUZINA, stdin);

    int duzina_polazni = strlen(polazni);
    if (duzina_polazni < DUZINA - 1)
        polazni[strlen(polazni) - 1] = '\0';

    printf("Unesite karakter: ");
    scanf("%c", &k);

    for (i = 0; i < strlen(polazni); i++)
    {
        if ((polazni[i] >= 'A' && polazni[i] <= 'Z') || polazni[i] == ' ' || (polazni[i] >= 'a' && polazni[i] <= 'z'))
        {
            krajnji[ki] = polazni[i];
            ki++;
        }
    }

    krajnji[ki] = '\0';

    int pronadjena_rijec = 0; // dodati ovu liniju
    // promijeniti u: i <= strlen(krajnji)
    for (i = 0; i <= strlen(krajnji); i++)
    {
        // dodati: || krajnji[i] == '\0'
        if (krajnji[i] == ' ' || krajnji[i] == '\0')
        {
            if (pronadjena_rijec) // dodati ovaj if
            {
                pronadjena_rijec = 0; // dodati ovu liniju
                broj_reci++;

                if (krajnji[i - 1] == k)
                {
                    brojac++;
                }
            }
        }
        else // dodati i ovaj else
        {
            pronadjena_rijec = 1;
        }
    }

    // nepotrebno
    /*
    if (krajnji[strlen(krajnji) - 1] == k)
    {
        broj_reci++;
        brojac++;
    }
    else
    {
        broj_reci++;
    }
    */

    printf("\nUdeo reci u polaznom stringu koji se zavrsavaju karakterom '%c' je %.2f%%.", k, ((float)brojac / broj_reci) * 100);

    for (i = 0; i < strlen(krajnji); i++)
    {
        if (i % 2 == 0 && krajnji[i] >= 'a' && krajnji[i] <= 'z')
            krajnji[i] = krajnji[i] - 32;
    }

    printf("\nString nakon modifikacije: %s\n", krajnji);

    return 0;
}


Rezultati izmijenjenog rješenja:

Ako je polazni string " test" (razmak na početku):

Unesite polazni string:  test
Unesite karakter: t

Udeo reci u polaznom stringu koji se zavrsavaju karakterom 't' je 100.00%.
String nakon modifikacije:  tEsT


Ako je polazni string "test " (razmak na kraju):

Unesite polazni string: test 
Unesite karakter: t

Udeo reci u polaznom stringu koji se zavrsavaju karakterom 't' je 100.00%.
String nakon modifikacije: TeSt 


Ako je polazni string "test test" (dva razmaka izmedju riječi):

Unesite polazni string: test  test 
Unesite karakter: t

Udeo reci u polaznom stringu koji se zavrsavaju karakterom 't' je 100.00%.
String nakon modifikacije: TeSt  TeSt


Primjer rada programa iz zadatka:

Unesite polazni string: Ovo je .primer nekog! stringa za prvi. kolokvijum koji nije tezak.
Unesite karakter: i

Udeo reci u polaznom stringu koji se zavrsavaju karakterom 'i' je 18.18%.
String nakon modifikacije: OvO Je pRiMeR NeKoG StRiNgA Za pRvI KoLoKvIjUm kOjI NiJe tEzAk
RadeKornjaca commented 1 year ago

Zdravo Andrej,

Hvala na primećenoj grešci i predlogu ispravke. Isprobao sam bio tvoje rešenje i primetio da radi onako kako si napisao za jedan razmak, ali ako postoji više razmaka pre i posle reči, ne ponaša se odgovarajuće, pa sam malo doradio originalno rešenje da i to bude podržano. Uvedena je logička promenljiva prethodno_slovo, koja će biti logički tačna ukoliko je prethodni karakter bio slovo. To će nam pomoći u situaciji kada imamo više razmaka jedan za drugim da odlučimo hoćemo li uvećati broj reči ili ne. Druga modifikacija je da će se broj_reci na kraju uvećati samo ako poslednji karakter nije razmak, za slučajeve kada se na kraju ne nalazi traženo slovo.

Nadam se da će sad rešenje biti odgovarajuće. Slobodno javi ako primetiš još neki nedostatak. Hvala! :)

Pozdrav, Rade

andrejvujic commented 1 year ago

Poštovani, hvala na odgovoru. Možete li mi reći koje testne primjere ste koristili kada ste testirali moj prijedlog rješenja? Svaki testni primjer koji sam probao daje isti rezultat kao ažurirano rješenje prikazano u tekstu zadatka. Hvala. 😃

RadeKornjaca commented 1 year ago

Naravno, stavi dva ili više razmaka pre i/ili posle reči test. Recimo " test" ili "test ".

RadeKornjaca commented 1 year ago

A, izvini, vidim sad da si i ti dodao sličnu logiku kao i ja što sam, isto tako, da testiraš i \0. Video sam samo zakomentarisani deo, pa sam mislio da je samo to bila ispravka. Verovatno je sa tim dodatnim u redu, isprobaću tako, pa javljam.