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

Odcinek 11 C++ - zadanie domowe - jak wyświetlic więcej niż jedną liczbę

VPS Starter Arubacloud
0 głosów
1,397 wizyt
pytanie zadane 17 maja 2017 w C i C++ przez Tinker Nowicjusz (120 p.)
edycja 18 maja 2017 przez Tinker

Rozwiązanie, do którego doszedłem wyświetla liczbę najbliższą średniej z pięciu podanych liczb. Gdy wśród podanych liczb znajduje się 0, to jest ono wyświetlane jako najbliższa (co mija się z prawdą). Jak temu zaradzić? Mam jeszcze pytanie odnośnie wyświetlenia więcej niż jednej liczby. Jak to zrobić?  :)

PS Podpowie mi ktoś jak rozdzielić treść posta od wklejonego kodu?  



#include <iostream>
#include <cmath>

using namespace std;
float a,b,c,d,e, najblizsza, srednia;
int main()
{
    cout << "Podaj cztery liczby odzielone spacjami " << endl;
    cin>> a>>b>>c>>d>>e;
    srednia=(a+b+c+d+e)/5;
    cout<< srednia<< endl;

    najblizsza=a;


    if (abs(srednia-a)>=abs(srednia-b))
        najblizsza=b;

    if (abs(srednia-b)>=abs(srednia-c))
        najblizsza=c;

    if (abs(srednia-c)>=abs(srednia-d))
        najblizsza=d;

    if (abs(srednia-d)>=abs(srednia-e))
        najblizsza=e;

        cout<< "Najblizsza liczba do sredniej to "<<najblizsza;
    return 0;
}

 

komentarz 17 maja 2017 przez Alex.Ironside Stary wyjadacz (14,880 p.)
Co do rozdzielania. Najpierw wytnij

Rozwiązanie, do którego doszedłem wyświetla liczbę najbliższą średniej z pięciu podanych liczb. Gdy wśród podanych liczb znajduje się 0, to jest ono wyświetlane jako najbliższa (co mija się z prawdą). Jak temu zaradzić?

Mam jeszcze pytanie odnośnie wyświetlenia więcej niż jednej liczby. Jak to zrobić?

 :)

 

PS Podpowie mi ktoś jak rozdzielić treść posta od wklejonego kodu?

Pozniej daj kilka spacji i wklej na samej gorze. Albo usun wszystko, wklej swoj tekst a potem po 3 spacjach kod

2 odpowiedzi

+2 głosów
odpowiedź 18 maja 2017 przez d0n Mądrala (6,440 p.)
Kolejne if'y  w twoim kodzie zakładają, że poprzednie wykonały swoją treść tzn. if z linijki 19 jest napisany w taki sposób, jakby zakładał, że if z 16 linijki był prawdą i teraz najbliższa liczba jest zapisana w zmiennej b, a nie musi, bo jeśli abs( srednia - a ) był mniejszy niz abs( srednia - b ), to blizsza sredniej liczba jest zapisana w zmiennej a, a nie b jak zakłada następny if. Kolejne if'y mają ten sam problem
 W skrócie, aby kod działał w if'ach musi być porównywana zmienna 'najblizsza' z kazda kolejna.

A co do wypisywania wiecej niz jednej liczby, cout dziala tak, ze mozemy pisac dowolna liczbe argumentow, pod warunkiem, ze oddzielimy je operatorem "<<", czyli mozna napisac
cout << zmienna << " " << zmienna2 << '\n';
aby miec wypisane dwie zmienne oddzielone spacja i zakonczone znakiem nowej linii.
komentarz 18 maja 2017 przez Tinker Nowicjusz (120 p.)
edycja 18 maja 2017 przez Tinker

Dzięki za odpowiedzi!

Poprawiłem kod wg twoich wskazówek, d0n oraz posta wg zaleceń Alex.Ironside.

Co w sytuacji gdy najbliższe są dwie zmienne? Dzieje się tak np przy podaniu takich liczb:

3.5, 6.5, 12, 0, 3. Średnia to 5 i najbliższe są 3.5 i 6.5. Zastanawiam się jak wypisać obie liczby w linii końcowej gdzie podawana jest najbliższa średniej. Drugim problemem jest 0, które jest interpretowane jako najbliższa liczba, a tak nie jest.

Poprawiony kod jest tutaj:

 


#include <iostream>
#include <cmath>

using namespace std;
float a,b,c,d,e, najblizsza, srednia;
int main()
{
    cout << "Podaj cztery liczby odzielone spacjami " << endl;
    cin>> a>>b>>c>>d>>e;
    srednia=(a+b+c+d+e)/5;
    cout<< srednia<< endl;

    najblizsza=a;


        if (abs(srednia-najblizsza)>=abs(srednia-b))
        najblizsza=b;

        if (abs(srednia-najblizsza)>=abs(srednia-c))
        najblizsza=c;

        if (abs(srednia-najblizsza)>=abs(srednia-d))
        najblizsza=d;

        if (abs(srednia-najblizsza)>=abs(srednia-e))
        najblizsza=e;

        cout<< "Najblizsza liczba do sredniej to "<<najblizsza;
    return 0;
}

 

komentarz 18 maja 2017 przez WilmaOlcho Obywatel (1,740 p.)
najblizsza jest już odległością, bez sensu jest i właściwie błędnie tworzyć od niej odległość.
0 głosów
odpowiedź 18 maja 2017 przez WilmaOlcho Obywatel (1,740 p.)
edycja 18 maja 2017 przez WilmaOlcho

Wykorzystanie if jest tu nawet niepotrzebne. Zgodnie z [link] funkcja min() zawiera w sobie dokładnie takie warunki i jest bardziej przejrzysta.
 

najblizsza=min(abs(srednia-a),abs(srednia-b));
najbliższa=min(najbliższa,abs(srednia-c));
najbliższa=min(najbliższa,abs(srednia-d));
najbliższa=min(najbliższa,abs(srednia-e));

lub krócej, choć mniej czytelnie (kolega by mi powiedział, że za****by mnie szpadlem za taki kod):
 

najblizsza=min(min(min(min(abs(srednia-a),abs(srednia-b)),abs(srednia-c)),abs(srednia-d)),abs(srednia-e));

a linię dalej:
 

if (a-najblizsza||a+najblizsza==srednia) najblizsza=a;
else if (b-najblizsza==srednia||b+najblizsza==srednia) najblizsza=b;
else if (c-najblizsza==srednia||c+najblizsza==srednia) najblizsza=c;
else if (d-najblizsza==srednia||d+najblizsza==srednia) najblizsza=d;
else if (e-najblizsza==srednia||e+najblizsza==srednia) najblizsza=e;

Poprawiam z racji tego, że sam zapędziłem się w ten sam błąd na który zwróciłem w jednym z poniższych komentarzy uwagę.

komentarz 18 maja 2017 przez Tinker Nowicjusz (120 p.)
Całkiem fajne i proste rozwiązanie. Masz jakiś pomysł na 2 problemy, które opisałem wcześniej? :)
komentarz 18 maja 2017 przez WilmaOlcho Obywatel (1,740 p.)

Pierwszy problem właśnie doprowadził do powstania komentarza, a drugi:
 

int wyniki[5],przesuniecie=0,iloscwynikow=0;
if (a-najblizsza==srednia||a+najblizsza==srednia) {wyniki[przesuniecie]=a; iloscwynikow++; przesuniecie++;}
if (b-najblizsza==srednia||b+najblizsza==srednia) {wyniki[przesuniecie]=b; iloscwynikow++; przesuniecie++;}
if (c-najblizsza==srednia||c+najblizsza==srednia) {wyniki[przesuniecie]=c; iloscwynikow++; przesuniecie++;}
if (d-najblizsza==srednia||d+najblizsza==srednia) {wyniki[przesuniecie]=d; iloscwynikow++; przesuniecie++;}
if (e-najblizsza==srednia||e+najblizsza==srednia) {wyniki[przesuniecie]=e; iloscwynikow++; przesuniecie++;}

for (int i=0;i<przesuniecie;i++) cout << wyniki[i] << " ";

Może tak? zamiast if i else if które podałem w odpowiedzi.

komentarz 18 maja 2017 przez 10kw10 Pasjonat (22,880 p.)

w taki sposob pojawia sie puste miejsce w tablicy ( znaczy bd tam randomowe liczby), lepiej uzyj wektora.

http://en.cppreference.com/w/cpp/container/vector

komentarz 18 maja 2017 przez WilmaOlcho Obywatel (1,740 p.)
Przy podaniu pięciu liczb, zawsze znajdzie się przynajmniej jedna, która spełnia warunek bycia najbliższej do wartości średniej. W ten sposób zawsze zostanie wypełniony pierwszy element tablicy właśnie tą liczbą, a zmienna przesunięcie będzie pozwalać na zapisanie drugiej liczby. Pętla wyświetlająca będzie wyświetlać tylko zapisane w tablicy przez wcześniejsze warunki liczby, ponieważ liczy od zera, do wartości przesunięcia, które minimalnie wyniesie 1 (wyświetli tylko element 0), a maksymalnie 5(wyświetli elementy od 0 do 4). Pojawienie się wówczas "losowych" liczb w pozostałych polach nie wpływa na działanie programu.

Ale fakt, vector jest bardzo przydatny.
komentarz 19 maja 2017 przez Tinker Nowicjusz (120 p.)

Zanim zajrzałem do tematu, trochę pogrzebałem w kodzie i wpadłem na takie rozwiązanie. Kod działa. Zdaję sobie sprawę, że nie jest to arcydzieło, bo dopiero się uczę :). Teraz przeanalizuje Wasze propozycje rozwiązania.



#include <iostream>
#include <cmath>

using namespace std;
float a,b,c,d,e, najblizsza, najblizsza2, srednia;
int main()
{
    cout << "Podaj piec liczb oddzielonych spacjami " << endl;
    cin>> a>>b>>c>>d>>e;
    srednia=(a+b+c+d+e)/5;
    cout<< srednia<< endl;

    najblizsza=a;


        if (abs(srednia-najblizsza)>abs(srednia-b))
        najblizsza=b;
        else if (abs(srednia-najblizsza)==abs(srednia-b) && najblizsza!=b)
        najblizsza2=b;

        if (abs(srednia-najblizsza)>abs(srednia-c))
        najblizsza=c;
        else if (abs(srednia-najblizsza)==abs(srednia-c) && najblizsza!=c)
        najblizsza2=c;

        if (abs(srednia-najblizsza)>abs(srednia-d))
        najblizsza=d;
        else if (abs(srednia-najblizsza)==abs(srednia-d) && najblizsza!=d)
        najblizsza2=d;

        if (abs(srednia-najblizsza)>abs(srednia-e))
        najblizsza=e;
        else if (abs(srednia-najblizsza)==abs(srednia-e) && najblizsza!=e)
        najblizsza2=e;

        cout<< "Najblizsza liczba do sredniej to "<<najblizsza;
        if (abs(srednia-najblizsza)==abs(srednia-najblizsza2))
            cout << " i " << najblizsza2;
    return 0;
}

Podobne pytania

0 głosów
2 odpowiedzi 499 wizyt
0 głosów
1 odpowiedź 223 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!

...