Duvida ao passar informações de uma struct para outra.

1. Duvida ao passar informações de uma struct para outra.

Yuri
yuryshadow

(usa Ubuntu)

Enviado em 21/05/2018 - 14:07h

Olá a todos!

Eu criei um sisteminha para estudos, algo bem simples só para tirar uma dúvida, que eu já estou a um tempo.
O código a seguir é de um sistema de locação de veículos (Como o foco é meramente didático e para o código não ficar tão grande eu me atentei a apenas colocar o código de inserção de cada struct, que já foi testado e está funcionando).

Note mais abaixo que existe um método chamado `Locacao* inserir_locacao(Locacao *primeiraLocacao){` esse método deveria conter o nome do veículo e o nome do cliente já cadastrado, provavelmente terei que fazer algum tipo de busca nas struct que eu já criei, porém não tenho idéia de como fazer isso, alguém poderia me ajudar?


    //Livrarias do sistema

#include <stdio.h>
//#include <conio.h>
#include <string.h>
#include <stdlib.h>

typedef struct cliente{
unsigned long int codigo;
char nome[50];
struct cliente* prox;
}Cliente;

typedef struct veiculo {
unsigned int codigo;
char modelo[50];
struct veiculo* prox;
}Veiculo;

typedef struct locacao {
unsigned long int codigo;
int codCliente;
char nomeCliente[50];
int cod_veiculo;
char modelo[50];
struct locacao* prox;
}Locacao;

//Declaracao de Funcoes

//Funcoes de gerenciamento de clientes
Cliente* inserir_cliente(Cliente* primeiro);

//Funcoes de gerenciamento de veiculos
Veiculo* inserir_veiculo(Veiculo* primeiro);

//Funcoes de gerenciamento de locacao
//Locacao* nova_locacao(Locacao* primeiro);

void main(){

//Declaracao de variaveis
char opcao;
Cliente *primeiroCliente = NULL;
Veiculo *primeiroVeiculo = NULL;
//Locacao *primeiraLocacao = NULL;

while (opcao != 's') {
//Menu de opcoes

printf(" @----------------------------------------------------------------------------@\n");
printf(" | ");printf("\t\t\t SISTEMA DE LOCACAO DE VEICULOS");printf("\t\t |\n");
printf(" @----------------------------------------------------------------------------@\n");
printf("\n");
printf(" @----------------------------------------------------------------------------@\n");
printf(" | <A> -> Inserir Cliente |\n");
printf(" @----------------------------------------------------------------------------@\n");
printf(" | <B> -> Inserir Veiculo |\n");
printf(" |----------------------------------------------------------------------------|\n");
printf(" | <C> -> Inserir Locacao |\n");
printf(" |----------------------------------------------------------------------------|\n");

//Lendo a opcao do menu
fflush(stdin);
opcao = getch();

//Menu de opcoes
switch (opcao)
{
//Nova locacao
case 'a':
case 'A':
fflush(stdin);
system("cls");
printf(" %c----------------------------------------------------------------------------%c\n",201,187);
printf(" | ");printf("\t\t\t Inserir Cliente ");printf("\t\t\t |\n");
printf(" %c----------------------------------------------------------------------------%c\n",200,188);
primeiroCliente = inserir_cliente(primeiroCliente);
getch();
system("cls");
break;

//Alterar dados da locacao
case 'b':
case 'B':
fflush(stdin);
system("cls");
printf(" %c----------------------------------------------------------------------------%c\n",201,187);
printf(" | ");printf("\t\t\t Inserir Veiculo ");printf("\t\t\t |\n");
printf(" %c----------------------------------------------------------------------------%c\n",200,188);
primeiroVeiculo = inserir_veiculo(primeiroVeiculo);
getch();
system("cls");
break;

//Listar locacao
case 'c':
case 'C':
fflush(stdin);
system("cls");
printf(" %c----------------------------------------------------------------------------%c\n",201,187);
printf(" | ");printf("\t\t\t Inserir Locacao ");printf("\t\t\t |\n");
printf(" %c----------------------------------------------------------------------------%c\n",200,188);
//primeiraLocacao = inserir_locacao(primeiraLocacao);
getch();
system("cls");
break;
//Sair do programa
case 's':
case 'S':
opcao = 's';

break;

//Previne a situacao de um usuario qualquer, digitar uma opcao nao fornecida.
default:
system("cls");
break;

}

}
}

//Inserir Locacao
/*
Locacao* inserir_locacao(Locacao *primeiraLocacao){
Locacao locacao;
Locacao *atual = primeiraLocacao;
char identificador = 'F';
}

//Lendo as informacoes da locacao
printf(" Codigo da locacao: ");
scanf("%u", &locacao.codigo); printf("\n");
printf("%s\n"," " );
fflush(stdin); fgets(locacao.nome, 40, stdin); printf("\n");
*/

//Inserindo veiculo
Veiculo* inserir_veiculo(Veiculo *primeiroVeiculo){
Veiculo veiculo;
Veiculo *atual = primeiroVeiculo;
char identificador = 'F' ;

//Lendo as informacoes do veiculo.
printf(" Codigo do Veiculo: ");
scanf("%u", &veiculo.codigo); printf("\n");
printf(" Modelo: ");
fflush(stdin); fgets(veiculo.modelo, 40, stdin); printf("\n");


//Verificando se o cadastro ja existe.
for(atual=primeiroVeiculo; atual!=NULL; atual=atual->prox){
if(atual->codigo==veiculo.codigo){
identificador = 'V';
break;
}
}

if(identificador!='V' && (strlen(veiculo.modelo)!=1)){
//Alocando espacos e guardando informacoes do veiculo.
Veiculo* NovoVeiculo=(Veiculo*) malloc(sizeof(Veiculo));
strcpy(NovoVeiculo->modelo, veiculo.modelo);
NovoVeiculo->codigo = veiculo.codigo;
NovoVeiculo->prox = primeiroVeiculo;
printf(" Cadastro realizado com sucesso.");
printf("\n\n PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL.");
return NovoVeiculo;
}else{
printf(" Cadastro inv%clido.", 160);
printf(" \n\n PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL.");
return primeiroVeiculo;
}

}

//Inserindo clientes
Cliente* inserir_cliente(Cliente *primeiroCliente){
Cliente cliente;
Cliente *atual = primeiroCliente;
char identificador = 'F' ;

//Lendo as informacoes do cliente.
printf(" Codigo do cliente: ");
scanf("%u", &cliente.codigo); printf("\n");
printf(" Nome: ");
fflush(stdin); fgets(cliente.nome, 40, stdin); printf("\n");


//Verificando se o cadastro ja existe.
for(atual=primeiroCliente; atual!=NULL; atual=atual->prox){
if(atual->codigo==cliente.codigo){
identificador = 'V';
break;
}
}

if(identificador!='V' && (strlen(cliente.nome)!=1)){
//Alocando espacos e guardando informacoes do cliente.
Cliente* NovoCliente=(Cliente*) malloc(sizeof(Cliente));
strcpy(NovoCliente->nome, cliente.nome);
NovoCliente->codigo = cliente.codigo;
NovoCliente->prox = primeiroCliente;
printf(" Cadastro realizado com sucesso.");
printf("\n\n PRESSIONE QUALQUER TECLA PARAVA VOLTAR AO MENU PRINCIPAL.");
return NovoCliente;
}else{
printf(" Cadastro inv%clido.", 160);
printf(" \n\n PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL.");
return primeiroCliente;
}
}





  


2. Re: Duvida ao passar informações de uma struct para outra.

Paulo
paulo1205

(usa Ubuntu)

Enviado em 23/05/2018 - 13:44h

Algumas sugestões que lhe dou:

  • Siga o padrão ao declarar a função main: o tipo de retorno tem de ser int, e a lista de argumentos tem de ser ou “void”, se você não quiser receber argumentos do sistema operacional, ou um parâmetro inteiro seguido por um array de ponteiros para char (tipicamente “int argc, char **argv”), se você quiser receber tais argumentos do SO, na forma de um array de strings.

  • Não leia dados nas funções de inserção. Faça com que a função de inserção apenas insira. Mova a leitura para algum outro lugar, e depois insira os dados lidos.

  • Faça com que as funções de inserção realmente insiram, porque, do jeito como estão, elas apenas copiam a lista atual para após um nó novo, e a substituição da lista antiga pela que começa com o nó recém-criado acontece fora da função. Em vez de usar algo como “primeiro=inserir(primeiro, dados);” (já considerando que você obteve dados de uma outra maneira, conforme sugestão acima), uma forma mais canônica de fazer seria “inserir(&primeiro, dados);” (note que eu passo o ponteiro para a função por referência, para que seu valor possa ser modificado dentro da função).

  • Considere fazer com que suas funções de inserção ordenem os dados, de modo a facilitar, depois, as operações de busca (por exemplo, se você quiser procurar num nome que não existe, não vai precisar sempre varrer a lista inteira para dizer que não o encontrou, mas vai bastar encontrar um nome que deveria ficar antes dele na ordenação natural).

  • Se optar por usar ordenação, considere dar um passo além e passar a armazenar seus dados em árvores, em lugar de listas. Fazer isso deixaria as funções de inserção e remoção um pouco mais complicadas, mas facilitaria grandemente o custo das operações de busca (por exemplo, com uma árvore bem balanceada, uma busca numa coleção de 1000 elementos demandaria no máximo 10 iterações; com uma lista seriam 1000 iterações).

  • Em vez de copiar o código e o nome do cliente e o código e o nome do veículo para dentro do relacionamento chamado de “locação”, você poderia usar apenas o código de cada um deles, e depois fazer uma varredura nas árvores de clientes e veículos na hora em que viesse a precisar dos nomes.

  • Alternativamente, em lugar dos códigos e de buscas para recuperar os nomes, você poderia ter ponteiros para os nós das respectivas árvores/listas, desde que você nunca trocasse os dados contidos nesses ponteiros. Desse modo, nenhuma varredura seria necessária para acesso nem aos nomes nem aos códigos, mas apenas derreferência de ponteiros.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts