[C] Esercizio su diverse tipologie di dati.

Messaggioda SirDanielFortesque » 24/01/2019, 16:40

Salve,
potreste aiutarmi a risolvere questo esercizio? Non dovrebbe essere troppo lungo ma mi risulta difficile.

Scrivere un programma che calcoli un'espressione:

schermata tipica:

inserire espressione: 1+2.5*3
risultato: 10.5

Gli operandi dell'espressione sono numeri floating point. Gli operatori ammessi devono essere +,-,*,/.
Per semplicità l'espressione viene calcolata da sinistra a destra (nessun operatore deve avere precedenza sugli altri).

dovrei utilizzare il ciclo do-while e la funzione getchar() (dato che il capitolo del libro da cui l'ho preso di quello parla) ma non riesco a mettere insieme le cose.
Conoscete la storia del Conte Giacomo Ceconi?
Avatar utente
SirDanielFortesque
Advanced Member
Advanced Member
 
Messaggio: 515 di 2184
Iscritto il: 27/12/2016, 08:35
Località: Milano.

Re: [C] Esercizio su diverse tipologie di dati.

Messaggioda Super Squirrel » 24/01/2019, 19:45

Il problema è legato all'input e al getchar(), oppure all'implementazione dell'algoritmo risolutivo?
Ipotizzando di essere già in possesso di una stringa contenente un'espressione valida (per esempio quella da te postata), non hai alcuna idea su come approcciare il problema?
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 337 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C] Esercizio su diverse tipologie di dati.

Messaggioda SirDanielFortesque » 24/01/2019, 22:00

Testo nascosto, perché contrassegnato dall'autore come fuori tema. Fai click in quest'area per vederlo.
Ho un grosso problema con l'esame di informatica di base (l'unico esame di informatica) del mio corso.


Il mio problema è che in tutto il pomeriggio l'unica cosa che sono riuscito a fare di questo esercizio è questo programma che se immetto o comunque un numero qualsiasi del tipo 123.4567 mi restitusce il numero.
Anzi. Non capisco perché ma ad esempio se metto 478.546 mi restituisce 478.54600006 (cioè mi aggiunge quale 1/1000000).
Potresti darmi un consiglio su come farlo semplicemente? Inoltre non servirebbero i vettori per fare questo esercizio perché il libro li introduce solo nel capitolo successivo.

Codice:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>


int main(void)
{
char ch=0;
float totale=0;
float cumulativo=0;
int v[10];
int i=0;
int n;//indice


printf("Inserisci una espressione:\t");

ch=getchar();


while(ch!='+'&&ch!='-'&&ch!='*'&&ch!='/'&&ch!='.'&&ch!='\n')
{
v[i]=ch-48;
i++;
ch=getchar();
};
i--;
n=i;
do{
    cumulativo=cumulativo+v[i]*pow(10,n-i);
    i--;

}while(i>=0);
i++;
if(ch=='.')
{
    ch=getchar();
 while(ch!='+'&&ch!='-'&&ch!='*'&&ch!='/'&&ch!='\n')
{
v[i]=ch-48;
i++;
ch=getchar();
};
i--;
do{
    cumulativo=cumulativo+v[i]*pow(10,-1-1*i);
    i--;
}while(i>=0);
i++;//i=0
}
 printf("Cumulativo %f", cumulativo);

exit(0);
}
Conoscete la storia del Conte Giacomo Ceconi?
Avatar utente
SirDanielFortesque
Advanced Member
Advanced Member
 
Messaggio: 523 di 2184
Iscritto il: 27/12/2016, 08:35
Località: Milano.

Re: [C] Esercizio su diverse tipologie di dati.

Messaggioda Super Squirrel » 25/01/2019, 13:44

SirDanielFortesque ha scritto:Potresti darmi un consiglio su come farlo semplicemente? Inoltre non servirebbero i vettori per fare questo esercizio perché il libro li introduce solo nel capitolo successivo.

Ragionando un po' ho constatato che il tutto può essere fatto senza scomodare gli array e la libreria math. Per esempio potresti partire dalla seguente impostazione:
Codice:
    char c;
    char operatore = '+';
    double operando = 0;
    double risultato = 0;
    do
    {
        c = getchar();
        if(c >= '0' && c <= '9')
        {
            ...
        }
        else
        {
            if(operatore == '+')
            {
                risultato += operando;
            }
            else if(operatore == '-')
            {
                risultato -= operando;
            }
            ...
        }
    }
    while(c != '\n');

Per il momento lascia stare il carattere '.' e inizia ad implementare il tutto ipotizzando che l'espressione ammetta solo valori interi.
Spero che questo input ti possa essere utile, se hai dubbi chiedi pure!
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 338 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C] Esercizio su diverse tipologie di dati.

Messaggioda Albesa81 » 25/01/2019, 14:19

Super Squirrel ha scritto:
SirDanielFortesque ha scritto:Potresti darmi un consiglio su come farlo semplicemente? Inoltre non servirebbero i vettori per fare questo esercizio perché il libro li introduce solo nel capitolo successivo.

Ragionando un po' ho constatato che il tutto può essere fatto senza scomodare gli array e la libreria math. Per esempio potresti partire dalla seguente impostazione:
Codice:
    char c;
    char operatore = '+';
    double operando = 0;
    double risultato = 0;
    do
    {
        c = getchar();
        if(c >= '0' && c <= '9')
        {
            ...
        }
        else
        {
            if(operatore == '+')
            {
                risultato += operando;
            }
            else if(operatore == '-')
            {
                risultato -= operando;
            }
            ...
        }
    }
    while(c != '\n');

