Boas, Este é o meu trabalho de Programação que tenho de fazer: Gestão do aluguer de uma frota de autocaravanas e caravanas O objetivo principal do trabalho prático é a construção de um programa que permita auxiliar a tarefa de gerir a os alugueres de veículos de recreio de uma empresa que se destina ao aluguer de autocaravanas e caravanas. Para isso, deve utilizar a metodologia descrita a seguir. Descrição sobre o funcionamento do programa: Uma empresa de aluguer de autocaravanas e caravanas possui 6 escritórios espalhados pelo país, e uma frota total de 20 veículos. A empresa necessita de uma aplicação que ajude a gerir os veículos e os contratos de aluguer. Cada veículo disponível para aluguer está associado a um único escritório, o qual pode ter vários veículos disponíveis. Os escritórios encontram-se espalhados pelas diversas cidades do país. Cada contrato de aluguer deve conter um código, e ter associado os dados do cliente e do veículo, identificando sempre o escritório onde o veículo foi alugado e o escritório onde o veículo foi devolvido, bem como a data de inicio e de fim do aluguer. Esta última informação não é conhecida no momento da assinatura do contrato, sendo atualizada no momento da devolução. Para beneficiar os clientes, um veículo pode ser devolvido em qualquer escritório. Após a devolução, não é obrigatório que o veículo seja enviado para o escritório de origem. Da mesma forma, quando é efetuado um aluguer num determinado escritório, não é requisito obrigatório que o veículo esteja nesse escritório. Assim, em qualquer escritório é possível alugar e devolver veículos desde que estejam disponíveis. Embora um cliente possa alugar mais do que um veículo, é sempre realizado um contrato em separado para cado veículo alugado. Cada contrato é realizado por um único cliente, que pode ser particular ou empresa. Cado veículo tem um código identificador, a matrícula, a marca, o modelo e a categoria. Para as autocaravanas é necessário registar a quilometragem atual, a quantidade de combustível no depósito. A empresa atualmente classifica os seus veículos em várias categorias conforme o tipo: • Autocaravanas: Capucine (máximo de 7 lugares de dormida); Integrais (máximo de 4 lugares de dormida); Perfiladas (máximo de 6 lugares de dormida); Furgões (máximo de 2 lugares de dormida e não tem casa de banho contrariamente às restantes) • Caravanas: Citadina (máximo de 2 lugares de dormida, não tem casa de banho); Utilitária (máximo de 3 lugares de dormida); Familiar (máximo de 5 lugares de dormida). Para cada cliente é atribuído um código único, além de manter informações sobre nome, endereço, e carta de condução. Caso um cliente danifique ou abandone um veículo ou não pague o aluguer, o mesmo será registado como cliente de risco e não poderá mais alugar veículos na empresa. Os valores do aluguer são determinados pelo tipo do veículo, sendo que para as autocaravanas é cobrado o valor por quilómetro andado e para o caso das caravanas é cobrado apenas o valor da diária. A aplicação deverá efetuar as seguintes funcionalidades: •Inserir/Alterar/Eliminar informação sobre clientes e veículos. Incluir definição da localização do veículo. Nesta altura o local onde o veículo se encontra passa a 1 (um). Os valores possíveis são: 0=”local incerto” e 1=”local conhecido”. O local corresponde ao escritório onde o veículo se encontra. •Inserir/Alterar/Eliminar informação sobre alugueres. ◦Inserir aluguer corresponde a alugar veículo. Nesta altura o estado do veículo passa a “Alugado”. Os estados possíveis são: “Disponível” e “Alugado”. O veículo também passa a estar em lugar incerto pelo que a localização passa a 0 (zero). É calculado um valor a pagar que poderá ser revisto na altura da devolução. ◦Devolver veículo. É gerada a fatura a entregar ao cliente, revisto o valor a pagar e a quilometragem do veículo é atualizada para o caso das autocaravanas. Nesta altura o estado do veículo passa a “Disponível”. O veículo também passa a estar em lugar conhecido pelo que a localização passa a 1 (zero). •Listagens ◦Dos veículos alugados e dos não alugados ◦Dos veículos alugados ordenada por ordem de chegada ◦De clientes ◦De alugueres por mês ◦Da localização dos veículos. Esta funcionalidade deve mostrar no ecrã uma matriz salientando a localização dos veículos que estão disponíveis para aluguer, num período especificado, considerando os escritórios onde se encontram. Para esse período, deve excluir do resultado os veículos que estão alugados. •Pesquisas ◦De veículos ◦De clientes ◦Por datas Exemplo de mapa ilustrando a localização dos veículos: ...................Escritório Veiculo ............Lisboa Porto Coimbra 57 ..........0 .......1.......0 63 ..........0 .......0.......1 21 ..........0........0.......0 74 ..........1........0.......0 Legenda: o veículo 21 está alugado razão pela qual não é conhecida a sua localização, todos os valores no mapa estão a 0 (zero). O veículo 57 está no escritório do Porto, o veículo 63 está no escritório de Coimbra e o veículo 74 está no escritório de Lisboa, todos os valores nestas interseções têm o valor 1 (um). •Validações a efetuar O programa deverá prever as seguintes situações: •Não permitir que determinado veículo esteja situado em mais do que um escritório ao mesmo tempo •Validar datas: ◦o dia do mês deve estar dentro dos limites adequados ao mês escolhido ◦a data de fim do aluguer não pode ser inferior à data de início•O código da categoria deve variar entre 0 e 4 •Valores permitidos para o campo tipo de cliente: ‘0' e '1' •Valores permitidos para o campo estado do veículo: ‘D' e 'A' •Não permitir códigos repetidos nas mesmas estruturas •Não permitir alugar um veículo que não existe ou está alugada As estruturas apresentadas a seguir, devem ser usadas na implementação deste trabalho. Tipo de estrutura Designação typedef struct cliente { short int cod_cl; Código do cliente (entre 1000 e 9999) char nome[30]; Nome do cliente char morada[40]; Morada do cliente short int tipo; Tipo de cliente (0-cliente normal; 1-cliente de risco) char carta_conducao[5]; Numero carta de condução }cliente_tipo; Tipo de estrutura Designação typedef struct veiculo { short int cod_vc; Código do veículo (entre 10 e 99) char marca[10]; Marca do veículo char modelo[10]; Marca do veículo char matricula[8]; Matricula do veículo short int cod_categoria; Categoria do veículo float km; Quilometragem atual do veículo float qt_comb; Quantidade de combustível no depósito char estado; Estado do veículo: ‘D’-Disponível; ‘A’-Alugado }veiculo_tipo; Tipo de estrutura Designação typedef struct contrato { short int cod_vc; Código do veículo (entre 1000 e 9999) short int cod_cl; Código do cliente (entre 1000 e 9999) Float preco_dia; Valor da diária em unidades monetárias float preco_km; Valor por Km andado em unidades monetárias float qt_km; Quilómetros percorridos data_tipo data_ini; Data inicio do aluguer data_tipo data_fim; Data fim do aluguer char escritório_ini; Escritório onde o veículo é alugado char escritorio_fim; Escritório onde o veículo é devolvido }contrato_tipo; Tipo de estrutura Designação typedef struct data { short int dia; Dia char mes[3]; Mês short int ano; Ano }data_tipo; Declaração, em C, das categorias disponíveis para as veículos: char categoria[][10]={ "capucine","integral","perfilada","furgão", "citadina","utilitaria","familiar"} E mais um relatório Ffnal sobre o trabalho Se tiver alguma dificuldade digo neste tópico algumas questões importantes: 1º- como devo dividir o trabalho por partes ? (sei que o relatório final deve ser no fim) 2º- por que parte devo começar primeiro ? •Inserir/Alterar/Eliminar informação sobre clientes e veículos. •Inserir/Alterar/Eliminar informação sobre alugueres. •Listagens •Pesquisas •Validações a efetuar (O programa deverá prever as algumas situações: caso de mostragem de erros tipo : valores fora do intervalo considerado , etc...) e ainda não sei fazer os menus, como faço os menus ? e para os informáticos, fazem primeiro o pseudocódigo ? (linguagem escrita) ou passam logo ao código em C propriamente dito ?. Obrigado desde já pela disponibilidade
boas pessoal envio o que fiz ate agora Código: // trabalho prático APROG 2012/2013 "gestão de caravanas" #include<stdio.h> #include<time.h> // tempo #include<stdlib.h> // memoria dinamica malloc realloc calloc #define MAX 20 // maximo 20 veiculos // estrutura cliente typedef struct cliente // nome cliente desnecessário { short int cod_cl; // código cliente (entre 1000 e 9999) // short int –32,768 to 32,767 char nome [30]; // nome do cliente maximo 30 caracteres char morada[40]; // morada do cliente maximo 40 caracteres short int tipo; // tipo de cliente ( 0- cliente normal; 1- cliente de risco) char carta_conducao[5]; // numero de carta de condução 123456 }cliente_tipo; // estrutura veiculo typedef struct veiculo { short int cod_vc; // codigo veiculo (entre 10 e 99) char marca[10]; // marca veiculo autocaravanas - Adria (Coral,Action) Burstner(Travel,Club,Holiday) Kabe(Travelmaster) char modelo[10]; // modelo veiculo // caravanas - Adria (Linea,Adora, Alpina) Burstner(City,) Kabe (Royal,Eximo) char matricula[8]; // matricula do veiculo 00-00-AA short int cod_categoria; // categoria do veiculo: autocaravanas - capucine, integral, perfilada, furgao | caravanas - citadina, utilitaria, familiar float km; // quilometragem actual do veiculo em Km float qt_comb; // quantidade de combustivel no deposito em Litros char estado; // estado veiculo : 'D' - disponivel; 'A' - alugado }veiculo_tipo; // estrutura contrato typedef struct contrato { short int cod_vc; // codigo do veiculo ( entre 1000 e 9999) short int cod_cl; // codigo cliente (entre 1000 e 9999) float preco_dia; // valor diario em unidades monetarias € - caravanas -100€/dia float preco_km; // valor em Km andado em unidades metricas - autocaravanas - 2€/Km float qt_km; // quilometros percoridos //data_tipo data_ini; // data inicio aluguer - 01 jan 2012 //data_tipo data_fim; // data fim de aluguer char escritorio_ini; // escritorio onde o veiculo é alugado - Lisboa Porto Coimbra Algarve Braga Aveiro char escritorio_fim; // escritorio onde o veiculo é devolvido - Lisboa Porto Coimbra Algarve Braga Aveiro }contrato_tipo; // estrutura data typedef struct data { short int dia; // dia 1-31 char mes[3]; // jan,fev...dez short int ano; // ano 2012 }data_tipo; char categoria[][10]={"capucine","integral","perfilada","furgao","citadina","utilitaria","familiar"}; short int mes_dias[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; // funcoes escrever/ler/mostrar/eliminar/alterar cliente, veiculo, contrato, data //funcao escrever cliente void escrever_cliente(cliente_tipo *cliente, int qtd_clientes) { int i; for(i=0;i<qtd_clientes;i++) { printf(" \n\n --- clientes --- "); fflush(stdin); //limpa o buffer do teclado printf(" \n qual o codigo do cliente ? "); scanf("%d",&cliente[i].cod_cl); // -> porque cliente é um vetor while(cliente[i].cod_cl<1000 || cliente[i].cod_cl>9999 && cliente[i].cod_cl != cliente[i].cod_cl) { printf(" \n erro ! digite o codigo do cliente com 4 digitos \n"); scanf("%d",&cliente[i].cod_cl); // gets - le strings (cadeia de caracteres com espaços), scanf - le so numeros ou uma unica letra ? } fflush(stdin); printf(" \n qual o nome do cliente ? "); gets(cliente[i].nome); // equivalente a : scanf("%d",&(*cliente).nome); x-> igual a (*x). fflush(stdin); printf(" \n qual o morada do cliente ? "); gets(cliente[i].morada); fflush(stdin); printf(" \n qual o tipo de cliente ? "); scanf("%d",&cliente[i].tipo); while(cliente[i].tipo!=0 && cliente[i].tipo!=1) { printf(" \n erro ! digite o tipo de cliente 0- cliente normal 1- cliente de risco \n"); scanf("%d",&cliente[i].tipo); // gets - le strings (cadeia de caracteres com espaços), scanf - le so numeros ou uma unica letra ? } fflush(stdin); printf(" \n qual o numero da carta de conducao ? "); gets(cliente[i].carta_conducao); // equivalente a : scanf("%d",&(*cliente).nome); x-> igual a (*x). } } // mostra todos os clientes guardados em memoria, o parametro qtd_clientes é a quantidade de clientes void mostrar_cliente(cliente_tipo *cliente, int qtd_clientes) {//permite visualizar o conteudo da estrutura , só printf´s com %s ou %d int i; for(i=0;i<qtd_clientes;i++) { printf(" \n\n cliente "); printf(" \n codigo cliente : %d ",cliente[i].cod_cl); printf(" \n nome cliente : %s ",cliente[i].nome); printf(" \n morada : %s ",cliente[i].morada); printf(" \n tipo de cliente : %d ",cliente[i].tipo); printf(" \n numero carta conducao : %s ",cliente[i].carta_conducao); } printf(" \n prima qualquer tecla para continuar"); // se premido alguma tecla sai da funcao void mostrar_cliente(cliente_tipo *cliente, int qtd_clientes) getch(); // le as teclas digitadas sai } int ler_quantidade_clientes() //pergunta quantos clientes pretende guardar e retorna esse numero {// le um numero positivo e inferior a MAX - 20 int qtd_clientes,i; do { printf("\n qual a quantidade maxima de clientes ( entre 1 e %d): ",MAX); scanf("%d",&qtd_clientes); }while (qtd_clientes<1 || qtd_clientes >MAX); return qtd_clientes; } // e) funcao procura e mostra todos os clientes com o nome indicado no vetor nome[10] void procurar_clientes(cliente_tipo cliente[], char nome[], int qtd_clientes) // cliente[] = *cliente { int i, flag=1; // 1 = verdadeiro (qualquer numero != 0 ) , 0= falso for(i=0;i<qtd_clientes && flag;i++) // se a flag tambem for verdadeira (!= 0) 1,2,3,4... { if(strcmp(cliente[i].nome,nome)==0) // compara duas strings, comeca por comparar o primeiro caracter de cada string se forem ambas iguais continua a percorer a string até chegar ao null ou até que algum par ( de strings)seja diferente // se retornar 0 as strings sao iguais, se for >0 o caracter diferente e maior na string1 (a[i].cidade) do que na string2 (cid) // se for <0 exactamente o contrario { printf(" \n\n cliente "); printf(" \n codigo cliente : %d ",cliente[i].cod_cl); printf(" \n nome cliente : %s ",cliente[i].nome); printf(" \n morada : %s ",cliente[i].morada); printf(" \n tipo de cliente : %d ",cliente[i].tipo); printf(" \n numero carta conducao : %s ",cliente[i].carta_conducao); flag=0; // é falso } } } // menu de opcoes char formulario () // nao é void formulario (), mas sim char formulario () porque retorna os caracteres { char r; // o caracter digitado é guardado em r do { system ("cls"); // limpa o monitor, é um comando do windows (DOS cmd) , system ("cls"); == a system("dir"); , ou char s="cd bin" , system (cd); printf(" 1- Inserir cliente \n"); printf(" 2- Mostrar cliente \n"); printf(" 3- Procurar cliente por nome \n"); printf(" 4- Alterar cliente \n"); printf(" 5- Eliminar cliente \n"); printf(" s/S- Sair \n"); r=getch(); // le o caracter digitado guarda como r e depois vai para a funcao }while (r!= 's' && r!= 'S' && r!= '1' && r!= '2' && r!= '3' && r!= '4' && r!= '5'); return r; } int main() // retorna um inteiro 0 é certo ? , 1 é errado ? { char ch, nome[30]; int qtd_clientes=0,i,n; cliente_tipo cliente[50]; // cliete_tipo cliente; e não veiculo_tipo disciplina porque a estrutura veiculo está dentro da estrutura cliente, estrutura cliente é a principal ? do { ch=formulario(); switch(ch) { //preenche os vetores da estrutura cliente case '1' : { // retorna a quantidade de clientes a analisar qtd_clientes=ler_quantidade_clientes(); escrever_cliente(cliente,qtd_clientes); break; } // lista todos os clientes case'2' : { mostrar_cliente(cliente,qtd_clientes); //mostrar_cliente(cliente, qtd_clientes) break; } //procura o cliente pelo nome case '3': { printf("\n nome do cliente a procurar ?: "); gets(nome); procurar_clientes(cliente, nome, qtd_clientes); printf("\n prima tecla para continuar"); getch(); break; } /*altera o cliente case '4': { printf("\n qual o cliente a alterar ? ", alterar_cliente(cliente,qtd_clientes)); gets(nome); // chama funcao alterar printf(" \n cliente alterado !"); getch(); break; } //elimina o cliente case '5': { printf("\n qual o cliente a eliminar ? ", eliminar_cliente(cliente,qtd_clientes)); gets(nome); // chama funcao eliminar printf(" \n cliente eliminado !"); getch(); break; } */ } }while(ch!='s' && ch!='S'); system("pause"); return 0; //diferença entre 0 e 1 ?? } // funcionalidades : // função inserir/alterar/eliminar :informação sobre clientes e veiculos ( localização veiculo 0-"local incerto" 1-" local conhecido" // função inserir/alterar/eliminar :informação sobre alugueres // funcao inserir aluguer :(aluga veiculo passa de "Disponivel" para "Alugado", lugar passa 1-"porto" a 0-"incerto" alterar na matriz // função devolver veiculo :depois de devolvido o veiculo calcula o valor a pagar: caravanas -100€/dia - autocaravanas - 2€/Km // quilometrogem actualizada para as autocaravanas, char estado passa de "0- alugado" para "1- disponivel" // funcões listagens // - funcao veiculos alugados e não alugados // - funcao veiculos alugados por ordem de chegada // - funcao de clientes // - funcao de alugueres por mes // - funcao da localização de veiculos matriz - para um determinado periodo(definido) - Só mostra os veiculos disponiveis para aluguer (0-0-0-0-0-0) // funcao Pesquisa // - veiculos // - clientes // - por datas ( de aluguer veiculo) //validacoes // nao permitir que um veiculo esteja em mais do que um escritorio ao mesmo tempo // validar datas (dia 1 a 31 janeiro) (dia 1 a 28 fevereiro) etc... //categoria veiculo autocaravanas - 1-capucine, 2-integral, 3-perfilada, 4-furgao | caravanas - 1-citadina, 2-utilitaria, 3-familiar // tipo cliente só ( 0- cliente normal; 1- cliente de risco) // estado do veiculo só 'D' - disponivel; 'A' - alugado do {} while ou {}while // nao permitir codigos repetidos nas mesmas estruturas // nao permitir alugar um veiculo que não existe ou que está alugado pelo menos o programa corre e não dá erros mas está incompleto precisso de incluir as seguintes funcoes eliminar e alterar dados de clientes, mas não sei como eliminar/alterar vetores ? se alguem puder fazer essa funçãozinha até agora só fiz para clientes, mas ainda falta para veículos, contrato e data ? tambem não sei como eide incluir os veiculos como fazendo parte da estrutura cliente ? assim como cada contrato que tem um cliente associado ? fiz até agora assim a função eliminar cliente: Código: // eliminar clientes void eliminar_cliente(int pos, cliente_tipo *cliente, int *qtd_clientes) { int i; printf("qual o cliente que deseja eliminar ?"); gets(cliente[i].nome); // equivalente a : scanf("%d",&(*cliente).nome); x-> igual a (*x). fflush(stdin); for (i=pos;i<=*qtd_clientes-1;i++) cliente[i]=cliente[i+1]; (*qtd_clientes)--; } depois chamei-a na main Código: case '5': { eliminar_cliente(pos, cliente,qtd_clientes); printf(" \n cliente eliminado !"); mostrar_cliente(cliente,qtd_clientes); getch(); break; } não dá erros mas não está a funcionar ... quando carego em 5 o programa fecha inesperadamente
esta um bocado confuso assim tudo separado, mas parece que a circulação da variável "qtd_clientes" para dentro da função está incorrecta. passa o endereço da variável lá para dentro qd chamas a função quando lá queres escrever: eliminar_cliente(pos, cliente, &qtd_clientes);
boas, Código - funcao eliminar clientes: Código: //eliminar clientes void eliminar_cliente(int pos,cliente_tipo *cliente, int *qtd_clientes) { int i; for (i=pos;i<=*qtd_clientes-1;i++) cliente[i]=cliente[i+1]; (*qtd_clientes)--; // retira um cliente } Código na main : Código: case '5': { printf("\n qual a posicao do cliente que quer eliminar ? <posicao 1 ate %d > ",qtd_clientes); scanf("%d",&pos); eliminar_cliente(pos,cliente,&qtd_clientes); printf("\n eliminou o cliente %d \n",pos); printf("\n tem os seguintes clientes registados"); mostrar_cliente(cliente,qtd_clientes); getch(); break; } e modifiquei a main esta linha : cliente_tipo cliente[50]; para cliente_tipo cliente[MAX+1]; será que fiz bem ? sim agora o programa corre, mas a funcao eliminar esta sempre a eliminar o ultimo cliente existente, isso e obvio porque o numero de clientes fica sempre menos um. por exemplo se tenho 3 clientes carrego em 5 (eliminar o 1º cliente ) e o resultado é : cliente 1 .... cliente 2 (mal porque aparece o 1º cliente na mesma, e mais o cliente 3 desapareceu ) de novo em 5 (eliminar o 1º cliente ) resultado é : cliente 1 ( nao elimina o cliente 1) de novo em 5 (eliminar o 1º cliente ) resultado é : (sem clientes ) ou seja, eliminou todos os clientes mas nao por ordem certa Código: // trabalho prático APROG 2012/2013 "gestão de caravanas" #include<stdio.h> #include<time.h> // tempo #include<stdlib.h> // memoria dinamica malloc realloc calloc #define MAX 20 // maximo 20 veiculos // estrutura contrato typedef struct contrato { short int cod_vc; // codigo do veiculo ( entre 1000 e 9999) short int cod_cl; // codigo cliente (entre 1000 e 9999) float preco_dia; // valor diario em unidades monetarias € - caravanas -100€/dia float preco_km; // valor em Km andado em unidades metricas - autocaravanas - 2€/Km float qt_km; // quilometros percoridos //data_tipo data_ini; // data inicio aluguer - 01 jan 2012 //data_tipo data_fim; // data fim de aluguer char escritorio_ini[10]; // escritorio onde o veiculo é alugado - Lisboa Porto Coimbra Algarve Braga Aveiro char escritorio_fim[10]; // escritorio onde o veiculo é devolvido - Lisboa Porto Coimbra Algarve Braga Aveiro }contrato_tipo; // estrutura veiculo typedef struct veiculo { short int cod_vc; // codigo veiculo (entre 10 e 99) char marca[10]; // marca veiculo autocaravanas - Adria (Coral,Action) Burstner(Travel,Club,Holiday) Kabe(Travelmaster) char modelo[10]; // modelo veiculo // caravanas - Adria (Linea,Adora, Alpina) Burstner(City,) Kabe (Royal,Eximo) char matricula[8]; // matricula do veiculo 00-00-AA short int cod_categoria; // categoria do veiculo: autocaravanas - capucine, integral, perfilada, furgao | caravanas - citadina, utilitaria, familiar float km; // quilometragem actual do veiculo em Km float qt_comb; // quantidade de combustivel no deposito em Litros char estado; // estado veiculo : 'D' - disponivel; 'A' - alugado }veiculo_tipo; // estrutura cliente typedef struct cliente // nome cliente desnecessário { short int cod_cl; // código cliente (entre 1000 e 9999) // short int –32,768 to 32,767 char nome [30]; // nome do cliente maximo 30 caracteres char morada[40]; // morada do cliente maximo 40 caracteres short int tipo; // tipo de cliente ( 0- cliente normal; 1- cliente de risco) char carta_conducao[5]; // numero de carta de condução 123456 veiculo_tipo veiculo; contrato_tipo contrato; }cliente_tipo; // estrutura data typedef struct data { short int dia; // dia 1-31 char mes[3]; // jan,fev...dez short int ano; // ano 2012 }data_tipo; char categoria[][10]={"capucine","integral","perfilada","furgao","citadina","utilitaria","familiar"}; short int mes_dias[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; // funcoes escrever/ler/mostrar/eliminar/alterar cliente, veiculo, contrato, data //funcao escrever cliente/veiculos/contratos void escrever_cliente(cliente_tipo *cliente, int qtd_clientes) { int i; char D,A; for(i=0;i<qtd_clientes;i++) { //**** clientes *****// printf(" \n\n --- cliente %d --- ",i+1); fflush(stdin); //limpa o buffer do teclado printf(" \n qual o codigo do cliente ? "); scanf("%d",&cliente[i].cod_cl); // -> porque cliente é um vetor while(cliente[i].cod_cl<1000 || cliente[i].cod_cl>9999 && cliente[i].cod_cl != cliente[i].cod_cl) // falta - os codigos nao podem ser iguais na mesma estrutura { printf(" \n erro ! digite o codigo do cliente com 4 digitos \n"); scanf("%d",&cliente[i].cod_cl); // gets - le strings (cadeia de caracteres com espaços), scanf - le so numeros ou uma unica letra ? } fflush(stdin); printf(" \n qual o nome do cliente ? "); gets(cliente[i].nome); // equivalente a : scanf("%d",&(*cliente).nome); x-> igual a (*x). fflush(stdin); printf(" \n qual o morada do cliente ? "); gets(cliente[i].morada); fflush(stdin); printf(" \n qual o tipo de cliente ? "); scanf("%d",&cliente[i].tipo); while(cliente[i].tipo!=0 && cliente[i].tipo!=1) { printf(" \n erro ! digite o tipo de cliente 0- cliente normal 1- cliente de risco \n"); scanf("%d",&cliente[i].tipo); // gets - le strings (cadeia de caracteres com espaços), scanf - le so numeros ou uma unica letra ? } fflush(stdin); printf(" \n qual o numero da carta de conducao ? "); gets(cliente[i].carta_conducao); // equivalente a : scanf("%d",&(*cliente).nome); x-> igual a (*x). //**** veiculos *****// printf(" \n\n --- veiculo %d --- ",i+1); fflush(stdin); //limpa o buffer do teclado printf(" \n qual o codigo do veiculo ? "); scanf("%d",&cliente[i].veiculo.cod_vc); // vc - codigo do veiculo while(cliente[i].veiculo.cod_vc < 10 || cliente[i].veiculo.cod_vc > 99) // falta - os codigos nao podem ser iguais na mesma estrutura { printf(" \n erro ! digite o codigo do veiculo com 2 digitos \n"); scanf("%d",&cliente[i].veiculo.cod_vc); // gets - le strings (cadeia de caracteres com espaços), scanf - le so numeros ou uma unica letra ? } fflush(stdin); printf(" \n qual a marca do veiculo ? "); // < Adria ou Burstner ou Kabe> gets(cliente[i].veiculo.marca); fflush(stdin); printf(" \n qual o modelo do veiculo ? "); // < autocaravanas - Adria(Coral,Action), Burstner(Travel,Club,Holiday) e Kabe(Travelmaster) | caravanas - Adria(Linea,Adora,Alpina), Burstner(City,) e Kabe (Royal,Eximo) > gets(cliente[i].veiculo.modelo); fflush(stdin); printf(" \n qual a matricula do veiculo ? "); // < 00-00-AA > gets(cliente[i].veiculo.matricula); fflush(stdin); printf(" \n qual o numero da categoria do veiculo ? "); // codigo categoria deve variar entre 0 e 4 // <autocaravanas - 1-capucine, 2-integral, 3-perfilada, 4-furgao | caravanas - 5-citadina, 6-utilitaria, 7-familiar > scanf("%d",&cliente[i].veiculo.cod_categoria); fflush(stdin); printf(" \n quilometragem actual do veiculo ?"); scanf("%f",&cliente[i].veiculo.km); fflush(stdin); printf(" \n qual a quantidade de combustivel no deposito ? "); scanf("%f",&cliente[i].veiculo.qt_comb); fflush(stdin); printf("\n qual o estado do veiculo? <'D' -disponivel ou 'A' - alugado> "); scanf("%c",&cliente[i].veiculo.estado); while(cliente[i].veiculo.estado != 'D' && cliente[i].veiculo.estado != 'd' && cliente[i].veiculo.estado != 'A' && cliente[i].veiculo.estado != 'a') { printf("\n opcao invalida! qual o estado do veiculo? <'D' -disponivel ou 'A' -alugado >\n"); scanf("%c",&cliente[i].veiculo.estado); // gets - le strings (cadeia de caracteres com espaços), scanf - le so numeros ou uma unica letra ? } //**** contratos *****// printf(" \n\n --- contrato %d --- ",i+1); printf(" \n o codigo do cliente %d e %hd ",i+1,cliente[i].cod_cl); fflush(stdin); printf(" \n o codigo do veiculo %d e %hd ",i+1,cliente[i].veiculo.cod_vc); fflush(stdin); printf(" \n qual o preco diario de aluguer ? <caravanas> "); scanf("%f",&cliente[i].contrato.preco_dia); fflush(stdin); printf(" \n qual o preco por kilometro ? <autocaravanas>"); scanf("%f",&cliente[i].contrato.preco_km); fflush(stdin); printf(" \n quantos kilometros percorridos ? "); scanf("%f",&cliente[i].contrato.qt_km); fflush(stdin); /*printf(" \n qual a data de inicio de aluguer ? "); scanf("%s",&cliente[i].contrato.data_ini); fflush(stdin); printf(" \n qual a data de fim de aluguer ? "); scanf("%s",&cliente[i].contrato.data_fim); fflush(stdin); */ printf(" \n qual o destrito do escritorio em que alugou o veiculo ? "); gets(cliente[i].contrato.escritorio_ini); fflush(stdin); printf(" \n qual o destrito do escritorio em que devolveu o veiculo ? "); gets(cliente[i].contrato.escritorio_fim); fflush(stdin); printf("\n prima qualquer tecla para continuar"); getch(); } } // mostra todos os clientes guardados em memoria, o parametro qtd_clientes é a quantidade de clientes void mostrar_cliente(cliente_tipo *cliente, int qtd_clientes) {//permite visualizar o conteudo da estrutura , só printf´s com %s ou %d int i; for(i=0;i<qtd_clientes;i++) { printf(" \n\n cliente %d ",i+1); printf(" \n codigo do cliente : %d ",cliente[i].cod_cl); printf(" \n nome do cliente : %s ",cliente[i].nome); printf(" \n morada : %s ",cliente[i].morada); printf(" \n tipo de cliente : %d ",cliente[i].tipo); printf(" \n numero carta conducao : %s ",cliente[i].carta_conducao); printf(" \n\n veiculo %d ",i+1); printf(" \n codigo do veiculo : %d ",cliente[i].veiculo.cod_vc); printf(" \n marca do veiculo : %s ",cliente[i].veiculo.marca); printf(" \n modelo do veiculo : %s ",cliente[i].veiculo.modelo); printf(" \n matricula do veiculo : %s ",cliente[i].veiculo.matricula); printf(" \n categoria do veiculo : %d ",cliente[i].veiculo.cod_categoria); printf(" \n quilometragem atual do veiculo : %.3f Km",cliente[i].veiculo.km); printf(" \n quantidade de combustivel no deposito : %.3f Litros",cliente[i].veiculo.qt_comb); printf(" \n estado do veiculo : %c ",cliente[i].veiculo.estado); printf(" \n\n contrato %d ",i+1); printf(" \n codigo do cliente : %d ",cliente[i].cod_cl); printf(" \n codigo do veiculo : %d ",cliente[i].veiculo.cod_vc); printf(" \n preco em euros por dia de aluguer : %.2f ",cliente[i].contrato.preco_dia); printf(" \n preco por km : %.2f ",cliente[i].contrato.preco_km); printf(" \n kilometros percorridos : %.3f ",cliente[i].contrato.qt_km); //printf(" \n data inicio de aluguer : %s ",cliente[i].contrato.data_ini); //printf(" \n data fim de aluguer : %s ",cliente[i].contrato.data_fim); printf(" \n escritorio veiculo alugado : %s ",cliente[i].contrato.escritorio_ini); printf(" \n escritorio veiculo devolvido: %s ",cliente[i].contrato.escritorio_fim); } printf(" \n prima qualquer tecla para continuar"); // se premido alguma tecla sai da funcao void mostrar_cliente(cliente_tipo *cliente, int qtd_clientes) getch(); // le as teclas digitadas sai } int ler_quantidade_clientes() //pergunta quantos clientes pretende guardar e retorna esse numero {// le um numero positivo e inferior a MAX - 20 int qtd_clientes,i; do { printf("\n qual a quantidade maxima de clientes ( entre 1 e %d): ",MAX); scanf("%d",&qtd_clientes); }while (qtd_clientes<1 || qtd_clientes >MAX); return qtd_clientes; } // e) funcao procura e mostra todos os clientes com o nome indicado no vetor nome[10] void procurar_clientes(cliente_tipo cliente[], char nome[], int qtd_clientes) // cliente[] = *cliente { int i, flag=1; // 1 = verdadeiro (qualquer numero != 0 ) , 0= falso for(i=0;i<qtd_clientes && flag;i++) // se a flag tambem for verdadeira (!= 0) 1,2,3,4... { if(strcmp(cliente[i].nome,nome)==0) // compara duas strings, comeca por comparar o primeiro caracter de cada string se forem ambas iguais continua a percorer a string até chegar ao null ou até que algum par ( de strings)seja diferente // se retornar 0 as strings sao iguais, se for >0 o caracter diferente e maior na string1 (a[i].cidade) do que na string2 (cid) // se for <0 exactamente o contrario { printf(" \n\n cliente %d ",i+1); printf(" \n codigo cliente : %d ",cliente[i].cod_cl); printf(" \n nome cliente : %s ",cliente[i].nome); printf(" \n morada : %s ",cliente[i].morada); printf(" \n tipo de cliente : %d ",cliente[i].tipo); printf(" \n numero carta conducao : %s ",cliente[i].carta_conducao); printf(" \n\n veiculo %d ",i+1); printf(" \n codigo do veiculo : %d ",cliente[i].veiculo.cod_vc); printf(" \n marca do veiculo : %s ",cliente[i].veiculo.marca); printf(" \n modelo do veiculo : %s ",cliente[i].veiculo.modelo); printf(" \n matricula do veiculo : %s ",cliente[i].veiculo.matricula); printf(" \n categoria do veiculo : %d ",cliente[i].veiculo.cod_categoria); printf(" \n quilometragem atual do veiculo : %.3f Km",cliente[i].veiculo.km); printf(" \n quantidade de combustivel no deposito : %.3f Litros",cliente[i].veiculo.qt_comb); printf(" \n estado do veiculo : %c ",cliente[i].veiculo.estado); printf(" \n\n contrato %d ",i+1); printf(" \n codigo do cliente : %d ",cliente[i].cod_cl); printf(" \n codigo do veiculo : %d ",cliente[i].veiculo.cod_vc); printf(" \n preco em euros por dia de aluguer : %.2f ",cliente[i].contrato.preco_dia); printf(" \n preco por km : %.2f ",cliente[i].contrato.preco_km); printf(" \n kilometros percorridos : %.3f ",cliente[i].contrato.qt_km); //printf(" \n data inicio de aluguer : %s ",cliente[i].contrato.data_ini); //printf(" \n data fim de aluguer : %s ",cliente[i].contrato.data_fim); printf(" \n escritorio veiculo alugado : %s ",cliente[i].contrato.escritorio_ini); printf(" \n escritorio veiculo devolvido: %s ",cliente[i].contrato.escritorio_fim); flag=0; // é falso } } } /* alterar clientes void alterar_cliente( cliente_tipo *cliente, int *qtd_clientes) { int i, esc; // esc - escolha da opção printf("\n qual o cliente que deseja alterar ?"); gets(cliente[i].nome); // equivalente a : scanf("%d",&(*cliente).nome); x-> igual a (*x). fflush(stdin); printf("\n qual o campo que deseja alterar 1- codigo cliente 2- nome 3- morada 4- tipo de cliente 5- carta conduçao?"); fflush(stdin); scanf("%d",&esc); // determina a escolha a efectuar switch(esc) { case'1': printf ("\n vai alterar o codigo do cliente"); gets(cliente[i].cod_cl); fflush(stdin); printf ("\n codigo do cliente alterado ! "); break; case'2': printf ("\n vai alterar o nome do cliente"); gets(cliente[i].nome); fflush(stdin); printf ("\n nome do cliente alterado ! "); break; case'3': printf ("\n vai alterar a morada do cliente"); gets(cliente[i].morada); fflush(stdin); printf ("\n morada do cliente alterada ! "); break; case'4': printf ("\n vai alterar o tipo de cliente"); gets(cliente[i].tipo); fflush(stdin); printf ("\n tipo de cliente alterado ! "); break; case'5': printf ("\n vai alterar o numero de carta conducao do cliente"); gets(cliente[i].carta_conducao); fflush(stdin); printf ("\n numero de carta de conducao alterada ! "); break; default : printf("\n nenhum dos campos foi alterado "); } } */ //eliminar clientes void eliminar_cliente(int pos,cliente_tipo *cliente, int *qtd_clientes) { int i; for (i=pos;i<=*qtd_clientes-1;i++) cliente[i]=cliente[i+1]; (*qtd_clientes)--; // retira um cliente } // menu de opcoes char formulario () // nao é void formulario (), mas sim char formulario () porque retorna os caracteres { char r; // o caracter digitado é guardado em r do { system ("cls"); // limpa o monitor, é um comando do windows (DOS cmd) , system ("cls"); == a system("dir"); , ou char s="cd bin" , system (cd); printf(" 1- Inserir clientes \n"); printf(" 2- Mostrar clientes \n"); printf(" 3- Procurar cliente por nome \n"); printf(" 4- Alterar cliente \n"); printf(" 5- Eliminar cliente \n"); printf(" s/S- Sair \n"); r=getch(); // le o caracter digitado guarda como r e depois vai para a funcao }while (r!= 's' && r!= 'S' && r!= '1' && r!= '2' && r!= '3' && r!= '4' && r!= '5'); return r; } int main() // retorna um inteiro 0 é certo ? , 1 é errado ? { char ch, nome[30]; int qtd_clientes=0,i,pos,a; cliente_tipo cliente[MAX+1]; // cliente_tipo cliente; e não veiculo_tipo disciplina porque a estrutura veiculo está dentro da estrutura cliente, estrutura cliente é a principal ? do { ch=formulario(); switch(ch) { //preenche os vetores da estrutura cliente case '1' : { // retorna a quantidade de clientes a analisar qtd_clientes=ler_quantidade_clientes(); escrever_cliente(cliente,qtd_clientes); break; } // lista todos os clientes case'2' : { mostrar_cliente(cliente,qtd_clientes); //mostrar_cliente(cliente, qtd_clientes) break; } //procura o cliente pelo nome case '3': { printf("\n nome do cliente a procurar ?: "); gets(nome); procurar_clientes(cliente, nome, qtd_clientes); printf("\n prima qualquer tecla para continuar"); getch(); break; } /* altera o cliente case '4': { alterar_cliente(cliente,qtd_clientes); printf(" \n cliente alterado !"); mostrar_cliente(cliente,qtd_clientes); printf("\n prima qualquer tecla para continuar"); getch(); break; } */ //elimina o cliente case '5': { printf("\n qual a posicao do cliente que quer eliminar ? <posicao 1 ate %d > ",qtd_clientes); // se digitar 1 elimina cliente 3, se digitar 1 de novo eliminina cliente 2 depois elimina o cliente 1 scanf("%d",&pos); // se digitar 2 de novo elimnina cliente 2 depois elimina o cliente 1 eliminar_cliente(pos,cliente,&qtd_clientes); printf("\n eliminou o cliente %d \n",pos); printf("\n tem os seguintes clientes registados"); mostrar_cliente(cliente,qtd_clientes); getch(); break; } } }while(ch!='s' && ch!='S'); system("pause"); return 0; //diferença entre 0 e 1 ?? }