Ordonare după numărul de vocale:
Se dă un text care conține doar cuvinte formate din litere mici și mari ale alfabetului englez și spații. Să se afișeze cuvintele din text, ordonate crescător în funcție de numărul de vocale. În cazul în care două cuvinte au același număr de vocale, se vor afișa în ordine lexicografică.
Date de intrare
Cuvintele citite vor fi separate prin spații și pot apărea pe mai multe linii.
Date de ieșire
Pe ecran se vor afișa cuvintele textului ordonate după criteriul din enunț, câte un cuvânt pe o linie.
Restricții
Șirul va conține maxim 1 000 de caractere
Fiecare cuvânt va conține maxim 20 caractere
Textul va conține maxim 100 de cuvinte
O linie va conține maxim 1 000 de caractere
Exemplu
Date de intrare:
Ana are mere
Cosmin are portocale
Date de iesire:
Ana
Cosmin
are
are
mere
portocale
Răspunsuri la întrebare
► Program C++
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;
struct cuvant {
char s[20] = "";
unsigned nr_vocale = 0;
};
//Functie care calculeaza cate vocale sunt in sirul transmis ca parametru
unsigned calculare_nr_vocale(char* s) {
static const char voc[] = "AEIUOaeiou";
unsigned nr_vocale = 0;
for (int i = 0; i < strlen(s); i++) {
if (strchr(voc, s[i])!=nullptr) nr_vocale++;
}
return nr_vocale;
}
//Stabileste relatia < intre doua cuvinte conform enuntului problemei
bool comparator_cuvinte(const cuvant& a, const cuvant& b) {
if(a.nr_vocale != b.nr_vocale) return a.nr_vocale < b.nr_vocale;
return strcmp(a.s, b.s) < 0;
}
int main() {
char curent[20];
cuvant vector_cuvinte[100];
int nr_cuv = 0;
//Citeste cuvantul si pune-l in vectorul de cuvinte
while (cin>>curent) {
strcpy(vector_cuvinte[nr_cuv].s, curent);
vector_cuvinte[nr_cuv].nr_vocale = calculare_nr_vocale(curent);
nr_cuv++;
}
//Sorteaza cuvintele dupa numarul de vocale
sort(vector_cuvinte, vector_cuvinte + nr_cuv, comparator_cuvinte);
//Afiseaza rezultat
for (int i = 0; i < nr_cuv; i++) {
cout << vector_cuvinte[i].s << endl;
}
}
Explicatie :
- Folosim o structura "cuvant" care memoreaza fiecare cuvant, dar si numarul de vocale din cuvantul respectiv
- Folosim functia std::sort din algorithm pentru a sorta eficient cuvintele. Aceasta functie primeste ca parametru pointer catre primul element din vector, pointer catre prima adresa de memorie care nu face parte din vector (locatia de memorie aflata imediat dupa ultimul element din vector). Functia sorteaza elementele in mod crescator dupa operatia '<'. Deoarece pentru structura noastra cuvant nu exista relatie de < definita vom folosi o functie comparator. Aceasta primeste doua elemente de tip cuvant si returneaza 1 daca cele doua cuvinte sunt in ordinea ceruta si 0 daca acestea trebuie inversate. Puteam folosi orice tip de sortare dar aceasta ofera o eficienta foarte buna si e foarte usor de folosit.