Jump to content

[C++] Algoritm pentru afișarea numărului de vocale și consoane dintr-un cuvânt


Andreigl
 Share

Recommended Posts

În primul rând să stabilim diferența dintre vocale și consoane (fără cele cu diacritice):

 

  1. Vocale: a, e, i, o, u, A, E, I, O, U (lowercase și uppercase)
  2. Consoane: b, c, d, ... , x, y, z, B, C, D, ..., X, Y, Z (restul literelor din alfabet)

 

Al doilea lucru pe care trebuie să vi-l explic ca să înțelegeți algoritmul, este următorul:

Valorea numerică a unei litere lowercase (literă mică, exemplu: a) este diferită de valoarea numerică uppercase (literă mare, exemplu: A) a aceleiași litere.

 

Exemplu:

Valoarea numerică a literei „A” este: 0x41

Valoarea numerică a literei „a” este: 0x61

 

Ce observăm? Diferența în modul dintre cele 2 valori este 0x20.

 

Următorul algoritm verifică câte vocale și consoane sunt într-un cuvânt.

Am creat un for care se repetă de atâtea ori câte caractere are acel cuvânt. 

Exemplu: lapte, are 5 caractere, deci se repetă de 5 ori. 

Output-ul va fi următorul:

image.thumb.png.5df01b9ca8783d42a54b0b9ec1feb6a7.png

 

În for se verifică atât vocalele / consoanele lowercase, cât și cele uppercase.

#include <iostream> // cin
#include <stdio.h> // printf
#include <string> // strlen

int main()
{
	char myString[256];
	std::cin >> myString;

	int Vocale, Consoane;
	Vocale = Consoane = 0;

	int Length = strlen(myString);
	for (int contor = 0; contor < Length; contor++)
		if (myString[contor] == 'A' or myString[contor] == ('A' + 0x20) ||
			myString[contor] == 'E' or myString[contor] == ('E' + 0x20) ||
			myString[contor] == 'I' or myString[contor] == ('I' + 0x20) ||
			myString[contor] == 'O' or myString[contor] == ('O' + 0x20) ||
			myString[contor] == 'U' or myString[contor] == ('U' + 0x20)
			)
			Vocale++;
		else
			Consoane++;

	printf("Cuvantul %s are un numar de:\n - vocale: %d\n - consoane: %d\n\n", myString, Vocale, Consoane);
	return 0;
}

 

Edited by shanker'
editare titlu
Link to comment
Share on other sites

Salut! Iti scriu din perspectiva unui tip care are urmatoarele "life achievements":

  • Current Software Tool Development Technician @ Veoneer
  • Former Junior Software Engineer @ Nokia
  • Experienta in industrie de peste 2 ani, (in curent fiind in an terminal la o facultate de Informatica)
  • Premii la olimpiade si concursuri de IT, atat nationale cat si internationale

 

As vrea sa iei aceasta critica ca fiind una constructiva (ai scris in titlu ca programul e C++ asadar voi argumenta ca atare):

  • Din respect fata de limbajul C++, nu folosi camelCase cand scrii C++ decat daca deja proiectul e scris in acest fel (asa am avut eu la Nokia). Pentru a fi in pas cu STL si alte librarii care sunt fidele snake_case (case-ul de baza al C++) precum boost, foloseste si tu snake_case.
  • Daca ai inceput cu cin, nu folosi printf pentru afisare, foloseste cout. (Oricum cout este mai eficient decat printf, iar printf e error-prone daca nu pui bine formatul si e greu sa faci debug).
  • Intotdeauna foloseste brackets ({}) chiar daca nu e nevoie.
  • Foloseste cat mai multe functii deja existente, nu reinventa roata (acest lucru te ajuta sa menti codul cat mai mic si curat)

Varianta mea (nerafinata, se poate mai bine):

#include <cctype> // tolower
#include <cstring> // strchr
#include <iostream> // cin, cout

