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

Zadanie domowe odc.11

42 Warsaw Coding Academy
0 głosów
466 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 979 wizyt
0 głosów
1 odpowiedź 497 wizyt
pytanie zadane 3 grudnia 2017 w C i C++ przez Kamil Miętkiewicz Użytkownik (630 p.)
0 głosów
1 odpowiedź 692 wizyt

93,377 zapytań

142,379 odpowiedzi

322,528 komentarzy

62,727 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
...