Ir ao conteúdo
  • Cadastre-se

C Como organizar esse programa em C ?


Eli Almeida

Posts recomendados

Preciso fazer um trabalho em C de uma locadora de veículos de carros e motos. 

Comecei fazendo , mas não sei se está correto assim, estou tentando fazer da forma mais

simples possível porque acabei de começar a estudar a linguagem C. Mas preciso

entregar esse trabalho quarta-feira. Alguém poderia ajudar por favor? 

Está certo dessa forma que estou fazendo?

O que precisa colocar a mais nesse programa para melhorar ? 

 

Objetivo 
Crie um sistema em C de uma locadora de veículos. (Carro e Motos). O seu programa,  deverá conter as seguintes opções:  
∙ Cadastrar Veículo 
∙ Cadastrar Locador (Usuário) 
∙ Listar Veículos 
∙ Listar Locadores 
∙ Contratos Ativos 
∙ Locar Veículo 
∙ Sair 
 

Cadastrar Veículo 
Aqui deverão ser cadastradas todas as informações Básicas dos veículos.  

 

Cadastrar Locador 
Aqui deverão ser cadastradas todas as informações Básicas dos usuários que desejam  locar os veículos. 


Listar Veículos 
Mostrar todos os veículos disponíveis e não disponíveis. Além das informações  cadastradas. 


Listar Usuários 
Mostrar todas as informações dos usuários, já cadastrados no sistema. Além de todos os  contratos existentes para aquele usuário. 


Contratos Ativos 
Exibir todos os contratos ativos e inativos, contendo todas as informações do locador e  do veículo. 


Locar Veículo 
Aqui o sistema deverá criar todo processo de reserva do veículo escolhido pelo usuário.  Verificando se existe disponibilidade de locação. 


Encerrar Contrato 
O sistema verifica se não multa a ser paga ou qualquer pendência. Se houver aplica a  multa e o contrato fica pendente até a multa ser paga. Do contrário, encerrará o contrato,  liberando o veículo para locação de outro usuário, bem como, deixando aquele usuário  livre para alugar outro veículo. 
 

 

 

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


struct veiculo  {
    char marca [50];
    char modelo [50];
    char cor [50];
    int ano;
    int dias;
    int cnh;
};

struct dados_pessoais {
    char nome [100];
    int nascimento;
    int cpf;
    int telefone;
    int cartao;
    int cnh;
    
};


int main () {
    
setlocale (LC_ALL,"Portuguese");
int opcao  ;

typedef struct veiculo dados;
dados motos;

typedef struct dados_pessoais pessoais;
pessoais registro;
    
printf ("\n ");
printf ("-------- MENU--------\n\n ");
printf ("1 - Cadastrar veículo\n ");
printf ("2 - Cadastrar locador (Usuário)\n ");
printf ("3 - Listar veículos\n ");
printf ("4 - Listar locadores\n ");
printf ("5 - Contratos ativos\n ");
printf ("5 - locar veículo\n ");
printf ("6 - Sair\n ");
printf ("\n ");
printf ("Escolha uma opção:\n ");
scanf ("%d",&opcao);
fflush(stdin);

if (opcao == 1) {


   printf (" Qual veículo gostaria de cadastrar?\n ");
   printf ("1 - Moto\n ");
   printf ("2 - Carro\n ");
   printf (" Escolha uma opção:\n ");
   scanf ("%d",&opcao);
   fflush(stdin);
if (opcao==1) {

printf (" Motos disponíveis\n ");
printf ("\n");
printf (" \tMarca -- Modelo ----- Cor ----- Ano ----- Diária\n ");
printf (" \tHonda -- CB 500X -- Vermelha - 2023 ----- R$ 331\n ");
printf (" \tHonda -- CB 500F -- Prata ---- 2023 ----- R$ 331\n ");
printf (" \tYamaha - Factor  -- Preta ---- 2019 ----- R$ 100\n ");
printf (" \tTriumph - Tiger  -- vermelha - 2023 ----- R$ 523\n ");
printf (" \tDafra -  RIVA 150 - Branca --  2015 ----- R$ 60\n ");
printf (" \tKasinski- Comet 150 - Vermelha -2011 ---- R$ 50\n ");
printf (" \tHonda - Pop 101i -   preta -   2016 ----- R$ 29\n ");
printf ("\n ");
printf (" Escolha uma marca:\n ");
scanf ("%49[^\n]s", &motos.marca);
fflush(stdin);
printf (" Escolha um modelo:\n ");
scanf ("%49[^\n]s", &motos.modelo);
fflush(stdin);
printf (" Escolha uma cor:\n ");
scanf ("%49[^\n]s", &motos.modelo);
fflush(stdin);
printf (" Escolha um ano:\n ");
scanf ("%d",&motos.ano);
fflush(stdin);
printf ("Quantos dias ficará com o veículo?\n ");
scanf ("%d",&motos.dias);
fflush(stdin);
}
else
if (opcao== 2) {
printf (" Carros disponíveis\n ");
printf ("\n");
printf (" \tMarca -- Modelo --- Cor -  Ano -----   Diária\n ");
printf (" \tFiat -   Mobi -- branco -  2021 ----- R$ 125\n ");
printf (" \tToyota - Corolla -- cinza -2020 ----- R$ 228\n ");
printf (" \tPeugeot   Hatch     cinza - 2022 ---- R$ 183\n ");
printf (" \tHyundai  Hb20s     cinza - 2016 ----- R$ 151\n "); 
printf (" \tNissan  Kickss     cinza - 2017 ----- R$ 202\n "); 
printf (" \tJeep    Renegade   cinza - 2021 ----- R$ 199\n ");
printf (" \tkia      Rio       cinza - 2020 ----- R$ 92\n ");


}
}
else
if (opcao== 2) {
printf ("Informe o seu nome completo:\n ");
scanf ("%99[^\n]s", &registro.nome);
fflush(stdin);
printf ("Informe a data do seu nascimento:\n ");
scanf("%d",&registro.nascimento);
fflush(stdin);
printf ("Informe o seu cpf:\n ");
scanf("%d",&registro.cpf);
fflush(stdin);
printf ("Informe o número de seu telefone:\n ");
scanf("%d",&registro.telefone);
fflush(stdin);
printf ("Informe o número de seu cartão de crédito:\n ");
scanf("%d",&registro.cartao);
fflush(stdin);
printf ("Informe o número da sua carteira Nacional de Habilitação:\n");
scanf ("%d",&registro.cnh);
fflush(stdin);
    }
}

 

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

