Ir ao conteúdo
  • Cadastre-se
carolfera

ESTACIONAMENTO EM C

Recommended Posts

Por favor, alguem pode me ajudar
Preciso entregar esse trabalho mas ainda estou muito crua e nao dá tempo para eu estudar e fazer o trabalho agora, preciso entregar pra depois estudar e aprender direito.
Eu achei essa postagem mas nao entendi a solução dada no final. Alguem pode me ajudar. Beijos

 

*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 invés 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, 
 

#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[I].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 ja cadastrado, informe outra placa\n\n");         INSERIR(I);         }      }        strcpy(CARRO[I].PLACA, PL);      TAM_PLACA=strlen(CARRO[I].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[I].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[I].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[I].MODELO);   //deixa string em minúsculo   strlwr(CARRO[I].MODELO);   //deixa primeiro caractere maiúsculo   CARRO[I].MODELO[0]=toupper(CARRO[I].MODELO[0]);     puts("\nDigite a marca: ");   fflush(stdin);   gets(CARRO[I].MARCA);   strlwr(CARRO[I].MARCA);   CARRO[I].MARCA[0]=toupper(CARRO[I].MARCA[0]);   puts("\nDigite a cor: ");   fflush(stdin);   gets(CARRO[I].COR);   strlwr(CARRO[I].COR);   CARRO[I].COR[0]=toupper(CARRO[I].COR[0]);   CARRO[I].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[I].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[I].STATUS==1)                  {      printf("Veiculo %d\nPlaca: %s\t Modelo: %s\t Marca: %s\t Cor: %s\n\n", I+1, CARRO[I].PLACA, CARRO[I].MODELO, CARRO[I].MARCA, CARRO[I].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");    }}BOM, AQUI ESTÁ O PROBLEMA:      for(I2=0; I2<10; I2++)      {          if(strcmp(PL, CARRO[I2].PLACA)==0)         {         printf("\nVeiculo ja cadastrado, informe outra placa\n\n");         INSERIR(I);         }      }

Como você já disse na sua pergunta, se chamar a função "INSERIR(I)", ele vai chamar uma nova funçao INSERIR com o parametro I, porém ao sair da função nova que foi chamada, ele volta pra esse ponto da primeira funcao inserir chamada, então ele vai continuar a execução do programa, "descendo" pra parte que ele pergunta todos dados do carro novamente.
então em vez de chamar a funçao inserir de novo, faça um laço pedindo para ele digitar apenas a placa novamente, enquanto a placa digitada for repetida.

Se não entendeu posta aí que eu tento explicar melhor =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×