2
votes

Comment prendre la moyenne de tous les nièmes éléments en C ++

Je programme pour le plaisir et je voulais prendre les moyennes de chaque nième élément. Par exemple, j'ai 1000 éléments dans le vecteur et je veux prendre la moyenne de tous les 100 éléments, comment puis-je faire cela en utilisant C ++.

J'ai essayé d'utiliser modulo, mais ma logique n'est pas correcte.

    float av;
    vector<float> average;
    vector<int> vec = {1, 3, 5, 5, 6, 2, 12, 54};

    for(int i = 0; i < vec.size(); i++) {

        if(i % 2 == 0) {
            av += vec[i];
            average.push_back(av);
        }

        cout << average << endl;
    }

J'obtiens toujours quelque chose de différent. Par exemple, pour la première moyenne, j'obtiens 1;


2 commentaires

Si vous avez du mal avec un algorithme, essayez de l'écrire sur un papier avec un stylo et non en C ++. Essayez de le parcourir à la main et lorsque vous le faites fonctionner, écrivez-le en utilisant le code. Pourquoi avez-vous utilisé modulo? Où faites-vous la moyenne dans le code que vous avez publié? Pourquoi average est-il un vecteur, ne devrait-il pas être un nombre?


La question sera plus claire si vous ajoutez le résultat attendu avec votre vecteur. Doit être 16 (moyenne de 3, 5, 2, 54) ou le vecteur {2, 5, 4, 33}? (la moyenne de chaque paire d'éléments)?


3 Réponses :


0
votes

Dans votre boucle, vous pouvez changer i ++ en i + = 100 puis conserver une somme courante de chaque élément que vous avez rencontré ainsi qu'un décompte du nombre d'éléments que vous avez additionnés, puis renvoyez la somme divisée par le nombre pour obtenir la moyenne.


0 commentaires

1
votes

Excellente question. Voici une solution simple que j'ai trouvée. J'utilise périodicité pour représenter les étapes entre les éléments vectoriels que vous souhaitez utiliser. Ensuite, comme le nombre d'éléments peut ne pas être un multiple entier de la périodicité, j'utilise la fonction de plafond pour saisir un élément supplémentaire pour la division.

#include <iostream>
#include <vector>
#include <cmath>

int main()
{
  int total = 0;
  uint count;
  float average;
  const uint periodicity = 2;
  std::vector<int> vec {1, 3, 5, 5, 6, 2, 12, 54, 18};

  for (int i = 0; i < vec.size(); i = i + periodicity) {
    total += vec[i];

  }

  count = ceil((double) vec.size()/periodicity);
  average = (double) total / count;
  std::cout << "sum: " << total << ", count: " << count
  << ", average: " << average << std::endl;

}


0 commentaires

0
votes

La moyenne est de (somme / nombre_éléments) : (vec [0] + vec [1] + ... + vec [N - 1]) / N Seule la division se produit au Nième élément, la somme est pour chaque nombre:

int N = 2;
for (int i = 0; i < vec.size(); i++)
{
  av += vec[i];

  if (i % N == 0)
  {        
    average.push_back(av / N);
    av = 0; // reset sum for next average
  }
}


0 commentaires