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

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.


VxF: Ia să ghicesc: de funcţia qsort() n-aţi învățat. Doar pentru că ar fi foarte comod.

Răspunsuri la întrebare

Răspuns de VxF
3

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.

Răspuns de Sergetec
2

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;

}

Alte întrebări interesante