Seu programa não está bom. E parece longe de ficar pronto.

 

Tem muitos dos problemas clássicos dos programas de iniciantes que vemos aqui e em outros foruns. Tirando de uma lista que eu tenho:

  • Não tem uma única função exceto main
  • tem dados globais
  • tem fflush na entrada (indefinido)
  • Não testa o retorno de scanf
  • tem printf() em sequência
  • chama system()

Evite essas coisas. Todas. Só vai levar uma eternidade para concluir os programas e vai aprender pouco e devagar.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@Eli Almeidaa Esses 6 itens que listei são ajuda, por exemplo.

 

De outro modo: tire os dados globais, acabe com as chamadas a system e fflush que nem tem sentido. E escreva funções para 🙂 as funções que estão descritas em seu enunciado. Escreva e teste uma a uma. É mais simples e rápido.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@Eli Almeidaa Provavelmente seria mais simples escrever o programa com uma outra estrutura para os contratos. Considere que os veículos e pessoas existem sempre. O que muda é a relação entre eles. O básico de banco de dados: relação. Pessoas alugam carros, carros são alugados por pessoas. Um carro só pode ser alugado para uma pessoa, uma pessoa pode alugar vários carros.

 

Algumas coisas são totalmente independentes. Parece que não fez nenhuma. Essa ideia de escrever o programa todo é um atraso enorme no seu progresso. 

Listar os carros é só isso. Já podia estar pronto e testado.

 

Esse não é o seu primeiro programa. Programas assim vem depois de dezenas de outros mais simples. Mesmo assim não tem funções, tenta ler os dados via scanf, má ideia.

 

Use arquivos para gravar as coisas. É muito simples em C.

Cadastrar Veículo 
∙ Cadastrar Locador (Usuário) 
∙ Listar Veículos 
∙ Listar Locadores 
∙ Contratos Ativos 
∙ Locar Veículo 
∙ Sair 

 

As opções são independentes. Se usar uma 3a estrutura para os contratos fica ainda mais simples

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

@Eli Almeidaa Você não vai mostrar mais nenhum código? Nem para mostrar que está ao menos tentando arrumar as muitas coisas de que falei? 

 

  • Se fizesse algo mais estaria de todo modo fazendo o trabalho que tem que fazer
  • E estaria aumentando a chance de conseguir ajuda
19 horas atrás, Eli Almeidaa disse:

Sou iniciante. Para listar não necessita usar vetor?

 

É iniciante, mas para ter esse programa pra fazer já deve ter escrito muitos outros.

 

Necessidade de vetor? Um vetor é uma conveniência aqui. 

 

Preste atenção: 

 

Você tem um conjunto não vazio de carros, um conjunto não vazio de pessoas e um conjunto talvez vazio de carros alugados para pessoas.

 

