Ir ao conteúdo
  • Cadastre-se

Vericar a exitencia de uma palavra


yanmartins

Posts recomendados

Boa tarde,

 

Eu tenho um projeto onde devo fazer um estacionamento em C.

O programa precisa coletar placa do veículo e data e hora do sistema.

Usando o código abaixo eu consigo coletar a data e hora de entrada e saída, porém eu queria que antes de fazer a coleta de data e hora de saída, o programa verificasse se o veículo existe no estacionamento.

 

OBSERVAÇÕES:

O programa irá criar 3 arquivos .txt são eles arquivo de entrada, arquivo de saída, histórico.

IGNORE "GERAR HISTÓRICO", ele é só um teste (em "GERAR HISTÓRICO",  ele coletaria tudo que estivesse armazenado na estrutura e geraria o arquivo: historico.txt)

 

Alguém sabe me dizer o que devo fazer?

 

 

#include <stdio.h>
#include <time.h>

struct Tveiculo{
char placa[7];
char data_sistema_entra[100];
char hora_sistema_entra[100];
char data_sistema_sai[100];
char hora_sistema_sai[100];} carro[10];


// FUNCAO PARA FORMATACAO DA HORA
char *format(int number);
// FUNCAO PARA RETORNAR DATA
char *data(void);
// FUNCAO PARA RETORNAR HORA
char *hora(void);


int main(){

  int opcao;
  int i=0;
  int j;
  int placadig[7];

  while (opcao != 4){

  printf("Digite a opção desejada\n");
  printf("1. ENTRADA DE VEÍCULOS\n");
  printf("2. SAÍDA DE VEÍCULOS\n");
  printf("3. GERAR HISTÓRICO\n");
  printf("4. FECHAR ESTACIONEMENTO\n");
  scanf("%d", &opcao);

  switch(opcao){

  case 1: //ENTRADA DE VEÍCULOS
    printf("Digite a placa do veículo\n");
    scanf("%s", carro[i].placa);

    sprintf(carro[i].data_sistema_entra,"%s",data());
    sprintf(carro[i].hora_sistema_entra,"%s",hora());

    FILE *file_entra;
    file_entra = fopen("C:\\Users\\Yan Martins\\Desktop\\historico\\entrada.txt", "a");
    fprintf(file_entra,"PLACA DO VEÍCULO: %s\n",carro[i].placa);
    fprintf(file_entra,"DIA DE ENTRADA: %s\n",carro[i].data_sistema_entra);
    fprintf(file_entra,"HORA DE ENTRADA: %s\n\n\n",carro[i].hora_sistema_entra);
    fclose(file_entra);
    i++;

    break;

  case 2: //SAÍDA DE VEÍCULOS
    printf("Digite a placa do veículo\n");
    scanf("%s", placadig);

    for(j=0; j<30; j++){
    if(carro[j].placa == placadig[7]){

        sprintf(carro[j].data_sistema_sai,"%s",data());
        sprintf(carro[j].hora_sistema_sai,"%s",hora());

        FILE *file_sai;
        file_sai = fopen("C:\\Users\\Yan Martins\\Desktop\\historico\\saida.txt", "a");
        fprintf(file_sai,"PLACA DO VEÍCULO: %s\n",carro[j].placa);
        fprintf(file_sai,"DIA DE SAÍDA: %s\n",carro[j].data_sistema_sai);
        fprintf(file_sai,"HORA DE SAÍDA: %s\n\n\n",carro[j].hora_sistema_sai);
        fclose(file_sai);

    }
    else{
        printf("\nPLACA NÃO EXISTE\n");
    }
    }
    break;

  case 3: //GERA HISTÓRICO

    printf("PLACA DO VEÍCULO: %s\n",carro[0].placa);
    printf("DIA DE SAÍDA: %s\n",carro[0].data_sistema_sai);
    printf("HORA DE SAÍDA: %s\n\n\n",carro[0].hora_sistema_sai);

    printf("PLACA DO VEÍCULO: %s\n",carro[1].placa);
    printf("DIA DE SAÍDA: %s\n",carro[1].data_sistema_sai);
    printf("HORA DE SAÍDA: %s\n\n\n",carro[1].hora_sistema_sai);

    printf("PLACA DO VEÍCULO: %s\n",carro[2].placa);
    printf("DIA DE SAÍDA: %s\n",carro[2].data_sistema_sai);
    printf("HORA DE SAÍDA: %s\n\n\n",carro[2].hora_sistema_sai);
    break;

  case 4: //FIM DO PROGRAMA
    printf("ESTACIONAMENTO FECHADO\n");
    break;
  }
  }

}

// FUNCAO PARA FORMATACAO DA HORA
char *format(int number){
   char    *retorno,
      ret[100];
   int    i;

   if (number < 10){
      sprintf(ret,"0%d",number);
      retorno = ret;
      return retorno;
   }
   else{
      sprintf(ret,"%d",number);
      retorno = ret;
      return retorno;
   }
}



// FUNCAO PARA RETORNAR DATA
char *data(void){

   int dia,mes,ano;
   char   var1[100],
      var2[100],
      var3[100],
      var4[100],
      *dataPtr;
   struct tm *local;
   time_t t;

   t = time(NULL);
   local = localtime(&t);

   dia = local -> tm_mday;
   mes = local -> tm_mon + 1;
   ano = local -> tm_year + 1900;

   sprintf(var1,"%s",format(dia));
   sprintf(var2,"%s",format(mes));
   sprintf(var3,"%s",format(ano));

   sprintf(var4,"%s/%s/%s",var1,var2,var3);

   // retorna data no formato dd:MM:yyyy com um ponteiro
   dataPtr = var4;
   return dataPtr;
}

// FUNCAO PARA RETORNAR HORA
char *hora(void){

   int   hora,minuto,segundo;
   char   var1[100],
      var2[100],
      var3[100],
      var5[100],
      *retorno;

   struct tm *local;
   time_t t;

   t = time(NULL);
   local = localtime(&t);

   // obtem hora, minuto e segundo e os aloca em uma variavel do tipo inteiro
   hora   =   local -> tm_hour;
   minuto   =    local -> tm_min;

   // por algum motivo precisa converter os valores retornados pelos ponteiros
   // da funcao em variaveis do tipo char
   sprintf(var1,"%s",format(hora));
   sprintf(var2,"%s",format(minuto));

   // cria a variavel de retorno dos dados e cria um ponteiro para essa variavel
   sprintf(var5,"%s:%s",var1,var2);

   // retorna hora no formato hh:mm:ss com um ponteiro
   retorno = var5;
   return retorno;
}

 

Link para o comentário
Compartilhar em outros sites

Deverias ativar o flag -wall (warning all ou todos as advertências) para lhe auxiliar na programação.
-wall.JPG

 

Com isso ativado coisas como essas que mostrarei a continuação poderiam ser prevenidas:
1º nessa linha você declara placadig como int:int.JPG

Depois tenta ler como se fosse um string:int como string.JPG
Trata-se de um int o especificador é %d. porém siga o seguinte erro...


2º Pior ainda que o erro anterior você tenta comparar um string com um int:Comparação entre ponteiro e int.JPG

Que você espera conseguir com isso?
Meu conselho é você comparar 2 variáveis do mesmo tipo, pois nunca serão iguais entre tipos diferentes. E pior ainda... se são 2 strings deveria ser usado a função strcmp(str1, str2) para efetuar a comparação.

Variaveis por um tubo.JPG

Variáveis declaradas por um tubo sem usar.:atirador: 

 

Agora bem... vamos a sua consulta.
Cada vez que um carro entra é criado um conjunto de dados para o carro no arquivo entrada.txt dessa forma:
PLACA DO VEÍCULO: asdf
DIA DE ENTRADA: 10/12/2016
HORA DE ENTRADA: 22:18

E mais 3 saltos de linha

Eu sinceramente acho que você está dificultando a coisa usando 6 linhas para um só carro. Eu faria tal como:
asdf 10/12/2016 22:18

ou:
asdf,10/12/2016,22:18

Por que faria assim? simples...
Faria a leitura de toda a linha e jogaria tudo em uma string( str="asdf 10/12/2016 22:18" ). Usaria const char *find = strstr(str, placa); if ( find != NULL ){/*ENCONTROU*/}else{/*NAO ENCONTROU*/}

O anterior se repetiria para cada linha do arquivo e seria bem simples buscar a placa. O esquema montado ficaria mais ou menos:

char placa[]= "1234ABC";
FILE *f = fopen("entrada.txt", "r");
while( fscanf(f, "%499[^\n]%*c", str) != EOF ){
const char *find = strstr(str, placa); //incluir string.h para usar strstr
if ( find != NULL ){
/*INFORMAR QUE ENCONTROU*/
break; // E saimos. O carro está dentro
}else{
/*NAO ENCONTROU... NAO FAZER NADA, CONTINUAR BUSCANDO.*/
}
}

O esquema é mais ou menos esse, pode estar um pouco errado mas seria isso se cada carro ocupasse uma só linha.

Se quiser continuar com as 6 linhas para cada carro o código anterior acho que também funciona, pois ele faz a leitura de linha por linha e compara com a placa buscada, mas seria uma forma incorreta de fazer a coisa. O correto seria ler a linha da placa comparar, saltar 5 linhas e repetir o processo, porém isso poderia ser ainda pior e dar erros, por isso recomendo usar uma só linha para cada carro.




 

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...