Informatică, întrebare adresată de magdalenapop, 8 ani în urmă

Se numește șir vocalic asociat unui șir de caractere format din litere mici ale alfabetului englez un șir egal cu acesta, dacă el este format numai din vocale, sau un șir obținut din acesta prin eliminarea tuturor consoanelor sale. Se consideră vocale literele a, e, i, o, u. Exemplu: șirul ui este șir vocalic asociat unor șiruri ca nuci, frunzis sau ui, iar șirul vid este șir vocalic asociat unor șiruri ca brr sau mr. Subprogramul vocalic are doi parametri: • s, prin care primește un șir de cel mult 100 de caractere, numai litere mici ale alfabetului englez; • sv, prin care furnizează șirul vocalic asociat șirului primit prin parametrul s. Scrieți un program Pascal/C/C++ care citește de la tastatură un text format din maximum 100 de caractere, în care cuvintele sunt formate din litere mici ale alfabetului englez și sunt separate prin câte un spațiu. Programul afișează pe ecran mesajul DA, dacă există cel puțin o pereche de cuvinte din text care au asociat același șir vocalic, sau mesajul NU în caz contrar. Programul cuprinde definiția completă a subprogramului precizat mai sus, precum și apeluri utile ale acestuia. Exemplu: dacă se citește textul in livada de nuci soarele picteaza des stele de aur prin frunzis se afișează pe ecran mesajul DA

Răspunsuri la întrebare

Răspuns de CinevaFaraNume
0

#include <iostream>

#include <string>

#include <cstring>

using namespace std;

int sir_vocalic(char* s, char *sv){

   int k = 0;

   char c;

   int cod = 0;

   for(; (*s) != 0; s++){

       c = *s;

       if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'){

           sv[k++] = c;

           cod += c * k * k;

       }

   }

   sv[k] = '\0';

   return cod % k + k * 100; // returneaza un fel de hash

}

char siruri_voclaice[10100][5][100];

string str;

char sv[100];

int main(){

   bool da = false;

   while(cin>>str){

       char *s = (char*)str.c_str();

       int cod = sir_vocalic(s, sv);

       bool brk = false;

       for(int i = 0; i < 5 && siruri_voclaice[cod][i][0] != 0; i++) // folosim hash-ul sa cautam in tabloul tridimensional

       {

           if(strcmp(siruri_voclaice[cod][i], sv) == 0){

               da = true;

               brk = true;

               break;

           }

       }

       if(brk)

           break;

       for(int i = 0; i < 5; i++)

           if(siruri_voclaice[cod][i][0] == 0){

               strcpy(siruri_voclaice[cod][i], sv); // sau sa il copiem in cazul in care nu exista

               break;

           }

   }

   cout << (da ? "DA" : "NU");

}


CinevaFaraNume: Conditional ternary operator
CinevaFaraNume: Asa se numeste in documentatie
GabiAlex99: Mersi mult, nu vazusem ca ai variabila "da" :)). Btw, tu te cat timp faci informatica?
CinevaFaraNume: Aproape 4 ani
GabiAlex99: Se vede ca ai o pregatire din raspunsuri :d. Ai vreo realizare "nationala" sa zic asa? :)) (Olimpiada, concursuri etc..)
CinevaFaraNume: Putem spune ca am ajuns pana la oni, dar nu am luat un punctaj cu care sa ma mandresc
GabiAlex99: Totusi, e o realizare sa participi la oni :).. Te pregatesti singur/ai un profesor? Si "cum" te pregatesti? Daca ai avea niste sfaturi.. nu de mult am "descoperit informatica" - cam vreo 9 luni, insa asta vreau sa fac mai departe si trebuie sa "bag tare" :)). Mult succes iti doresc!
CinevaFaraNume: Informatica doar ca rezolvare a unor probleme simple de matematica?
CinevaFaraNume: Din pacate informatica poate face mult mai multe.
GabiAlex99: Stiu, doar ca algoritmica te ajuta sa-ti dezolti gandirea logica.. Pe asta vreau sa ma axez in urmatoarele luni, dupa trec la "industrie". (Plus ca la majoritatea firmelor ai un interviu din algoritmica)
Alte întrebări interesante