Não são 3 vetores apenas, mas sim 3 coleções, como são chamadas em java, ou containers, como são chamados em C++. Mas são óbvios 3 vetores ao menos. Ou deveriam ser. Pode resolver com dois como está tentando. mas são 3 como já expliquei duas vezes ao menos.

 

 

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

Escreva em torno dos dados, não saia programando. É muito mais simples.

 

Para não parecer que falo de algo abstrato e complicado vou mostrar o caminho simples de escrever em C em torno dos dados...

 

Por exemplo, ao invés disso:
 

struct veiculo
{
    char marca[50];
    char modelo[50];
    char cor[50];
    int  ano;
    int  dias;
    int  cnh;
};


Use isso

 

typedef struct
{
    char     marca[50];
    char     modelo[50];
    unsigned ano;
    char     cor[50];
    char     placa[8];
} Veiculo;


 

Apenas definindo o que é um veículo afinal. E veículos não tem CNH. Mas tem a placa, que identifica unicamente o carro.

 

Isso só cria o Veiculo e não aloca memória.

 

Os carros não existem sózinhos

 

Os carros fazem parte de algo, uma frota, o conjunto de carros que seu programa vai tratar. É óbvio que se tiver isso num arquivo é MUITO mais fácil que digitar meia dúzia deles para CADA VEZ que for testar seu programa. E com 5 campos para cada um.

 

Como eu disse, use um arquivo. De carros. É trivial em C e é a sua realidade. 

 

O que é uma frota? um conjunto de N carros. Isso é só um programa de teste e não vai querer inicialmente alocar memória dinâmicamente para eles, muito embora isso fosse facilitar sua vida no geral

 

EXEMPLO: Frota

 

typedef struct
{
    unsigned cap;    // capacidade
    unsigned size;   // o nome consagrado para o tamanho
    Veiculo  v[20];  // tanto faz, mais de 2
} Frota;


Não é simples? Uma frota tem size carros de um total possível de cap carros que nesse caso seriam claro 20.

 

Como seria isso em um arquivo `frota1.txt`?
 

Ford, Mustang, 2023, Prata, ABC4D01
Aston Martin, DBS, 2010, Azul, DEF5E02
Cadillac,Escalade ESV, 2023, Vermelho, GHI303 

 

Não é mais simples escrever em torno dos dados?

 

Se criar uma frota não é só ler o arquivo e colocar um carro por linha dentro da frota, marcar o total como o total de linhas que leu e pronto?

É.

E claro que é a mesma coisa com o conjunto de pessoas. E os contratos? Igualzinho.

E a opção de listar? Igualzinho.

Fez 1 fez todos.

 

Claro que ter testar logo. Que tal usar constantes para TESTAR o programa em 5 minutos?

 

Não quer ler o arquivo ainda,  e seria um um loop só, mas quer escrever as funções e testar o programa todo?

Para o arquivo acima basta declarar usando recortar e colar:

 

A frota acima, como constante:

 

    Frota teste = {
        .cap  = 20,
        .size = 3,
        .v[0] =
            {"Ford", "Mustang", 2019, "Prata", "ABC4D01"},
        .v[1] =
            {"Aston Martin", "DBS", 2017, "Prata",
             "ABC4D02"},
        .v[2] =
            {"Cadillac", "Escalade V ESV", 2023, "Vermelho",
             "ABC4D03"},
    };

 

E assim tem uma frota com os mesmos 3 carros do arquivo e já pode testar o programa que nem começou a escrever.

 

Como listar isso? Não seria o caso de ter uma função que lista a frota? 

 

E seria complexa? Tem que listar todos os carros e já sabe quantos tem. O valor de size. E como listar um carro? Que tal uma função que lista um carro? Como declarar uma coisa dessas?

 

	int lista_carro(Veiculo* carro);
	int lista_frota(Frota* frota);


Sim, só isso.

 

Note que não programou uma linha de C, mas tem algo como

 

#include <stdio.h>

typedef struct
{
    char     marca[50];
    char     modelo[50];
    unsigned ano;
    char     cor[50];
    char     placa[8];
} Veiculo;

typedef struct
{
    unsigned cap;    // capacidade
    unsigned size;   // o nome consagrado para o tamanho
    Veiculo  v[20];  // tanto faz, mais de 2
} Frota;

int lista_carro(Veiculo* carro);
int lista_frota(Frota* frota);

int main(void)
{
    Frota teste = {
        .cap  = 20,
        .size = 3,
        .v[0] =
            {"Ford", "Mustang", "Prata", 2019, "ABC4D01"},
        .v[1] =
            {"Aston Martin", "DBS", 2017, "Prata",
             "ABC4D02"},
        .v[2] =
            {"Cadillac", "Escalade V ESV", 2023, "Vermelho",
             "ABC4D03"},
    };

    lista_frota(&teste);

    return 0;
}

 

