Ir ao conteúdo
  • Cadastre-se

C Problema em programa C


Posts recomendados

Alguem pode me ajudar a resolver? Não consigo fazer funcionar a função de verificar se a placa inserida está no formato AAA0000. Está contido na função inserirveiculo().

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

// Programa opcional para resetar o sistema ao iniciar
void resetarsistema() {

    int resetar;
    FILE *f;
    printf("Deseja resetar o sistema antes de iniciar? (1= sim | 2= não):  ");
    scanf("%d", &resetar);

    switch(resetar) {
        case 1: {
            f=fopen("carros.txt", "w");
            remove("carros.txt");
            f=fclose(f);
            system("cls");
            printf("Reiniciando");
            _sleep(300);
            printf(".");
            _sleep(300);
            printf(".");
            _sleep(300);
            printf(".");
            _sleep(300);
            printf(".");
            _sleep(300);
            printf(".");
            _sleep(1000);
            system("cls");
            printf("Sistema reiniciado com sucesso!");
            _sleep(4000);
            system("cls"); // Vários sleeps para criar efeito de loading
            break;
            }

        case 2: {
            system("cls");
            break;
        }

        default: {
            printf("Opção inválida!");
            _sleep(4000);
            system("cls");
            resetarsistema();
            break;
            }
    }
}

// Variavel para controlar o tempo no formato correto
struct Tempo {
    char hora[7];
};

// Variaveis relacionadas aos veículos
struct cadastro  {
    int status, tipo, tipon;
    char placa[8], modelo[15], marca[15], cor[15], proprietario[20];
    struct Tempo entrada;
}carro[20];

// Retorna 0/false caso a placa não esteja no formato correto
int verificarplaca(int n){
    if (n==0){
        return 0;
    }
    else{
        return 1;
    }
}

// Verifica se o estacionamento está vazio
int verificaestacionamento (int n) {
    if (n==0){
        return 0;
    }
    else{
        return 1;
    }
}

// Programa para deletar as informações dos veículos retirados do estacionamento
void deletarcarro(int i){
    carro.placa==0;
    carro.modelo==0;
    carro.marca==0;
    carro.cor==0;
    carro.entrada.hora==0;
    carro.status==0;
    carro.proprietario==0;
    }

// Programa para inserir os dados dos veículos que entram no estacionamento
void inserirveiculo(int i) {
    char placa[8], escolhetipo;
    int tamanhoplaca, k, testeletra, b, c;

    FILE *f;

    puts("\nDigite a placa do veículo: \n");
    fflush(stdin);
    gets(placa);

    strupr(placa); // Transforma strings minúsculas em maiúsculas
    for (c=0; c<20; c++) {
        if(strcmp(placa,carro[c].placa)==0){ // Compara a placa digita para verificar há repetição
        printf("Placa já cadastrada!\n\nInsira outra placa");
        _sleep(4000);
        system("cls");
        inserirveiculo(i);
        return;
        }
    }

    strcpy(carro.placa, placa); // Copia os dados da placa digitada para o sistema de controle
    tamanhoplaca = strlen(carro.placa); // Verifica se o tamanho da placa é correto

    if(tamanhoplaca != 7) {
        printf("Placa inválida!\nTente novamente");
        _sleep(4000);
        system("cls");
        inserirveiculo(i);
        return;
    }

    // Verifica se as 3 iniciais são letras
    for(k=0; k<3; k++)
       {
          testeletra=isalpha(carro.placa[k]);//retorna 1 se for letra
          b==verificarplaca(testeletra);
          if(b==1)
          {
          printf("\nPlaca inválida!\nOs três primeiros dígitos devem ser letras!\n\n");
          _sleep(3000);
          system("cls");
          inserirveiculo(i);
          return;
          }
       }

      //testa se 4 últimos digitos não são letras
      for(k=3; k<7; k++)
      {
            testeletra=isalpha(carro.placa[k]);//retorna 1 se for letra
            b==verificarplaca(testeletra);
            if(testeletra==1)
            {
            printf("\nPlaca inválida!\nOs quatro últimos dígitos devem ser números!\n\n");
            _sleep(3000);
            system("cls");
            inserirveiculo(i);
            return;
            }
      }

    puts("Digite o modelo do veículo: ");
    fflush(stdin);
    gets(carro.modelo);
    strlwr(carro.modelo);
    carro.modelo[0]=toupper(carro.modelo[0]); // Deixa a primeira letra maiúscula

    puts("Digite a marca do veículo: ");
    gets(carro.marca);
    fflush(stdin);
    strlwr(carro.marca);
    carro.marca[0]=toupper(carro.marca[0]);

    puts("Digite a cor do veículo: ");
    fflush(stdin);
    gets(carro.cor);
    strlwr(carro.cor);
    carro.cor[0]=toupper(carro.cor[0]);

    puts("Digite o nome do proprietário: ");
    fflush(stdin);
    gets(carro.proprietario);
    strlwr(carro.proprietario);
    carro.proprietario[0]=toupper(carro.proprietario[0]);

    puts("Digite a hora de entrada do veículo: ");
    gets(carro.entrada.hora);
    carro.status=1;

    //Salva as informações do veículo recém adicionado ao arquivo de texto
    f=fopen("carros.txt","w");
    fwrite(&carro, sizeof(carro), 1, f);
    fclose(f);
}

void cadastroveiculo(){
    int i, aviso;
    for (i=0; i<20; i++) {
        if(carro.status==0) {
            inserirveiculo(i);
            printf("\nVeículo cadastrado!");
            aviso=0;
            _sleep(4000);
            system("cls");
            break;
        }
    }

    if(aviso==1) {
        printf("O estacionamento está cheio!");
        _sleep(3000);
        getch();
        system("cls");
    }
}

