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
BozhidarKlouchek avatar BozhidarKlouchek 24 Точки
Best Answer
#include <iostream>
#include <vector>

using namespace std;
int main(){

double sum=0;
int lenght;
int newNum;
vector<int>vec;
cin>>lenght;

for(int i=0;i<lenght;++i)
{
    cin>>newNum;
    vec.push_back(newNum);
    sum+=vec[i];
}

int average=sum/lenght;

for(int j=0;j<lenght;++j)
{
    if(vec[j]>=average)
    {
        cout<<vec[j]<<" ";
    }
}
return 0;
}

Не разбирам напълно идеята ти с highest, higher и lower. В условието на задачата е описано да се изведат тези елемента на масива, чиято стойност е по-висока на average-a. В примерите в домашното (първи и трети) имаш в output-a три числа, но това не означава, че винаги биха били три. 

Примерно, ако в input имаш 
10

2 6 7 3 2 9 8 3 7 2

Трябва да получиш output,

6 7 9 8 7

Това е така, защото общата сума на всички елементи в масива (2+6+7+3+2+9+8+3+7+2) е 49, това разделено на 10 е 4.9. Само 6 7 9 8 7 са по-големи от 4.9 и за това само те излизат на конзолата.

Тук пращам моето решение, доста е новобранско, признавам, още се уча да пиша функции извън main.
Иначе мисля, че твоят код също би сработил, ако премахнеш идеята с highest, higher, lower и просто сложиш една проверка if(aboveAverage[n]>=average){cout<<aboveAverage[n]<<" ";}.

Всичко най-хубаво, 
Божко
 

0
16/09/2019 14:43:37
Filipbg avatar Filipbg 26 Точки

Я виж ти. Проработи. 

#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 higher = 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)
        {
            cout<<aboveAverage[n]<<" ";
        }
    }
    /*if(totalNumbers == 1)
    {
        //cout << average << endl;
    }*/
    return 0;
}

Само закоментирах отдолу проверката при само 1 число за да не го повтаря 2 пъти.

0
Vankata83 avatar Vankata83 72 Точки

Трябва ти  само един цикъл през масива, за да провериш кои числа са равни или по - големи от average.

Когато смяташ average пробвай с целочислено деление и виж какво ще се получи. При мен се получава така.

0
Filipbg avatar Filipbg 26 Точки

Един цикъл трябва да мине прочитайки и събирайки числата така или иначе. Направих цикъла да изпълва масива но ако имаше в предвид цялочисленото деление да го направя в цикъла с проверка if(aboveAverage[n] % average >= 1) не става защото % е само за integers а average си е double. И дори при кастване към int си обърква смисъла. Или имаш в предвид average = total / totalNumbers * 1.0; да го направя с %? 

0
Vankata83 avatar Vankata83 72 Точки

Имам предвид, че с един for цикъл намирам 

int average=sum/lenght;

След това втори for цикъл, с който минавам през всяко число от масива и ако то е по - голямо или равно на average,

го принтирам на конзолата.

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