Salve a tutti ho fatto un programmino un po' lunghetto e poco pratico ma è tutto quello che sono riuscito a fare con le mie conoscenze (gli array gli sto per fare quindi non avendoli usati ho trovato non pochi problemi), che dovrebbe chiedere all'utente un'espressione e restituire il risultato (Nota bene: nessun operatore ha precedenza sugli altri, per esempio: a-c*b=(a-c)*b)...
Allora esso consiste nel leggere una stringa tramite un ciclo for con un espressione di controllo (c=getchar())!= '\n' che a seconda del carattere immesso esegue i calcoli partendo da sinistra grazie alla funzione switch.
Il mio problema è che dopo averlo finito, compilato, testato e corretto il programma esegue qualunque calcolo (+*/) tranne la sottrazione (-).
Penso che sia un errore di distrazione interno al ciclo perchè sembra saltare completamente il carattere '-' e i numeri successivi vengono scritti di seguito al numero precedente il segno meno.
Mi aiutereste a trovarlo?? Io ho poca concentrazione e voglia di controllare tutte le 200 righe...![]()
Grazie in anticipo a tutti vi posto il codice sorgente e un output del mio terminale.
ProgrammaOutputcodice:/* Programma per il calcolo di un espressione da input * (Nota: nessun operatore ha precedenza sull'altro) */ #include <stdio.h> #include <ctype.h> #include <stdbool.h> int main (void) { float r = 0, smn = 0, stn = 0, mn = 0, dn = 0; char c = 0; bool n = true, sm = false, st = false, m = false, d = false, nl = false; printf("Enter an expression: "); for (; (c = getchar()) != '\n'; ) { switch (c) { case '0': { if (sm == false && m == false && d == false) {r = r * 10.00f + 0.00f;} else if (sm == true && n == false) {smn += 0.00f;} else if (sm == true && n == true) {smn = smn * 10.00f + 0.00f;} else if (st == true && n == false) {stn += 0.00f;} else if (st == true && n == true) {stn = stn * 10.00f + 0.00f;} else if (m == true && n == false) {mn += 0.00f;} else if (m == true && n == true) {mn = mn * 10.00f + 0.00f;} else if (d == true && n == false) {dn += 0.00f;} else if (d == true && n == true) {dn = dn * 10.00f + 0.00f;} break; } case '1': { if (sm == false && m == false && d == false) {r = r * 10.00f + 1.00f;} else if (sm == true && n == false) {smn += 1.00f;} else if (sm == true && n == true) {smn = smn * 10.00f + 1.00f;} else if (st == true && n == false) {stn += 1.00f;} else if (st == true && n == true) {stn = stn * 10.00f + 1.00f;} else if (m == true && n == false) {mn += 1.00f;} else if (m == true && n == true) {mn = mn * 10.00f + 1.00f;} else if (d == true && n == false) {dn += 1.00f;} else if (d == true && n == true) {dn = dn * 10.00f + 1.00f;} break; } case '2': { if (sm == false && m == false && d == false) {r = r * 10.00f + 2.00f;} else if (sm == true && n == false) {smn += 2.00f;} else if (sm == true && n == true) {smn = smn * 10.00f + 2.00f;} else if (st == true && n == false) {stn += 2.00f;} else if (st == true && n == true) {stn = stn * 10.00f + 2.00f;} else if (m == true && n == false) {mn += 2.00f;} else if (m == true && n == true) {mn = mn * 10.00f + 2.00f;} else if (d == true && n == false) {dn += 2.00f;} else if (d == true && n == true) {dn = dn * 10.00f + 2.00f;} break; } case '3': { if (sm == false && m == false && d == false) {r = r * 10.00f + 3.00f;} else if (sm == true && n == false) {smn += 3.00f;} else if (sm == true && n == true) {smn = smn * 10.00f + 3.00f;} else if (st == true && n == false) {stn += 3.00f;} else if (st == true && n == true) {stn = stn * 10.00f + 3.00f;} else if (m == true && n == false) {mn += 3.00f;} else if (m == true && n == true) {mn = mn * 10.00f + 3.00f;} else if (d == true && n == false) {dn += 3.00f;} else if (d == true && n == true) {dn = dn * 10.00f + 3.00f;} break; } case '4': { if (sm == false && m == false && d == false) {r = r * 10.00f + 4.00f;} else if (sm == true && n == false) {smn += 4.00f;} else if (sm == true && n == true) {smn = smn * 10.00f + 4.00f;} else if (st == true && n == false) {stn += 4.00f;} else if (st == true && n == true) {stn = stn * 10.00f + 4.00f;} else if (m == true && n == false) {mn += 4.00f;} else if (m == true && n == true) {mn = mn * 10.00f + 4.00f;} else if (d == true && n == false) {dn += 4.00f;} else if (d == true && n == true) {dn = dn * 10.00f + 4.00f;} break; } case '5': { if (sm == false && m == false && d == false) {r = r * 10.00f + 5.00f;} else if (sm == true && n == false) {smn += 5.00f;} else if (sm == true && n == true) {smn = smn * 10.00f + 5.00f;} else if (st == true && n == false) {stn += 5.00f;} else if (st == true && n == true) {stn = stn * 10.00f + 5.00f;} else if (m == true && n == false) {mn += 5.00f;} else if (m == true && n == true) {mn = mn * 10.00f + 5.00f;} else if (d == true && n == false) {dn += 5.00f;} else if (d == true && n == true) {dn = dn * 10.00f + 5.00f;} break; } case '6': { if (sm == false && m == false && d == false) {r = r * 10.00f + 6.00f;} else if (sm == true && n == false) {smn += 6.00f;} else if (sm == true && n == true) {smn = smn * 10.00f + 6.00f;} else if (st == true && n == false) {stn += 6.00f;} else if (st == true && n == true) {stn = stn * 10.00f + 6.00f;} else if (m == true && n == false) {mn += 6.00f;} else if (m == true && n == true) {mn = mn * 10.00f + 6.00f;} else if (d == true && n == false) {dn += 6.00f;} else if (d == true && n == true) {dn = dn * 10.00f + 6.00f;} break; } case '7': { if (sm == false && m == false && d == false) {r = r * 10.00f + 7.00f;} else if (sm == true && n == false) {smn += 7.00f;} else if (sm == true && n == true) {smn = smn * 10.00f + 7.00f;} else if (st == true && n == false) {stn += 7.00f;} else if (st == true && n == true) {stn = stn * 10.00f + 7.00f;} else if (m == true && n == false) {mn += 7.00f;} else if (m == true && n == true) {mn = mn * 10.00f + 7.00f;} else if (d == true && n == false) {dn += 7.00f;} else if (d == true && n == true) {dn = dn * 10.00f + 7.00f;} break; } case '8': { if (sm == false && m == false && d == false) {r = r * 10.00f + 8.00f;} else if (sm == true && n == false) {smn += 8.00f;} else if (sm == true && n == true) {smn = smn * 10.00f + 8.00f;} else if (st == true && n == false) {stn += 8.00f;} else if (st == true && n == true) {stn = stn * 10.00f + 8.00f;} else if (m == true && n == false) {mn += 8.00f;} else if (m == true && n == true) {mn = mn * 10.00f + 8.00f;} else if (d == true && n == false) {dn += 8.00f;} else if (d == true && n == true) {dn = dn * 10.00f + 8.00f;} break; } case '9': { if (sm == false && m == false && d == false) {r = r * 10.00f + 9.00f;} else if (sm == true && n == false) {smn += 9.00f;} else if (sm == true && n == true) {smn = smn * 10.00f + 9.00f;} else if (st == true && n == false) {stn += 9.00f;} else if (st == true && n == true) {stn = stn * 10.00f + 9.00f;} else if (m == true && n == false) {mn += 9.00f;} else if (m == true && n == true) {mn = mn * 10.00f + 9.00f;} else if (d == true && n == false) {dn += 9.00f;} else if (d == true && n == true) {dn = dn * 10.00f + 9.00f;} break; } case '+': { if (sm == true) {r += smn;} else if (st == true) {r -= stn;} else if (m == true) {r *= mn;} else if (d == true) {r /= dn;} n = false; sm = true; st = false; m = false; d = false; smn = 0; stn = 0; mn = 0; dn = 0; break; } case '-': { if (sm == true) {r += smn;} else if (st == true) {r -= stn;} else if (m == true) {r *= mn;} else if (d == true) {r /= dn;} n = false; sm = false; st = true; m = false; d = false; smn = 0; stn = 0; mn = 0; dn = 0; break; } case '*': { if (sm == true) {r += smn;} else if (st == true) {r -= stn;} else if (m == true) {r *= mn;} else if (d == true) {r /= dn;} n = false; sm = false; st = false; m = true; d = false; smn = 0; stn = 0; mn = 0; dn = 0; break; } case '/': { if (sm == true) {r += smn;} else if (st == true) {r -= stn;} else if (m == true) {r *= mn;} else if (d == true) {r /= dn;} n = false; sm = false; st = false; m = false; d = true; smn = 0; stn = 0; mn = 0; dn = 0; break; } } if (c >= '0' && c <= '9') {n == true;} } if (sm == true) {r += smn;} else if (st == true) {r -= stn;} else if (m == true) {r *= mn;} else if (d == true) {r /= dn;} n = false; sm = false; st = false; m = false; d = false; smn = 0; stn = 0; mn = 0; dn = 0; printf("Value of expression: %.2f\n", r); return 0; }codice:zorgatone@zorgatone-laptop:~/Esercizi$ ./sez7prog12_comp.out Enter an expression: 2*2*2 Value of expression: 8.00 zorgatone@zorgatone-laptop:~/Esercizi$ ./sez7prog12_comp.out Enter an expression: 2+2-2 Value of expression: 42.00 zorgatone@zorgatone-laptop:~/Esercizi$


Rispondi quotando
