III.2 simulare 2019

Subiectul al III-lea – Exerciţiul 2

Într-un text de cel mult 50 de caractere cuvintele sunt separate prin câte un spațiu și sunt formate din litere mari ale alfabetului englez, urmate eventual de caracterul . (punct), dacă sunt scrise prescurtat. Textul reprezintă numele unei instituții de învățământ și doar cuvintele din mulțimea {COLEGIUL, LICEUL, NATIONAL, TEORETIC} pot fi prescurtate, eliminându-se ultimele lor litere. Scrieți un program C++ care citeste de la tastatură un text de tipul precizat și construiește în memorie, apoi afișează pe ecran, numele instituției scris fără prescurtări.

Exemplu: dacă se citește textul COLEG. NATIONAL DE INFORMATICA sau textul

COLEG. NAT. DE INFORMATICA se obține COLEGIUL NATIONAL DE INFORMATICA

O variantă simplă de rezolvare a unei astfel de probleme este cea în care folosim funcții predefinite de prelucrare a șirurilor de caractere (bibliotecacstring saustring.h).

Ținând cont de faptul că, textul dat, este format din cuvinte separate printr-un singur spațiu, atunci putem folosi funcția strtok pentru a obține fiecare cuvânt din text. Vom construi un nou șir (snou) prin adăugarea (concatenarea) câte unui cuvânt din șirul inițial, urmat de caracterul spațiu. Fiecare cuvânt va fi analizat. Dacă el nu conține caracterul punct atunci nu va trebui înlocuit și va fi adăugat în noul șir. În cazul în care cuvântul conține caracterul punct, va fi adăugat cuvântul neprescurtat corespunzător. Cum toate cuvintele prescurtate încep cu litere diferite, putem recunoaște cuvântul prescurtat în funcție de prima literă: dacă prima literă este C atunci cuvântul neprescurtat va fi COLEGIUL, dacă prima literă este L, folosim LICEUL ș.a.m.d.

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char s[51], snou[80]="" ,*p;
    cin.getline(s,51);
    p=strtok(s," "); //determina primul cuvant din sir
    while(p!=0)
    {
        if(strchr(p,'.')!=0)
           if(p[0]=='C')
                strcat(snou,"COLEGIUL");
            else
                if(p[0]=='L')
                    strcat(snou,"LICEUL");
                else
                    if(p[0]=='N')
                        strcat(snou,"NATIONAL");
                    else
                        strcat(snou,"TEORETIC");
         else
           strcat(snou,p);

         strcat(snou," ");//concateneaza sirul alcatuit din
                         //caracterul spatiu
         p=strtok(NULL," ");//determina urmatorul cuvant
    }
    snou[strlen(snou)-1]=0;//sterge caracterul spatiu de la
                          //finalul sirului snou
    cout<<snou;
    return 0;
}

Varianta 2 de rezolvare

Se construiește noul șir în variabila t (de tip vector de caractere), separarea cuvintelor se realizează prin parcurgerea șirului dat, memorând poziția primului caracter al unui cuvânt în variabila p, iar poziția curentă din șir în variabila i. În momentul în care se detectează ultimul caracter al unui cuvânt (s[i+1]==’ ‘||s[i+1]==’\0’) și dacă poziția curentă este caracterul punct, atunci se vor copia în șirul rezultat t toate caracterele cuvântului neprescurtat, altfel se vor copia toate caracterele cuvântului curent. La final, se adaugă pe ultima poziție, în șirul rezultat t, caracterul nul. Pentru claritatea codului, se utilizează o matrice de caractere care memorează, pe fiecare linie câte un cuvânt din mulțimea {COLEGIUL, LICEUL, NATIONAL, TEORETIC}.

#include <iostream>
using namespace std;

int main()
{
char s[51],t[101];
char mat[5][10]={"COLEGIUL","LICEUL","NATIONAL","TEORETIC"};
int p=0,i,j,k,q=0;
    cin.getline(s,101);
    for(i=0; s[i]!='\0'; i++)
        if(s[i+1]==' '||s[i+1]=='\0')
        {
            if(s[i]=='.')
              {
               for(j=0;j<4;j++)
                if(s[p]==mat[j][0])
                  {for(k=0; mat[j][k]!=0; k++)
                     {t[q]=mat[j][k];q++;}
                   t[q]=' ';q++;
                  }
                }
             else {for(k=p;k<=i;k++){t[q]=s[k];q++;}
                   t[q]=' ';q++;
                  }
            p=i+2;
        }
     t[q]='\0';
     cout<<t;
     return 0;
}