03. Above average
#include <iostream>
#include <cmath>
#include <array>
using namespace std;
int main()
{
int totalNumbers = 0;
cin >> totalNumbers;
array<int, 10> aboveAverage;
int total = 0;
double average;
int lower = INT_MAX;
int higher = INT_MIN;
int highest = INT_MIN;
int nums = 0;
for(int i = 0; i < totalNumbers; i++)
{
cin >> aboveAverage[i];
total += aboveAverage[i];
}
average = total / totalNumbers * 1.0;
for(int n = 0; n < totalNumbers; n++)
{
if(aboveAverage[n] > average)
{
highest = aboveAverage[n];
if(aboveAverage[n] > average && aboveAverage[n] < highest)
{
higher = aboveAverage[n];
}
}
else if(aboveAverage[n] == average)
{
lower = aboveAverage[n];
}
}
if(totalNumbers == 1)
{
cout << average << endl;
}
else
{
cout << lower << " " << higher << " " << highest << endl;
}
return 0;
}
На първия output ми намира lower и highest, но не и higher. За втория output работи. Но за третия не. Опитах се да го изкарам в масив извън main но ми дава всевъзможни грешки. Тези вектори и масиви тотално пи пръсват главата. Колкото и да гледам лекцията нищо не помага за решаването на задачитe.
Привет, колега,
Говорихме го на лекциите - казвам го пак тук:
Винаги слагайте скоби!
Давам пример:
int arrayElementsSum = 5;
int arrayDimension = 2;
double arrayElementsAverage = arrayElementsSum / arrayDimension * 1.0;
cout << arrayElementsAverage << std::endl;
arrayElementsAverage = 1.0 * arrayElementsSum / arrayDimension;
cout << arrayElementsAverage << std::endl;
Ще генерира изхода:
2
2.5
Защо се получава така?
Защото когато няма скоби - операциите се изпълняват според тяхната тежест.
В случай операциите умножение и деление имат еднакъв приоритет, затова се изпълняват от ляво на дясно.
Вариант 1:
arrayElementsSum / arrayDimension * 1.0;
Тук имаме 2 операции - целочислено деление (защото arrayElementsSum и arrayDimension са int) и след това деление с плаваща запетая.
Т.е. arrayElementsSum / arrayDimension * 1.0 ---> 2 * 1.0 ---> 2.0 (което се принти само като 2 на конзолата)
Вариант 2:
1.0 * arrayElementsSum / arrayDimension;
Тук отново имаме същите 2 операции, но в обратен ред - деление с плаваща запетая (защото 1.0 e тип double) и отново деление с плаваща запетая (защото резултата от първата операция е число от тип double)
Т.е. 1.0 * arrayElementsSum / arrayDimension ---> 5.0 / 2 ---> 2.5 (което се принти като 2.5 на конзолата)
Поздрави,
Живко
Разлика няма. Аз използвах average = total / totalNumbers * 1.0; Ако имаше () щеше да даде приоритет при изчислението. Все пак успях да я реша. Дава си 100/100 и по този начин.