O rezolvare eleganta propusa de noi pentru problema 2911 WriteDigits de pe site pbinfo, se face folosind structura SWITCH si functii de tip void.

Problema cere desenarea pe ecran a cifrelor unui numar de oricate cifre citit de la tastatura. Numerele trebuie desenate folosindu-se simbolul „@” de mai multe ori.

Pentru ca numarul dat poate avea, conform textului problemei foarte multe cifre, o rezolvare eleganta recomanda folosirea unui string pentru citirea numarului initial.

rezolvare eleganta
Rezolvare eleganta

 

Functiile de tip void

Ele sunt folosite pentru a „desena” fiecare cifra in parte.

Programul principal, rupe numarul initial in cifre si cu ajutorul unei structuri SWITCH cauta desenul corespunzator fiecarei cifre in parte si il tipareste pe ecran.

Stringul in care am citit numarul initial permite abordarea cu usurinta a numerelor de oricate cifre. Daca introducem stringurile, algoritmul este mai eficient pentru ca nu mai trebuie sa execute o bucla repetitiva in care sa extraga cifrele numarului.

Codul sursa al programului


#include <iostream>
#include <cstring>


using namespace std;


void zero() {
cout << "@@@@@" << endl;
cout << "@ @" << endl;
cout << "@ @" << endl;
cout << "@ @" << endl;
cout << "@@@@@" << endl;
cout << endl;
}


void one() {
cout << " @ " << endl;
cout << " @@ " << endl;
cout << " @ " << endl;
cout << " @ " << endl;
cout << "@@@@@" << endl;
cout << endl;
}


void two() {
cout << "@@@@" << endl;
cout << "@ @" << endl;
cout << " @" << endl;
cout << " @ " << endl;
cout << "@@@@" << endl;
cout << endl;
}


void three() {
cout << "@@@@@" << endl;
cout << " @" << endl;
cout << "@@@@@" << endl;
cout << " @" << endl;
cout << "@@@@@" << endl;
cout << endl;
}


void four() {
cout << "@ @" << endl;
cout << "@ @" << endl;
cout << "@@@@@" << endl;
cout << " @" << endl;
cout << " @" << endl;
cout << endl;
}


void five() {
cout << "@@@@@" << endl;
cout << "@ " << endl;
cout << "@@@@@" << endl;
cout << " @" << endl;
cout << "@@@@@" << endl;
cout << endl;
}


void six() {
cout << "@@@@@" << endl;
cout << "@ " << endl;
cout << "@@@@@" << endl;
cout << "@ @" << endl;
cout << "@@@@@" << endl;
cout << endl;
}


void seven() {
cout << "@@@@" << endl;
cout << " @" << endl;
cout << " @@@" << endl;
cout << " @" << endl;
cout << " @" << endl;
cout << endl;
}


void eight() {
cout << "@@@@@" << endl;
cout << "@ @" << endl;
cout << "@@@@@" << endl;
cout << "@ @" << endl;
cout << "@@@@@" << endl;
cout << endl;
}


void nine() {
cout << "@@@@@" << endl;
cout << "@ @" << endl;
cout << "@@@@@" << endl;
cout << " @" << endl;
cout << " @" << endl;
cout << endl;
}


int main() {
string n;
int i;
cin >> n;
for (i=0; i<n.length(); i++) {
switch (n[i])
{
case '0': zero(); break;
case '1': one(); break;
case '2': two(); break;
case '3': three(); break;
case '4': four(); break;
case '5': five(); break;
case '6': six(); break;
case '7': seven(); break;
case '8': eight(); break;
case '9': nine(); break;
}
}
return 0;
}

Explicatii de final

Adaugati acest cod intr-un IDE offline (Code::Blocks,  CLion sau Visual Studio Code) si il compilati. Puteti sa folositi si alte solutii online de compilare si observa ca programul functioneaza fara probleme.

El afiseaza una cate una toate cifrele stringului introdus initial ca data de intrare in algoritm. Parcurgerea stringului se face de la caracterul de pe prima pozitie pana la capatul stringului, folosindu-se pentru iesirea din bucla repetitiva functia length()

Pentru fiecare element din string – care reprezinta de fapt cifra a numarului initial – structura SWITCH cauta functia de care are nevoie pentru a desena cifra respectiva.

Folosind aceasta metoda algoritmul de rezolvare ofera o rezolvare eleganta. Programul principal este concentrat si clar. Functiile care deseneaza cifrele sunt scoase in exteriorul lui „main()”.

 

Mai multe probleme rezolvate si explicate in detaliu gasiti accesand sectiunea Invata cu noi de pe acest site. Pe Bootcamp online de invatare deschis de LAN Academy gasiti cursuri online. Va asteptam sa va abonati la canalul nostru de Youtube Lanteam Solutions.

Lasă un răspuns