Que pode compilar e rodar. Em minutos. Sem pensar muito.

 

 

Parece complicado? Como seria para listar a frota?

Não seria um simples loop para listar os carros, depois de dizer quantos são?

 

Algo assim talvez:

 

int lista_frota(Frota* frota)
{
    if (frota == NULL) return -1;
    printf(
        "A frota tem %d de %d carros\n", frota->size,
        frota->cap);
    for (int i = 0; i < frota->size; i += 1)
        lista_carro(&frota->v[i]);
    return 0;
}


Só 3 comandos, afinal listar a frota é listar os carros

 

E para listar cada carro do jeito que quiser é só usar a função...

 

Algo assim:

 

int lista_carro(Veiculo* c)
{
    if (c == NULL) return -1;
    printf("\t%s %s\t%d\n", c->marca, c->modelo, c->ano);
    return 0;
}


Com 5 linhas. Para testar logo.

 

SAÍDA do exemplo
 

A frota tem 3 de 20 carros
        Ford Mustang    2019
        Aston Martin DBS        2017
        Cadillac Escalade V ESV 2023


Sugiro escrever assim

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

@arfneto , tentei compilar e executar o seu código, mas não compila. Está dando erro. Estou usando o Dev C++.

Erros do tipo :  In function 'main' , 

