Edual Postado Dezembro 7, 2011 Denunciar Share Postado Dezembro 7, 2011 /*programa em C, Controle de Estacionamento com Menu,--------------------------------------------------------------------------------Se você executa o programa e tenta gravar um veículo direto, funciona.Se você tenta gravar outro veículo, desde que não seja uma placa repetida funciona também...Mas se você tenta gravar uma placa que já existe, a mensagem de erro é mostrada e ele pede outra placa(como esperado), mas depois de entrar com o resto dos dados (marca, modelo e cor) ele volta a pedir os dados desde o modelo, e as vezes desde a placa, eu não consigo achar erro no meu algoritmo, será que é porque eu fiquei chamando o procedimento "INSERIR(I)" passando a variável I por parâmetro várias vezes? Será que preciso colocar tudo dentro de laços de repetição invez de ficar chamando o procedimento de novo caso alguma condição não seja respeitada?O algoritmo tá fácil de analisa, até agora só fiz alguns procedimentos, o que inicializa os campos STATUS pra dizer se pode ou não gravar naquele registro, o menu com a opção 1 chamando o CADASTRAR_VEICULO() que testa se tem algum registro livre ai chama o INSERIR(I) passando o I que é a posição do vetor com o registro livre, acho que o erro tá no procedimento INSERIR mesmo... Conto com a ajuda do grupo, ________________________________________________________________________________________________________________________________________________________________Código: */#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <ctype.h>#include <string.h>void INICIALIZA();void INSERIR(int I);void CADASTRAR_VEICULO();void CADASTRAR_VAGA();void CONTROLAR_ESTACIONAMENTO();void CONSULTAR_VAGAS();void LISTAR_OCUPADAS();void LISTAR_VEICULOS();struct{ char PLACA[8], MODELO[20], MARCA[20], COR[10]; int STATUS;}CARRO[10];int NVEI=0; //contador de veículos cadastrados//int NVAG=0; //contador de vagas cadastradas//-----------------------------------------------------------------------------main(){ int OP; FILE* P; INICIALIZA(); //abre o arquivo pro fopen "w" não substituir o que já existe P=fopen("CARRO.txt", "r"); fread(&CARRO, sizeof(CARRO), 1, P); fclose(P); do{ printf("CONTROLE DE ESTACIONAMENTO\n\n"); printf("1. Cadastrar veiculo\n2. Cadastrar vaga\n3. Controle do estacionamento\n"); printf("4. Consultar vagas\n5. Listar vagas ocupadas\n6. Listar veiculos\n7. Sair\n\nOpcao: "); scanf("%d", &OP); switch(OP) { case 1: { system("cls"); CADASTRAR_VEICULO(); break; } case 2: { system("cls"); CADASTRAR_VAGA(); break; } case 3: { system("cls"); CONTROLAR_ESTACIONAMENTO(); break; } case 4: { system("cls"); CONSULTAR_VAGAS(); break; } case 5: { system("cls"); LISTAR_OCUPADAS(); break; } case 6: { system("cls"); LISTAR_VEICULOS(); break; } case 7: break; default: { system("cls"); printf("Opcao invalida!\nEnter para voltar ao menu"); getch(); system("cls"); } } }while(OP!=7); getchar();}//-----------------------------------------------------------------------------void INICIALIZA(){ int I; for(I=0; I<10; I++) CARRO.STATUS=0; }//-----------------------------------------------------------------------------void INSERIR(int I){ char PL[8]; int I2, TESTE, TAM_PLACA; FILE *P; puts("Digite a placa: "); fflush(stdin); gets(PL); strupr(PL);//deixa caracteres da placa em maiúsculo for(I2=0; I2<10; I2++) { if(strcmp(PL, CARRO[i2].PLACA)==0) { printf("\nVeiculo já cadastrado, informe outra placa\n\n"); INSERIR(I); } } strcpy(CARRO.PLACA, PL); TAM_PLACA=strlen(CARRO.PLACA); if(TAM_PLACA!=7) { if(TAM_PLACA<7) { printf("\nPlaca invalida\nDigitos insuficientes\n\n"); INSERIR(I); } else//(TAM_PLACA>7) { printf("\nPlaca invalida\nMuitos digitos\n\n"); INSERIR(I); } } //testa se 3 primeiros digitos são letras for(I2=0; I2<3; I2++) { TESTE=isalpha(CARRO.PLACA[i2]);//retorna 1 se for letra if(TESTE==0) { printf("\nPlaca invalida\nTres primeiros digitos devem ser letras!\n\n"); INSERIR(I); } } //testa se 4 últimos digitos não são letras for(I2=3; I2<7; I2++) { TESTE=isalpha(CARRO.PLACA[i2]);//retorna 1 se for letra if(TESTE==1) { printf("\nPlaca invalida\nQuatro ultimos digitos devem ser numeros!\n\n"); INSERIR(I); } } puts("\nDigite o modelo: "); fflush(stdin); gets(CARRO.MODELO); //deixa string em minúsculo strlwr(CARRO.MODELO); //deixa primeiro caractere maiúsculo CARRO.MODELO[0]=toupper(CARRO.MODELO[0]); puts("\nDigite a marca: "); fflush(stdin); gets(CARRO.MARCA); strlwr(CARRO.MARCA); CARRO.MARCA[0]=toupper(CARRO.MARCA[0]); puts("\nDigite a cor: "); fflush(stdin); gets(CARRO.COR); strlwr(CARRO.COR); CARRO.COR[0]=toupper(CARRO.COR[0]); CARRO.STATUS=1; P=fopen("CARRO.txt", "w"); fwrite(&CARRO, sizeof(CARRO), 1, P); fclose(P);}//-----------------------------------------------------------------------------void CADASTRAR_VEICULO(){ int I, FLAG=1; for(I=0; I<10; I++) { if(CARRO.STATUS==0) { INSERIR(I); FLAG=0; system("cls"); break; } } if(FLAG==1) { printf("Sem espaco para cadastrar\nEnter voltar ao menu..."); getch(); system("cls"); }}//-----------------------------------------------------------------------------void CADASTRAR_VAGA(){}//-----------------------------------------------------------------------------void CONTROLAR_ESTACIONAMENTO(){}//-----------------------------------------------------------------------------void CONSULTAR_VAGAS(){}//-----------------------------------------------------------------------------void LISTAR_OCUPADAS(){}void LISTAR_VEICULOS(){ int I, X=1; FILE *P; P=fopen("CARRO.txt", "r"); fread(&CARRO, sizeof(CARRO), 1, P); for(I=0; I<10; I++) { if(CARRO.STATUS==1) { printf("Veiculo %d\nPlaca: %s\t Modelo: %s\t Marca: %s\t Cor: %s\n\n", I+1, CARRO.PLACA, CARRO.MODELO, CARRO.MARCA, CARRO.COR); X=0; } } if(X==0) { printf("\nEnter voltar ao menu..."); getch(); system("cls"); } else { puts("Nenhum veiculo cadastrado\nEnter voltar ao menu..."); getch(); system("cls"); }} Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Edual
/*programa em C, Controle de Estacionamento com Menu,
--------------------------------------------------------------------------------
Se você executa o programa e tenta gravar um veículo direto, funciona.Se você tenta gravar outro veículo,
desde que não seja uma placa repetida funciona também...
Mas se você tenta gravar uma placa que já existe, a mensagem de erro é mostrada e ele pede
outra placa(como esperado), mas depois de entrar com o resto dos dados (marca, modelo e cor)
ele volta a pedir os
dados desde o modelo, e as vezes desde a placa, eu não consigo achar erro no meu algoritmo,
será que é porque eu fiquei chamando o procedimento "INSERIR(I)" passando a variável I por
parâmetro várias vezes?
Será que preciso colocar tudo dentro de laços de repetição invez de ficar chamando o procedimento
de novo caso alguma condição não seja respeitada?
O algoritmo tá fácil de analisa, até agora só fiz alguns procedimentos, o que inicializa os campos
STATUS pra dizer se pode ou não gravar naquele registro, o menu com a opção 1 chamando o CADASTRAR_VEICULO()
que testa se tem algum registro livre ai chama o INSERIR(I) passando o I que é a posição do vetor com o registro
livre, acho que o erro tá no procedimento INSERIR mesmo... Conto com a ajuda do grupo,
________________________________________________________________________________
________________________________________________________________________________
Código: */
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
void INICIALIZA();
void INSERIR(int I);
void CADASTRAR_VEICULO();
void CADASTRAR_VAGA();
void CONTROLAR_ESTACIONAMENTO();
void CONSULTAR_VAGAS();
void LISTAR_OCUPADAS();
void LISTAR_VEICULOS();
struct
{
char PLACA[8], MODELO[20], MARCA[20], COR[10];
int STATUS;
}CARRO[10];
int NVEI=0; //contador de veículos cadastrados
//int NVAG=0; //contador de vagas cadastradas
//-----------------------------------------------------------------------------
main()
{
int OP;
FILE* P;
INICIALIZA();
//abre o arquivo pro fopen "w" não substituir o que já existe
P=fopen("CARRO.txt", "r");
fread(&CARRO, sizeof(CARRO), 1, P);
fclose(P);
do{
printf("CONTROLE DE ESTACIONAMENTO\n\n");
printf("1. Cadastrar veiculo\n2. Cadastrar vaga\n3. Controle do estacionamento\n");
printf("4. Consultar vagas\n5. Listar vagas ocupadas\n6. Listar veiculos\n7. Sair\n\nOpcao: ");
scanf("%d", &OP);
switch(OP)
{
case 1:
{
system("cls");
CADASTRAR_VEICULO();
break;
}
case 2:
{
system("cls");
CADASTRAR_VAGA();
break;
}
case 3:
{
system("cls");
CONTROLAR_ESTACIONAMENTO();
break;
}
case 4:
{
system("cls");
CONSULTAR_VAGAS();
break;
}
case 5:
{
system("cls");
LISTAR_OCUPADAS();
break;
}
case 6:
{
system("cls");
LISTAR_VEICULOS();
break;
}
case 7: break;
default:
{
system("cls");
printf("Opcao invalida!\nEnter para voltar ao menu");
getch();
system("cls");
}
}
}while(OP!=7);
getchar();
}
//-----------------------------------------------------------------------------
void INICIALIZA()
{
int I;
for(I=0; I<10; I++)
CARRO.STATUS=0;
}
//-----------------------------------------------------------------------------
void INSERIR(int I)
{
char PL[8];
int I2, TESTE, TAM_PLACA;
FILE *P;
puts("Digite a placa: ");
fflush(stdin);
gets(PL);
strupr(PL);//deixa caracteres da placa em maiúsculo
for(I2=0; I2<10; I2++)
{
if(strcmp(PL, CARRO[i2].PLACA)==0)
{
printf("\nVeiculo já cadastrado, informe outra placa\n\n");
INSERIR(I);
}
}
strcpy(CARRO.PLACA, PL);
TAM_PLACA=strlen(CARRO.PLACA);
if(TAM_PLACA!=7)
{
if(TAM_PLACA<7)
{
printf("\nPlaca invalida\nDigitos insuficientes\n\n");
INSERIR(I);
}
else//(TAM_PLACA>7)
{
printf("\nPlaca invalida\nMuitos digitos\n\n");
INSERIR(I);
}
}
//testa se 3 primeiros digitos são letras
for(I2=0; I2<3; I2++)
{
TESTE=isalpha(CARRO.PLACA[i2]);//retorna 1 se for letra
if(TESTE==0)
{
printf("\nPlaca invalida\nTres primeiros digitos devem ser letras!\n\n");
INSERIR(I);
}
}
//testa se 4 últimos digitos não são letras
for(I2=3; I2<7; I2++)
{
TESTE=isalpha(CARRO.PLACA[i2]);//retorna 1 se for letra
if(TESTE==1)
{
printf("\nPlaca invalida\nQuatro ultimos digitos devem ser numeros!\n\n");
INSERIR(I);
}
}
puts("\nDigite o modelo: ");
fflush(stdin);
gets(CARRO.MODELO);
//deixa string em minúsculo
strlwr(CARRO.MODELO);
//deixa primeiro caractere maiúsculo
CARRO.MODELO[0]=toupper(CARRO.MODELO[0]);
puts("\nDigite a marca: ");
fflush(stdin);
gets(CARRO.MARCA);
strlwr(CARRO.MARCA);
CARRO.MARCA[0]=toupper(CARRO.MARCA[0]);
puts("\nDigite a cor: ");
fflush(stdin);
gets(CARRO.COR);
strlwr(CARRO.COR);
CARRO.COR[0]=toupper(CARRO.COR[0]);
CARRO.STATUS=1;
P=fopen("CARRO.txt", "w");
fwrite(&CARRO, sizeof(CARRO), 1, P);
fclose(P);
}
//-----------------------------------------------------------------------------
void CADASTRAR_VEICULO()
{
int I, FLAG=1;
for(I=0; I<10; I++)
{
if(CARRO.STATUS==0)
{
INSERIR(I);
FLAG=0;
system("cls");
break;
}
}
if(FLAG==1)
{
printf("Sem espaco para cadastrar\nEnter voltar ao menu...");
getch();
system("cls");
}
}
//-----------------------------------------------------------------------------
void CADASTRAR_VAGA()
{}
//-----------------------------------------------------------------------------
void CONTROLAR_ESTACIONAMENTO()
{}
//-----------------------------------------------------------------------------
void CONSULTAR_VAGAS()
{}
//-----------------------------------------------------------------------------
void LISTAR_OCUPADAS()
{}
void LISTAR_VEICULOS()
{
int I, X=1;
FILE *P;
P=fopen("CARRO.txt", "r");
fread(&CARRO, sizeof(CARRO), 1, P);
for(I=0; I<10; I++)
{
if(CARRO.STATUS==1)
{
printf("Veiculo %d\nPlaca: %s\t Modelo: %s\t Marca: %s\t Cor: %s\n\n", I+1, CARRO.PLACA, CARRO.MODELO, CARRO.MARCA, CARRO.COR);
X=0;
}
}
if(X==0)
{
printf("\nEnter voltar ao menu...");
getch();
system("cls");
}
else
{
puts("Nenhum veiculo cadastrado\nEnter voltar ao menu...");
getch();
system("cls");
}
}
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.