Ir ao conteúdo
  • Cadastre-se

C Fazendo cálculos com números em vetor


afmliguori
Ir à solução Resolvido por afmliguori,

Posts recomendados

#include <stdio.h>


float calcMedia(float vet[], int tam){
  float media, soma = 0;
  int i;

  for(i=0; i<tam; i++){
    soma = soma + vet[i];
  }
  media = (float) soma/tam;

  return media;
}

float exibeDifMedia (int vInsc[], float vSal[], int num){
  float difmedia, soma=0, salario, media;
  int x,i;

  for (i=0; i<num; i++){
   calcMedia(vSal, 6);
   difmedia=vSal[x]-calcMedia(vSal,x);

   
  }
  
  return difmedia ;
  

  ;

  return difmedia;
}



int main(void){

int vInsc[6]={1010,1020,1030,1040,1050,1060};
float vSal[6]={1000.00,4020.00,900.00,10400.00,20000.00,1000.00};
float mediasal, difsal;
int i;

  mediasal = calcMedia(vSal, 6);
  printf("A media dos salários é de %.2f\n", mediasal);

  difsal = exibeDifMedia(vInsc, vSal, i);

  for( i = 0 ; i <= 7; i++)
  {
    printf("\nDiferença de salário do funcionário [%d] para a média = %.1f\n",vInsc[i], difsal);
  }

  
 

return 0;
}

 

Boa noite...

 

Eu estou tentando fazer um código em linguagem C, mas esbarrei em uma dificuldade... fiz o primeiro vetor calculando a média dos valores dos salários de uma empresa... até aí tudo bem..., mas agora preciso calcular a diferença entre o salário de cada empregado e essa média... a minha dúvida é: como fazer para conseguir selecionar cada valor (que tá dentro do vetor) e fazer esse cálculo individualmente?

 

Agraço a quem puder me dar uma luz!

Link para o comentário
Compartilhar em outros sites

@Math.Pi, ficou dessa forma..., mas função exibeDifMedia não tá funcionando corretamente.

 

#include <stdio.h>


float calcMedia(float vet[], int tam){
  float media, soma = 0;
  int i;

  for(i=0; i<tam; i++){
    soma = soma + vet[i];
  }
  media = (float) soma/tam;

  return media;
}

float exibeDifMedia (int vInsc[], float vSal[], int num){
  float difmedia, soma=0, salario, media;
  int x,i;

  for (i=0; i<num; i++){
   calcMedia(vSal, 6);
   difmedia=vSal[x]-calcMedia(vSal,x);

   
  }
  
  return difmedia ;
  

 
}



int main(void){

int vInsc[6]={1010,1020,1030,1040,1050,1060};
float vSal[6]={1000.00,4020.00,900.00,10400.00,20000.00,1000.00};
float mediasal, difsal;
int i;

  mediasal = calcMedia(vSal, 6);
  printf("A media dos salários é de %.2f\n", mediasal);

  

  for( i = 0 ; i <= 7; i++)
  {

    difsal = exibeDifMedia(vInsc, vSal, i);
    
    printf("\nDiferença de salário do funcionário [%d] para a média = %.1f\n",vInsc[i], difsal);
  }

  
 

return 0;
}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá. Vou tentar complementar.

 

Um primeiro ponto é sempre deixar a indentação do código bem organizada. Exemplo:

 

#include <stdio.h>

float calcMedia(float vet[], int tam) {
    float media, soma = 0;
    int i;

    for (i=0; i<tam; i++) {
        soma = soma + vet[i];
    }
    
    media = (float)soma/tam;
    
    return media;
}

float exibeDifMedia (int vInsc[], float vSal[], int num) {
    float difmedia, soma=0, salario, media;
    int x,i;

    for (i=0; i<num; i++) {
        calcMedia(vSal, 6);
        difmedia=vSal[x]-calcMedia(vSal,x);
    }

    return difmedia;
}

