• 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.

Aruba Cloud - Virtual Private Server VPS
+1 głos
1,248 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 688 wizyt
pytanie zadane 15 listopada 2015 w C i C++ przez Zangariev Początkujący (290 p.)
0 głosów
4 odpowiedzi 451 wizyt
pytanie zadane 9 grudnia 2015 w C i C++ przez baqazan Nowicjusz (230 p.)
–3 głosów
2 odpowiedzi 699 wizyt
pytanie zadane 1 marca 2016 w C i C++ przez Nowicjusz89 Obywatel (1,050 p.)

93,324 zapytań

142,323 odpowiedzi

322,389 komentarzy

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...