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

Object Storage Arubacloud
0 głosów
285 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ź 376 wizyt
+1 głos
1 odpowiedź 262 wizyt
0 głosów
1 odpowiedź 478 wizyt

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!

...