Newsgroup: it.comp.lang.c
Titolo: Programma che non funge Aiuto [lungo e di un principiante]

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
*/

 ha scritto nel messaggio
news:9nu9hk$g8e$1...@pegasus.tiscalinet.it...


Quotiamo per piacere
Dome