Program znajdujący liczbę najbliższą średniej z 5-ciu podanych liczb - optymalizacja kodu

0

Witam wszystkich serdecznie. Zwracam się do bardziej doświadczonych osób ode mnie, a biorąc pod uwagę, że uczę się C++ stosunkowo krótko, to raczej nie będzie ciężko o sporą ilość takich osób :) Przerabiam aktualnie kurs, gdzie na końcu działu było zadanie domowe o treści:

Napisz program znajdujący liczbę najbliższą średniej z 5-ciu podanych liczb.
Program napisałem, ale strasznie dużo w nim chaosu i jeśli możecie troszkę pomóc co mógłbym poprawić, aby był bardziej czytelny, byłbym bardzo wdzięczny. Jednocześnie proszę o wyrozumiałość ze względu na małe doświadczenie w programowaniu. Może mało w nim profesjonalizmu, ale przynajmniej mam pewność i wewnętrzną radość, że sam napisałem :) Oto moje wypociny :

 #include <iostream>

using namespace std;

int main()
{
    float liczba[5];
    float wyniki[5];
    float suma=0,srednia,wynik;
    float najblizsza_1,najblizsza_2;
    int licznik=0;

    cout << "Podaj 5 liczb:" << endl;

    for (int i=0; i<5; i++)
    {
        cin >> liczba[i];
        suma += liczba[i];
    } // FOR

    srednia=suma/5;
    cout << "Srednia: " << srednia << endl;

    for (int k=0; k<5; k++)
    {
        wyniki[k]=liczba[k]-srednia;
        if (wyniki[k]<0)
            wyniki[k]=wyniki[k]*(-1);
        cout << wyniki[k] << endl;
    } // FOR

    najblizsza_1=liczba[0];
    wynik=wyniki[0];
    for (int j=0; j<4; j++)
    {
        if (wynik>wyniki[j+1])
        {
            wynik=wyniki[j+1];
            najblizsza_1=liczba[j+1];
        } // IF

        if ((wynik == wyniki[j+1]) && (najblizsza_1 != liczba[j+1]))
        {
                najblizsza_2=liczba[j+1];
                licznik++;
        } // IF
    } // FOR


    if(licznik==0)
    {
        cout << "Liczba najblizsza sredniej: " << najblizsza_1;
    } // IF
    else cout << "Liczby najblizsze sredniej: " << najblizsza_1 << " oraz " << najblizsza_2;

    return 0;
}
3

Jak ten kod powinien wyglądać?

int main(){
    float dane[5] = wczytajDane();
    float srednia = policzSrednia(dane);
    float najblizsza = wybierzNajblizsza(dane, srednia);
}

Czytelny? Jak dla mnie tak. Bo kod pisze sie dla ludzi do czytania a nie "żeby działał".

0

Na marginesie dorzucę link do przykładowego style guide:
https://google-styleguide.googlecode.com/svn/trunk/cppguide.html

Warto rzucić na ten (albo inny) okiem, szczególnie, że konkretne wybory są tam uzasadnione.

0

Jak zaznaczałem wcześniej jestem początkującą osobą, więc szczerze przyznam, że nie rozumiem za bardzo o czym piszecie w komentarzach ;/ Konstruktory, wielokrotne dziedziczenie, GSG są dla mnie terminami całkowicie obcymi na etapie mojej nauki o języku, więc w tym momencie nasuwa mi się pytanie, a mianowicie:
Czy warto pracować nad optymalizacją programu, czy póki co skupić się na dalszych lekcjach kursu i cieszyć się z faktu, że program po prostu działa? :)

1
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;

int main() {
	vector<double> nums = {1, 2, 4, 5};
	auto begin = ::begin(nums), end = ::end(nums);
	double average = accumulate(begin, end, 0)/nums.size();
	auto lower = lower_bound(begin, end, average);
	auto upper = upper_bound(begin, end, average);
	
	auto it_info = [&](auto it){
		return it!=end? to_string(*it) : "not avaiable";
	};
	
	cout << average << "|" << it_info(lower) << "|" << it_info(upper) << endl;
	return 0;
}
1

Szukanie elementu najbliższego średniej można przedstawić jako szukanie pierwszego elementu w ciągu posortowanym wg odległości od średniej.

Realizacja z użyciem lambda: http://stackoverflow.com/a/19608379

0
morti napisał(a):

Jak zaznaczałem wcześniej jestem początkującą osobą, więc szczerze przyznam, że nie rozumiem za bardzo o czym piszecie w komentarzach ;/ Konstruktory, wielokrotne dziedziczenie, GSG są dla mnie terminami całkowicie obcymi na etapie mojej nauki o języku, więc w tym momencie nasuwa mi się pytanie, a mianowicie:
Czy warto pracować nad optymalizacją programu, czy póki co skupić się na dalszych lekcjach kursu i cieszyć się z faktu, że program po prostu działa? :)

Nie ma przymusu przy nauce, możesz robić to co chcesz. (no chyba że to szkoła) Podczas nauki C++-sa możesz projektować różnego rodzaju programy jakie tylko zechcesz. Jednakże... Programowanie na poważnie zaczyna się wówczas, gdy znasz przynajmniej większość tych mechanizmów z C++-sa i zaczniesz tworzyć coś konkretnego - coś, co rzeczywiście może Ci się przydać. Pamiętaj, że dzisiaj efektywne programowanie w c++ to nie tylko podstawy samego czystego C++sa... to jest też często standardowa biblioteka C++, stardardy (np C++11), i biblioteki.. W zależności od potrzeb... różne.

2
morti napisał(a):

Czy warto pracować nad optymalizacją programu, czy póki co skupić się na dalszych lekcjach kursu i cieszyć się z faktu, że program po prostu działa? :)

Etapy są mniej więcej takie:

  1. zrób tak żeby działało
  2. chcesz to komuś pokazać (a) czy przyspieszyć (b)?
  3. Jeśli (a):
  4. formatujesz kod, patrz http://bit.ly/1fVy8sQ
  5. bierzesz jakiś C++ Coding Style i stosujesz do swojego programu.
  6. Przeszukujesz bibliotekę standardową w poszukiwaniu elementów które mógłbyś użyć.
  7. skok do (5)
  8. Jeśli (b) to optymalizujesz:
  9. Przepuszczasz program przez profiler.
  10. Próbujesz zoptymalizować elementy nie-algorytmiczne (np. przez zastosowanie lepszej struktury danych lub innej kolejności działań)
  11. Optymalizujesz algorytm(y)
  12. Sprawdzasz czy zastosowanie algorytmów z biblioteki standardowej poprawia wydajność, jeśli tak:
  13. Próbujesz poprawić swój algorytm lub
  14. Stosujesz algorytm z biblioteki standardowej
  15. Wyszukujesz w necie najszybszy znany algorytm do Twojego problemu i go implementujesz
  16. Testujesz wydajność. Oceniasz skalowalność (stopień złożoności obliczeniowej). Jeśli nie jest wystarczająca - skok do (b).

1 użytkowników online, w tym zalogowanych: 0, gości: 1