Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
matheus_moraes

Programa não roda !

Recommended Posts

Não sei o motivo do programa nao compilar
Me ajudem


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.cod_cl); // -> porque cliente é um vetor
        while(cliente.cod_cl<1000 || cliente.cod_cl>9999 && cliente.cod_cl != cliente.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.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.nome); // equivalente a : scanf("%d",&(*cliente).nome);       x->  igual a (*x).
        fflush(stdin);
        printf(" \n qual o morada do cliente ? ");
        gets(cliente.morada);
        fflush(stdin);
        printf(" \n qual o tipo de cliente ? ");
        scanf("%d",&cliente.tipo); 
        while(cliente.tipo!=0 && cliente.tipo!=1)
        {
            printf(" \n erro ! digite o tipo de cliente 0- cliente normal 1- cliente de risco \n");
            scanf("%d",&cliente.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.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.veiculo.cod_vc); // você - codigo do veiculo
        while(cliente.veiculo.cod_vc < 10 || cliente.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.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.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.veiculo.modelo);
        fflush(stdin);
        
        printf(" \n qual a matricula do veiculo ? "); //  < 00-00-AA >
        gets(cliente.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.veiculo.cod_categoria);
        fflush(stdin);
        
        printf(" \n quilometragem actual do veiculo ?");
        scanf("%f",&cliente.veiculo.km);
        fflush(stdin);
        
        printf(" \n qual a quantidade de combustivel no deposito ? ");
        scanf("%f",&cliente.veiculo.qt_comb);
        fflush(stdin); 
        
        printf("\n qual o estado do veiculo? <'D' -disponivel ou 'A' - alugado> ");
        scanf("%c",&cliente.veiculo.estado);
         while(cliente.veiculo.estado != 'D' && cliente.veiculo.estado != 'd' && cliente.veiculo.estado != 'A' && cliente.veiculo.estado != 'a')
        {
            printf("\n opcao invalida! qual o estado do veiculo? <'D' -disponivel ou 'A' -alugado >\n");
            scanf("%c",&cliente.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.cod_cl);
        fflush(stdin);
        
        printf(" \n o codigo do veiculo %d e %hd ",i+1,cliente.veiculo.cod_vc);
        fflush(stdin);
        
        printf(" \n qual o preco diario de aluguer ? <caravanas> ");
        scanf("%f",&cliente.contrato.preco_dia);
        fflush(stdin);
        
        printf(" \n qual o preco por quilometro ? <autocaravanas>");
        scanf("%f",&cliente.contrato.preco_km);
        fflush(stdin);
        
        printf(" \n quantos quilometros percorridos ? ");
        scanf("%f",&cliente.contrato.qt_km);
        fflush(stdin);
    
        /*printf(" \n qual a data de inicio de aluguer ? ");
        scanf("%s",&cliente.contrato.data_ini);
        fflush(stdin);
        
        printf(" \n qual a data de fim de aluguer ? ");
        scanf("%s",&cliente.contrato.data_fim);
        fflush(stdin); */
    
        printf(" \n qual o destrito do escritorio em que alugou o veiculo ? ");
        gets(cliente.contrato.escritorio_ini); 
        fflush(stdin);
        
        printf(" \n qual o destrito do escritorio em que devolveu o veiculo ? ");
        gets(cliente.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.cod_cl);
        printf(" \n  nome do cliente : %s ",cliente.nome);
        printf(" \n  morada : %s ",cliente.morada);
        printf(" \n  tipo de cliente : %d ",cliente.tipo);
        printf(" \n  numero carta conducao : %s ",cliente.carta_conducao);
        
        printf(" \n\n veiculo %d ",i+1);
        printf(" \n  codigo do veiculo : %d ",cliente.veiculo.cod_vc);
        printf(" \n  marca do veiculo : %s ",cliente.veiculo.marca);
        printf(" \n  modelo do veiculo : %s ",cliente.veiculo.modelo);
        printf(" \n  matricula do veiculo : %s ",cliente.veiculo.matricula);
        printf(" \n  categoria do veiculo : %d ",cliente.veiculo.cod_categoria);
        printf(" \n  quilometragem atual do veiculo : %.3f Km",cliente.veiculo.km);
        printf(" \n  quantidade de combustivel no deposito : %.3f Litros",cliente.veiculo.qt_comb);
        printf(" \n  estado do veiculo : %c ",cliente.veiculo.estado); 
        
        printf(" \n\n contrato %d ",i+1);
        printf(" \n  codigo do cliente : %d ",cliente.cod_cl);
        printf(" \n  codigo do veiculo : %d ",cliente.veiculo.cod_vc);
        printf(" \n  preco em euros por dia de aluguer : %.2f ",cliente.contrato.preco_dia);
        printf(" \n  preco por km : %.2f ",cliente.contrato.preco_km);
        printf(" \n  quilometros percorridos : %.3f ",cliente.contrato.qt_km);
        //printf(" \n  data inicio de aluguer : %s ",cliente.contrato.data_ini);
        //printf(" \n  data fim de aluguer : %s ",cliente.contrato.data_fim);
        printf(" \n  escritorio veiculo alugado : %s ",cliente.contrato.escritorio_ini);
        printf(" \n  escritorio veiculo devolvido: %s ",cliente.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.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.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.cod_cl);
            printf(" \n  nome cliente : %s ",cliente.nome);
            printf(" \n  morada : %s ",cliente.morada);
            printf(" \n  tipo de cliente : %d ",cliente.tipo);
            printf(" \n  numero carta conducao : %s ",cliente.carta_conducao);
            
            printf(" \n\n veiculo %d ",i+1);
            printf(" \n  codigo do veiculo : %d ",cliente.veiculo.cod_vc);
            printf(" \n  marca do veiculo : %s ",cliente.veiculo.marca);
            printf(" \n  modelo do veiculo : %s ",cliente.veiculo.modelo);
            printf(" \n  matricula do veiculo : %s ",cliente.veiculo.matricula);
            printf(" \n  categoria do veiculo : %d ",cliente.veiculo.cod_categoria);
            printf(" \n  quilometragem atual do veiculo : %.3f Km",cliente.veiculo.km);
            printf(" \n  quantidade de combustivel no deposito : %.3f Litros",cliente.veiculo.qt_comb);
            printf(" \n  estado do veiculo : %c ",cliente.veiculo.estado);
            
            printf(" \n\n contrato %d ",i+1);
            printf(" \n  codigo do cliente : %d ",cliente.cod_cl);
            printf(" \n  codigo do veiculo : %d ",cliente.veiculo.cod_vc);
            printf(" \n  preco em euros por dia de aluguer : %.2f ",cliente.contrato.preco_dia);
            printf(" \n  preco por km : %.2f ",cliente.contrato.preco_km);
            printf(" \n  quilometros percorridos : %.3f ",cliente.contrato.qt_km);
            //printf(" \n  data inicio de aluguer : %s ",cliente.contrato.data_ini);
            //printf(" \n  data fim de aluguer : %s ",cliente.contrato.data_fim);
            printf(" \n  escritorio veiculo alugado : %s ",cliente.contrato.escritorio_ini);
            printf(" \n  escritorio veiculo devolvido: %s ",cliente.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.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.cod_cl);
                     fflush(stdin); 
                     printf ("\n  codigo do cliente alterado ! ");
                       break;
                 
             case'2': printf ("\n vai alterar o nome do cliente"); 
                     gets(cliente.nome);
                     fflush(stdin); 
                     printf ("\n  nome do cliente alterado ! ");
                     break;
                 
            case'3': printf ("\n vai alterar a morada do cliente"); 
                     gets(cliente.morada);
                     fflush(stdin); 
                     printf ("\n  morada do cliente alterada ! ");
                        break;
                 
            case'4': printf ("\n vai alterar o tipo de cliente"); 
                     gets(cliente.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.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=cliente[i+1];
    (*qtd_clientes)--;  // retira um cliente
}  

//  menu de opções    
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); 
                    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;
              }    
        }    
    }while(ch!='s' && ch!='S');
    system("pause");
       return 0; //diferença entre 0 e 1 ??
}

 