void retiradaveiculo() {

    FILE *f;

    f=fopen("carros.txt", "r"); // Lê os dados para modificá-los ao retirar um veículo
    fread(&carro, sizeof(carro), 1, f);

    int i;
    int hent, ment, hret, mret, ttment, ttmret, tt; // Variáveis de tempo
    float preco=1.00, precoadicional=0.05; // Declaração de preços
    char placasai[8];

    puts("Digite a placa do veículo: ");
    gets(placasai);
    fflush(stdin);
    strupr(placasai);

    // Imprime os dados de cada veículo
    for (i=0; i<20; i++){

        if (strcmp(placasai,carro.placa)==0){
            printf("\nPlaca: %s", carro.placa);
            printf("\nModelo: %s", carro.modelo);
            printf("\nMarca: %s", carro.marca);
            printf("\nCor: %s", carro.cor);
            printf("\nProprietário: %s", carro.proprietario);
            printf("\nHora de Entrada: %s", carro.entrada.hora);
            carro.status=0;

            deletarcarro(i);

            printf("\n\nDigite a hora de entrada do veículo:   \nObs: Utilize o formato HH enter MM  ");
            scanf("%d""%d", &hent, &ment);

            printf("\n\nDigite a hora de saída do veículo:   \nObs: Utilize o formato HH enter MM  ");
            scanf("%d""%d", &hret, &mret);

            //Adiciona 24 na hora de retirada caso a hora de entrada seja maior que esta, para não resultar em números negativos
            if(hent>hret) {
                ttment= (hent*60)+ ment;
                ttmret= ((hret+24)*60)+ mret;
                tt = ttmret - ttment;
            }
            else {
                ttment= (hent*60)+ ment;
                ttmret= (hret*60)+ mret;
                tt = ttmret - ttment;
            }
            system("cls");
            printf("Veículo retirado com sucesso!");
            if (tt<=60) {
                printf("\n\nTempo de permanência no estacionamento: %d minutos \nTotal a pagar: R$%.2f ", tt, preco);
            }

            else {
               float totalpagar = ((tt-60)*precoadicional) + preco;
                printf("\n\nTempo de permanência no estacionamento: %.d minutos \nTotal a pagar: R$%.2f\n\n\n", tt, totalpagar);
            }

            // Salva os dados editados da lista de veículos
            f=fopen("carros.txt", "w");
            fwrite(&carro, sizeof(carro), 1, f);
            fclose(f);

            getch();

            system("cls");
            return;
                    }
             }

        printf("\nPlaca não encontrada!");
        _sleep(4000);
        system("cls");
    }

void listadeveiculos() {
    int i, j, n=1, r;

    FILE *f;

    f=fopen("carros.txt", "r");
    fread(&carro, sizeof(carro), 1, f);

    for (i=0; i<20; i++) {
        if (carro.status==1) {
            printf("\n* Placa: %s\n  Modelo: %s\n  Marca: %s\n  Cor: %s\n  Proprietário: %s\n", carro.placa, carro.modelo, carro.marca, carro.cor, carro.proprietario);
            printf("  Entrada: %s\n\n", carro.entrada.hora);
        printf("-------------------------------------------------------------------------------");
            n=0;
            r=verificaestacionamento(n);
        }
    }

            if(r==0) {
                printf("\n\nPressione ENTER para voltar ao menu");
                getch();
                system("cls");
            }

            else {
                puts(" Nenhum veiculo cadastrado\n\n Pressione ENTER para voltar ao menu");
                getch();
                system("cls");
            }

            fclose(f);
}

main(){

setlocale(LC_ALL,"portuguese"); //Adiciona o ***** portugues ao programa

resetarsistema();


int escolha;

    FILE *f;

    f=fopen("carros.txt", "r");
    fread(&carro, sizeof(carro), 1, f);
    fclose(f);

    do {

        printf(" \n    SISTEMA DE ESTACIONAMENTO ");
        printf(" \n _________________________________");
        printf(" \n\n Escolha uma opção");
        printf(" \n\n1- Registrar entrada de veículo");
        printf(" \n2- Registrar saída de veículo");
        printf(" \n3- Listar veículos estacionados");
        printf(" \n4- Sair");
        printf(" \n\nOpção: ");
        scanf("%i", &escolha);
        fflush(stdin);


    switch(escolha) {

        case 1: {
            system("cls");
            cadastroveiculo();
            break;
        }
        case 2: {
            system("cls");
            retiradaveiculo();
            break;
            }
        case 3: {
            system("cls");
            listadeveiculos();
            break;
            }
        case 4: {
            exit(main);
            }
        default: {
            system("cls");
            printf("\nOpcao inválida!\n\nTente novamente.");
            _sleep(3000);
            system("cls");
            }

    }

    }while(escolha!=4);
    getchar();
}


 

 

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Podia economizar umas quantas linhas si usar o valor de retorno do scanf junto a uns especificadores e o strlen.

Deixo constância que não provei a fundo, não sei se tem bugs etc.
 

#include<stdio.h>
#include <string.h>

int main() {
    char placa [10];
    int resultado = 0;
    
    
    do {
        
        printf ( "Entre con la placa\n" );
        resultado = scanf ( "%3[A-Z^\n^' ']%4[^A-Z^a-z^\n^' ']%*c", placa, &placa[3]);
        fflush(stdin);
        
        printf("scanf leu %d valores\n\n", resultado);

        int letras = strlen(placa);
           
        
        if( letras != 7 ) {
            printf("Longitude de formato invalido(%d). ", letras);
            resultado = 0;
        }
        printf ( "Formato placa: \"%-7s\"\n\n", placa );
        getchar();
        
    
        
    } while ( resultado < 2 );
    
    
    
    

    
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...