Newsgroup: it.comp.programmare.win32
Titolo: Help programma che non funge [lungo]

Salve a tutti, ho appena iniziato a programmare in C e nel tentativo di
svolgere un tema d'esame ho incontrato qualche problema.
Lo scopo del programma č, o meglio sarebbe quello di "gestire un ristorante"
nel senso che l'utente deve scegliere tra calcolare un conto oppure ampliare
il file menu.dat (nel codice ho messo l'opzione "w" per le prove) mediante
inserimento di un codice piatto, nome e suo prezzo.
Se avete pazienza mi sapreste dire perchč alla scelta  case '1' non posso
immettere nomi con spazi e subito dopo, digitando il prezzo il programma
termina dopo aver digitato una sola cifra??
Come vanno scritti gli argomenti di scanf visto che in lettura da file tutto
funziona correttamente??
grazie
davide.
/*PROGRAMMA PER LA GESTIONE DI UN RISTORANTE */
#include <stdio.h>
#include <conio.h>
#define MAX_N    25
#define MAX    30
#define MAX_CONTO  30
/*VARIABILI GLOBALI E STRUTTURE*/
int num_piatti = 0, num_pay = 0;
long int totale = 0;
char dummy[MAX];
struct menu {
 int codice;
   char nome[MAX_N];
   long int prezzo;
};
struct conto {
 int codice;
   long int prezzo;
   int quantita;
};
struct menu piatto[MAX];
struct conto conto[MAX_CONTO];
/* FUNZIONI */
int input(struct menu piatto[]);
void ordina(struct menu piatto[]);
void stampa(struct menu piatto[]);
void confronta(struct menu piatto[], struct conto conto[]);
/* main */
int main(void)
{
 int i = 0, j;
   char risp, c;
   clrscr();
   printf("\n\t\tPROGRAMMA PER LA GESTIONE DI UN RISTORANTE\n\n");
   input(piatto);
 printf("Che cosa devo fare?\n\n[1] :\tAggiungiere piatto\n[2] :\tStampare
scontrino\n[3] :\tUscire\n\n\t");
   scanf("%c", &risp);
   switch(risp)
   {
      case '1' :
        printf("\nInserire codice piatto\n\n");
        scanf("%d", &piatto[num_piatti].codice);
        printf("\nInserire nome del piatto\n");
        scanf(" %[ ^\n]", piatto[num_piatti].nome);  /* COME devo impostare
gli argomenti di scanf perchč legga correttamente alche gli spazi??( in
lettura da file lo fa senza problemi)
        printf("\nInserire il prezzo\n\n");
        scanf("%ld", &piatto[num_piatti].prezzo);
        ordina(piatto);
        stampa(piatto);
        while(!kbhit());
        break;
      case '2' :
         printf("\n\tCALCOLO PREZZO CONSUMAZIONI\n\nInserire numero piatto
da pagare e loro codice separati da invio\n\n"
         "Per uscire premere 'e' seguito da invio\n");
   for(j = 0; (c = getchar())!= 'e'; ++j)
         {
          scanf("%d %d", &conto[i].quantita, &conto[i].codice);
          if(conto[i].quantita > 0)
          {
             ++i;
             ++num_pay;
            }
          else
          break;
         }
         clrscr();
         confronta(piatto, conto);
         while(!kbhit());
         break;
      case '3' :
       printf("\nEsecuzione terminata\n");
       while(!kbhit());
       break;
      default :
       printf("\nErrore, comando non previsto,\n");
         while(!kbhit());
   break;
   }
 return 0;
}
/* FUNZIONI UTILIZZATE */
int input(struct menu piatto[])
{
   int i;
   FILE *ifp;
   ifp = fopen("\\menu.dat", "r");
   for(i = 0; fscanf(ifp," %d %[^\n] %ld ", &piatto[i].codice,
piatto[i].nome, &piatto[i].prezzo) == 3; ++i)
    ++num_piatti;
   fclose(ifp);
   return num_piatti;
}
void ordina(struct menu piatto[])
{
 int i, j;
   struct menu temp;
   for(j = 0; j < num_piatti - 1; ++j)
    for(i = j + 1; i < num_piatti; ++i)
      if(piatto[i].codice < piatto[j].codice)
      {
         temp = piatto[j];
         piatto[j] = piatto [i];
         piatto[i] = temp;
      }
}
void stampa(struct menu piatto[])
{
  int i;
   FILE *ofp;
   ofp = fopen("\\dati2.dat", "w");
   for(i = 0; i < num_piatti + 2; ++i)
    fprintf(ofp, "%d \n%s \n%ld \n\n", piatto[i].codice, piatto[i].nome,
piatto[i].prezzo);
   fclose(ofp);
}
void confronta( struct menu piatto[], struct conto conto[])
{
 int i, j;
   for(i = 0; i < num_piatti; ++i)
    for(j = 0; j < num_pay; ++j)
       if(conto[j].codice == piatto[i].codice)
         {
          printf("\n%40s\t %2d %8ld\n", piatto[i].nome, conto[j].quantita,
piatto[i].prezzo*conto[j].quantita);
            totale += piatto[i].prezzo*conto[j].quantita;
         }
   for(i = 0; i < 60; ++i)
    printf("-");
      printf("\n\n");
   printf("Totale    %50ld",totale);
}
/*File menu.dat
3020
Pinot grigio
11000
1477
Filetto al pepe verde
13000
545
Branzino arrosto
21000
223
Trenette al pesto
8000
*/

funziona correttamente??
scanf e' una funzione pericolosa che non va mai usata, usa
fgets per i tuoi scopi, ricordandoti che quest'ultima
memorizza nella stringa letta anche la sequenza new-line
finale.
In ogni caso, scanf si ferma al primo spazio che incontra e
lascia, comunque, nel buffer, la sequenza di new-line, per
cui due scanf successive, senza che il buffer venga in
qualche modo svuotato, non hanno l'effetto desiderato.
Dopo ogni scanf, ti suggerisco di inserire una funzione del
tipo:
void kbdflush()
{
     while (getchar() != '\n') ;
}
Che svuota il buffer di tastiera.
In ogni caso, se vuoi discutere di argomenti prettamente
attinenti al C, rivolgiti a it.comp.lang.c (lo frequento
anch'io).
--
Andrea Laforgia - walkietalkie(at)
libero.it
http://www.geocities.com/AndreaLaforgia