PDA

Visualizza la versione completa : [C] Errore di compilazione "expected expression before..."


jackazz
09-08-2011, 17:18
Ciao a tutti, ho un problma nella compilazione di una semplice calcolatrice a 4 operazioni, ecco il codice:


#include <stdio.h>

int main(int argc, char **argv)
{
int a, b, addizione, sottrazione, moltiplicazione, divisione;
char operatore;

printf("Inserisci il primo numero: ", a);
scanf("%d", &a);

printf("\n\nInserisci il secondo numero: ", b);
scanf("%d", &b);

printf("\n\n Inserisci l'operatore (+ - * /): ", operatore);
scanf("%d", &operatore);

addizione = a + b;
sottrazione = a - b;
moltiplicazione = a * b;
divisione = a / b;

if (operatore==+){
printf("\nRISULTATO: %d", addizione);}
if (operatore==-){
printf("\nRISULTATO: %d", sottrazione);}
if (operatore==*){
printf("\nRISULTATO: %d", moltiplicazione);}
if (operatore==/){
printf("\nRISULTATO: %d", divisione);}

return 0;
}


Quando lo compilo mi da degli errori, ma non riesco a capire quali.

Errori:


nome_file.c:25:18: error: expected expression before ‘)’ token
nome_file.c:27:18: error: expected expression before ‘)’ token
nome_file.c:29:18: error: expected expression before ‘)’ token
nome_file.c:31:17: error: expected expression before ‘/’ token
Compilazione fallita.



Come IDE uso Geany (Ubuntu)

Celebron
09-08-2011, 18:05
Originariamente inviato da jackazz
Ciao a tutti, ho un problma nella compilazione di una semplice calcolatrice a 4 operazioni, ecco il codice:


#include <stdio.h>

int main(int argc, char **argv)
{
int a, b, addizione, sottrazione, moltiplicazione, divisione;
char operatore;

printf("Inserisci il primo numero: ", a);
scanf("%d", &a);

printf("\n\nInserisci il secondo numero: ", b);
scanf("%d", &b);

printf("\n\n Inserisci l'operatore (+ - * /): ", operatore);
scanf("%d", &operatore);

addizione = a + b;
sottrazione = a - b;
moltiplicazione = a * b;
divisione = a / b;

if (operatore==+){
printf("\nRISULTATO: %d", addizione);}
if (operatore==-){
printf("\nRISULTATO: %d", sottrazione);}
if (operatore==*){
printf("\nRISULTATO: %d", moltiplicazione);}
if (operatore==/){
printf("\nRISULTATO: %d", divisione);}

return 0;
}


Quando lo compilo mi da degli errori, ma non riesco a capire quali.

Errori:


nome_file.c:25:18: error: expected expression before ‘)’ token
nome_file.c:27:18: error: expected expression before ‘)’ token
nome_file.c:29:18: error: expected expression before ‘)’ token
nome_file.c:31:17: error: expected expression before ‘/’ token
Compilazione fallita.



Come IDE uso Geany (Ubuntu)

è un errore già apparso qua

devi capire la differenza tra
+ - / *
che sono OPERATORI del linguaggio e
'+' '-' '/' '*'
che invece sono char, e sono quelli che fanno al caso tuo e devono finire negli if


inoltre nella scanf devi usare il %c per leggere i char, non il %d

in aggiunta mi chiedo perché hai messo quei parametri aggiuntivi nelle printf. Non servono ne c'è motivo per inserirli. Anche perché, pur volessi stamparli (e devi usare la notazione apposita) in quel momento non sono nemmeno inizializzati, quindi avresti risultati di visualizzazione non prevedibili

jackazz
09-08-2011, 18:36
Originariamente inviato da Celebron
è un errore già apparso qua

devi capire la differenza tra
+ - / *
che sono OPERATORI del linguaggio e
'+' '-' '/' '*'
che invece sono char, e sono quelli che fanno al caso tuo e devono finire negli if


inoltre nella scanf devi usare il %c per leggere i char, non il %d

in aggiunta mi chiedo perché hai messo quei parametri aggiuntivi nelle printf. Non servono ne c'è motivo per inserirli. Anche perché, pur volessi stamparli (e devi usare la notazione apposita) in quel momento non sono nemmeno inizializzati, quindi avresti risultati di visualizzazione non prevedibili

Adesso compila correttamente, con qualche warning, ma compila, adesso però quando lo avvio, dopo "Inserisci un operatore (+ - * /)" il programma finisce, perchè? Poi volevo sapere che paramentri aggiuntivi avrei messo nelle printf()

Ecco le modifiche cho ho apportato:

#include <stdio.h>

int main(int argc, char **argv)
{
/*Dichiarazione delle variabili di tipo intero.*/
int a, b, addizione, sottrazione, moltiplicazione, divisione;
char operatore;

/*Con %d intendiamo spcificare la conversione
* per numeri interi*/
printf("Inserisci il primo numero: ", a);
scanf("%d", &a);

printf("\n\nInserisci il secondo numero: ", b);
scanf("%d", &b);

printf("\n\n Inserisci l'operatore (+ - * /): ", operatore);
scanf("%c", &operatore);

addizione = a + b;
sottrazione = a - b;
moltiplicazione = a * b;
divisione = a / b;

if (operatore=="+"){
printf("\nRISULTATO: %d", addizione);}
if (operatore=="-"){
printf("\nRISULTATO: %d", sottrazione);}
if (operatore=="*"){
printf("\nRISULTATO: %d", moltiplicazione);}
if (operatore=="/"){
printf("\nRISULTATO: %d", divisione);}

return 0;
}

Celebron
09-08-2011, 18:44
metti un

while(getchar()!='q');

alla fine, ma prima del return, in modo che il programma aspetti che l'utente prema il tasto q prima di uscire dal programma

nelle printf:
printf("Inserisci il primo numero: ", a);
printf("\n\nInserisci il secondo numero: ", b);
printf("\n\n Inserisci l'operatore (+ - * /): ", operatore);

questi in grassetto, a che ti servono? Perché li hai messi? Sai che non svolgono alcuna funzione messi così?


Probabilmente i warning ti segnalavano proprio questo
leggili sempre e non ignorarli MAI

jackazz
09-08-2011, 18:51
Originariamente inviato da Celebron
metti un

while(getchar()!='q');

alla fine, ma prima del return, in modo che il programma aspetti che l'utente prema il tasto q prima di uscire dal programma

nelle printf:
printf("Inserisci il primo numero: ", a);
printf("\n\nInserisci il secondo numero: ", b);
printf("\n\n Inserisci l'operatore (+ - * /): ", operatore);

questi in grassetto, a che ti servono? Perché li hai messi? Sai che non svolgono alcuna funzione messi così?


Probabilmente i warning ti segnalavano proprio questo
leggili sempre e non ignorarli MAI

Infatti anche io mi sono sempre chiesto a che cosa servono, visto che la variabile si mette nello scanf, ma io ho imparato così con le varie guide, e mi sembrava opportuno metterle. Comunque i warning rimangono. Lo avvio ma dopo che metto l'operatore e premo enter, non succede nulla, non dice che il programma è terminato e neanche il risultato, posso premere enter quanto voglio, ma non succede niente.

Celebron
09-08-2011, 18:59
due cose:

i warning ce li hai perché hai messo i caratteri tra "" e non tra ' ' come io li avevo messi
" " <- si usa per le variabili stringhe statiche
' ' <- per i caratteri

il warning ti dice che stavi confrontando un char con un char*.


seconda cosa:
il problema per il quale non ti stampa nulla è colpa degli "invio" che rimangono nello stdin quando leggi i dati con la scanf.
Questo fa si che il carattere '\n' venga letto dalla tua scanf%c al posto del carattere che tu inserisci
E' un problema classico del c purtroppo

risolvilo mettendo while(getchar()!='\n'); dopo ogni scanf e tutto funzionerà


#include <stdio.h>

int main(int argc, char **argv)
{
/*Dichiarazione delle variabili di tipo intero.*/
int a, b, addizione, sottrazione, moltiplicazione, divisione;
char operatore;

/*Con %d intendiamo spcificare la conversione
* per numeri interi*/
printf("Inserisci il primo numero: ", a);
scanf("%d", &a);
while(getchar()!='\n');

printf("\n\nInserisci il secondo numero: ", b);
scanf("%d", &b);
while(getchar()!='\n');

printf("\n\n Inserisci l'operatore (+ - * /): ", operatore);
scanf("%c", &operatore);
while(getchar()!='\n');

addizione = a + b;
sottrazione = a - b;
moltiplicazione = a * b;
divisione = a / b;

if (operatore=='+'){
printf("\nRISULTATO: %d", addizione);}
if (operatore=='-'){
printf("\nRISULTATO: %d", sottrazione);}
if (operatore=='*'){
printf("\nRISULTATO: %d", moltiplicazione);}
if (operatore=='/'){
printf("\nRISULTATO: %d", divisione);}

return 0;
}

ti consiglio di imparare ad usare GDB come debugger. Ti assicurò che questi problemi diventano banali e facilmente rilevabili :ciauz:

jackazz
09-08-2011, 19:05
Originariamente inviato da Celebron
due cose:

i warning ce li hai perché hai messo i caratteri tra "" e non tra ' ' come io li avevo messi
" " <- si usa per le variabili stringhe statiche
' ' <- per i caratteri

il warning ti dice che stavi confrontando un char con un char*.


seconda cosa:
il problema per il quale non ti stampa nulla è colpa degli "invio" che rimangono nello stdin quando leggi i dati con la scanf.
Questo fa si che il carattere '\n' venga letto dalla tua scanf%c al posto del carattere che tu inserisci
E' un problema classico del c purtroppo

risolvilo mettendo while(getchar()!='\n'); dopo ogni scanf e tutto funzionerà


#include <stdio.h>

int main(int argc, char **argv)
{
/*Dichiarazione delle variabili di tipo intero.*/
int a, b, addizione, sottrazione, moltiplicazione, divisione;
char operatore;

/*Con %d intendiamo spcificare la conversione
* per numeri interi*/
printf("Inserisci il primo numero: ", a);
scanf("%d", &a);
while(getchar()!='\n');

printf("\n\nInserisci il secondo numero: ", b);
scanf("%d", &b);
while(getchar()!='\n');

printf("\n\n Inserisci l'operatore (+ - * /): ", operatore);
scanf("%c", &operatore);
while(getchar()!='\n');

addizione = a + b;
sottrazione = a - b;
moltiplicazione = a * b;
divisione = a / b;

if (operatore=='+'){
printf("\nRISULTATO: %d", addizione);}
if (operatore=='-'){
printf("\nRISULTATO: %d", sottrazione);}
if (operatore=='*'){
printf("\nRISULTATO: %d", moltiplicazione);}
if (operatore=='/'){
printf("\nRISULTATO: %d", divisione);}

return 0;
}

ti consiglio di imparare ad usare GDB come debugger. Ti assicurò che questi problemi diventano banali e facilmente rilevabili :ciauz:

Quindi da ora in poi, anche se dovessi programmare un elaboratore di immagini 3D :D dopo ogni scanf() va messo un while(getchar()!='\n');? Comunque adesso mi funziona alla grande, grazie dell'aiuto e dei consigli (utilissimi).

Loading