int main(void){
    int vInsc[6] = {1010,1020,1030,1040,1050,1060};
    float vSal[6] = {1000.00,4020.00,900.00,10400.00,20000.00,1000.00};
    float mediasal, difsal;
    int i;
    
    mediasal = calcMedia(vSal, 6);
    printf("A media dos salários é de %.2f\n", mediasal);

    for (i = 0 ; i <= 7; i++) {
        difsal = exibeDifMedia(vInsc, vSal, i);
        printf("\nDiferença de salário do funcionário [%d] para a média = %.1f\n",vInsc[i], difsal);
    }
    
    return 0;
}

 

Visualmente ajuda na compreensão do código.

 

 

Em relação ao comportamento desejado, a minha sugestão é focar em entender o problema. O que está solicitando lá no enunciado?

 

Creio que seja essa parte:

 

8 horas atrás, afmliguori disse:

mas agora preciso calcular a diferença entre o salário de cada empregado e essa média

 

Tá! Mas o que seria a "diferença entre o salário e a média"? O que é uma diferença?

 

Então, pelo que eu entendi, seria algo como: "média geral" - "salário do empregado".... ou algo do tipo, correto? Se for isso, vai lá no código e implementa... se não for, vem e tenta definir o que é para ser feito, entende? Primeiro tem que definir melhor o que é para ser feito... "o como" eu entendo que seria parte posterior.

 

Vou me basear pelo que eu defini acima... o que seria preciso para calcular a tal da diferença supracitada? 

 

Atualmente o código está assim:

 

float exibeDifMedia (int vInsc[], float vSal[], int num){
    float difmedia, soma=0, salario, media;
    int x,i;

    for (i=0; i<num; i++){
        calcMedia(vSal, 6);
        difmedia=vSal[x]-calcMedia(vSal,x);
    }

    return difmedia ;
}

 

Por exemplo: perceba que inscrição não tem algo a ver com o contexto... você sequer está utilizando na função. Outro ponto é que a cálculo da média é feito apenas uma vez, já que ela não muda... e, inclusive, já foi feito. Você apenas precisa desse valor.

 

Então, creio que precisaria da "média atual", que estaria na variável mediaSal e dos salários, que estariam em vSal[]. Aí, para cada empregado, você faz a subtração correspondente e exibia a respectiva resposta. Seria basicamente algo como:

 

difMedia = mediaSal - vSal[i]

 

Fazendo isso cada empregado (dentro de um laço de repetição). Outros pontos podem ir surgindo... vai entendendo (antes) e dando o devido tratamento.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Simon Viegas ajudou bastante!

Vou fazer as alterações e os testes conforme você sugeriu, obrigada!

@Simon Viegas

Refiz com as alterações que você sugeriu e incluí uma linha para me informar o salário de cada funcionário antes de informar a diferença (só mesmo pra checar se os valores estão corretos)

Porém ainda falta algo, pois esse cálculo da diferença salarial está me retornando "-nan"

 

#include<stdio.h>
#include<stdlib.h>
#include<locale.h>

float calcMedia(float vet[], int tam) {
    float media, soma = 0;
    int i;

    for (i=0; i<tam; i++) {
        soma = soma + vet[i];
    }
    
    media = (float)soma/tam;
    
    return media;
}

float exibeDifMedia (int vInsc[], float vSal[], int num) {
    float difmedia, mediasal;
    int i;

    for (i=0; i<num; i++) {
      
        difmedia = mediasal - vSal[i];
      
    }

    return difmedia;
}

