• 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

42 Warsaw Coding Academy
0 głosów
482 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 (195,240 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 (195,240 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 (195,240 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 742 wizyt
0 głosów
2 odpowiedzi 1,769 wizyt
0 głosów
2 odpowiedzi 1,239 wizyt

93,383 zapytań

142,382 odpowiedzi

322,539 komentarzy

62,744 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...