BOA TARDE AMIGOS ! MEU PROGRAMA ESTÁ RODANDO COM ERRO GRAVE. NA OPÇÃO 1 DO MENU ELE CADASTRA , ATÉ AE TUDO CERTO
QUANDO APERTO A OPÇÃO 3,4,5 ELE DÁ ERRO , já REVI O CODIGO POR VEZES E não ACHO O QUE PODE SER.
SE alguém PUDER AUXILIAR, AGRADEÇO !
#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;
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 não 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 não 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 preço diario de aluguer ? <caravanas> ");
scanf("%f",&cliente.contrato.preco_dia);
fflush(stdin);
printf(" \n qual o preço por quilometro ? <autocaravanas>");
scanf("%f",&cliente.contrato.preco_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");
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.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 preço em euros por dia de aluguer : %.2f ",cliente.contrato.preco_dia);
printf(" \n preço 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)
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.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 são 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 preço em euros por dia de aluguer : %.2f ",cliente.contrato.preco_dia);
printf(" \n preço 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
}
}
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=cliente[i+1];
(*qtd_clientes)--; // retira um cliente
}
// menu de opções
char formulario () // não é 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 ??
}
Pergunta
moraesd2
BOA TARDE AMIGOS ! MEU PROGRAMA ESTÁ RODANDO COM ERRO GRAVE. NA OPÇÃO 1 DO MENU ELE CADASTRA , ATÉ AE TUDO CERTO
QUANDO APERTO A OPÇÃO 3,4,5 ELE DÁ ERRO , já REVI O CODIGO POR VEZES E não ACHO O QUE PODE SER.
SE alguém PUDER AUXILIAR, AGRADEÇO !
#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.cod_cl); // -> porque cliente é um vetor
while(cliente.cod_cl<1000 || cliente.cod_cl>9999 && cliente.cod_cl != cliente.cod_cl) // falta - os codigos não 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 não 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 preço diario de aluguer ? <caravanas> ");
scanf("%f",&cliente.contrato.preco_dia);
fflush(stdin);
printf(" \n qual o preço 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");
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.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 preço em euros por dia de aluguer : %.2f ",cliente.contrato.preco_dia);
printf(" \n preço 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)
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.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 são 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 preço em euros por dia de aluguer : %.2f ",cliente.contrato.preco_dia);
printf(" \n preço 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
}
}
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=cliente[i+1];
(*qtd_clientes)--; // retira um cliente
}
// menu de opções
char formulario () // não é 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 ??
}
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.