Я боролся с этой проблемой, и именно поэтому я прошу здесь о помощи.
Представьте себе следующий набор значений для массива под названием "баллы",
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
Я думаю, вы хотите использовать основы 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;
}
Предполагая, что я понимаю ваши исходные данные и вашу цель, я считаю, что что-то простое, как это должно работать:
for (int i=0; i < num_students; i++)
average[i] = std::accumulate(scores + 4*i, scores + 4*i + 4, 0) / 4;
Попробуй это:
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.
for
цикла, но ваше требование ограничено одним for
цикла.
Насколько я понимаю вашу проблему, ваша главная цель - просто создать самый быстрый код. Вы хотите иметь только один цикл без инструкции 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);
}
Это первое, что перешло мне в голову.
#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;
}
i+=4
в цикле for?