PDA

View Full Version : cosa ho sbagliato?


thessdd
04-12-2006, 15:39
Allora vi posto il programma che ho scritto, in pratica esso prende da linea di comando tre valori e da input altri 4 per volta fino a che uno non inserisce una riga vuota.
Il problema è che anche inserendo una linea vuota non esce dal programma e che anche facendo partire il programma da linea da comando con i dati necessari mi chiede solo una volta di inserire i dati e poi si pianta...
#include <stdio.h>
#include <stdlib.h>

char colori[20];
float dimoriz[20],dimvert[20],dim[20],costo[20],costocolore[5],dimparz,costoparz,dimtot,costotot,costomedio;
int a,b,c;

int main(int argc, float *argv[4])
{
a=0;
do
{
printf("\n Inserire colore, dim orizzontale e verticale in questo ordine separate da uno spazio (i colori ammessi sono N=nero, B=bianco, V=verde,G=giallo)per uscire premeresemplicemnte invio\n");
scanf("%c%f%f",&colori[a],&dimoriz[a],&dimvert[a]);
if (dimoriz[a]<0 || dimvert[a]<0 || colori[a] != 'n' || colori[a] != 'b'|| colori[a] != 'v'|| colori[a] != 'g')
{
fprintf(stderr, "si e' verificato un errore alla linea %d",a);
}
else
{
for(b=0;b<=a;b++)
{
if ( tolower(colori[b]) == 'n' )
{

dim[b]=(dimoriz[b] * dimvert[b]);
costo[b]=(dim[b] / 4)* strtol(argv[1], NULL, 0);
}
else
{
if ( tolower(colori[b]) == 'b' )
{

dim[b]=(dimoriz[b] * dimvert[b]);
costo[b]=(dim[b] / 4)* strtol(argv[2], NULL, 0);
}
else
{
if ( tolower(colori[b]) == 'v' )
{

dim[b]=dimoriz[b]* dimvert[b];
costo[b]=(dim[b] / 4)* strtol(argv[3], NULL, 0);
}
else
{
if ( tolower(colori[b]) == 'g' )
{

dim[b]=dimoriz[b] * dimvert[b];
costo[b]=(dim[b] / 4)* strtol(argv[4], NULL, 0);
}
}
}
}
}
}
a++;
}while(colori[a-1]!='\0');
dimparz=0;
costoparz=0;
for (c=0;c<=a;c++)
{
dimtot=dimparz+dim[c];
costotot=costoparz+costo[c];
}
costomedio=costotot/dimtot;
printf("\nArea Totale : %f",dimtot);
printf("\nCosto totale : %f", costotot);
printf("\nCosto medio : %f",costomedio);
return (0);
}

andbin
04-12-2006, 15:55
Allora vi posto il programma che ho scritto, in pratica esso prende da linea di comando tre valori e da input altri 4 per volta fino a che uno non inserisce una riga vuota.
Il problema è che anche inserendo una linea vuota non esce dal programma e che anche facendo partire il programma da linea da comando con i dati necessari mi chiede solo una volta di inserire i dati e poi si pianta...Il problema principale è che scanf si aspetta comunque qualcosa. Usa fgets e poi sscanf.

thessdd
04-12-2006, 16:14
cioè dovrei scrivere
char buffer [10]
fgets(buffer, 10, stdin);
sscanf(buffer,"%c %f %f",&colore[a],&dimvert[a],&dimoriz[a]);

scusate ma n sono pratico di queste funzioni

provando ho notato che anche inserendo una riga vuota continua a chiedere input....

andbin
04-12-2006, 16:31
cioè dovrei scrivere
char buffer [10]
fgets(buffer, 10, stdin);
sscanf(buffer,"%c %f %f",&colore[a],&dimvert[a],&dimoriz[a]);Sì, è così (ti conviene però aumentare la dimensione del buffer).

provando ho notato che anche inserendo una riga vuota continua a chiedere input....Certo ... però in questo modo dopo la fgets puoi testare se la riga è vuota. Il primo carattere (buffer[0]) infatti conterrebbe '\n'.

