/*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"); } }