• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kurs C++, zadanie, odcinek 11 - problem ze sposobem myślenia

VPS Starter Arubacloud
0 głosów
223 wizyt
pytanie zadane 6 maja 2019 w C i C++ przez Nomadovsky Nowicjusz (120 p.)

Cześć! Na początku chcę napisać, że czuję się bardzo nieswojo wołając o pomoc.
Uff, mam to z głowy, więc teraz przejdę do rzeczy.

W zadaniu należy podać 5 liczb, wyliczyć z nich średnią, a następnie wypisać liczbę lub liczby najbliższe średniej. 
Można zrobić to wyliczając wartość bezwzględną różnicy liczby i średniej, ale ja chciałem zrobić to inaczej i utknąłem. Otóż wymyśliłem sobie, że utworzę tablicę z podanymi liczbami, następnie wyliczę średnią, a później zrobię pętlę, która odseparuje mi liczby:
= średniej, jeśli takie istnieją, > średniej i < średniej. Potem wybiorę najmniejszą liczbę z liczb powyżej średniej i największą z liczb poniżej średniej. Następnie sprawdzę ich "odległość" od średniej i wypiszę tę o mniejszej różnicy od średniej, lub obie.
Niestety wypisywanie najmniejszej spośród większych od średniej i największej spośród mniejszych przerosło moje zdolności. To co zrobiłem do tego momentu:
 

#include <iostream>

using namespace std;

float s, maks, below, over;


float srednia (float *num, int x)
{
    float suma=0;
    for (int i=0; i<x; i++)
    {
        suma+=*num;
        *num++;
    }

    return suma/x;
}

int main()
{
    float liczby[5];
    cout << "Podaj 5 liczb oddzielonych spacja" << endl;
        for (int i=0; i<5; i++)
        {
            cin >> liczby[i];
        }
            cout << "Srednia wynosi: " << srednia (liczby, 5) <<endl;

        maks=liczby[0];

        for (int i=0; i<5; i++)
        {
                if (liczby[i] == srednia(liczby, 5))
                    {
                        maks = liczby[i];
                        cout << "Liczba najblizsza sredniej: " << maks << endl;
                    }

                if (liczby[i] < srednia(liczby, 5))
                    {

                        cout << liczby[i] << " "; //Liczby poniżej średniej
                        below = srednia(liczby, 5);
                        if (liczby[i]<below) below = liczby[i];

                    }

                if (liczby[i] > srednia(liczby, 5))
                    {
                        cout << liczby[i] << "o ";//liczby powyżej średniej
                        over = srednia(liczby, 5);
                        if (over<liczby[i]) over = liczby[i];

                    }


        }
        if (srednia(liczby, 5) != maks)
        {//dalej są niedokończone spełnione warunki obliczania wartości bezwzględnej, ale póki co krzaczy się już powyżej 

Domyślam się, że wewnątrz warunków dla liczb x> i x< od średniej powinna być dodatkowa pętla, która zapisze te liczby w zmiennej, a następnie znajdę najmniejsza i największą wartość?
Jest mi okropnie głupio, ale utknąłem tu od kilku dni i bardzo prosze o jakieś wskazówki gdzie powinienem szukać rozwiązania.
Z góry dziękuję za poświęcony nowicjuszowi czas ;)

1 odpowiedź

0 głosów
odpowiedź 7 maja 2019 przez j23 Mędrzec (194,920 p.)
  • W linii 14 powinno być  ++num;
  • Po co 5 razy wywołujesz srednia? Raz nie wystarczy?
  • Dlaczego zmienne s, maks, below i over zdefiniowane są globalnie a nie lokalnie?
komentarz 7 maja 2019 przez Nomadovsky Nowicjusz (120 p.)
Jeśli chodzi o linię 14 to wzorowałem sie na odcinku kursu pana Zelenta i funkcja wydaje się działać.
Co do reszty to dziękuję za trafne uwagi, ale póki co chciałbym skupic się na rozwiązaniu problemu, a w drugiej kolejności estetyce kodu ;)
komentarz 7 maja 2019 przez j23 Mędrzec (194,920 p.)
edycja 7 maja 2019 przez j23
int maks, below, above;
float sr = srednia(liczby, 5);

maks = below = above = -1;

for (int i = 0; i < 5; ++i) {
	if (liczby[i] == sr) {
		maks = i;
	}

	if (liczby[i] < sr) {
		if (below < 0 || liczby[i] > liczby[below]) below = i;
	}

	if (liczby[i] > sr)	{
		if (above < 0 || liczby[i] < liczby[above]) above = i;
	}
}

if(below != -1) std::cout << "liczba poniżej sredniej: " <<  liczby[below] << '\n';
if(above != -1) std::cout << "liczba powyżej sredniej: " << liczby[above] << '\n';
if(maks != -1) std::cout << "liczba równa sredniej: " << liczby[maks] << '\n';

O to chodzi?

komentarz 8 maja 2019 przez Nomadovsky Nowicjusz (120 p.)

Chodzi mi o to, że np mając liczby: 1, 4, 3, 4, 5 średnia to 3,4, więc chce wypisać liczby:
1) poniżej średniej (above) - 1, 3,
2) powyżej średniej (over) - 4, 4, 5,
3) teraz znaleźć największą liczbę z above (3), oraz najmniejszą z over (4).
4) Później przyrównać wartości bezwzględne odejmowania ze średnią
5) i w ten sposób otrzymać liczbę najbliższą średniej
No i utknąłem w tym punkcie trzecim i nie wiem jak zrobić, żeby to działało frown

No i dzięki za zainteresowanie tak w ogóle ;)

komentarz 8 maja 2019 przez j23 Mędrzec (194,920 p.)
edycja 8 maja 2019 przez j23

above i over odnoszą się do zbioru powyżej, tyle że słowo above jest tutaj bardziej adekwatne (dlatego go użyłem) ;)

 

Zrób tak:

  1. posortuj tablicę
  2. znajdź pierwszy element o wartości większej lub równej średniej
  3. mając punkt podziału wypisujesz elementy mniejsze (below) i większe (above) od średniej (mean)
  4. resztę punktów powinieneś ogarnąć... :)

Dwa pierwsze punkty może załatwić funkcja std::partition.

komentarz 9 maja 2019 przez Nomadovsky Nowicjusz (120 p.)

Będę walczył, dzięki za pomoc yes

Podobne pytania

0 głosów
2 odpowiedzi 499 wizyt
0 głosów
2 odpowiedzi 1,397 wizyt
0 głosów
2 odpowiedzi 694 wizyt

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...