int main(void){
    int vInsc[6] = {1010,1020,1030,1040,1050,1060};
    float vSal[6] = {1000.00,4020.00,900.00,10400.00,20000.00,1000.00};
    float mediasal, difsal;
    int i;
    
    mediasal = calcMedia(vSal, 6);
    printf("A media dos salários é de %.2f\n", mediasal);

    for (i = 0 ; i <= 5; i++) {

        printf("\nsalário do funcionário [%d] = %.1f\n",vInsc[i], vSal[i]);
        difsal = exibeDifMedia(vInsc, vSal, 5);
        printf("\nDiferença de salário do funcionário [%d] para a média = %.1f\n",vInsc[i], difsal);
    }
    
    return 0;
}

 

Repare que quando eu faço o mesmo cálculo direto na MAIN, ele funciona corretamente... mas quando eu tento fazer esse cálculo chamando a função "exibeDifMedia" é que ele dá o erro "NAN"... deve ser algum erro na construção da função que eu ainda não encontrei!

 

 

#include<stdio.h>
#include<stdlib.h>
#include<locale.h>

float calcMedia(float vet[], int tam) {
    float media, soma = 0;
    int i;

    for (i=0; i<tam; i++) {
        soma = soma + vet[i];
    }
    
    media = (float)soma/tam;
    
    return media;
}

float exibeDifMedia (int vInsc[], float vSal[], int num) {
    float difmedia, mediasal;
    int i;

    for (i=0; i<num; i++) {
      
        difmedia = mediasal - vSal[i];
            
    }

    return difmedia;
}

int main(void){
    int vInsc[6] = {1010,1020,1030,1040,1050,1060};
    float vSal[6] = {1000.00,4020.00,900.00,10400.00,20000.00,1000.00};
    float mediasal, difsal;
    int i;
    
    mediasal = calcMedia(vSal, 6);
    printf("A media dos salários é de %.2f\n", mediasal);

    for (i = 0 ; i <= 5; i++) {

        printf("\nsalário do funcionário [%d] = %.1f\n",vInsc[i], vSal[i]);
        difsal = mediasal - vSal[i];
        printf("\nDiferença de salário do funcionário [%d] para a média = %.1f\n",vInsc[i], difsal);
    }
    
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

 

Sobre o método exibeDifMedia():

 

2 horas atrás, afmliguori disse:


float exibeDifMedia (int vInsc[], float vSal[], int num) {
    float difmedia, mediasal;
    int i;

    for (i=0; i<num; i++) {
        difmedia = mediasal - vSal[i];
    }

    return difmedia;
}

 

  1. o nome do método está como "exibexxxx". Onde está exibindo alguma coisa nele?; (Ou você exibe a resposta nele, ou muda o nome.)
  2. para que está recebendo o vInsc[]?; (Se não está utilizando, não receba. Ou se deveria utilizar, utilize...);
  3. você declarou um mediaSal local. Qual valor está nesta nova variável? (O valor já foi calculado fora da método, deve ser passado por parâmetro. Cria uma variável local com o mesmo nome não faz o valor "entrar" ou "ficar disponível" na função¹.)
  4. no laço de repetição, você está definindo várias vezes um novo valor para um mesmo difMedia, ou seja: simplesmente vai ficar o último valor. (No caso, você calcula e já exibe, assim como fez no segundo código.)

 

Você precisa entender o que quer fazer primeiro e e só depois fazer o que entendeu.

 

¹ Observação: a depender como implementar, poderia utilizar variáveis globais dentro da função, mas não seria recomendado. Para uma função, tudo que vai ser utilizada nela, OU é recebida por parâmetro, OU é criada dentro. Como "essa média" já tá lá no "main", então passa o valor por parâmetro para função.

 

Acho que a assinatura poderia ficar algo assim:

 

float exibeDifMedia (int mediaSal; int vInsc[], float vSal[], int tam) {

 

Aí dentro da função exibe os dados

Link para o comentário
Compartilhar em outros sites

  • Solução

@Simon Viegas Nossa, suas explicações foram excelentes... eu mudei conforme sua sugestão e também coloquei o printf pra cima, direto na função... e aí na main só deixei pra puxar as duas funções, e o cálculo deu certinho!!

 

Muito obrigada mesmo 😀

 

#include<stdio.h>
#include<stdlib.h>
#include<locale.h>

float calcMedia(float vet[], int tam) {
    float media, soma = 0;
    int i;

    for (i=0; i<tam; i++) {
        soma = soma + vet[i];
    }
    
    media = (float)soma/tam;
    
    return media;
}

float exibeDifMedia (float mediasal, int vInsc[], float vSal[], int num) {
    float dif_media;
    int i;

    for (i=0; i<num; i++) {

        printf("\nsalário do funcionário [%d] = %.1f\n",vInsc[i], vSal[i]);
        dif_media = mediasal - vSal[i];
        printf("\nDiferença de salário do funcionário [%d] para a média = %.1f\n",vInsc[i], dif_media);
        
            
    }

    return dif_media;
}

int main(void){
    int vInsc[6] = {1010,1020,1030,1040,1050,1060};
    float vSal[6] = {1000.00,4020.00,900.00,10400.00,20000.00,1000.00};
    float mediasal, media;
    int i;
    
    mediasal = calcMedia(vSal, 6);
    printf("A media dos salários é de %.2f\n", mediasal);

    exibeDifMedia (mediasal, vInsc, vSal, 6);
    
    return 0;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Acho que poderia ser feito assim também:

Spoiler

#include <stdio.h>
#include <stdlib.h>


double calcularMedia(double *salarios, size_t tamanho);

void calcularDiferencas(double *salarios, double *diferencas, size_t tamanho, double media);

void imprimirVetor(char *nome, double *vetor, size_t tamanho);


int main() {
    const size_t tamanho = 6;

    double media = 0.0;

    double salarios[tamanho];
    double diferencas[tamanho];

    // Inicia os vetores
    for (int i = 0; i < tamanho; ++i) {
        salarios[i] = 0.0;
        diferencas[i] = 0.0;
    }

    salarios[0] = 1000;
    salarios[1] = 1300;
    salarios[2] = 980;
    salarios[3] = 1529;
    salarios[4] = 2900;
    salarios[5] = 5000;

    media = calcularMedia(salarios, tamanho);
    calcularDiferencas(salarios, diferencas, tamanho, media);

    printf("     Media: %.2f \n", media);
    imprimirVetor("  Salarios", salarios, tamanho);
    imprimirVetor("Diferencas", diferencas, tamanho);

    return EXIT_SUCCESS;
}


/**
 * Calcula a media dos valores do vetor.
 *
 * @param salarios Vetor com os dados para calcular a media.
 * @param tamanho  Tamanho do vetor.
 * @return Media dos valores do vetor.
 */
double calcularMedia(double *salarios, size_t tamanho) {
    double media = 0.0;

    for (int i = 0; i < tamanho; ++i) {
        media += salarios[i];
    }

    return (tamanho != 0)
           ? media / tamanho
           : 0.0;
}

/**
 * Calcula a diferenca de cada salario em relação a media.
 *
 * @param salarios   Vetor com os salarios.
 * @param diferencas Vetor onde serao colocados os resultados.
 * @param tamanho    Tamanho do vetor.
 * @param media      Media usada para calcular a diferenca.
 */
void calcularDiferencas(double *salarios, double *diferencas, size_t tamanho, double media) {
    for (int i = 0; i < tamanho; ++i) {
        diferencas[i] = salarios[i] - media;
    }
}

/**
 * Imprime o vetor.
 *
 * @param nome    Nome para identificar o vetor.
 * @param vetor   Vetor que sera impresso.
 * @param tamanho Tamanho do vetor.
 */
void imprimirVetor(char *nome, double *vetor, size_t tamanho) {
    printf("%s: [", nome);

    for (int i = 0; i < tamanho; ++i) {
        printf("%9.2f", vetor[i]);

        if (i + 1 < tamanho) {
            printf(", ");
        }
    }

    printf("] \n");
}

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!