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

C++, Odcinek 11, zadanie domowe, kod do oceny.

+1 głos
968 wizyt
pytanie zadane 14 kwietnia 2016 w C i C++ przez Marcin Soczówka Użytkownik (590 p.)
edycja 14 kwietnia 2016 przez Marcin Soczówka

Witam wszystkich!

Uczę się C++ z tutoriali Pana Mirosława Zelenta. Na koniec filmu 11 było zadanie domowe o następującej treści:
"Napisz program który wczyta od użytkownika pięć liczb z przecinkiem, po czym wypisze na ekranie tę liczbę, która ma wartość najbardziej zbliżoną do średniej z wszystkich pięciu liczb. Można też pokazać ile ta średnia wynosi."

Program napisałem tak żeby użytkownik mógł wczytać dowolną ilość liczb.

W tym miejscu proszę bardziej doświadczone osoby o krytykę czyli co można było zrobić lepiej. Z góry dziękuje za poświęcony czas.

 

Kod będę się starał ciągle ulepszać dlatego może być nieaktualny do starszych komentarzy:P.

 

#include <iostream>
#include <cmath>

using namespace std;

float average(float *arr, int how_many);

int how_many;
int main()
{

    float calculated_average, close_calculated_average, special_close_calculated_average; //sometimes we have 2 numbers close to average, for example: average=4,
//close_calculated_average=2, special_close_calculated_average=6.


    cout << "Z ilu liczb liczymy srednia?" << '\n';
    cin >> how_many;


    float *array_;
    array_ = new float [how_many];

    for (int i=0; i<how_many; i++)
        {
            cout << "Wprowadz " << i+1 << " liczbe: ";
            cin >> *(array_+i);
        }

    calculated_average = average (array_, how_many);

    close_calculated_average = *array_;

    for (int i=0; i <=how_many; i++)
        {
            if ((fabs(calculated_average - close_calculated_average)) > (fabs(calculated_average - *array_)))
                {
                    close_calculated_average = *array_;
                }


             if ((fabs(calculated_average - close_calculated_average))==(fabs(calculated_average - *array_)))
                    {
                        special_close_calculated_average = *array_;
                    }

            array_++;
        }


    if (special_close_calculated_average!=close_calculated_average)
        {
            cout << '\n' << "Srednia= " << calculated_average << '\n';
            cout << "Liczby najblizej sredniej to " << close_calculated_average << " i " << special_close_calculated_average;
        }

    else
        {
            cout << '\n' << "Srednia= " << calculated_average << '\n';
            cout << "Liczba najblizej sredniej to " << close_calculated_average;
        }

    delete [] array_;

    return 0;

}

float average(float *arr, int how_many)
{
    float sum = 0;
    for (int i=0; i<how_many; i++)
        {
            sum+=*arr;
            arr++;
        }
    return sum/how_many;
}

1 odpowiedź

+1 głos
odpowiedź 14 kwietnia 2016 przez Sedi Stary wyjadacz (10,200 p.)
edycja 14 kwietnia 2016 przez Sedi

Fajnie, że się rozwijasz. Nie podoba mnie się:

  1. Mieszanie nazw polskich z angielskimi
  2. Nazywanie zmiennych bez tego co robią. Co u Ciebie robi m i z ?
  3. cin >> *(tablica+i);

    Czytelniejsze od tego jest:

  4. std::cin>>tablica[i];
  5. Fajnie, że zrobiłeś osobną, uniwersalną funkcję do liczenia średniej.

  6.  tablica++;

    Nie skacz tak jak powyżej wskaźnikiem. Łatwo możesz wyjść poza adres i zaczną się kłopoty

  7. Zamiast endl, proponowałbym '\n'. Nie potrzebujesz tutaj endl.

  8. delete [] tablica; <- To jest bardzo ważna rzecz, ALE wystarczy chwila nieuwagi i gdy skaczesz tablica++, zamiast za pomocą zwykłej zmiennej, delete [] tablica może Ci cały program wywalić ;] Dlaczego ? Najkrócej mówiąc delete powinien otrzymać to co zaalokował new, a u Ciebie jest to zmieniane za pomocą tablica++;

W razie czego nie analizowałem dokładnie kodu, więc napisałem tylko kilka spostrzeżeń. Na pewno da się to napisać prościej. Np. sortujesz tablicę, bierzesz środkowy i sprawdzasz lewy i prawy od niego i voila, gotowe. Masz najbliższą średniej

komentarz 14 kwietnia 2016 przez Marcin Soczówka Użytkownik (590 p.)
edycja 14 kwietnia 2016 przez Marcin Soczówka

1. Jak wpisałem array to podświetliło się na zielono i nie chciało działać:P. Zaraz to naprawię.

2. m przyjmuje z automatu pierwszą wartość w tablicy. Potem ta wartość może ulec zmianie jeśli kolejna liczba z tablicy jest bliżej średniej.

z jest potrzebne w przypadku gdy od średniej najbliżej znajdują się dwie liczby. 

3. Czytelniejsze jest std::cin>>tablica[i]; ale przez wskaźnik program jest chyba szybszy?

delete [] tablica; <- To jest bardzo ważna rzecz, ALE wystarczy chwila nieuwagi i gdy skaczesz tablica++, zamiast za pomocą zwykłej zmiennej, delete [] tablica może Ci cały program wywalić ;] Dlaczego ? Najkrócej mówiąc delete powinien otrzymać to co zaalokował new, a u Ciebie jest to zmieniane za pomocą tablica++;

8. Sądziłem, że za pomocą tablica++; jest zmieniany tylko adres tego na co pokazuje wskaźnik. Wiem, że gdy używam pętli i mam zapis tablica++; to po wyjściu z pętli będzie on wskazywał na pierwszy adres za tablicą. Dlatego wcześniej używałem zapisu (tablica +i); bo wtedy adres pozostaje na pierwszym elemencie tablicy.

 

Program napisałem z tego co się do tej pory nauczyłem a tam nie było jeszcze np sortowania i wartości bezwzględnej której notabene musiałem się z googla nauczyć:]. Bardziej chodzi mi o to czy mając dostępne środki można to zrobić lepiej:P. 

 

 

 

komentarz 14 kwietnia 2016 przez Sedi Stary wyjadacz (10,200 p.)
Ładny kod :) Fajnie, że się rozwijasz :) Teraz pora iść spać :) -  Jeśli lubisz troszkę poczytać więcej na temat wskaźników, zapraszam :

http://forum.pasja-informatyki.pl/127590/cr-c-%2310-wskazniki-dynamiczne-alokowanie-pamieci

Pozdrawiam ;]
komentarz 14 kwietnia 2016 przez Marcin Soczówka Użytkownik (590 p.)
W sumie racja, trochę późno. Dzięki za link, dobranoc;].

Podobne pytania

0 głosów
1 odpowiedź 377 wizyt
pytanie zadane 7 października 2016 w Nasze projekty przez unbearable Początkujący (450 p.)
0 głosów
4 odpowiedzi 1,306 wizyt
pytanie zadane 20 marca 2016 w C i C++ przez Eliro Stary wyjadacz (12,160 p.)
+1 głos
1 odpowiedź 551 wizyt

93,742 zapytań

142,678 odpowiedzi

323,297 komentarzy

63,328 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...