Buscar

TÉCNICAS DE PROGRAMAÇÃO ATIVIDADE 3 (A3)

Prévia do material em texto

Em algumas situações, para a implementação de um sistema computacional, 
não se conhece, previamente, qual o tamanho da massa de dados que será 
efetivamente manipulada. Em tais casos, pode ser usado o recurso de 
alocação dinâmica de memória. Com tal recurso, uma região de memória 
poderá ser alocada, sob demanda de modo a tornar o programa mais flexível 
em relação à quantidade de itens a serem manipulados. Essa flexibilidade 
torna o programa escalável. 
O objetivo desta questão é exercitar a manipulação de ponteiros em um 
cenário onde se exige a alocação dinâmica de memória através da 
implementação de um programa computacional. 
Antes de falarmos das funcionalidades do programa a ser implementado, 
convém mencionar que, em algumas situações o espaço previamente alocado 
deve ser redimensionado devido, à por exemplo, um aumento ou diminuição 
inesperada na quantidade de itens manipulados. Para realizar o 
redimensionamento, pode-se, na linguagem C, utilizar a função “realloc()”. 
Essa função segue a seguinte sintaxe: 
void *realloc (void *ptr_original, size_t); 
A função “realloc()” retorna a posição do bloco realocado com a nova 
dimensão. No trecho de código acima, o parâmetro “ptr_original” representa o 
bloco previamente alocado com a função “malloc()” ou “calloc()”. Detalhes 
destas funções, inclusive a “realloc()” poderão ser obtidas acessando-se 
(GARCIA, 2016) através do link: <https://www.embarcados.com.br/ponteiro-
em-c-alocacao-dinamica/>. 
Para a realização desta atividade, suponha a necessidade de cadastrar 
clientes de uma loja. Por ser uma loja nova e com produtos inovadores, pouco 
se sabe do mercado a ser atingido, sendo assim, não se sabe a quantidade de 
clientes poderão ser cadastrados. Estima-se, inicialmente, em 10 clientes. 
Cada cliente terá os seguintes 
campos: 
- nome (suponha um nome com, no máximo, 30 caracteres) 
- ano de nascimento 
- montante de gastos realizados no mês (quanto o clinte pagou em suas 
compras dentro do mês corrente) 
Para tanto, o sistema deverá oferecer as seguintes funcionalidades: 
- incluir um novo cliente 
- remover cliente - atualizar o montante de compras do cliente realizadas no 
mês corrente 
- zerar todos os montantes de compras por ocasião da virada de mês 
- listar o cliente melhor comprador 
- exibir um montante de compras de um cliente específico. 
O programa deverá, ainda, prever a situação que a quantidade de clientes a 
ser cadastrados supere a previsão inicial. Neste caso, quando o espaço de 
memória destinado a receber dados dos clientes estiver cheia, deve-se ampliar 
esse espaço – sempre em blocos de 10. 
Poste o código, implementado em C, em seu portfólio. 
Bons Estudos! 
Referência DEITEL, P. J.; DEITEL, H. C: Como Programar. 6. Ed. São Paulo: 
Pearson Prentice Hall, 2011. [Recurso eletrônico, Biblioteca Virtual 
Universitária] 
GARCIA, F. D. Ponteiro em C: Alocação Dinâmica de Memória. Publicado em 
08/01/2016. Disponível em <https://www.embarcados.com.br/ponteiro-em-c-
alocacao-dinamica/>. Acesso em 05/07/2019. 
Resposta 
Seleciona
da: 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <ctype.h> 
struct pedido 
{ 
 char namePed[200]; 
 char CPF[200]; 
 char numPed[200]; 
 char qtdPed[200]; 
 char valorped[200]; 
 int cod; 
}logP[200]; 
 