C:\Users\eliel\AppData\Local\Temp\cc2IFBK3.o orum.c:(.text+0x2d3): undefined reference to `lista_frota' etc.

 

Você usou ponteiro? Para que precisa utilizar "frota"? 

 

#include <stdio.h>

typedef struct
{
    char     marca[50];
    char     modelo[50];
    unsigned ano;
    char     cor[50];
    char     placa[8];
} Veiculo;

typedef struct
{
    unsigned cap;    // capacidade
    unsigned size;   // o nome consagrado para o tamanho
    Veiculo  v[20];  // tanto faz, mais de 2
} Frota;

int lista_carro(Veiculo* carro);
int lista_frota(Frota* frota);

int main(void)
{
    Frota teste = {
        .cap  = 20,
        .size = 3,
        .v[0] =
            {"Ford", "Mustang", "Prata", 2019, "ABC4D01"},
        .v[1] =
            {"Aston Martin", "DBS", 2017, "Prata",
             "ABC4D02"},
        .v[2] =
            {"Cadillac", "Escalade V ESV", 2023, "Vermelho",
             "ABC4D03"},
    };

    lista_frota(&teste);

    return 0;
}

 

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

15 minutos atrás, Eli Almeidaa disse:

Você usou ponteiro? Para que precisa utilizar "frota"? 

 

Leia com atenção de novo o que eu te expliquei. E preste atenção ao que está copiando.

 

Eu te mostrei a saída da execução do programa então deve imaginar que ele passa por essas coisas de compilar e link. Resolveu rodar o código sem as funções, e aí o link diz que elas não estão definidas. Faz sentido não é? Cadê o código delas?

 

Entendeu o mecanismo? É muito mais importante que rodar o programa. Entendeu o que significa escrever em torno dos dados?

 

Isso:

 

20 minutos atrás, Eli Almeidaa disse:

Para que precisa utilizar "frota"? 

 

quer dizer que não entendeu isso: 

 

5 horas atrás, arfneto disse:

Os carros não existem sózinhos

 

Os carros fazem parte de algo, uma frota, o conjunto de carros que seu programa vai tratar. É óbvio que se tiver isso num arquivo é MUITO mais fácil que digitar meia dúzia deles para CADA VEZ que for testar seu programa. E com 5 campos para cada um.

 

Como eu disse, use um arquivo. De carros. É trivial em C e é a sua realidade. 

 

O que é uma frota? um conjunto de N carros.

 

Não continue com o código enquanto não entender isso. Não vai adiantar pra você.

 

22 minutos atrás, Eli Almeidaa disse:

Você usou ponteiro?

 

Como assim? É o simples. Passa para a função que lista a frota o que? O endereço de uma.

 

Para a função que lista um carro passa o que? Um endereço de um veículo.

 

 

Entenda o que seu programa trata:

 

6 horas atrás, arfneto disse:

Você tem um conjunto não vazio de carros, um conjunto não vazio de pessoas e um conjunto talvez vazio de carros alugados para pessoas.

 

Pois é: seu programa não trata um carro ou um cliente ou um contrato. Trata 3 conjuntos. Todos esses programas para iniciantes são iguais e tratam coleções de coisas. E ensinam os caras aparentemente a tratar um a um e por isso dá trabalho. São as coleções de livros, de músicas, de poltronas no cinema, de carros, TUDO IGUAL.

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

12 horas atrás, arfneto disse:

Pois é: seu programa não trata um carro ou um cliente ou um contrato. Trata 3 conjuntos. Todos esses programas para iniciantes são iguais e tratam coleções de coisas. E ensinam os caras aparentemente a tratar um a um e por isso dá trabalho. São as coleções de livros, de músicas, de poltronas no cinema, de carros, TUDO IGUAL.

 

Não respondeu ainda  a nada do que perguntei, mas entenda que

  • seu programa não trata um carro. Trata um conjunto deles, com ao menos um.
  • seu programa não trata um cliente. Trata um conjunto deles, com ao menos um.
  • seu programa não trata um aluguel. trata um conjunto deles, e cada aluguel é uma relação entre um carro e um cliente
  • Quanto mais perto seu programa estiver da realidade mais fácil é o seu trabalho. Seu programa original está muito longe então vai ter trabalho.
  • O modo como te mostrei (o normal profissional) é iterativo e começa a testar antes mesmo de pensar no problema, como a parte que te mostrei.
  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Eli Almeidaa  Preste atenção às linhas e a cada comando....

 

14 horas atrás, Eli Almeidaa disse:
int lista_carro(Veiculo* carro);
int lista_frota(Frota* frota);

 

São DUAS funções. E da pra imaginar o que cada uma faz... 

 

É o jeito simples de fazer, porque não dá erro. 

 

lista_frota recebe o endereço de uma frota, o conjunto de carros, e lista na saída padrão.

 

Mas é óbvio que vai listar os carros, só que ela não lista os carros porque seria perda de tempo nos testes e nas mudanças.

 

lissta_carro() recebe o endereço de um carro e lista na saída padrão.

 

É o simples, assim se quer mudar como sai o carro tem exatamente UM ponto de mudança, O mesmo para listar a tal frota.

 

Isso é chamado Principio de Unica Responsabilidade, SRP, um nome chique da literatura para o simples: cada função faz uma coisa e não depende de nada global, de nada de fora dela.

 

E eu te mostrei exemplos das duas e um programa que chama as duas...

 

14 horas atrás, Eli Almeidaa disse:
    Frota teste = {
        .cap  = 20,
        .size = 3,
        .v[0] =
            {"Ford", "Mustang", "Prata", 2019, "ABC4D01"},
        .v[1] =
            {"Aston Martin", "DBS", 2017, "Prata",
             "ABC4D02"},
        .v[2] =
            {"Cadillac", "Escalade V ESV", 2023, "Vermelho",
             "ABC4D03"},
    };

 

Isso cria uma frota pra teste, com 3 carros. E a frota se chama teste.Com essa trivial coisa já pode testar o programa nessa parte: basta chamar a função e passar o endereço dessa frota. E em C o endereço de teste é &teste.

  

14 horas atrás, Eli Almeidaa disse:
lista_frota(&teste);

 

Nada mais. Copiar e colar para Veiculo e testa outra parte. Copiar e colar para os contratos e testa a última e o programa estará quase pronto. m minutos. Todos esses exercícios são simples containers, coleções de coisas, como te expliquei.

 

19 horas atrás, arfneto disse:
int lista_frota(Frota* frota)
{
    if (frota == NULL) return -1;
    printf(
        "A frota tem %d de %d carros\n", frota->size,
        frota->cap);
    for (int i = 0; i < frota->size; i += 1)
        lista_carro(&frota->v[i]);
    return 0;
}

 

Pois é, um loop só. E funciona mesmo que tenha um carro só, ou nenhum, certo?

 

Agora se listar errado o problema é na função lista_carro()...

 

19 horas atrás, arfneto disse:
int lista_carro(Veiculo* c)
{
    if (c == NULL) return -1;
    printf("\t%s %s\t%d\n", c->marca, c->modelo, c->ano);
    return 0;
}

 

Esse é o trivial. 

 

Sai isso 

 

19 horas atrás, arfneto disse:

SAÍDA do exemplo
 

A frota tem 3 de 20 carros
        Ford Mustang    2019
        Aston Martin DBS        2017
        Cadillac Escalade V ESV 2023

 

Pois é. Mas não saiu a placa do carro ou a cor. Só que não é importante. O importante é testar e ver que funciona. É claro que se alterar a função que lista os carros vai continuar certo ou o erro estará nela... 

 

 

 

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

@arfneto , ainda estou tentando entender o que você está explicando , não cheguei a estudar ponteiros ainda.

Já vi matrizes, vetores, funções e outras coisas , mas não me aprofundei nem no que estudei ainda.

Estava tentando compilar seu código para estudar e ver como funciona, mas não estou conseguindo.

Se você puder montar ele para compilar, seria bom para eu ver na prática como funciona a execução.

Só tenho hoje para terminar esse trabalho.

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

15 minutos atrás, Eli Almeidaa disse:

ainda estou tentando entender o que você está explicando , não cheguei a estudar ponteiros ainda.

Já vi matrizes, vetores, funções e outras coisas , mas não me aprofundei nem no que estudei ainda.

 

Não há nada de profundo no que eu escrevi. O programa nem aloca memória e o ponteiro é só uma questão de simples eficiência de passar o endereço de um carro e não copiar o vetor todo. O mesmo vale para a frota.

 

Não é um programa que manipule ponteiros pra nada.

 

Se estudou vetores espero que tenham te ensinado que em C um vetor é um ponteiro, o endereço de início. E um deslocamento, dado pelo tamanho de cada elemento. E um tamanho, dado pelo número de ocorrências.

 

	double V[50];

 

Então V é um vetor de double. O tamanho dele é de 50 x sizeof(double). Cada elemento tem sizeof(double), em geral hoje em dia 8 bytes 

 

E V é um ponteiro, o endereço de início do vetor V.

 

15 minutos atrás, Eli Almeidaa disse:

Se você puder montar ele para compilar, seria bom para eu ver na prática como funciona a execução

 

O programa é apenas o que te mostrei. Não precisa ser "montado para compilar". Não sei o que seria. E a saída é a que mostrei, nem mais nem menos.

 

#include <stdio.h>

typedef struct
{
    char     marca[50];
    char     modelo[50];
    unsigned ano;
    char     cor[50];
    char     placa[8];
} Veiculo;

typedef struct
{
    unsigned cap;    // capacidade
    unsigned size;   // o nome consagrado para o tamanho
    Veiculo  v[20];  // tanto faz, mais de 2
} Frota;

int lista_carro(Veiculo* carro);
int lista_frota(Frota* frota);

int main(void)
{
    Frota teste = {
        .cap  = 20,
        .size = 3,
        .v[0] =
            {"Ford", "Mustang", 2019, "Prata", "ABC4D01"},
        .v[1] =
            {"Aston Martin", "DBS", 2017, "Prata",
             "ABC4D02"},
        .v[2] =
            {"Cadillac", "Escalade V ESV", 2023, "Vermelho",
             "ABC4D03"},
    };

    lista_frota(&teste);

    return 0;
}

int lista_carro(Veiculo* c)
{
    if (c == NULL) return -1;
    printf("\t%s %s\t%d\n", c->marca, c->modelo, c->ano);
    return 0;
}

int lista_frota(Frota* frota)
{
    if (frota == NULL) return -1;
    printf(
        "A frota tem %d de %d carros\n", frota->size,
        frota->cap);
    for (int i = 0; i < frota->size; i += 1)
        lista_carro(&frota->v[i]);
    return 0;
}

 

Uma função tem 3 linhas a outra 5 na prática. 

 

Se passar o endereço é algo problemático, poderia ter escrito

 

#include <stdio.h>

typedef struct
{
    char     marca[50];
    char     modelo[50];
    unsigned ano;
    char     cor[50];
    char     placa[8];
} Veiculo;

typedef struct
{
    unsigned cap;    // capacidade
    unsigned size;   // o nome consagrado para o tamanho
    Veiculo  v[20];  // tanto faz, mais de 2
} Frota;

int lista_carro(Veiculo carro);
int lista_frota(Frota frota);

int main(void)
{
    Frota teste = {
        .cap  = 20,
        .size = 3,
        .v[0] =
            {"Ford", "Mustang", 2019, "Prata", "ABC4D01"},
        .v[1] =
            {"Aston Martin", "DBS", 2017, "Prata",
             "ABC4D02"},
        .v[2] =
            {"Cadillac", "Escalade V ESV", 2023, "Vermelho",
             "ABC4D03"},
    };

    lista_frota(teste);

    return 0;
}

int lista_carro(Veiculo c)
{
    printf("\t%s %s\t%d\n", c.marca, c.modelo, c.ano);
    return 0;
}

int lista_frota(Frota frota)
{
    printf(
        "A frota tem %d de %d carros\n", frota.size,
        frota.cap);
    for (int i = 0; i < frota.size; i += 1)
        lista_carro(frota.v[i]);
    return 0;
}

 

Só não seria esperto. Mas o resultado é o mesmo

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

2 horas atrás, Eli Almeidaa disse:

No caso , eu preciso terminar

de preencher os carros , colocando a marca, modelo, ano, cor e placa até 20 ?

e as motos como fica ? Já que é uma locadora de carros e motos

 

Tudo isso é irrelevante. Bastam 1 veiculo para testar o programa. Veiculo pode ser um patinete. Pra que 20? Que diferença faz se é carro ou moto? Vai alugar e pronto. Faça o resto do programa. Cadê os clientes? E os contratos?

 

Eu te mostrei como resolver, sem pensar. Implemente o que já se sabe do enunciado. 

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@arfneto , será que dessa forma está certo ? como colocar os "contratos ativos" e "locar" ?

 

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

typedef struct {
    char nome[50];
    char endereco[100];
    char cpf[12];
    char telefone[12];
} Locador;

typedef struct
{
    char     marca[50];
    char     modelo[50];
    unsigned ano;
    char     cor[50];
    char     placa[8];
    float     diaria;
} Veiculo;

typedef struct
{
    unsigned cap;    // capacidade
    unsigned size;   // o nome consagrado para o tamanho
    Veiculo  v[20];  // tanto faz, mais de 2
 Locador  loc[20];

} Frota;

void cadastrar_locador(Frota* frota);
void cadastrar_veiculo(Frota* frota);
int lista_carro(Veiculo* carro);
int lista_frota(Frota* frota);
void lista_locadores(Frota* frota);

int main(void)
{  

    
    
    Frota teste = {
        .cap  = 20,
        .size = 3,
        .v[0] =
            {"Ford", "Mustang", 2019, "Prata", "ABC4D01",350},
        .v[1] =
            {"Aston Martin", "DBS", 2017, "Prata",
             "ABC4D02",250},
        .v[2] =
            {"Cadillac", "Escalade V ESV", 2023, "Vermelho",
             "ABC4D03",450},
    
    };

  //Menu de opções
     setlocale (LC_ALL,"Portuguese");
 int opcao = 0;

while (opcao != 7) {
 printf ("\n");    
 printf ("\n");    
 printf ("\t------- MENU --------\n")    ;
 printf("Escolha uma opção:\n");
 printf("1 - Cadastrar Veículo\n");
 printf("2 - Cadastrar Locador (Usuario)\n");
 printf("3 - Listar Veículos\n");
 printf("4 - Listar Locadores\n");
 printf("5 - Contratos ativos\n");
 printf("6 -  Locar Veículo \n");
 printf("7 - Sair\n");

scanf("%d", &opcao);


if (opcao == 1) {
        cadastrar_veiculo(&teste);
    } else if (opcao == 2) {
        cadastrar_locador(&teste);
    } else if (opcao == 3) {
        lista_frota(&teste);
    } else if (opcao == 4) {
        lista_locadores(&teste);
    } else if (opcao == 5) {
        printf("Co");
    } else if (opcao == 6) {
        printf("Locar Veículo");
    } else if (opcao == 7) {
       printf ("Encerrando.");
    } else {
        printf("Opção inválida.\n");
    }
}

return 0;
}


void cadastrar_veiculo(Frota* frota)
{
    if (frota == NULL) return; // verifica se o ponteiro "frota" é nulo.
    
    if (frota->size >= frota->cap) {
        printf("A frota está cheia.\n");
        return;
    }
 Veiculo novo;
    printf("Marca: ");
    scanf("%s", novo.marca);
    printf("Modelo: ");
    scanf("%s", novo.modelo);
    printf("Ano: ");
    scanf("%u", &novo.ano);
    printf("Cor: ");
    scanf("%s", novo.cor);
    printf("Placa: ");
    scanf("%s", novo.placa);
    printf("Diária: ");
    scanf("%f", &novo.diaria);
    frota->v[frota->size] = novo;
    frota->size += 1;
    printf("Veículo cadastrado com sucesso.\n");
 
}

void cadastrar_locador(Frota* frota)
{
    if (frota == NULL) return -1 ; // verifica se o ponteiro "frota" é nulo.
    
    if (frota->size >= frota->cap) {
        printf("A frota está cheia.\n");
        return;
    }
    
 Locador novo;
    printf("Nome:\n ");
    fflush(stdin); // limpa o buffer de entrada
    fgets(novo.nome, 50, stdin);
    printf("Endereco:\n ");
    fflush(stdin); // limpa o buffer de entrada
    fgets(novo.endereco, 100, stdin);
    printf("CPF: ");
    fflush(stdin); // limpa o buffer de entrada
    fgets(novo.cpf, 12, stdin);
    printf("Telefone:\n ");
    fflush(stdin); // limpa o buffer de entrada
    fgets(novo.telefone, 12, stdin);
    frota->loc[frota->size] = novo;
    frota->size += 1;
    printf("Locador cadastrado com sucesso.\n");
}

void lista_locadores(Frota* frota)
{
    if (frota == NULL) return -1;
    printf("Lista de locadores:\n");
    for (int i = 0; i < frota->size; i++) {
        printf("Nome: %s\n", frota->loc[i].nome);
        printf("Endereco: %s\n", frota->loc[i].endereco);
        printf("CPF: %s\n", frota->loc[i].cpf);
        printf("Telefone: %s\n", frota->loc[i].telefone);
        printf("\n");
    }
}

int lista_carro(Veiculo* c)
{
    if (c == NULL) return -1;
    printf("\t%s %s\t%d\t%.2f\n", c->marca, c->modelo, c->ano,c->diaria);
    return 0;
}

int lista_frota(Frota* frota)
{
    if (frota == NULL) return -1;
    printf(
        "A frota tem %d de %d carros\n", frota->size,
        frota->cap);
    for (int i = 0; i < frota->size; i += 1)
        lista_carro(&frota->v[i]);
    return 0;
}

 

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

Não, não está.

 

Não é que está errado. Está ignorando o que tentei te explicar e seguindo exatamente como estava fazendo antes. E assim vai ter os mesmos problemas de antes.

 

Eu te disse o que fazer. Apenas copie o que está feito para veiculo para pessoa.

 

E entenda que o contrato é a mesma coisa. 

 

O contrato é um vínculo entre uma pessoa e um carro, moto, patinete ou muleta, o que tenha para alugar

 

Entendeu mesmo o que eu tentei explicar sobre escrever em torno dos dados?

 

typedef struct
{
    Veiculo v;
    Locador l;
    char data[12];
    unsigned id;
} Locacao;

 

Uma locação é uma relação. Te expliquei isso. Não há o que pensar.

 

E é óbvio que tem uma coleção delas. Esse é o seu programa....

 

typedef struct
{
    unsigned cap;    // capacidade
    unsigned size;   // o nome consagrado para o tamanho
    Locacao  loc[20];  // tanto faz, mais de 2
} Contratos;

 

Entende isso? Os contratos são uma coleção de Locacao claro. É tudo igual, como te expliquei. É só copiar tudo.

 

Ou pode ignorar e insistir em fazer como está tentando:

 

typedef struct
{
    unsigned cap;    // capacidade
    unsigned size;   // o nome consagrado para o tamanho
    Veiculo  v[20];  // tanto faz, mais de 2
    Locador  loc[20];

} Frota;

 

É ingênuo colocar um Locador na frota. Nada tem a ver. Os carros existem sem estar alugados. O conjunto deles é a frota da locadora. Tanto faz se estão ou não alugados. Claro, dependendo da aplicação pode ter um campo de status, de tipo de veículo, o que importar. Mas não deve controlar os contratos aí. É mais complicado. 

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

@arfneto , tem que criar  uma frota separada  para contratos também ?

ainda não compreendi direito o que é frota e para que serve nesse programa. Também

tem outra questão o que significa esses três carros que você colocou no programa que já vai cadastrado. O usuário

novo pode escolher eles para alugar ? 

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

@Eli Almeidaa acho que não consegui explicar quase nada, nem com o programa de exemplo e as estruturas...

 

Entenda os dados. Seu programa é de uma locadora, aluga coisas para locadores.

 

Então o que tem no programa? Uma pessoa que aluga um carro, um carro que é alugado por uma pessoa, um contrato que é o ato de uma pessoa alugar um carro. Nada mais.

 

Só que é muito mais simples entender de vez que o programa trata

  • UM CERTO NUMERO de carros, a frota,
  • UM CERTO NUMERO de pessoas, um cadastro,
  • UM CERTO NUMERO de locações, os contratos.

Entenda isso e seu programa ficará simples, ainda mais que te mostrei como construir as coisas, com um programa e tal.

 

24 minutos atrás, Eli Almeidaa disse:

Também

tem outra questão o que significa esses três carros que você colocou no programa que já vai cadastrado. O usuário

novo pode escolher eles para alugar

 

Como te expliquei logo no início, o que importa é começar logo a testar. Para isso serve a frota não por acaso chamada teste no exemplo, com os tais 3 carros. Era pra você entender o que significa escrever em torno dos dados.

 

Ao entender isso você usa copiar e colar e cria as funções e estruturas e dados de teste para testar as funções óbvias.

 

É claro que deve ler os dados de alguma forma depois que isso estiver pronto. E é pra fazer em meia hora. Aí escreve funções simples, copiadas dessas, que leêm os dados de frota e cadastro e contratos de simples triviais arquivos texto que você digita no próprio IDE (e te mostrei isso no primeiro post). E escreve as funções finais, o que restou de criativo no programa.

 

Como te falei, praticamente todos esses programas para iniciantes são em torno de containers, de coleções de coisas, seja a playlist, as poltronas, os carros, os times, só muda o exercício

  • Curtir 2
  • Obrigado 1
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...

 

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!