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

Zadanie domowe z odcinka 11 kursu C++

0 głosów
463 wizyt
pytanie zadane 2 listopada 2015 w C i C++ przez Aleksandra Nowicjusz (140 p.)

Cześć, przerabiam własnie kurs C++ i dotarłam do zadania domowego w odcinku 11. Chciałam jednak sobie to nieco utrudnić więc zrobiłam nie dla 5 liczb tylko w tablicy żeby program działal zarówno dla 2 jak i 100 :)
Czy można ten kod jakoś jeszcze uprościć? Jakoś go zoptymalizować?

 

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

double srednia(int ile, double *tab)
{
	double suma=0;
	for (int i = 0; i<=ile; i++)
	{
		suma += tab[i];
		
	}
	double srednia = (suma / ile);
	return srednia;
}

int main()
{
	int ile;
	cout << " Ile elementow bedzie miala Twoja tablica?" << endl;
	cin >> ile;
	double *tablica = new double[ile];

	cout << "Podaj elementy tablicy:" << endl;
	for (int i = 0; i < ile; i++)
	{
		cin >> tablica[i];
	}

	double sr = srednia(ile, tablica);
	cout << "Srednia to: " << sr << endl;
	
	double m;
	double *wyniki = new double[ile];
	for (int i = 0;i < ile;i++)
	{
		wyniki[i] = abs(sr - tablica[i]);
	}
	cout << "Wyniki odejmowania liczby od sredniej: " << endl;
	for (int i = 0; i < ile; i++)
	{
		cout << i + 1 << ".     " << wyniki[i] << endl;
	}
	
	m = wyniki[0];
	for (int i = 0; i <= ile-1;i++)
	{
		
		if (wyniki[i] < m) m = wyniki[i];
			
	}
	for (int i = 0; i < ile; i++)
	{
		if (m == wyniki[i])  cout << "Liczba najblizej sredniej to: " << tablica[i] << endl;
	}



	delete[] tablica;
	delete[] wyniki;

	return 0;
}

 

4 odpowiedzi

0 głosów
odpowiedź 2 listopada 2015 przez Porcupine Nałogowiec (31,560 p.)
Hmmm, no niby możesz przy wczytywaniu liczby do tablicy od razu zliczać je do jakiejś sumy, którą potem użyjesz w funkcji średnia() zamiast liczyć tam w pętli jeszcze raz. To skróci trochę kod ale jednocześnie ucierpi trochę na czytelności więc tak jak jest, jest ok :)
0 głosów
odpowiedź 2 listopada 2015 przez Krawiec91 Pasjonat (19,600 p.)

Znalazłem jeden błąd w programie, a mianowicie w funkcji srednia() przy takim warunku pętli for do zmiennej suma zostanie dodany element znajdujący się poza tablicą.
 

    for (int i = 0; i<=ile; i++)
    {
        suma += tab[i];
         
    }

Możliwe, że przez przypadek ten błąd się wkradł, bo inne pętle są w porządku pod tym względem.
Tak poza tym, w zasadzie nie ma za bardzo z czego ten program odchudzić.

komentarz 2 listopada 2015 przez Aleksandra Nowicjusz (140 p.)
Hm... niby ma Pan rację ale jak odpalę program i podam 5 elementów każdy o wartości 2 to średnia nadal jest 2. Może dlatego nie zobaczyłam tego błędu.
komentarz 3 listopada 2015 przez Krawiec91 Pasjonat (19,600 p.)
Powiem tak, ten błąd znalazłem zanim ten kod u siebie skompilowałem. Program uruchomiłem i wszystko dobrze wygląda. Tylko dlatego dobrze działało, że jako szósty element do średniej brana była bardzo mała liczba (u mnie to było około 10^-9), więc dodanie praktycznie zera do sumy i podzielenie tego przez parametr ile, dawało i tak poprawny wynik.
0 głosów
odpowiedź 2 listopada 2015 przez furas Maniak (53,800 p.)

Jedyne co na pewno bym skrócił to poniższe

    double srednia = (suma / ile);
    return srednia;

Zamieniłbym to na 

    return suma / ile;

Ale nie powinno to mieć wpływu na szybkość.

0 głosów
odpowiedź 9 listopada 2015 przez frambooisier Nowicjusz (140 p.)

Yowink

może lepiej by było zredukować jedną pętlę, i wrzucić to do jednej, czyli zrobić z tego:

for (int i = 0;i < ile;i++)

    {

        wyniki[i] = abs(sr - tablica[i]);

    }

    cout << "Wyniki odejmowania liczby od sredniej: " << endl;

    for (int i = 0; i < ile; i++)

    {

        cout << i + 1 << ".     " << wyniki[i] << endl;

    }

     

 

TO:

 cout << "Wyniki odejmowania liczby od sredniej: " << endl;

for (int i = 0;i < ile;i++)

    {

        wyniki[i] = abs(sr - tablica[i]);

        cout << i + 1 << ".     " << wyniki[i] << endl;

    }

  

 

Podobne pytania

0 głosów
1 odpowiedź 557 wizyt
+1 głos
1 odpowiedź 518 wizyt
0 głosów
1 odpowiedź 777 wizyt

93,720 zapytań

142,635 odpowiedzi

323,264 komentarzy

63,267 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.

...