Ir ao conteúdo
  • Cadastre-se

ESTACIONAMENTO EM C


carolfera

Posts recomendados

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 =)

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!