Azzurra IRC Network Forum

[C]Help,vari bug nel programma

viridovix · 25/07/2005 22:54 · #1
Questo programma simula un servizio di prenotazione posti cinema (dalla stessa macchina x ora).
Purtroppo presenta una serie di problemi :( che nn riesco ancora a risolvere.LA compilazione perlomeno è ok.

Da i seguenti problemi:
1) Usando la prima volta l'opzione a)visualizza posti liberi
nonostante siano tutti posti non prenotati la matrice appare cosi

A2 A3
B1 B2 B3
C1 C2 C3

nel main ho aggiunto la chiamata alla funzione che visualizza i posti x vedere se combinava la stessa cosa invece visualizza anche il posto A1.
Ma se poi uso la chiamata se lo mangia anche se è presente(infatti è possibile prenotarlo).

2)altro bug:
Se ad esempio il posto B2 è libero e lo prenoto
su schermo stampa:
- posto non disponibile
-Inserisci il posto
-Il posto è vuoto lo riserviamo a voi

IN effetti il posto viene cmq prenotato anche se nn ci dovrebbero essere le prime 2 stampate

3) questo piu' che altro è un problema estetico
Se prenoto un posto ad esempio A1 poi visualizza la
matrice cosi

A2 A3
B1 B2 B3
C1 C2 C3

Ora ecco il codice del file .h:

struct posto
{
unsigned char idPosto[3];
int flag;
};

//typedef struct posto cine[3][3];
// funzioni

void inizializza_cinema(struct posto cine[3][3]);
int cinema_pieno(struct posto cine[3][3]);
void posti_vuoti(struct posto cine[3][3]);
//int cinema_pieno(struct posto cine[3][3]);
void assegna_posto(struct posto cine[3][3],unsigned char x, unsigned char y);
void controllo_posto(struct posto cine[3][3]);
void menu();
_______________________________________________

ora il file principale: x ora nn fate caso alle // sparse xchè ho fatto vari tentativi (inutil idirei :( )

#include <stdio.h>
//#include <stdlib.h>
#include "header.h"
//#include "funzioni.h"
//#include "header.h"
//#include <stdio.h>
// Funzioni
//
//Inizializza la struttura cinema a 0 (posti vuoti)
//con idPosto vettore della posizione
//
void inizializza_cinema(struct posto cine[3][3])
{
unsigned char i,j;
for(i='A';i<='C';i++)
{
for(j='1';j<='3';j++)
{
cine[i-'A'][j-'1'].flag=0;
cine[i-'A'][j-'1'].idPosto[0]=i;
cine[i-'A'][j-'1'].idPosto[1]=j;
cine[i-'A'][j-'1'].idPosto[2]='\0';
}
}
}
//
//Stampa posti non prenotati
//
void posti_vuoti(struct posto cine[3][3])
{
//system("clear");
unsigned char i,j;
printf("\n\n");
for(i='A';i<='C';i++)
{
printf("\n");
for(j='1';j<='3';j++)
{
if (cine[i-'A'][j-'1'].flag==0) printf("%s\t",cine[i-'A'][j-'1'].idPosto);
}
}
printf("\n\n");
//getchar();
}
//
//
//Controlla se il cinema è pieno
//e restituisce il numero dei posti vuoti
//
int cinema_pieno(struct posto cine[3][3])
{
int conta=0;
unsigned char i,j;
//
for(i='A';i<='C';i++)
{
for(j='1';j<='3';j++)
{
if(cine[i-'A'][j-'1'].flag==1) conta++;
}
}
return conta;
};
//
//assegna il posto alla persona
void assegna_posto(struct posto cine[3][3],unsigned char x,unsigned char y)
{
printf("\nil posto è vuoto lo riserviamo a voi!!");
cine[x-'A'][y-'1'].flag=1;
};
//
//Controlla i posti se sono assegnati oppure no
//
void controllo_posto(struct posto cine[3][3])
{
int flag_cinema_pieno;
unsigned char x,y;
printf("\nInserisci il posto che vuoi prenotare diviso da virgola, fila,posto :");
scanf("%c,%c",&x,&y);
while ((x<'A')||(x>'C')||(y<'1')||(y>'3'))
{
printf("\nPosto non disponibile");
printf("\nInserisci il posto che vuoi prenotare diviso da virgola, fila,posto :");
scanf("%c,%c",&x,&y);
}
fflush(stdin);
x=toupper(x);
y=toupper(y);
flag_cinema_pieno=cinema_pieno(cine);
if (flag_cinema_pieno!=9) //se il cinema nn è pieno
//controlla posto
{
if (cine[x-'A'][y-'1'].flag==0)
{ assegna_posto(cine,x,y);
}
else //il posto è già occupato
{
printf("\nIl posto è già prenotato");
printf("\nI posti liberi sono");
posti_vuoti(cine/*[3][3]*/);
//controllo_posto(cine);
/*printf("\nInserisci il posto che vuoi prenotare diviso da virgola, fila,posto :");
scanf("%c,%c",&x,&y);
fflush(stdin);
x=toupper(x);
y=toupper(y);
assegna_posto(cine,x,y);*/

}

}
else printf("Cinema pieno,oggi disco!!");
};
//
//stampa menu scelte opzioni
//
void menu()
{
//system("clear");
printf("\n");
printf("****************************\n");
printf("* MENU *\n");
printf("****************************\n");
printf("a) visualizza posti vuoti\n");
printf("b) prenota posto \n");
printf("c) disconnetti \n");
printf("\n inserisci scelta prego \n");
};



int main(int argc, char *argv[])
{
struct posto cinema[3][3];
char scelta[1];
inizializza_cinema(cinema);
posti_vuoti(cinema);
menu();
scanf("%s",scelta);
//printf("\n");
while (strcmp(scelta,"c")!=0)
{ //printf("\n");
if (strcmp(scelta,"a")==0) posti_vuoti(cinema);
else if (strcmp(scelta,"b")==0) controllo_posto(cinema);
else
{
printf("\nripeti scelta\n");
sleep(2);
}
menu();
scanf("%s",scelta);
}
return 0;
}


Mi serve una manona ,grazie a chiunque si interessi :D
viridovix · 04/08/2005 22:25 · #2
nn so se ho impostato male la richiesta che quindi nn meritava risposta, cmq nn ho mollato e sti problemi li ho risolti.Ho modificato intanto un po' il codice migliorandolo e poi ho appreso che la fflush nn serve a molto perche' forza la scrittura solo sugli output buffer (quindi stdout e stderr al limite) l'ho scoperto a mi e spese e poi bazzicando x la rete ho avuto conferma.
LA soluzione è usare un while con con una getchar() e x migliorare il tutto la si puo' definire come una macro cosi:
#define fflush(stdin) while ((getchar()) != '\n') e li problema è risolto.
Quindi la soluzione è questa e in sostanza il problema è che nel buffer rimane"\n" dalla volta precedente che si è premuto invio , per questo con quel while si cattura il \n che nn rompe +