Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C] Errore programma calcolo espressione (funziona tutto tranne sottrazione)

    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.

    Programma
    codice:
    /* 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;
    }
    Output
    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$

  2. #2

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    117
    Piuttosto che cercare un errore in un programma complesso come l'hai fatto tu (che a me personalmente non piace, ma è solo un mio parere), ti dico come farei io un programmino del genere.


    Partiamo dalla stringa dell'espressione che ci ha dato l'utente, ad esempio:

    135+65*6-200/2-100

    (il risultato, se ho fatto bene i conti e senza considerare le normali precedenze sarebbe 400)

    A questo punto mi creerei una funzione che, data in ingresso la stringa s=[135+65*6-200/2-100] con questa espressione, mi restituisse un vettore di interi con le posizioni degli operatori all'interno della stringa, ovvero nel nostro caso p=[3 6 8 12 14].

    Dati i valori di questo vettore, posso tranquillamente considerare diverse sottostringhe all'interno della stringa s; ogni sottostringa corrisponde ad un operando (ad es, la stringa da 0 a p[0]-1 corrisponde a 135, la stringa da p[0]+1 a p[1]-1 corrisponde a 65, etc). Ora non programmando in C di frequente e non ricordo bene, ma credo che esistano funzioni che convertono una stringa che rappresenta un numero in un intero; se anche non esistessero o non le trovassi, in ogni caso non ci dovrebbe volere molto a crearsene una ad hoc (anzi, è un utile esercizio).
    Impacchetterei quindi tutta questa funzionalità appena creata in una funzione che, a partire dal vettore s e dal vettore p restituisca un vettore con gli operandi, nel nostro caso v=[135 65 6 200 2 100]

    A questo punto, inserisco il primo operando in una variabile di accumulazione (acc=v[0]) con un ciclo e uno switch sugli s[p[i]] farei le varie operazioni. Ad es, per i=0 abbiamo che s[p[0]]='+', per cui nell'opportuno ramo dello switch relativo al '+' farei l'operazione di addizione tra i primi due operandi acc+=v[1] che, generalizzata, è acc+v[i+1]. E così via.


    Secondo me così viene più bello, leggibile (soprattutto se ti crei qualche tua funzione) e, credo, anche più breve.

    Nella mia descrizione comunque ho fatto l'assunzione che la stringa di partenza sia già stata inserita in un formato corretto, inoltre ho assunto che gli operando siano tutti interi e che il primo non sia negativo (altrimenti dovresti gestirti il meno davanti all'espressione).


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.