Среднее по массиву

0

Я боролся с этой проблемой, и именно поэтому я прошу здесь о помощи.

Представьте себе следующий набор значений для массива под названием "баллы",

20 30 40 50 10 20 40 10

То, что я хочу сделать, - создать цикл, который вычисляет среднее значение каждого из 4 значений. В этом случае и при ручной математике это должно быть

(20+30+40+50)/4
(10+20+40+10)/4 

Теперь моя точка зрения и моя проблема в том, что я не знаю, как это сделать с одним циклом. Я понимаю, что я могу настроить два цикла, а затем сделать это, но, как очевидно, если массив был больше, мне пришлось бы установить сотни циклов. Теперь я решил, что решение, которое я сделал, очень далек от реального решения

#include <iostream>
#include <string>

using namespace std;

int main()
{
  string names[4] = {"Peter","Mark","July","Sarah"};
  double scores [16] = {20,30,100,60,30,40,10,90,10,99,100,12,100,100,10,100};
  double average[4] ;
  int i;

    for (int d = 0, i = 0; d < 4 - 1; d++)
    {
        average[i] += scores[d];
        if (d % 4 == 0) {
            average[i] /= 4;
            i++;
        }
    }

    for (int l = 0 ; l < 4 ; l++)
    {

        cout << "\nName : " << names[l] << endl << endl ;
        cout << "Average :  " << average[l] << endl;

    }

}

Желаемый результат:

Имя: Питер Среднее: 52.5 Название: Марка Среднее: 42.5 Название: Июль Среднее: 55,25 Имя: Сара Средняя: 77,5

Фактический результат: Имя: Питер Среднее: 5 Название: Марка Среднее: 130 Название: Июль Среднее: 3.11076e-317 Имя: Сара Средняя: 6.90921e-310

  • 3
    подсказка: вы можете увеличить d более чем на 1 на каждой итерации цикла
  • 0
    Почему сотни петель? Это всегда будут две петли: внешняя по ученикам и внутренняя по оценкам каждого учащегося (как бы физически ни организовывались данные - эти два показателя всегда необходимы для доступа к конкретному баллу для конкретного учащегося). Каждый из циклов может повторяться произвольно часто, но это логически отличается. Так что это аргумент для использования вложенных циклов, явно или неявно, как через накопление.
Показать ещё 2 комментария
Теги:

5 ответов

2
Лучший ответ

Я думаю, вы хотите использовать основы c++. Следующий код даст вам нужный результат.

      string names[4] = {"Peter","Mark","July","Sarah"};
      double scores [16] = {20,30,100,60,30,40,10,90,10,99,100,12,100,100,10,100};
      double average[4] ;
      int i;

        for (int d = 1, i = 0; d <= 16; d++)
        {
            average[i] += scores[d-1];
            if (d % 4 == 0) {
                average[i] /= 4;
                i++;
            }
        }

        for (int l = 0 ; l < 4 ; l++)
        {

            cout << "\nName : " << names[l] << endl << endl ;
            cout << "Average :  " << average[l] << endl;

        }
  • 0
    По некоторым причинам, которые не работают
  • 0
    Я отредактировал код и проверил код. Это будет работать наверняка.
Показать ещё 1 комментарий
2

Предполагая, что я понимаю ваши исходные данные и вашу цель, я считаю, что что-то простое, как это должно работать:

for (int i=0; i < num_students; i++)
    average[i] = std::accumulate(scores + 4*i, scores + 4*i + 4, 0) / 4;
  • 0
    Я никогда не покрывал накопления на занятиях ... спасибо за вашу помощь, но я не могу использовать это для этого упражнения
1

Попробуй это:

average[0] = 0;
average[1] = 0;
for (unsigned int i = 0; i < scores_students; ++i)
{
  average[0] += scores[0 + i];
  average[1] += scores[4 + i];
}
average[0] = average[0] / scores_students;
average[1] = average[1] / scores_students;

Обратите внимание, что scores[0 + i] используют оценки в первом наборе из 4.
Также scores[4 + i] используют оценки во втором наборе из 4.

  • 0
    Это работает .. но если бы массив был больше, мне пришлось бы сделать больше среднего [x] и знать, сколько мне нужно добавить к i. Правильно?
  • 0
    Если бы у вас было больше средних, вы бы использовали более одного for цикла, но ваше требование ограничено одним for цикла.
0

Насколько я понимаю вашу проблему, ваша главная цель - просто создать самый быстрый код. Вы хотите иметь только один цикл без инструкции if.

Мое решение №1:

int scores[] = {20,30,100,60,30,40,10,90,10,99,100,12,100,100,10,100};
double avgs[4] = {};

for (int it = 0; it < 16; ++it)
{
    avgs[it / 4] += scores[it] / 4.0;
}

for (int it = 0; it < 4; ++it)
{
    cout << it << ": " << avgs[it] << endl;
}

Мое решение №2:

double accumulate(int input[4])
{
    return (input[0] + input[1] + input[2] + input[3]) / 4.0;
}

for (int it = 0; it < 4; ++it)
{
    avgs[it] = accumulate(scores + 4 * it);
}
0

Это первое, что перешло мне в голову.

   #include <iostream>
#include <string>

using namespace std;

int main()
{
    string names[4] = {"Peter","Mark","July","Sarah"};
    double scores[16] = {20,30,100,60,30,40,10,90,10,99,100,12,100,100,10,100};
    double average[4];
    for(int i = 0; i < 16 + 1; i+=4)
    {
        if(i != 0 && i % 4 == 0)
            average[(i / 4)-1] = (scores[i-4]+scores[i-3]+scores[i-2]+scores[i-1]) / 4;
    }
    for (int l = 0 ; l < 4 ; l++)
    {

        cout << "\nName : " << names[l] << endl << endl ;
        cout << "Average :  " << average[l] << endl;

    }
    return 0;
}
  • 0
    Почему бы не использовать i+=4 в цикле for?
  • 0
    Спасибо за напоминание, я очень устала.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню