printf("Digite o nome do cliente que deseja alugar o veiculo: ");
scanf(" %[^\n]s", cliente.nome);
// Check if the client exists
if (!clienteExiste(arquivoClientes, cliente.nome)) {
printf("Cliente nao encontrado.\n");
return;
}
// Solicitar informa�es adicionais para a loca�o
printf("Digite a data de retirada (formato dd/mm/aaaa): ");
scanf(" %[^\n]s", novaLocacao.dataRetirada);
printf("Digite a data de devolucao (formato dd/mm/aaaa): ");
scanf(" %[^\n]s", novaLocacao.dataDevolucao);
printf("Digite a quantidade de ocupantes necessaria: ");
scanf("%d", &novaLocacao.quantidadeDias);
// Buscar ve�culo dispon�vel para a necessidade do cliente
printf("\nVeiculos disponiveis:\n");
fseek(arquivoVeiculos, 0, SEEK_SET);
int veiculoEncontrado = 0;
while (fread(&veiculo, sizeof(struct Veiculo), 1, arquivoVeiculos) == 1)
{
if (veiculo.ocupantes >= novaLocacao.quantidadeDias && strcmp(veiculo.status, "Disponivel") == 0)
{
printf("Codigo: %d | Descricao: %s | Modelo: %s | Cor: %s | Placa: %s | Valor Diaria: %.2f\n",
veiculo.codigo, veiculo.descricao, veiculo.modelo, veiculo.cor, veiculo.placa, veiculo.valorDiaria);
veiculoEncontrado = 1;
}
}
if (!veiculoEncontrado)
{
printf("Nenhum veiculo disponivel para a necessidade do cliente.\n");
return;
}
// Solicitar escolha do ve�culo pelo c�digo
printf("\nDigite o codigo do veiculo escolhido: ");
scanf("%d", &novaLocacao.codigoVeiculo);
// Verificar se o ve�culo est� dispon�vel
if (!veiculoDisponivel(arquivoVeiculos, novaLocacao.codigoVeiculo))
{
printf("Veiculo escolhido nao esta disponivel.\n");
return;
}
// Oferecer op�o de contratar seguro
printf("Deseja contratar um seguro para o veiculo? (1 - Sim, 0 - Nao): ");
scanf("%d", &novaLocacao.contratarSeguro);
// Calcular o valor total da loca�o
float valorTotal = calcularValorLocacao(arquivoVeiculos, novaLocacao.codigoVeiculo, novaLocacao.quantidadeDias, novaLocacao.contratarSeguro);
if (valorTotal < 0)
{
printf("Erro ao calcular o valor da locacao. Verifique se o veiculo foi encontrado.\n");
return;
}
// Atualizar o status do ve�culo para "Locado"
fseek(arquivoVeiculos, 0, SEEK_SET);
while (fread(&veiculo, sizeof(struct Veiculo), 1, arquivoVeiculos) == 1)
{
if (veiculo.codigo == novaLocacao.codigoVeiculo)
{
strcpy(veiculo.status, "Locado");
fseek(arquivoVeiculos, -sizeof(struct Veiculo), SEEK_CUR);
fwrite(&veiculo, sizeof(struct Veiculo), 1, arquivoVeiculos);
break;
}
}
// Gravar a nova loca�o no arquivo
fseek(arquivoLocacoes, 0, SEEK_END);
fwrite(&novaLocacao, sizeof(struct Locacao), 1, arquivoLocacoes);
(*totalLocacoes)++;
printf("Locacao cadastrada com sucesso! Valor total: R$ %.2f\n", valorTotal);
}
EXPLICAÇÃO DO CÓDIGO:
Declaração de Estruturas:
struct Locacao: Representa informações sobre uma locação.
struct Cliente: Armazena informações sobre um cliente.
struct Veiculo: Contém detalhes sobre um veículo.
Entrada de Dados:
Solicita o nome do cliente que deseja alugar um veículo.
Verifica se o cliente existe no arquivo de clientes. Se não existir, exibe uma mensagem e encerra a função.
Solicitação de Informações Adicionais:
Solicita a data de retirada, a data de devolução e a quantidade de dias para a locação.
Busca por Veículos Disponíveis:
Lê informações sobre veículos a partir do arquivo de veículos.
Verifica se um veículo atende aos requisitos de ocupantes e se está disponível.
Exibe os veículos disponíveis para o cliente, se houver algum. Se não, exibe uma mensagem e encerra a função.
Escolha do Veículo:
Solicita ao cliente que digite o código do veículo escolhido.
Verifica se o veículo escolhido está disponível. Se não estiver, exibe uma mensagem e encerra a função.
Opção de Contratar Seguro:
Pergunta se o cliente deseja contratar um seguro para o veículo.
Cálculo do Valor Total da Locação:
Calcula o valor total da locação, levando em consideração o número de dias, o veículo escolhido e a opção de seguro.
Atualização do Status do Veículo:
Atualiza o status do veículo escolhido para "Locado" no arquivo de veículos.
Gravação da Nova Locação:
Adiciona as informações da nova locação ao final do arquivo de locações.
Atualização do Contador Total de Locações:
Incrementa o contador total de locações.
Saída:
Exibe uma mensagem indicando que a locação foi cadastrada com sucesso, juntamente com o valor total da locação.
void cadastrarLocacao(FILE arquivoLocacoes, FILE arquivoClientes, FILE arquivoVeiculos, int totalLocacoes) { struct Locacao novaLocacao; struct Cliente cliente; struct Veiculo veiculo;
}
EXPLICAÇÃO DO CÓDIGO: Declaração de Estruturas:
struct Locacao: Representa informações sobre uma locação. struct Cliente: Armazena informações sobre um cliente. struct Veiculo: Contém detalhes sobre um veículo. Entrada de Dados:
Solicita o nome do cliente que deseja alugar um veículo. Verifica se o cliente existe no arquivo de clientes. Se não existir, exibe uma mensagem e encerra a função. Solicitação de Informações Adicionais:
Solicita a data de retirada, a data de devolução e a quantidade de dias para a locação. Busca por Veículos Disponíveis:
Lê informações sobre veículos a partir do arquivo de veículos. Verifica se um veículo atende aos requisitos de ocupantes e se está disponível. Exibe os veículos disponíveis para o cliente, se houver algum. Se não, exibe uma mensagem e encerra a função. Escolha do Veículo:
Solicita ao cliente que digite o código do veículo escolhido. Verifica se o veículo escolhido está disponível. Se não estiver, exibe uma mensagem e encerra a função. Opção de Contratar Seguro:
Pergunta se o cliente deseja contratar um seguro para o veículo. Cálculo do Valor Total da Locação:
Calcula o valor total da locação, levando em consideração o número de dias, o veículo escolhido e a opção de seguro. Atualização do Status do Veículo:
Atualiza o status do veículo escolhido para "Locado" no arquivo de veículos. Gravação da Nova Locação:
Adiciona as informações da nova locação ao final do arquivo de locações. Atualização do Contador Total de Locações:
Incrementa o contador total de locações. Saída: Exibe uma mensagem indicando que a locação foi cadastrada com sucesso, juntamente com o valor total da locação.