Per il momento lascia stare il carattere '.' e inizia ad implementare il tutto ipotizzando che l'espressione ammetta solo valori interi.
Spero che questo input ti possa essere utile, se hai dubbi chiedi pure!

L'esercizio non è banale come sembra, se si vogliono fare le cose per bene bisogna implementare quantomeno un automa a pila.
Albesa81
Junior Member
Junior Member
 
Messaggio: 134 di 341
Iscritto il: 21/12/2010, 12:02

Re: [C] Esercizio su diverse tipologie di dati.

Messaggioda SirDanielFortesque » 25/01/2019, 14:25

Mi hai sbloccato finalmente. sopratutto questo risultato+=operando.

Adesso ho il programma che funzia:

Codice:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>


int main(void)
{

    float a;
    char ch=0;
    float cumulativo=0;


printf("Inserisci un' espressione:\n\n\t");

scanf("%f", &a);
cumulativo=a;



while(ch!='\n'){
ch=getchar();
    if(ch=='\n')
    {
        break;
    } else{
scanf("%f", &a);


switch (ch)
{
    case '+': cumulativo=cumulativo+a;
    break;
    case '-': cumulativo=cumulativo-a;
    break;
    case '*': cumulativo=cumulativo*a;
    break;
    case '/': cumulativo=cumulativo/a;
    break;
    default: ;
    break;
}

    }
}

printf("Totale:\t%f",cumulativo);

    exit(0);
}


Avevo bisogno di un suggerimento che mi sbloccasse.

Ho solo un dubbio. Resta questo piccolo problema. Ossia se inserisco per esempio

$1+2.5*3$

mi restituisce $10.50000001$
oppure $10.49999999$

Una volta ogni 3 circa. Posso trascurare questo fatto o è qualcosa che sbaglio?
Conoscete la storia del Conte Giacomo Ceconi?
Avatar utente
SirDanielFortesque
Advanced Member
Advanced Member
 
Messaggio: 525 di 2184
Iscritto il: 27/12/2016, 08:35
Località: Milano.

Re: [C] Esercizio su diverse tipologie di dati.

Messaggioda SirDanielFortesque » 25/01/2019, 14:27

Albesa81 ha scritto:automa a pila.


No non lo abbiamo fatto al corso. Cosa intendi?
Conoscete la storia del Conte Giacomo Ceconi?
Avatar utente
SirDanielFortesque
Advanced Member
Advanced Member
 
Messaggio: 526 di 2184
Iscritto il: 27/12/2016, 08:35
Località: Milano.

Re: [C] Esercizio su diverse tipologie di dati.

Messaggioda SirDanielFortesque » 25/01/2019, 14:29

Comunque funzia io mi ritengo soddisfatto. L'unica cosa che non riesco a capire è perché introduce un errore sul risultato... Cioè quel 0.000000001 che aggiunge o toglie che però è brutto a vedersi.
Conoscete la storia del Conte Giacomo Ceconi?
Avatar utente
SirDanielFortesque
Advanced Member
Advanced Member
 
Messaggio: 527 di 2184
Iscritto il: 27/12/2016, 08:35
Località: Milano.

Re: [C] Esercizio su diverse tipologie di dati.

Messaggioda Super Squirrel » 25/01/2019, 15:12

@SirDanielFortesque

Interessante, non avevo pensato a quest'utilizzo della scanf()! :D
Giusto per rendere il codice più pulito, farei qualcosa del genere:
Codice:
#include <stdio.h>

int main()
{
    double risultato = 0;
    double operando;
    char operatore = '+';
    printf("ESPRESSIONE: ");
    do
    {
        scanf("%lf", &operando);
        if(operatore == '+')
        {
            risultato += operando;
        }
        else if(operatore == '-')
        {
            risultato -= operando;
        }
        else if(operatore == '*')
        {
            risultato *= operando;
        }
        else
        {
            risultato /= operando;
        }
    }
    while((operatore = getchar()) != '\n');
    printf("RISULTATO: %lf", risultato);
    return 0;
}

Per quanto riguarda gli "errori sul risultato" prova ad utilizzare i double.

@Albesa81
Mi dispiace, ma non so a cosa ti riferisci... il mio bagaglio di conoscenze teoriche sull'informatica è abbastanza limitato!
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 339 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C] Esercizio su diverse tipologie di dati.

Messaggioda SirDanielFortesque » 25/01/2019, 15:29

@Super squirrel...

si direi che il mio è più uno "spaghetti programming", se confrontato col tuo.

E' che tendo a far casino, dimenticare i ";" , le parentesi, e chi più ne ha più ne metta. E quindi poi non lo compila...

E poi non sapevo si potesse mettere un assegnazione dentro una condizione così.

Codice:
...
while ((operatore = getchar()) != '\n');
...



Questo devo tenerlo a mente.

Con il tipo double adesso non lo fa più l'errore 0.0000000...

Grazie dei consigli. Ciao!
Conoscete la storia del Conte Giacomo Ceconi?
Avatar utente
SirDanielFortesque
Advanced Member
Advanced Member
 
Messaggio: 528 di 2184
Iscritto il: 27/12/2016, 08:35
Località: Milano.

Prossimo

Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite