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

Zadanie domowe odc.11

Object Storage Arubacloud
0 głosów
322 wizyt
pytanie zadane 1 grudnia 2018 w C i C++ przez Padomen Początkujący (260 p.)

Dzień dobry! Mam problem z zrobieniem pracy domowej z odcinka 11 z kursu c++. Mój program nie dziala co moze byc nie tak.

#include <iostream>

using namespace std;
float a[4],sr,najb,najm[4];



int main()
{
    cout << "Podaj 5 liczb uzywajac enter." << endl;

    for (int i=0;i<=4;i++)
    {
        cout << "Podaj liczbe: ";
        cin >> a[i];
    }
    sr=(a[0]+a[1]+a[2]+a[3]+a[4])/5;
    cout << "Srednia tych liczb to "<<sr<<endl;

    if (sr>a[0])najm[0]=sr-a[0];else najm[0]=a[0]-sr;
    if (sr>a[1])najm[1]=sr-a[1];else najm[1]=a[1]-sr;
    if (sr>a[2])najm[2]=sr-a[2];else najm[2]=a[2]-sr;
    if (sr>a[3])najm[3]=sr-a[3];else najm[3]=a[3]-sr;
    if (sr>a[4])najm[4]=sr-a[4];else najm[4]=a[4]-sr;

    najb=a[0];

    for (int i=1;i<=4;i++)
    {
        if (najb>najm[i])najb=a[i];

    }
    cout << "Liczba najblizej sredniej to "<<najb<<endl;
    cout<<a[0]<<endl<<a[1]<<endl<<a[2]<<endl<<a[3]<<endl<<a[4]<<endl;

    return 0;
}

 

 

 

1 odpowiedź

0 głosów
odpowiedź 1 grudnia 2018 przez PanRik Gaduła (4,510 p.)
edycja 1 grudnia 2018 przez PanRik
float a[4],sr,najb,najm[4];

1. a oraz najm  to tablice od 0 do 3. W programie korzystasz z tablic 5 elementowych( od 0 do 4 )

2. Według mnie bardzo mylące jest pisanie tak warunków w pętli:
 

for (int i=0;i<=4;i++)

chodzi mi o i<=4 polecam jednak pisać i<5 wtedy jest trudniej się pomylić :D

3. Tą serie ifów co masz mógłbyś zastąpić pętlą i funkcją fabs
 

    for( int i = 0; i < 5; i++ )
    {
        najm[i] = fabs(a[i] - sr);
    }

Dużo czytelniejsze :)

4. 

najb=a[0];
 
    for (int i=1;i<=4;i++)
    {
        if (najb>najm[i])najb=a[i];
 
    }

Z tym for`em masz mały problem. Sprawdzasz okej, aczkolwiek nie przewidujesz sytuacji, kiedy w Twojej tablicy będzie liczba , która jest też średnią. Dlatego przed tym ifem dodałbym małe sprawdzenie:
 

if ( najm[i] == 0 )
        {
            najblizej=a[i];
            break;
        }

Teraz w sytuacji np. 1,2,3,4,5, gdzie średnia jest 3 to trójka zawsze będzie najbliżej średniej i jej różnica do średniej jest 0. Chociaż ten dodatek może czasami zmniejszyć a czasami zwiększyć czas działania programu.

Kolejna sprawa: 

if (najb>najm[i])najb=a[i];

Przypisujesz najb do a[i] a potem to sprawdzasz zupełnie z inną tablicą... Coś tu jest nie tak. 
Proponuje moje rozwiązanie:
 

    najb = najm[0];
    float najblizej = a[0];
 
    for (int i=1;i<5;i++)
    {
        if ( najm[i] == 0 )
        {
            najblizej=a[i];
            break;
        }
        if ( najb>najm[i])
        {
            najb = najm[i]; 
            najblizej=a[i];   
        }
 
    }
    cout << "Liczba najblizej sredniej to "<<najblizej<<endl;

Jak widzisz dodałem jeszcze jedną zmienną najblizej, dzięki której najb może niezależnie sprawdzać kolejne elementy tablicy najm.

komentarz 1 grudnia 2018 przez Padomen Początkujący (260 p.)
Dziękuję za rady ale mam pytanie. Co powoduje ze liczba najblizej sredniej to srednia (tak wyswietla program)
komentarz 1 grudnia 2018 przez PanRik Gaduła (4,510 p.)
edycja 1 grudnia 2018 przez PanRik

Nie do końca rozumiem. 

Jeśli chodzi Ci o mój przykład:
1,2,3,4,5 - 1+2+3+4+5 = 15 , 15 / 5 = 3. W tym wypadku ( akurat w tym ), przy odejmowaniu fabs(sr - a[i]) zajdzie sytuacja a[2] - sr = 0, gdzie a[2] = 3.

Czyli pojawienie się liczby takiej samej jak średnia( czyli różnica tych liczb równa 0 ) z automatu ustawia ją jako liczbę najbliżej średniej.

Edit: Gdyby nie było tego:

Najbliższa liczbą dla przykładu 1,2,3,4,5 była by liczba 4, a to przecież nieprawda.
 

Edit2:
 

if ( najm[i] == 0 )
        {
            najblizej=a[i];
            break;
        }

W sumie to jest zbędne chociaż czasami może zmniejszyć czas wykonywania, a czasami go nawet zwiększyć.

komentarz 1 grudnia 2018 przez Padomen Początkujący (260 p.)

 

 

w moim programie a[5] zmienia sie na srednia czemu tak sie dzieje?

 

komentarz 1 grudnia 2018 przez PanRik Gaduła (4,510 p.)
Możesz pokazać wprowadzone przez siebie zmiany?

Podobne pytania

0 głosów
2 odpowiedzi 685 wizyt
0 głosów
1 odpowiedź 404 wizyt
pytanie zadane 3 grudnia 2017 w C i C++ przez Kamil Miętkiewicz Użytkownik (630 p.)
0 głosów
1 odpowiedź 480 wizyt

92,634 zapytań

141,505 odpowiedzi

319,883 komentarzy

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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...