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
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 ieșire:
Ana
Cosmin
are
are
mere
portocale
Ma puteti ajuta va rog cu o rezolvare in c++, dar nu cu striguri.
Răspunsuri la întrebare
Răspuns:
#include <iostream>
#include <cstring>
int numarVocale(char cuvant[20])
{
int nrVocale = 0;
for (int i = 0; cuvant[i]; i++) {
if (strchr("aeiouAEIOU", cuvant[i]) != NULL) {
nrVocale++;
}
}
return nrVocale;
}
int compara(char cuvant1[20], char cuvant2[20])
{
int nrVocale1 = numarVocale(cuvant1), nrVocale2 = numarVocale(cuvant2);
if (nrVocale1 < nrVocale2) {
return -1;
} else if (nrVocale1 > nrVocale2) {
return 1;
} else {
return strcmp(cuvant1, cuvant2);
}
}
int main()
{
char listaCuvinte[100][20];
char cuvant[20];
int nrCuvinte = -1;
while (std::cin >> listaCuvinte[++nrCuvinte]) ;
for (int i = 0; i < nrCuvinte - 1; i++) {
int min = i;
for (int j = i + 1; j < nrCuvinte; j++) {
if (compara(listaCuvinte[min], listaCuvinte[j]) > 0) {
min = j;
}
}
char temporar[20];
strcpy(temporar, listaCuvinte[i]);
strcpy(listaCuvinte[i], listaCuvinte[min]);
strcpy(listaCuvinte[min], temporar);
}
for (int i = 0; i < nrCuvinte; i++) {
std::cout << listaCuvinte[i] << std::endl;
}
}
Explicație:
Nu-i eficient de loc, pentru că numără vocalele pentru fiecare comparare.
Salut!
Ai rezolvarea in C++ mai jos
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("date.in");
ofstream out("date.out");
struct cuvant {
char a[21];
int nrVoc = 0;
}v[101];
int n;
//Functie care verifica daca o litera este vocala
bool voc(char ch) {
return (strchr("AEIOUaeiou", ch) != NULL);
}
//Functie care returneaza numarul de vocale dintr-un cuvant
int nrVocale(char* ch) {
int cnt = 0;
for (int i = 0; i < strlen(ch); ++i) {
if (voc(ch[i])) {
cnt++;
}
}
return cnt;
}
int main() {
char s[21];
while (in >> s) { //citim cuvantul curent
v[++n].nrVoc = nrVocale(s); //retinem nr ul de vocale, indexand de la 1
strcpy(v[n].a, s); //copiem in vector cuvantul respectiv
}
/*
Sortare dupa cerinte
- dupa vocale
- daca au acelasi nr de vocale le vom compara lexicografic folosind functia strcmp()
*/
for (int i = 1; i < n; ++i) {
for (int j = i + 1; j <= n; ++j) {
if (v[i].nrVoc > v[j].nrVoc) {
swap(v[i], v[j]);
}
else if (v[i].nrVoc == v[j].nrVoc) {
if (strcmp(v[i].a, v[j].a) > 0) {
swap(v[i], v[j]);
}
}
}
}
//Afisare
for (int i = 1; i <= n; ++i) {
out << v[i].a << '\n';
}
return 0;
}