struct cadastro 
{ 
 char CPF[200]; 
 char telefone[200]; 
 char nome[200]; 
 char endereco[200]; 
 char data[200]; 
 int vazio,cod; 
 struct pedido clientePed; 
 
}log[200]; 
//AQUI DECLARO AS FUNÇÕES A SEREM USADAS 
int verifica_pos(void); 
int verifica_cod( int cod ); 
int opt; 
void cadastroP(int cod,int pos); 
void list(); 
void cadastroPedido(); 
void consultaCod (void); 
void excluirCliente (void); 
int main(void){ //INICIO DO MAIN 
 
 int i,Opcao,OpcaoCliente,posicao,retorno; 
 int codaux; 
 do 
 { 
 printf("1 - Cadastrar Novo Cliente\n"); 
 printf("2 - Cliente\n"); 
 printf("3 - Alterar Cliente\n"); 
 printf("4 - Excluir Cliente\n"); 
 printf("5 - Cadastrar Pedido\n"); 
 printf("6 - Alterar Pedido\n"); 
 printf("7 - Excluir Pedido\n"); 
 printf("8 - Sair\n"); 
 printf(" Selecione uma opcao por favor: "); 
 scanf("%d", &Opcao); 
 getchar(); 
 if (Opcao == 1) 
 { 
 printf("Voce selecionou a opcao 1 - Cadastrar Novo 
Cliente\n"); 
 posicao=verifica_pos(); 
 
 if ( posicao != -1 ) 
 { 
 
 printf("\nEntre com um codigo de 1 a 200 para seu 
cadastro: \n"); 
 scanf("%d",&codaux);fflush(stdin); 
 
 retorno = verifica_cod( codaux ); 
 
 if ( retorno == 1 ) 
 cadastroP( codaux, posicao ); 
 else{ 
 printf("\nCodigo ja existente ou invalido pressione 
enter para voltar ao menu principal\n"); 
 getchar(); 
 system("cls"); 
 main(); 
 } 
 
 } 
 else 
 printf("\nNao e possivel realizar mais cadastros!\n"); 
 
 break; 
 
 } 
 else if (Opcao == 2) 
 { 
 system("cls"); 
 do{ 
 printf("Voce selecionou a opcao 2 - Clientes\n\n"); 
 printf("1 - Pesquisar cliente por codigo\n"); 
 printf("2 - Listar todos os clientes\n"); 
 printf("3 - Voltar ao menu principal\n"); 
 printf("Selecione uma opcao por favor: "); 
 scanf("%d", &OpcaoCliente); 
 getchar(); 
 if(OpcaoCliente == 1){ 
 consultaCod(); 
 } 
 else if(OpcaoCliente == 2){ 
 list(); 
 } 
 else if(OpcaoCliente == 3){ 
 printf("Voce selecionou voltar ao menu principal, 
pressione ENTER para continuar"); 
 getchar(); 
 system("cls"); 
 } 
 else 
 printf("Opcao Invalida\n\n"); 
 }while(OpcaoCliente =!3 || OpcaoCliente > 3 || OpcaoCliente < 0 
|| OpcaoCliente == 0); 
 } 
 else if (Opcao == 3) 
 { 
 printf("Voce selecionou a opcao 3 - Alterar Cliente\n"); 
 } 
 else if (Opcao == 4) 
 { 
 printf("Voce selecionou a opcao 4 - Excluir Cliente\n"); 
 excluirCliente(); 
 } 
 else if (Opcao == 5) 
 { 
 printf("Voce selecionou a opcao 5 - Cadastrar Pedido\n"); 
 cadastroPedido(); 
 } 
 else if (Opcao == 6) 
 { 
 printf("Voce selecionou a opcao 6 - Alterar Pedido\n"); 
 } 
 else if (Opcao == 7) 
 { 
 printf("Voce selecionou a opcao 7 - Excluir Pedido\n"); 
 } 
 else if (Opcao == 8) 
 { 
 printf("Voce selecionou a opcao 8 - Sair\n"); 
 } 
 else{ 
 printf("Opcao invalida, favor pressione enter para voltar ao 
menu principal"); 
 getchar(); 
 system("cls"); 
 } 
 } while (Opcao != 8 || Opcao < 8); 
 
} // FIM DO MAIN 
void list(){ // Lista os usuarios cadastrados. 
 int i,j; 
 for(i=0;i<200;i++){ 
 if(log[i].cod!=NULL){ 
 printf("\nCodigo: %d \nNome: %s\nCPF: %s\nEndereco: 
%s\nTelefone: %s\n\n", 
log[i].cod,log[i].nome,log[i].CPF,log[i].endereco,log[i].telefone); 
 } 
} 
 printf("Pressione enter para volta ao menu principal"); 
 getchar(); 
 system("cls"); 
 
} //FIM DO LIST 
void cadastroP(int cod, int pos){ //Cadastro das pessoas 
 int i; 
 do{ 
 pos = verifica_pos(); 
 log[pos].cod = cod; 
 printf("\nDigite seu nome: "); 
 gets(log[pos].nome); 
 printf("\nDigite seu CPF: "); 
 gets(log[pos].CPF); 
 printf("\nDigite seu Endereco:"); 
 gets(log[pos].endereco); 
 printf("\nDigite seu Telefone: "); 
 gets(log[pos].telefone); 
 log[pos].vazio = 1; 
 //printf("\nDigite enter para efetuar novo cadastro ou qualquer 
outra tecla para volar ao menu principal"); 
 //scanf("%d", &opt); 
 opt ==1; 
 getchar(); 
 }while(opt==1); 
 system("cls"); 
 main(); 
 
} // FIM DO CADASTRO DE PESSOAS 
int verifica_pos( void ) //VERIFICADOR DA POSIÇÃO 
{ 
 int cont = 0; 
 
 while ( cont <= 200 ) 
 { 
 
 if ( log[cont].vazio == 0 ) 
 return(cont); 
 
 cont++; 
 
 } 
 
 return(-1); 
 
} // FIM DO VERIFICADOR 
int verifica_cod( int cod ) // VERIFICADOR DE CÓDIGO 
{ 
 int cont = 0; 
 
 while ( cont <= 200 ) 
 { 
 if ( log[cont].cod == cod ) 
 return(0); 
 
 cont++; 
 } 
 
 return(1); 
 
} // FIM DO VERIFICADOR 
void cadastroPedido(){ //Cadastro dos pedidos 
 system("cls"); 
 int i; 
 int Option; 
 int OpcaoPedido; 
 char nomeCad[200]; 
 printf("\nDigite seu nome como esta no cadastro: "); 
 gets(nomeCad); 
 for(i=0;i<200;i++){ 
 if(strcmp(log[i].nome, nomeCad)==0){ 
 do{ 
 printf("\nEscolha o seu pedido: "); //PEDIDOS 
MERAMENTE ILUSTRATIVOS, COLOQUEI SÓ PARA VER SE 
CONSEGUIA ANEXAR A 1 CADATRO MAS NÃO CONSEGUI. 
 printf("\n1- Sanduba esperto"); 
 printf("\n2- Ceasar Salad"); 
 printf("\n3- Raviolli\n:"); 
 scanf("%d", &OpcaoPedido); 
 if(OpcaoPedido == 1){ 
 strcpy(log[i].clientePed.namePed, "Sanduba esperto"); 
 printf("\nVoce escolheu %s, seu pedido foi adicionado 
ao seu cadastro.",log[i].clientePed.namePed); 
 printf("\nPressione 1 para continuar pedindo ou 2 para 
volar ao menu principal: "); 
 scanf("%d", &Option); 
 i++; 
 } 
 else if(OpcaoPedido == 2){ 
 strcpy(log[i].clientePed.namePed, "Ceasar Salad"); 
 printf("\nVoce escolheu %s, seu pedido foi adicionado 
ao seu cadastro.", log[i].clientePed.namePed); 
 printf("\nPressione 1 para continuar pedindo ou 2 para 
volar ao menu principal: "); 
 scanf("%d", &Option); 
 i++; 
 } 
 else if(OpcaoPedido == 3){ 
 strcpy(log[i].clientePed.namePed, "Raviolli"); 
 printf("\nVoce escolheu %s, seu pedido foi adicionado 
ao seu cadastro.", log[i].clientePed.namePed); 
 printf("\nPressione 1 para continuar pedindo ou 2 para 
volar ao menu principal: "); 
 scanf("%d", &Option); 
 i++; 
 } 
 }while(Option == 1); 
 system("cls"); 
 
 
} 
} 
} // FIM DO CADASTRO DE PEDIDOS. 
void consultaCod (void) // CONSULTAR 1 CADASTRADO 
QUALQUER VIA CÓDIGO DADO POR USUÁRIO. 
{ 
 int cont = 0, cod; 
 
 printf("\nEntre com o codigo\n"); 
 scanf("%d",&cod); 
 fflush(stdin); 
 system("cls"); 
 
 while ( cont <= 200 ) 
 { 
 
 if (log[cont].cod==cod) 
 { 
 if (log[cont].vazio==1) 
 { 
 
 printf("\nCodigo: %d \nNome: %s\nCPF: %s\nEndereco: 
%s\nTelefone: %s\n\n", 
log[cont].cod,log[cont].nome,log[cont].CPF,log[cont].endereco,log[c
ont].telefone); 
 
 
 system ("pause"); 
 
 system("cls"); 
 
 break; 
 
 } 
 } 
 
 cont++; 
 
 if ( cont > 200 ){ 
 printf("\nCodigo nao encontrado, pressione enter para volar 
ao menu principal\n"); 
 getchar(); 
 system("cls"); 
 } 
 
 } 
} // FIM DA FUNÇÃO CONSULTAR 
void excluirCliente(void) // EXCLUI CLIENTE 
{ 
 int cod, cont = 0; 
 char resp; 
 printf("\nEntre com o codigo do registro que deseja excluir: \n"); 
 scanf("%d", &cod ); 
 
 while ( cont <= 200 ) 
 { 
 
 if ( log[cont].cod == cod ) 
 { 
 
 if (log[cont].vazio == 1 ) 
 { 
 printf("\nCodigo: %d \nNome: %s\nCPF: %s\nEndereco: 
%s\nTelefone: %s\n\n", 
log[cont].cod,log[cont].nome,log[cont].CPF,log[cont].endereco,log[c
ont].telefone); 
 getchar(); 
 printf("\nDeseja realmente exlucir? s/n: "); 
 scanf("%s",&resp); 
 
 if ( ( resp == 'S' ) || ( resp == 's' ) ) 
 { 
 log[cont].vazio=0; 
 log[cont].cod = NULL; 
 printf("\nExclusao feita com sucesso\n"); 
 break; 
 } 
 else 
 { 
 if ( ( resp == 'N' ) || ( resp == 'n' ) ) 
 { 
 printf("Exclusao cancelada!\n"); 
 break; 
 } 
 } 
 
 } 
 
 } 
 
 cont++; 
 
 if ( cont > 200 ) 
 printf("\nCodigo nao encontrado\n"); 
 
 } 
 
 system("pause"); 
 system("cls"); 
 
}

Continue navegando