Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- //A função valida serve para validar a quantidade de
- void valida(int * var){ // var é um ponteiro que recebe o endereço de N na main. Desse modo ele pode mudar seu valor indiretamente
- do{
- printf("Digite o numero de saldos (tem de ser maior que zero): \n");
- //nao colocamos o & pois desejamos armazenar o valor lido no endereço de N,
- //que no caso é a variável ponteiro var ( var recebeu &N, então, var == &N)
- scanf("%d", var);
- if(*var<=0) printf("Entrada invalida! Digite um valor maior que zero!\n");
- }while(*var<=0);// *var === N (da main) ou seja, qualquer operação com *var é como se estivesse operando com N diretamente
- //enquanto não for digitado um valor maior que zero, ele continua no laço
- }
- //A função leV recebe um inteiro como argumento e retorna um ponteiro para float
- float * leV(int tam){
- float *vetor;
- vetor = (float*) malloc(tam*sizeof(float)); //alocamos o ponteiro vetor com tamanho tam*sizeof(float) (tam é o N da main)
- if(vetor == NULL){//verificamos se a alocação foi bem sucedida
- printf("Nao foi possivel alocar memoria!\n");
- exit(1);//saímos do programa caso tenha ocorrido um erro na alocação
- }
- return vetor;//retornamos esse ponteiro para o vetor saldos de float que se encontra na main
- }
- //A função calcMedia calcula a media de todos os saldos do banco
- float calcMedia(float *vet, int qtd){
- float soma = 0; //não esquecer de iniciar corretamente as variáveis
- int i;
- //faz o somatorio de todos os saldos do banco
- for( i=0 ; i<qtd ; i++){
- soma = soma + vet[i];
- }
- return soma/qtd;//soma/qtd == media
- }
- //A função separa recebe o endereço do ponteiro de saldos para modificá-lo na main,
- // recebe também a média, a quantidade de saldos, e recebe o endereço de duas variaveis:
- // que representam a quantidade de vips e a quantidade de nao-vips, para modificá-las na main
- float * separa(float **vet, float media, int qtd, int *total_vips, int *total_nvips){
- float * toppers;//criamos um ponteiro para alocar memória para o novo vetor que irá comportar apenas os saldos vips (acima da media)
- int i, qtd_vips, j;
- //nao esquecer de iniciar a variavel qtd_vips com zero para iniciar a contagem da quantidade de saldos vips do zero
- for( i=0, qtd_vips = 0 ; i<qtd ; i++){
- if( *(*vet+i) > media){// *vet == saldos , entao é como fazer: *(saldos+i)
- //incrementando *vet+i, é como incrementar o ponteiro saldos, saldos+i,
- // desse modo, deslocando ele através do vetor alocado que se encontra na main
- qtd_vips++;//incrementamos a quantidade de vips caso encontremos um saldo acima da media
- }
- }
- //mudamos a variavel que corresponde a quantidade de vips na main indiretamente, atraves do ponteiro que aponta para ela
- *total_vips = qtd_vips;
- //alocamos o ponteiro toppers (onde estamos armazenando os saldos vips) com a quantidade de vips (qtd_vips*sizeof(float))
- toppers = (float*) malloc(qtd_vips*sizeof(float));
- if(toppers == NULL){//verificamos se a alocação foi bem sucedida (mesmo procedimento da verificação anterior logo acima)
- printf("Erro!\n");
- exit(2);
- }
- //agora vamos salvar no vetor alocado toppers, cada um dos saldos que estejam acima da media.
- // Lembrando que => *vet === saldos, portanto => *(*vet+i) === *(saldos+i)
- for( i=0, j=0, qtd_vips=0 ; i<qtd ; i++){
- if( *(*vet+i) > media){ //verificamos se o saldo atual e maior que a media
- //caso seja, salvamos esse saldo no vetor toppers,
- // e incrementamos a variavel qtd_vips para que ela possa navegar no vetor de saldos vips
- toppers[qtd_vips++] = *(*vet+i);
- }else{
- //caso o valor atual não esteja acima da media, deslocamos ele para uma posição anterior no vetor saldos,
- // para que no fim tenhamos de 0 (zero) à j apenas saldos abaixo da media.
- // E então, realocamos mais tarde para conter esses saldos abaixo da media
- *(*vet+j) = *(*vet+i);
- //j começa de zero, armazena o saldo abaixo da media detectado, e só é incrementado quando existe um saldo abaixo da media
- j++;//incrementamos j para receber o proximo eventual saldo abaixo da media
- }
- }
- //modificamos a variavel que contem o total de nao vips na main indiretamente utilizando um ponteiro.
- // j vai corresponder a quantidade de não vipes do vetor original
- *total_nvips = j;
- //aqui realocamos o vetor saldos indiretamente, utilizando a correspondencia *vet === saldos
- *vet = (float*) realloc(*vet,j*sizeof(float)); // *vet === saldos
- /*
- o trecho acima é como fazer:
- saldos = (float*) realloc(saldos,qtd_naovips*sizeof(float));
- na main
- */
- return toppers;//retornamos o ponteiro toppers para o vetor vips da main (toppers contem apenas os saldos vips, ou seja, acima da media)
- }
- //A função apresenta serve justamente para apresentar na tela os valores de saldos vips ou não vips, dependendo das entradas
- //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)
- //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
- //qtd recebe a quantidade de saldos a ser exibido, que pode ser a qtd de vips, ou de nao vips
- void apresenta(char *s, float *vet, int qtd){
- int i;
- printf("%s: ", s);//exibimos a frase que indica o tipo de saldo
- for( i=0 ; i<qtd ; i++ ){
- printf("%.2f ", vet[i]);//exibimos todos os saldos do vetor recebido
- }
- printf("\n");
- }
- int main(){
- int N, qtd_vips, qtd_naovips, i;
- float *saldos, *vips; //*saldos corresponde a todos os saldos, e no final apenas aqueles abaixo da media.
- // *vips corresponde apenas aos saldos acima da media
- float media = 0; //armazena a media de todos os saldos
- 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)
- 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
- //este trecho do código serve apenas para ler e armazenar cada saldo digitado pelo usuário
- for( i=0 ; i<N ; i++){
- scanf("%f", &saldos[i]);
- }
- //a função calcMedia recebe como parâmetro o vetor alocado saldos e a quantidade de saldos (N)
- // e retorna a media de todos os saldos do banco
- media = calcMedia(saldos,N);
- //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
- //Ela também deixa apenas os saldos abaixo da media no vetor de saldos original
- vips = separa(&saldos,media,N,&qtd_vips,&qtd_naovips);
- //printf("Media: %.2f\n", media); //"descomentar" essa linha caso queira exibir a media geral para comparação com as saidas dos saldos
- //as seguintes chamadas da funcao apresenta servem para exibir na tela os saldos vips e os não vipes respectivamente
- apresenta("Clientes vips", vips, qtd_vips);
- apresenta("Clientes nao-vips", saldos, qtd_naovips);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement