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

Am incercat de curand sa fa problema expresie9 de pe pbinfo ,dar nu prea m-am descurcat, am reusit sa iau 47 de pcte ,fiindca am rezolvat corect prima cerinta ,dar pe a doua chiar nu am habar cum sa o fac.La indicatii scrie"Această problemă nu are nevoie de un algoritm special de rezolvare, este legată de evaluarea unor expresii.". Ma poate cineva ajuta sa inteleg cum functioneaza evaluarea expresiilor ce contit siruri de caractere ,multumesc.


Porecla0987: Uite o functie care evalueaza o expresie ce contine litere, '+' si maxim unul dintre '<' si '>'.
Va trebui s-o modifici, caci nu returneaza numere mai mari decat long long int.
Porecla0987: long long int eval(string expression)
{
int comparisonIndex = 0;
for (int currentIndex = 0; currentIndex < expression.size(); ++currentIndex)
if (expression[currentIndex] == '<' || expression[currentIndex] == '>')
{
comparisonIndex = currentIndex;
break;
}
Porecla0987: if (!comparisonIndex) // Just sum the values
{
int currentIndex = 0;
long long int value = 0;
string result;
while (currentIndex < expression.size())
{
if (expression[currentIndex] >= 'a' && expression[currentIndex] <= 'z')
{
while (expression[currentIndex] >= 'a' && expression[currentIndex] <= 'z')
{
result += expression[currentIndex];
++currentIndex;
}
}
Porecla0987: long long int temp = 0;
for (char digit : result)
{
int number = digit - 96;
if (number > 10)
{
temp *= 10;
}
temp = temp * 10 + (digit - 96);
}
value += temp;
result.clear();
++currentIndex;
}
return value;
}
Porecla0987: else
{
string subString = expression.substr(0, comparisonIndex);
long long int leftSum = eval(subString); // Sum on the left side of the comparison sign
subString = expression.substr(comparisonIndex);
long long int rightSum = eval(subString); // Sum on the right side of the comparison sign
if ((expression[comparisonIndex] == '<' && leftSum < rightSum) || (expression[comparisonIndex] == '>' && leftSum > rightSum))
return 1;
return 0;
}
}
Porecla0987: Arata ingrozitor pentru ca nu pot s-o pun intr-un singur raspuns. Fac acum un pastebin si-ti trimit.
Porecla0987: https://pastebin.com/ZjuHE3n9
microbrich: ms mult

Răspunsuri la întrebare

Răspuns de AfloareiAndrei
1

Nu am sa iti scriu aici programul, am sa iti dau o idee cum ai putea sa il rezolvi.

Ca sa convertesti literele (a, b, c...) in nr. de ordine corespunzatoare (1, 2, 3...), trebuie sa afli valoarea ASCII a fiecarui caracter. Asta o poti face stergand caracterul NULL de la finalul unui sir de caractere.

In C/C++ caracterul "a" este un sir format din 2 caractere a + \0 <- caracterul null. daca stergi caracterul null \0 si afisezi caracterul 'a' o sa iti arate valoarea ASCII.

deci:

char litera[] = "a"   ==    char litera[2] = 'a\0'

(daca folosesti " " caracterul null este adaugat automat. daca folosesti ' ' trebuie sa adaugi tu caracterul null la finalul sirului)

incearca sa faci o bucla 'for' ca sa aflii valorile ASCII la toate literele

ex:

for(char litera='a'; litera<='z'; litera++)

{

cout << litera - '\0' << endl

}

sau mai poti folosi:

cout << (int)litera << endl;

Daca nu intelegi ceva, nu ezita sa imi spui.

Bafta :)


microbrich: Multumesc , asta cam am facut si eu , problema mea e ca , desi am facut asta pare ca nu se rezolva chiar asa , fiindca o sa ajung la numere care depasesc long long ul si asa ca ar trebui sa fac totul cu vecotri ceea ce ar fi foarte oribil de gandit si m am gandit sa intreb pe brainly fiindca poate exista o varianta mai simpla
AfloareiAndrei: OK. Am facut o rezolvare, e cam dezordonata, dar poate te ajuta cu ceva :p. Am lasat comentarii doar de la cerinta2, daca intelegi ce am facut colo o sa intelegi si cerinta1. Am incercat sa o verific pe pbinfo dar primesc o eroare din cauza la un array. Oricum bag mana in foc ca nu e o rezolvare de 100p :)). Am postat pe codeshare, am sa las un link: https://codeshare.io/5PMo1d
AfloareiAndrei: Imi pare rau ca nu am mai mult timp la dispozitie sa fac o rezolvare asa cum trebuie.
Porecla0987: Un sfat, n-are legatura cu problema:
Daca ai nevoie de pus comentarii de genul "folosesc variabilele 'a' si 'b' unde a = prima litera din sir" nu ti-ai numit corect variabilele. Numeste-o firstLetterOfSubString sau ceva asemanator. Oricum, e bine ca iti comentezi codul si motivele pentru care ai facut x sau y.
AfloareiAndrei: Inițial nu intenționăm să postez rezolvarea asta, și nu am modificat variabilele că să evit erorile. Știu că e foarte dezordonata rezolvarea mea. E un fel de 'prototip' :p așa lucrez eu. După ce sunt sigur că face ce vreau eu programul, îl fac să arate estetic și să fie citeț. Poți șterge răspunsul meu și să îl înlocuiești cu cel postat de Porecla0987.
Alte întrebări interesante