thessdd
04-12-2006, 16:45
allora ho fatto un ciclo do while che inizia così
printf("\n Inserire colore, dim orizzontale e verticale in questo ordine separate da uno spazio (i colori ammessi sono N=nero, B=bianco, V=verde,G=giallo)per uscire premeresemplicemente invio\n");
fgets(buffer, 30, stdin);
sscanf(buffer,"%c %f %f",&colori[a],&dimvert[a],&dimoriz[a]);
if (dimoriz[a]<0 || dimvert[a]<0 || tolower(colori[a]) != 'n' || tolower(colori[a]) != 'b' || tolower(colori[a]) != 'v' || tolower(colori[a]) != 'g' || colori[a] != '\n')
{
fprintf(stderr, "si e' verificato un errore alla linea %d",a);
}
poi ci sono le istruzioni e alla fine
}while(colori[a] != '\n');

il problema è che ora mi da errore anche se scrivo ad esempio n 30 25 che dovrebbe accettare senza scrivere errori....

andbin
04-12-2006, 16:47
Dopo la fgets devi testare se buffer[0] != '\n' e in tal caso continui con la sscanf, altrimenti esci.

thessdd
04-12-2006, 17:07
ogni volta ne esce una nuova...

#include <stdio.h>
#include <stdlib.h>

char colori[20];
float dimoriz[20],dimvert[20],dim[20],costo[20],costocolore[5],dimparz,costoparz,dimtot,costotot,costomedio;
int a,b,c;
char buffer[30];
int main(int argc, float *argv[4])
{

for(a=0;a<100;a++)
{
printf("\n Inserire colore, dim orizzontale e verticale in questo ordine separate da uno spazio (i colori ammessi sono N=nero, B=bianco, V=verde,G=giallo)per uscire premeresemplicemnte invio\n");
fgets(buffer, 30, stdin);
if(buffer[0] != '\n')
{
sscanf(buffer,"%c %f %f",&colori[a],&dimvert[a],&dimoriz[a]);
if (dimoriz[a]<0 || dimvert[a]<0 || tolower(colori[a]) != 'n' || tolower(colori[a]) != 'b' || tolower(colori[a]) != 'v' || tolower(colori[a]) != 'g' )
{
fprintf(stderr, "si e' verificato un errore alla linea %d",a);
}
else
{
for(b=0;b<=a;b++)
{
if ( tolower(colori[b]) == 'n' )
{

dim[b]=(dimoriz[b] * dimvert[b]);
costo[b]=(dim[b] / 4)* strtol(argv[1], NULL, 0);
}
else
{
if ( tolower(colori[b]) == 'b' )
{

dim[b]=(dimoriz[b] * dimvert[b]);
costo[b]=(dim[b] / 4)* strtol(argv[2], NULL, 0);
}
else
{
if ( tolower(colori[b]) == 'v' )
{

dim[b]=dimoriz[b]* dimvert[b];
costo[b]=(dim[b] / 4)* strtol(argv[3], NULL, 0);
}
else
{
if ( tolower(colori[b]) == 'g' )
{

dim[b]=dimoriz[b] * dimvert[b];
costo[b]=(dim[b] / 4)* strtol(argv[4], NULL, 0);
}
}
}
}
}
}
}
else
{
dimparz=0;
costoparz=0;
for (c=0;c<=a;c++)
{
dimtot=dimparz+dim[c];
costotot=costoparz+costo[c];
}
costomedio=costotot/dimtot;
printf("\nArea Totale : %f",dimtot);
printf("\nCosto totale : %f", costotot);
printf("\nCosto medio : %f",costomedio);
}
return (0);
}

questo è il programma finito, sembra funzionare tutto se non fosse che quando lo compilo mi dice syntex error at the end of input all'ultima riga...
un altra cosa sarebbe meglio un ciclio while al posto del for?

andbin
04-12-2006, 17:15
questo è il programma finito, sembra funzionare tutto se non fosse che quando lo compilo mi dice syntex error at the end of input all'ultima riga...Se ho contato correttamente le graffe, ne manca una di chiusura prima del return alla fine main.

Inoltre invece di fare:
if (...)
{
}
else
{
if (...)
{
}
}

fai più semplicemente:
if (...)
{
}
else if (...)
{
}
else if (....)
......
Risparmieresti graffe, tempo e renderesti il codice più snello e leggibile.