Advertisement
Ceruio

mt3_2016.1_EC

Oct 26th, 2016
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.94 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. //A função valida serve para validar a quantidade de
  5. void valida(int * var){ // var é um ponteiro que recebe o endereço de N na main. Desse modo ele pode mudar seu valor indiretamente
  6.     do{
  7.         printf("Digite o numero de saldos (tem de ser maior que zero): \n");
  8.         //nao colocamos o & pois desejamos armazenar o valor lido no endereço de N,
  9.         //que no caso é a variável ponteiro var ( var recebeu &N, então, var == &N)
  10.         scanf("%d", var);
  11.         if(*var<=0) printf("Entrada invalida! Digite um valor maior que zero!\n");
  12.     }while(*var<=0);// *var === N (da main) ou seja, qualquer operação com *var é como se estivesse operando com N diretamente
  13.     //enquanto não for digitado um valor maior que zero, ele continua no laço
  14. }
  15.  
  16. //A função leV recebe um inteiro como argumento e retorna um ponteiro para float
  17. float * leV(int tam){
  18.     float *vetor;
  19.     vetor = (float*) malloc(tam*sizeof(float)); //alocamos o ponteiro vetor com tamanho tam*sizeof(float) (tam é o N da main)
  20.     if(vetor == NULL){//verificamos se a alocação foi bem sucedida
  21.         printf("Nao foi possivel alocar memoria!\n");
  22.         exit(1);//saímos do programa caso tenha ocorrido um erro na alocação
  23.     }
  24.  
  25.     return vetor;//retornamos esse ponteiro para o vetor saldos de float que se encontra na main
  26. }
  27.  
  28. //A função calcMedia calcula a media de todos os saldos do banco
  29. float calcMedia(float *vet, int qtd){
  30.     float soma = 0; //não esquecer de iniciar corretamente as variáveis
  31.     int i;
  32.     //faz o somatorio de todos os saldos do banco
  33.     for( i=0 ; i<qtd ; i++){
  34.         soma = soma + vet[i];
  35.     }
  36.  
  37.     return soma/qtd;//soma/qtd == media
  38. }
  39.  
  40. //A função separa recebe o endereço do ponteiro de saldos para modificá-lo na main,
  41. // recebe também a média, a quantidade de saldos, e recebe o endereço de duas variaveis:
  42. // que representam a quantidade de vips e a quantidade de nao-vips, para modificá-las na main
  43. float * separa(float **vet, float media, int qtd, int *total_vips, int *total_nvips){
  44.     float * toppers;//criamos um ponteiro para alocar memória para o novo vetor que irá comportar apenas os saldos vips (acima da media)
  45.     int i, qtd_vips, j;
  46.  
  47.     //nao esquecer de iniciar a variavel qtd_vips com zero para iniciar a contagem da quantidade de saldos vips do zero
  48.     for( i=0, qtd_vips = 0 ; i<qtd ; i++){
  49.         if( *(*vet+i) > media){// *vet == saldos , entao é como fazer: *(saldos+i)
  50.             //incrementando *vet+i, é como incrementar o ponteiro saldos, saldos+i,
  51.             // desse modo, deslocando ele através do vetor alocado que se encontra na main
  52.             qtd_vips++;//incrementamos a quantidade de vips caso encontremos um saldo acima da media
  53.         }
  54.     }
  55.    
  56.     //mudamos a variavel que corresponde a quantidade de vips na main indiretamente, atraves do ponteiro que aponta para ela
  57.     *total_vips = qtd_vips;
  58.     //alocamos o ponteiro toppers (onde estamos armazenando os saldos vips) com a quantidade de vips (qtd_vips*sizeof(float))
  59.     toppers = (float*) malloc(qtd_vips*sizeof(float));
  60.  
  61.     if(toppers == NULL){//verificamos se a alocação foi bem sucedida (mesmo procedimento da verificação anterior logo acima)
  62.         printf("Erro!\n");
  63.         exit(2);
  64.     }
  65.  
  66.     //agora vamos salvar no vetor alocado toppers, cada um dos saldos que estejam acima da media.
  67.     // Lembrando que => *vet === saldos, portanto => *(*vet+i) === *(saldos+i)
  68.     for( i=0, j=0, qtd_vips=0 ; i<qtd ; i++){
  69.         if( *(*vet+i) > media){ //verificamos se o saldo atual e maior que a media
  70.             //caso seja, salvamos esse saldo no vetor toppers,
  71.             // e incrementamos a variavel qtd_vips para que ela possa navegar no vetor de saldos vips
  72.             toppers[qtd_vips++] = *(*vet+i);
  73.         }else{
  74.             //caso o valor atual não esteja acima da media, deslocamos ele para uma posição anterior no vetor saldos,
  75.             // para que no fim tenhamos de 0 (zero) à j apenas saldos abaixo da media.
  76.             // E então, realocamos mais tarde para conter esses saldos abaixo da media
  77.             *(*vet+j) = *(*vet+i);
  78.             //j começa de zero, armazena o saldo abaixo da media detectado, e só é incrementado quando existe um saldo abaixo da media
  79.             j++;//incrementamos j para receber o proximo eventual saldo abaixo da media
  80.         }
  81.     }
  82.  
  83.     //modificamos a variavel que contem o total de nao vips na main indiretamente utilizando um ponteiro.
  84.     // j vai corresponder a quantidade de não vipes do vetor original
  85.     *total_nvips = j;
  86.  
  87.     //aqui realocamos o vetor saldos indiretamente, utilizando a correspondencia *vet === saldos
  88.     *vet = (float*) realloc(*vet,j*sizeof(float)); // *vet === saldos
  89.     /*
  90.     o trecho acima é como fazer:
  91.     saldos = (float*) realloc(saldos,qtd_naovips*sizeof(float));
  92.     na main
  93.     */
  94.  
  95.     return toppers;//retornamos o ponteiro toppers para o vetor vips da main (toppers contem apenas os saldos vips, ou seja, acima da media)
  96. }
  97.  
  98. //A função apresenta serve justamente para apresentar na tela os valores de saldos vips ou não vips, dependendo das entradas
  99. //ela tem como parâmetro um ponteiro *s que recebe uma string que indica qual tipo de saldo será exibido (vip ou não-vip)
  100. //contem como parametro um ponteiro *vet que navegará no vetor dos saldos da origem (vips ou não-vips) de modo a exibi-los na tela
  101. //qtd recebe a quantidade de saldos a ser exibido, que pode ser a qtd de vips, ou de nao vips
  102. void apresenta(char *s, float *vet, int qtd){
  103.     int i;
  104.     printf("%s: ", s);//exibimos a frase que indica o tipo de saldo
  105.  
  106.     for( i=0 ; i<qtd ; i++ ){
  107.         printf("%.2f ", vet[i]);//exibimos todos os saldos do vetor recebido
  108.     }
  109.     printf("\n");
  110. }
  111.  
  112. int main(){
  113.     int N, qtd_vips, qtd_naovips, i;
  114.     float *saldos, *vips; //*saldos corresponde a todos os saldos, e no final apenas aqueles abaixo da media.
  115.     // *vips corresponde apenas aos saldos acima da media
  116.     float media = 0; //armazena a media de todos os saldos
  117.    
  118.     valida(&N); //a variavel N é passada >por referência< para a função, para ser validada na função valida (N digitado deve ser acima de 0)
  119.    
  120.     saldos = leV(N); //a função leV recebe a quantidade de saldos (N) e retorna um endereço para um vetor alocado na função
  121.  
  122.     //este trecho do código serve apenas para ler e armazenar cada saldo digitado pelo usuário
  123.     for( i=0 ; i<N ; i++){
  124.         scanf("%f", &saldos[i]);
  125.     }
  126.  
  127.     //a função calcMedia recebe como parâmetro o vetor alocado saldos e a quantidade de saldos (N)
  128.     // e retorna a media de todos os saldos do banco
  129.     media = calcMedia(saldos,N);
  130.  
  131.     //A função separa serve para criar o vetor de vips e retornar um endereço para esse vetor, que é recebido pelo ponteiro saldos_vips
  132.     //Ela também deixa apenas os saldos abaixo da media no vetor de saldos original
  133.     vips = separa(&saldos,media,N,&qtd_vips,&qtd_naovips);
  134.  
  135.     //printf("Media: %.2f\n", media); //"descomentar" essa linha caso queira exibir a media geral para comparação com as saidas dos saldos
  136.  
  137.     //as seguintes chamadas da funcao apresenta servem para exibir na tela os saldos vips e os não vipes respectivamente
  138.     apresenta("Clientes vips", vips, qtd_vips);
  139.     apresenta("Clientes nao-vips", saldos, qtd_naovips);
  140.  
  141.     return 0;
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement