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

Liczba najbardziej zbliżona do średniej. Ocena jakości kodu.

Object Storage Arubacloud
0 głosów
611 wizyt
pytanie zadane 4 lutego 2016 w C i C++ przez Tony Początkujący (360 p.)
edycja 4 lutego 2016 przez Tony

Jest to kod autorstwa mojego przyjaciela od programowania. Kod mi się bardzo podoba. Pytanie, czy jest tu co poprawiać? Co sądzicie Panowie?

#include <iostream>
#include <climits>
#include <math.h>
using namespace std;

float a, b, c, d, e;
float suma = 0, srednia = 0;
int main()
{
	cin >> a >> b >> c >> d >> e;
	suma = a + b + c + d + e;
	srednia = suma / 5;
	cout<<endl<<"Srednia: "<< srednia << endl;
/////////////////
    float tab[] = {a, b, c, d, e};
    float najblizsza_sredniej;
    float wartosc = INT_MAX;

    for(int i = 0; i < 5; i++)
    {
        float wyliczona_wartosc = fabs(tab[i] - srednia);
        if(wyliczona_wartosc < wartosc)
        {
            wartosc = wyliczona_wartosc;
            najblizsza_sredniej = tab[i];
        }
    }

    cout<<"Liczba najblizsza sredniej: "<< najblizsza_sredniej << endl;
    return 0;
}




 

3 odpowiedzi

+7 głosów
odpowiedź 4 lutego 2016 przez notabigthreat Mądrala (7,060 p.)
wybrane 6 lutego 2016 przez Tony
 
Najlepsza
#include <math.h>

W C++ używa się raczej <cmath>.

float a, b, c, d, e;
float suma = 0, srednia = 0;

Zmienne powyżej nie powinny być globalne. Lepiej zdefiniować je w mainie i jak najniżej w kodzie. a,b,c,d,e dobrze by było związać w tablicę.

cin >> a >> b >> c >> d >> e;

Użytkownik powinien być powiadomiony, co wpisać (chyba, że poprawność sprawdzać ma komputer). Powinna się tu znaleźć obsługa niepoprawnego wejścia. Kolejne nazwy zmiennych do zastąpienia kolejnymi indeksami tablicy, tak samo jak w:

suma = a + b + c + d + e;
srednia = suma / 5;

Za lepsze rozwiązanie uznałbym stałą reprezentującą ilość liczb, w tym przypadku równą 5. Podobnie z innymi wystąpieniami tej liczby.

cout<<endl<<"Srednia: "<< srednia << endl;

Spacje dookoła << albo stawiaj, albo nie. endl zastąpiłbym "\n".

/////////////////

Prawie jak na wystawie sztuki. Co to ma oznaczać?

float tab[] = {a, b, c, d, e};

Od początku można było je przechowywać w takiej postaci. Nazwa tab mało znaczy, to, że jest tablicą, można odczytać z kodu.

float wartosc = INT_MAX;

INT_MAX nie jest największą wartością float. Do rozważenia jest użycie nieskończoności.

for(int i = 0; i < 5; i++)
{
    float wyliczona_wartosc = fabs(tab[i] - srednia);
    if(wyliczona_wartosc < wartosc)
    {
        wartosc = wyliczona_wartosc;
        najblizsza_sredniej = tab[i];
    }
}

Cały ten fragment można zamienić na wywołanie gotowego algorytmu biblioteki standardowej.

return 0;

W najprostszych przypadkach (kiedy nie chcesz zwracać niczego prócz zera) można tego nie pisać.

komentarz 4 lutego 2016 przez Tony Początkujący (360 p.)
Doczepiłeś się do tak wielu kosmetycznych rzeczy, które nawet Pan Zelent zostawia w kodzie na tutorialach (np return 0). Jeżeli chodzi o obsługę niepoprawnego wejścia, nie potrafię tego zrobić. Komunikat o niepoprawnym cout i powtórne wprowadzenie danych rozumiem w pętli? Z tymi zmiennymi globalnymi myślę, że przesadzasz. Wkleiłeś mój kod po kawałkach. Jakbyś go widział w całości? Chętnie zobaczę ten kod w całości udoskonalony przez Ciebie.
Pozdrawiam.
komentarz 4 lutego 2016 przez event15 Szeryf (93,790 p.)
Tony, nie zachowuj się jak niewychowany burżuj.

Ktoś Ci powiedział jak kod ma wyglądać poprawnie. Jak to MZ tłumaczy - nie zwraca na to uwagi bo robi długie filmy i nie starczyłoby czasu. Poza tym MZ uczy starego C++, który jest z czasów kiedy ja byłem dzieckiem więc troche tej pokory miej i grzecznie się zastosuj do porad.
komentarz 4 lutego 2016 przez Tony Początkujący (360 p.)
W ktorym miejscu zachowalem sie niegrzecznie? Kod nie jest moj. Ja sie dopiero ucze. Mam prawo nie wiedziec i pytac. Piszesz tak jakbym sie wymądrzal.
komentarz 5 lutego 2016 przez notabigthreat Mądrala (7,060 p.)

Pomyłka z tym fdim (usunięte).

komentarz 5 lutego 2016 przez Tony Początkujący (360 p.)

A czy mógłbyś zamieścić chociaż kod do obsługi niepoprawnego wejścia?

W wyborze dwóch opcji(inny kod) działało. Myślę,że trochę przekombinowane. Jak by to było w przypadku tytułowego kodu? Tak,by po komunikacie o niepoprawnym wejściu okno się czyściło i program się wznawiał nie wyłączając?

 

            cout << "1. Start" << endl;
			cout << "2. Exit" << endl;
			cin >> choice1;
			if(choice1!=1 && choice1!=2)
			{

				cout << "It's not this number. " <<endl;
                cin.clear();
                string line;
                getline(cin, line);
                getchar();
				system("cls");
				continue;
			}
komentarz 5 lutego 2016 przez Tony Początkujący (360 p.)
Działa, dzięki!
komentarz 7 lutego 2016 przez Tony Początkujący (360 p.)

"Cały ten fragment można zamienić na wywołanie gotowego algorytmu biblioteki standardowej."  Jaki to algorytm?

komentarz 8 lutego 2016 przez notabigthreat Mądrala (7,060 p.)

min_element wywołany z własną "porównywarką", która stwierdza, która liczba jest bliższa średniej.

+1 głos
odpowiedź 4 lutego 2016 przez Avalon Obywatel (1,130 p.)
Po co te zmienne a1, b1 itd. ani razu ich nie używasz :)
komentarz 4 lutego 2016 przez Tony Początkujący (360 p.)
Zedytowałem.
0 głosów
odpowiedź 9 października 2020 przez kraZZeman Nowicjusz (140 p.)
Witam,

Fajny kod tylko że nie rozwiązuje przypadku szczególnego nr 3, tj. kiedy najbliżej średniej wypadają 2 liczby, które są po przeciwnej stronie osi średniej liczby. Przeszukuję w algorytmy w kierunku rozwiazania problemu z tym 3. przypadkiem ale nie mogę nigdzie znaleźć odpowiedzi jak napisać algorytm, który pokaże 2 liczby, które są najbliżej średniej (w tej samej odległości od niej, tylko że po przeciwnych stronach osi). Czy ktoś ma jakiś pomysł na to??

Podobne pytania

+1 głos
4 odpowiedzi 205 wizyt
pytanie zadane 27 stycznia 2016 w C i C++ przez Neko Użytkownik (780 p.)
0 głosów
2 odpowiedzi 504 wizyt
+1 głos
1 odpowiedź 338 wizyt
pytanie zadane 8 sierpnia 2016 w C i C++ przez Netreih Nowicjusz (130 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

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

...