Editado por dif
Inserir o código dentro da tag CODE

Compartilhar este post


Link para o post
Compartilhar em outros sites

Da proxima vez verifica os erros do compilador, por que seu erro foi grosseiro, sinceramente, então o erro é que você não esta utilizando o '[' ']' para identificar qual struct cliente você esta acessando, já que você tem um array de struct, segue o código editado:

 

#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <string.h>
#define MAX 20
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[][20]={"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); // você - 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 quilometro ? <autocaravanas>");
        scanf("%f",&cliente[i].contrato.preco_km);
        fflush(stdin);

        printf(" \n quantos quilometros percorridos ? ");
        scanf("%f",&cliente[i].contrato.qt_km);
        fflush(stdin);

        /*printf(" \n qual a data de inicio de aluguer ? ");
        scanf("%s",&cliente.contrato.data_ini);
        fflush(stdin);

        printf(" \n qual a data de fim de aluguer ? ");
        scanf("%s",&cliente.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");
        getchar();

    }
}
// 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  quilometros percorridos : %.3f ",cliente[i].contrato.qt_km);
        //printf(" \n  data inicio de aluguer : %s ",cliente.contrato.data_ini);
        //printf(" \n  data fim de aluguer : %s ",cliente.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)

    getchar(); // 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.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  quilometros percorridos : %.3f ",cliente[i].contrato.qt_km);
            //printf(" \n  data inicio de aluguer : %s ",cliente.contrato.data_ini);
            //printf(" \n  data fim de aluguer : %s ",cliente.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
        }
    }
    getchar();
}
/* 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.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.cod_cl);
                     fflush(stdin);
                     printf ("\n  codigo do cliente alterado ! ");
                       break;

             case'2': printf ("\n vai alterar o nome do cliente");
                     gets(cliente.nome);
                     fflush(stdin);
                     printf ("\n  nome do cliente alterado ! ");
                     break;

            case'3': printf ("\n vai alterar a morada do cliente");
                     gets(cliente.morada);
                     fflush(stdin);
                     printf ("\n  morada do cliente alterada ! ");
                        break;

            case'4': printf ("\n vai alterar o tipo de cliente");
                     gets(cliente.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.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 opções
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=getchar(); // 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");
                    getchar();
                    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);
                    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);
                    getchar();
                    break;
              }
        }
    }while(ch!='s' && ch!='S');
    system("pause");
       return 0; //diferença entre 0 e 1 ??
}

P.S: eu alterei os getch() para getchar() para meu compilador poder compilar...

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 20/05/2016 às 20:45, 1freakday disse:

Da proxima vez verifica os erros do compilador, por que seu erro foi grosseiro, sinceramente, então o erro é que você não esta utilizando o '[' ']' para identificar qual struct cliente você esta acessando, já que você tem um array de struct, segue o código editado:

 


#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <string.h>
#define MAX 20
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[][20]={"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); // você - 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 quilometro ? <autocaravanas>");
        scanf("%f",&cliente[i].contrato.preco_km);
        fflush(stdin);

        printf(" \n quantos quilometros percorridos ? ");
        scanf("%f",&cliente[i].contrato.qt_km);
        fflush(stdin);

        /*printf(" \n qual a data de inicio de aluguer ? ");
        scanf("%s",&cliente.contrato.data_ini);
        fflush(stdin);

        printf(" \n qual a data de fim de aluguer ? ");
        scanf("%s",&cliente.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");
        getchar();

    }
}
// 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  quilometros percorridos : %.3f ",cliente[i].contrato.qt_km);
        //printf(" \n  data inicio de aluguer : %s ",cliente.contrato.data_ini);
        //printf(" \n  data fim de aluguer : %s ",cliente.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)

    getchar(); // 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.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  quilometros percorridos : %.3f ",cliente[i].contrato.qt_km);
            //printf(" \n  data inicio de aluguer : %s ",cliente.contrato.data_ini);
            //printf(" \n  data fim de aluguer : %s ",cliente.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
        }
    }
    getchar();
}
/* 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.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.cod_cl);
                     fflush(stdin);
                     printf ("\n  codigo do cliente alterado ! ");
                       break;

             case'2': printf ("\n vai alterar o nome do cliente");
                     gets(cliente.nome);
                     fflush(stdin);
                     printf ("\n  nome do cliente alterado ! ");
                     break;

            case'3': printf ("\n vai alterar a morada do cliente");
                     gets(cliente.morada);
                     fflush(stdin);
                     printf ("\n  morada do cliente alterada ! ");
                        break;

            case'4': printf ("\n vai alterar o tipo de cliente");
                     gets(cliente.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.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 opções
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=getchar(); // 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");
                    getchar();
                    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);
                    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);
                    getchar();
                    break;
              }
        }
    }while(ch!='s' && ch!='S');
    system("pause");
       return 0; //diferença entre 0 e 1 ??
}

P.S: eu alterei os getch() para getchar() para meu compilador poder compilar...

 

QUANDO EU ESCREVO TODOS OS DADOS, COLOCO NA OPÇÃO 2 MOSTRAR CLIENTES, O PROGRAMA MOSTRAR SUPER rápido E VOLTA AO INICIAL, QUANDO COLOCO A OPÇÃO PROCURAR CLIENTE, ELE FAZ A MESMA COISA.

COMO RESOLVO ISSO ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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
Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×