1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Trabalho Programação C

Discussão em 'Programação' iniciada por insyspower, 17 de Dezembro de 2012. (Respostas: 3; Visualizações: 1924)

  1. insyspower

    insyspower Power Member

    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
     
    Última edição: 17 de Dezembro de 2012
  2. insyspower

    insyspower Power Member

    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
     
    Última edição: 3 de Janeiro de 2013
  3. dropko

    dropko Power Member

    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);
     
  4. insyspower

    insyspower Power Member

    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 ??
    }
    
     
    Última edição: 7 de Janeiro de 2013

Partilhar esta Página