# PBinfo #4756 – textcuv – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

Se citește un text format din cuvinte și separatori. Cuvintele sunt formate din litere mici ale alfabetului, iar separatorii sunt spațiul, plus caracterele din șirul .,!?:;-. 

Cerințe
1) Să se afișeze n – numărul de cuvinte, precum și cuvintele din text.
2) Se se afișeze cuvântul cel mai mic din punct de vedere lexicografic.
3) Să se determine numărul de cuvinte care conțin secvența ini.
4) Să se afișeze fiecare cuvânt oglindit.
5) Să se determine câte cuvinte se termină cu litera a.
6) Să se determine lungimea minimă și lungimea maximă a unui cuvânt

Date de intrare
Fișierul de intrare textcuv.in conține pe prima linie numărul natural T, iar pe a doua linie textul.

Date de ieșire
Fișierul de ieșire este textcuv.out.


dacă T = 1, atunci veți afișa numărul de cuvinte, apoi cuvintele din text, câte unul pe un rând
dacă T = 2, atunci veți afișa cuvântul cel mai mic din punct de vedere lexicografic.
dacă T = 3, atunci veți afișa numărul de cuvinte care conțin secvența ini.
dacă T = 4, atunci veți afișa cuvintele oglindite, câte unul pe un rând
dacă T = 5, atunci veți afișa numărul de cuvinte care se termină cu litera a.
dacă T = 6, atunci veți afișa, separate prin spațiu, lungimea minimă și lungimea maximă a unui cuvânt.

Restricții și precizări

lungimea textului nu va depăși 1000
fiecare cuvânt are lungimea cel mult 50
Nu uitați ca după ce citiți valoarea lui T, să folosiți instrucțiunea fin.get(); pentru a trece cursorul pe linia a doua a dișierului de intrare, de unde să puteți citi textul.

Exemplul 1:
textcuv.in

1
...destul de rece? desigur!
textcuv.out

4
destul
de
rece
desigur
Explicație
T = 1, deci se rezolvă doar prima cerință. Sunt patru cuvinte în text: destul, de, rece, desigur.

Exemplul 2:
textcuv.in

2
avem parte de exclamatii, accente si mirari.
textcuv.out

accente
Explicație
T = 2, deci se rezolvă doar a doua cerință. Cuvântul minim lexicografic este accente.

Exemplul 3:
textcuv.in

3
initial, toate initiativele sunt minime.
textcuv.out

3
Explicație
T = 3, deci se rezolvă doar a treia cerință. Sunt 3 cuvinte care conțin secvența ini, acestea fiind initial, initiativele și minime.

Exemplul 4:
textcuv.in

4
...destul de rece? desigur!
textcuv.out

lutsed
ed
ecer
rugised
Exemplul 5:
textcuv.in

5
este frumoasa, desteapta si devreme acasa.
textcuv.out

3
Explicație
T = 5, deci se rezolvă doar a cincea cerință. Sunt trei cuvinte care în text care se termină cu a: frumoasa, desteapta, acasa.

Exemplul 6:
textcuv.in

6
este frumoasa, desteapta si devreme acasa.
textcuv.out

2 9
Explicație
T = 6, deci se rezolvă doar a șasea cerință. Cel mai scurt cuvânt are lungimea 2: si, iar cel mai lung are lungimea 9: desteapta.

## Cod sursă C++

```cpp
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("textcuv.in");
ofstream fout("textcuv.out");
char a[1003];
char cuv[502][52];
int n, T;
int main()
{
    int i;
    char *p, sep[] = " .,!?:;-";
    fin >> T;
    fin.get();
    fin.getline(a, 1001);
    p = strtok(a, sep);
    while (p != NULL)
    {
        strcpy(cuv[n], p);
        n++;
        p = strtok(NULL, sep);
    }
    if (T == 1)
    {
        fout << n << "\n";
        for (i = 0; i < n; i++)
            fout << cuv[i] << "\n";
    }
    else if (T == 2)
    {
        char cuvMin[52];
        strcpy(cuvMin, cuv[0]);
        for (i = 1; i < n; i++)
            if (strcmp(cuvMin, cuv[i]) > 0)
                strcpy(cuvMin, cuv[i]);
        fout << cuvMin << "\n";
    }
    else if (T == 3)
    {
        int nrCuv = 0;
        for (i = 0; i < n; i++)
            if (strstr(cuv[i], "ini") != 0)
                nrCuv++;
        fout << nrCuv << "\n";
    }
    else if (T == 4)
    {
        for (i = 0; i < n; i++)
        {
            for (int j = strlen(cuv[i]) - 1; j >= 0; j--)
                fout << cuv[i][j];
            fout << "\n";
        }
    }
    else if (T == 5)
    {
        int nrCuv = 0;
        for (i = 0; i < n; i++)
        {
            int k = strlen(cuv[i]);
            if (cuv[i][k - 1] == 'a') nrCuv++;
        }
        fout << nrCuv << "\n";
    }
    else /// T == 6
    {
        int minLen = 100, maxLen = 0;
        for (i = 0; i < n; i++)
        {
            int k = strlen(cuv[i]);
            if (minLen > k) minLen = k;
            if (maxLen < k) maxLen = k;
        }
        fout << minLen << " " << maxLen << "\n";
    }
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/4756)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/4756/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-4756/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
