Loading...
Filipbg avatar Filipbg 26 Точки

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.

Тагове:
0
C++ Fundamentals
KaloyanEvtimov avatar KaloyanEvtimov 5 Точки

В контекста на задачата, можете ли да ми обясните разликата между

double arrayElementsAverage = arrayElementsSum / arrayDimension * 1.0;

и

double arrayElementsAverage = 1.0 * arrayElementsSum / arrayDimension;

Това е statement-а, с който изчислявам средно-аритм. стойност на елементите в масива. Сигурно се досещате, че преди това съм декларирал arrayElementsSum и arrayDimension като целочислени.

С втория начин judje ми даваше 40/100. Бях останал с впечатлението, че няма значение по кой от двата начина ще обърна израза отдясно в дробен, но явно има...

 

Благодаря предварително

 

1
j.petrov_90 avatar j.petrov_90 373 Точки

Привет, колега,

Говорихме го на лекциите - казвам го пак тук:
Винаги слагайте скоби!

Давам пример:

    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 на конзолата)

Поздрави,
Живко

0
Filipbg avatar Filipbg 26 Точки

Разлика няма. Аз използвах average = total / totalNumbers * 1.0; Ако имаше () щеше да даде приоритет при изчислението. Все пак успях да я реша. Дава си 100/100 и по този начин.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.