Rezolvare completă PbInfo #889 CuvinteComune

Cerința

Se dau două propoziții formate din litere mari și mici ale alfabetului englez și spații. Să se afișeze în ordine alfabetică cuvintele care apar în ambele șiruri.

Date de intrare

Programul citește de la tastatură cele două propoziții, separate printr-un caracter newline.

Date de ieșire

Programul va afișa pe ecran cuvintele comune, scrise cu litere mici, fiecare pe o linie, în ordine alfabetică.

Restricții și precizări

  • șirurile date au cel mult 255 de caractere
  • nu se face distincție între literele mari și cele mici
  • dacă un cuvânt comun apare de mai multe ori, se va afișa o singură dată

Exemplu

Intrare

Ana si Maria au mere si nuci
ana are MERE si Pere si prune

Ieșire

ana
mere
si

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema CuvinteComune:

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

char S[256], T [256], A[100][256], B[100][256];
int n , m;

bool litera_mica(char X) {  return X >= 'a' && X <= 'z'; }

bool litera_mare(char X) {  return X >= 'A' && X <= 'Z'; }

char to_lower(char X)
{
    if(litera_mare(X))
        return X + ('a' - 'A');
    return X;
}

void lowercase(char * s)
{
    for(int i = 0 ; s[i] ; i ++)
        s[i] = to_lower(s[i]);
    
}

void extract(char *S , int &n , char A[][256])
{
    char * p = strtok(S, " ");  
    while(p)
    {
        bool gasit = false;
        for(int i = 1 ; i <= n && !gasit ; i ++)
            if(strcmp(p , A[i]) == 0)
                gasit = true;
        if(!gasit)
        {
            ++n;
            strcpy(A[n] , p);
        }
        p = strtok(NULL , " ");
    }
}

void sortare(int &n , char A[][256])
{
    char x[256];
    for(int i = 1 ; i < n ; i ++)
        for(int j = i + 1 ; j <= n ; j ++)
            if(strcmp(A[i] , A[j]) > 0)
            {
                strcpy(x , A[i]);
                strcpy(A[i] , A[j]);
                strcpy(A[j] , x);
            }
}

void afisare()
{
    for(int i = 1 ; i <= n ; i ++)
    {
        bool gasit = false;
        for(int j = 1 ; j <= n && !gasit ; j ++)
            if(strcmp(B[j] , A[i]) == 0)
                gasit = true;
        if(gasit)
            cout << A[i] <<"\n";
    }
}

int main()
{
    cin.getline(S , 256);
    cin.getline(T , 256);
    lowercase(S);
    lowercase(T);
    extract(S, n, A);
    sortare(n , A);
    extract(T, m, B);
    afisare();
    return 0;
    
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #889 CuvinteComune

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #889 CuvinteComune de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!