PDA

View Full Version : [C]Help, vari bug nel programma :(


viridovix1
25-07-2005, 23:09
[C]Help, vari bug nel programma
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

ilsensine
26-07-2005, 09:03
Ti prego, riposta il codice indentato e utilizzando i tag [code] altrimenti è illeggibile...

Fenomeno85
26-07-2005, 09:27
Ti prego, riposta il codice indentato e utilizzando i tag [code] altrimenti è illeggibile...

*

~§~ Sempre E Solo Lei ~§~

Macco
26-07-2005, 13:16
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <ctype.h>
//#include "funzioni.h"
//#include "header.h"
//#include <stdio.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();

// sparse xchè ho fatto vari tentativi (inutil idirei )

// 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);
else printf(" ");//aggiunto per metter a posto la stampa
}
}
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 :");

fflush(stdin);//mancava e quindi andava a prendere un carattere precedente

scanf("%c,%c",&x,&y);
//consiglio se accetti anche caratteri minuscoli (visto che usi toupper) allora metti queste condizioni nel while
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[2];
//c'erano problemi con scanf che sovrascriveva cinema[0][0]


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;
}



Io il c lo conosco solo di vista, quindi potrei aver cannato di brutto, comunque cosi' mi sembra che funzioni.
Ciao

Ps Scusate se non ho identato. :rolleyes: