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

Kurs C++ odc. 11 - odpowiedź na zadanie domowe do oceny i pomocy.

Object Storage Arubacloud
+1 głos
979 wizyt
pytanie zadane 7 lipca 2015 w C i C++ przez Bartos Użytkownik (610 p.)

Witam szanowne grono programistów :)

Odrobiłem zadanie domowe z 11 odcinka kursu C++, dla przypomnienia: program ma obliczyć średnią z 5 podanych liczb i wypisać, tą która jest najbliższa średniej. Mam tylko problem z trzecim testem, nie wiem jak zrobić, aby wypisało dwie liczby jeśli są one tak samo bliskie do średniej.

Pozatym co sądzicie o takim kodzie? Jakieś rady, zastrzeżenia?

#include <iostream>
using namespace std;

float liczby[5],suma=0, srednia=0, x[5], najmniejsza;

int main()
{
    for(int i=0; i<5; i++)
    {
        cout<<"Podaj "<<i+1<<" liczbe: ";
        cin>>liczby[i];
        suma+=liczby[i];
    }
    srednia=suma/5;
    cout<<endl<<"Srednia wynosi: "<<srednia;


    for (int i=0; i<5; i++)
    {
       x[i]=(1-(liczby[i]/srednia));//liczba najblizsza sredniej to liczba, którą jak podzielimy przez srednia bedzie najblizsza 1, a zastosowane odejmowanie 1-wynik i uzycie  wartosci bezwzglednej jest po to aby pozniej znalezc najmniejsza z tych liczbe
       if (x[i]<0) x[i]=-x[i];//stworzenie wartosci bezwzglednej
    }


    najmniejsza=x[0];
    for (int i=0; i<5; i++)
    {
        if (x[i+1] < najmniejsza) najmniejsza=x[i+1]; //znalezienie najmniejszej liczby wsrod wynikow dzielenia (czyli takiej ktorej wynik z dzielenia przez srednia bedzie najblizszy 1, czyli najblizszej sredniej)
    }

    if ( x[0]==najmniejsza )cout<<endl<<"Liczba nablizsza sredniej to: "<<liczby[0];
    else if ( x[1]==najmniejsza )cout<<endl<<"Liczba nablizsza sredniej to: "<<liczby[1];
    else if ( x[2]==najmniejsza )cout<<endl<<"Liczba nablizsza sredniej to: "<<liczby[2];
    else if ( x[3]==najmniejsza )cout<<endl<<"Liczba nablizsza sredniej to: "<<liczby[3];
    else if ( x[4]==najmniejsza )cout<<endl<<"Liczba nablizsza sredniej to: "<<liczby[4];


    return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 7 lipca 2015 przez John Doe Obywatel (1,720 p.)
edycja 7 lipca 2015 przez John Doe

Jak dla mnie Twój kod jest czytelny, aczkolwiek jest w nim trochę redundancji :) 

Np. można się pozbyć ostatnich linii warunkowych za pomocą dodatkowej zmiennej. Przy okazji będzie można sprawdzić czy nie ma liczb o identycznej odległości od średniej, jak ta wytypowana wcześniej (3 test).

Zmienna powinna przechowywać indeks liczby spełniającej warunek z poprzedniej pętli. 

Coś takiego: 

#include <iostream>
using namespace std;

float liczby[5],suma=0, srednia=0, x[5], najmniejsza;
int indeks;

int main()
{
    for(int i=0; i<5; i++)
    {
        cout<<"Podaj "<<i+1<<" liczbe: ";
        cin>>liczby[i];
        suma+=liczby[i];
    }
    srednia=suma/5;
    cout<<endl<<"Srednia wynosi: "<<srednia;


    for (int i=0; i<5; i++)
    {
       x[i]=(1-(liczby[i]/srednia));
       if (x[i]<0) x[i]=-x[i];
    }


    najmniejsza=x[0];
    indeks = 0;
    
    for (int i=0; i<5; i++)
        if (x[i+1] < najmniejsza) { najmniejsza=x[i+1]; indeks = i+1; }

    cout<<endl<<"Liczba najblizsza sredniej to: "<<liczby[indeks];

    for(int i=0; i<5; i++)
        if(i != indeks) if(liczby[i] == liczby[indeks]) cout<<","<<liczby[i];
   
    return 0;
}

Pozdrawiam :)

komentarz 8 lipca 2015 przez Bartos Użytkownik (610 p.)
edycja 8 lipca 2015 przez Bartos

Sprytny pomysł! :) Tylko coś nie działa z tym wypisywaniem kilku liczb, przynajmniej u mnie w kompilatorze.

/edit

W ostatniej pętli był zły warunek, powinno być:
if(i != indeks) if(x[i] == x[indeks]) cout<<","<<liczby[i];
i wszystko jest cacy. Dzięki za pomysł ;) Sam bym chyba na to nie wpadł.

/edit2

Jednak nie wszystko :D podczas testu 2 wypisuje "Liczba najblizsza sredniej to: 3, 3, 3"
Jeszcze to rozpracuję :)

komentarz 8 lipca 2015 przez John Doe Obywatel (1,720 p.)
edycja 8 lipca 2015 przez John Doe
Edit: Wydaje mi się, że powinienem obejrzeć ten film wcześniej, nim zacząłem Ci pomagać :D. Obejrzawszy go, teraz wiem jak wyglądają te testy, zmień więc warunek ostatniej pętli:

if(x[i] == x[indeks] && liczby[i] != liczby[indeks]) cout<<","<<liczby[i];

Pozdrawiam :)
komentarz 8 lipca 2015 przez Bartos Użytkownik (610 p.)
Działa, dzięki :)
komentarz 17 sierpnia 2015 przez frezer Nowicjusz (100 p.)
Witam, dzięki, że wrzuciliście tak świetnie rozwiązane te zadanie, ja jestem początkujący (wręcz raczkujacy) i się z tym męczyłem ze 2 godziny i ciągle jakiś błąd miałem. Ale jestem też ciekawski i jeśli ktoś z was ma chwile czasu to poprosiłbym o kod tudzież wskazówki jak zrobić, żeby w przypadku testu gdzie było 6,5 i 3,5 program wyświetlał mi te liczby w kolejności od najmniejszej do największej, a nie, że zaczyna od tej liczby, która była pierwsza podana.
komentarz 12 października 2015 przez Teagle Nowicjusz (210 p.)

Witam, a ja wymyśliłem coś takiego:

#include <iostream>
#include <math.h> // dla funckji double pow(double,double), ktora liczy potege
using namespace std;

double a,b,c,d,e,m,s;

int main()
{
    cout << "Podaj piec liczb oddzielonych spacja: ";
    cin>>a>>b>>c>>d>>e;

    s=(a+b+c+d+e)/5; // srednia

    m=a;

    if ( pow(b-s,2) <= pow(m-s,2) ) m=b; // czyli sprawdzam czy: (b-s)^2 <= (m-s)^2
    if ( pow(c-s,2) <= pow(m-s,2) ) m=c; // analogicznie jak wyżej
    if ( pow(d-s,2) <= pow(m-s,2) ) m=d; // jw
    if ( pow(e-s,2) <= pow(m-s,2) ) m=e; // jw

    cout << "Srednia podanych liczb: " << s << endl;;
    cout << "Najblizej sredniej jest: " << m;

    if( (m!=a) && (pow(a-s,2) == pow(m-s,2)) ) cout << " i " << a << endl; // w przypadku gdy a!=m i spelniony jest warunek, ze (a-s)^2 == (m-s)^2 to dopisz " i (liczba a)" 
    if( (m!=b) && (pow(b-s,2) == pow(m-s,2)) ) cout << " i " << a << endl; // analogicznie jak wyżęj
    if( (m!=c) && (pow(c-s,2) == pow(m-s,2)) ) cout << " i " << b << endl; // jw
    if( (m!=d) && (pow(d-s,2) == pow(m-s,2)) ) cout << " i " << c << endl; // jw
    if( (m!=e) && (pow(e-s,2) == pow(m-s,2)) ) cout << " i " << d << endl; // jw

    return 0;
}

Co myślicie? :)
Pozdrawiam!

komentarz 17 kwietnia 2016 przez beginner Nowicjusz (100 p.)
Hej!
Ja zrobilem podobnie jak kolega wyzej, tylko ze z jedna zmienna mniej :)
Ale gdyby nie jego pomysl to bym nigdy nie wpadl jak zrobic ostatni warunek:)




#include <iostream>
#include<cmath>

float liczby[5],x,suma,srednia;
int m;
using namespace std;

int main()
{
       cout<<"Podaj 5 liczb :"<<endl;

        for(int i=0;i<5;i++)
        {
            cin >> liczby [i];
            suma+= liczby[i];
        }
        srednia = suma/5;
        cout <<endl<<"Srednia = "<<srednia<<endl;

        x=(fabs(srednia-liczby[0]));
        m=0;
        for (int i=0;i<5;i++)
        if ((fabs(srednia-liczby[i+1]))<x) {x=fabs(srednia-liczby[i+1]);m=i+1;}

        cout <<"Najblizej sredniej jest liczba :"<<liczby[m];

        for (int i=0;i<5;i++)
        if(((fabs(srednia-liczby[i]))==fabs(srednia-liczby[m]))&& liczby[i]!=liczby[m]){cout<<" i "<<liczby[i];}

        return 0;
}

 

Podobne pytania

0 głosów
2 odpowiedzi 622 wizyt
pytanie zadane 15 listopada 2015 w C i C++ przez Zangariev Początkujący (290 p.)
0 głosów
4 odpowiedzi 399 wizyt
pytanie zadane 9 grudnia 2015 w C i C++ przez baqazan Nowicjusz (230 p.)
–3 głosów
2 odpowiedzi 470 wizyt
pytanie zadane 1 marca 2016 w C i C++ przez Nowicjusz89 Obywatel (1,050 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 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!

...