int main() {
    char input[256]; std::cin >> input;
    
    int vocale = 0, consoane = 0;
    
    for (int npos = 0; input[npos]; ++npos) {
    // ultima pozitie din input este '\0', deci input[npos] va fi '\0' si se va opri din executie
        if (std::strchr("aeiou", std::tolower(input[npos]))) {
        // verifica daca al doilea argument se afla in primul sir (returneaza pozitia sau null pointer in caz ca nu exista)
            vocale++;
        }
        else {
            consoane++;
        }
    }
    
    std::cout << "Cuvantul " << input << " are " << vocale << " vocale si " << consoane << " consoane!\n";
    
    return 0;
}
 in:> lapte
out:> Cuvantul lapte are 2 vocale si 3 consoane!

Aprecieri:

  • Ai scos strlen() din for, ceea ce e bine din punct de vedere al performantei. Reduci timpul de la O(N^2) la O(N);
  • Nu ai folosit using namespace std;

Post Scriptum:

Modifica titlul din: [C++] Algoritm pentru afișarea numărului de vocale și consoane dintr-un număr in

                             [C++] Algoritm pentru afișarea numărului de vocale și consoane dintr-un cuvânt

Link to comment
Share on other sites

On 1/21/2020 at 7:28 AM, Vesca said:

Salut! Iti scriu din perspectiva unui tip care are urmatoarele "life achievements":

  • Current Software Tool Development Technician @ Veoneer
  • Former Junior Software Engineer @ Nokia
  • Experienta in industrie de peste 2 ani, (in curent fiind in an terminal la o facultate de Informatica)
  • Premii la olimpiade si concursuri de IT, atat nationale cat si internationale

mi se pare dragut ca iti place sa te dai mare ca lucrezi la nokia

 

On 1/21/2020 at 7:28 AM, Vesca said:

Din respect fata de limbajul C++, nu folosi camelCase cand scrii C++ decat daca deja proiectul e scris in acest fel

 

On 1/21/2020 at 7:28 AM, Vesca said:

a fi in pas cu STL si alte librarii

 

On 1/21/2020 at 7:28 AM, Vesca said:

Intotdeauna foloseste brackets ({}) chiar daca nu e nevoie.

dar imi place ca spui sa faca ceva si nu spui de ce si cum te ajuta

daca nu explici altora ca la un copil nu o sa inteleaga nimeni ce vorbesti, gandeste-te ca altii nu au nicio idee despre ce ai spus tu acolo

 

daca tot spui ca esti asa bun, de ce ai folosit 

 std::

si nu ai dat using namespace std;

 

chiar m-am intrebat de cateva ori, dar sper ca ma poti ajut aici ;) 

Link to comment
Share on other sites

5 minutes ago, Popa said:

mi se pare dragut ca iti place sa te dai mare ca lucrezi la nokia

 

 

 

dar imi place ca spui sa faca ceva si nu spui de ce si cum te ajuta

daca nu explici altora ca la un copil nu o sa inteleaga nimeni ce vorbesti, gandeste-te ca altii nu au nicio idee despre ce ai spus tu acolo

 

daca tot spui ca esti asa bun, de ce ai folosit 


 std::

si nu ai dat using namespace std;

 

chiar m-am intrebat de cateva ori, dar sper ca ma poti ajut aici ;) 

Huh, ce ma amuzi.

Eu dau o informatie, daca vad interes mai departe de la interlocutor ca vrea sa stie mai multe despre ea, ii explic cu drag. Daca nu il intereseaza, n-are rost sa explic degeaba, logic, nu?

Acum, pe tine vad ca te intereseaza de ce nu am folosit 'using namespace std;', deci am sa-ti explic. Daca @shanker' venea la randul lui cu intrebari despre argumentele mai sus scrise, ii explicam cu placere.

De obicei, cand folosesti mai multe librarii (de exemplu boost) o sa ai name collisions: (function din boost si std, shared_ptr din boost si std etc.). Exemplu:

#include <iostream>

namespace a {
    void foo() {
        std::cout << "a";
    }
}

namespace b {
    void foo() {
        std::cout << "b";
    }
}

using namespace a;
using namespace b;

int main() {
    foo();

    return 0;
}

O sa ai o eroare la compilare: compilatorul nu stie care "foo" sa-l apeleze, cel din namespace a sau cel din namespace b? De aceea, best practice e sa folosesti scope resolution operator (::).

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.