[C++] Średnia na 4 fronty

Program liczy 2 rodzaje średniej:

na 2 sposoby:

  • dla z góry określonej liczby elementów (podaje użytkownik z klawiatury);

  • dla liczby elementów takiej aż użytkownik nie naciśnie zera.

Zapętlone menu, 4 funkcje, wymuszenie dzielenia rzeczywistego, casting i parę innych bajerów.

Binary: http://odsiebie.com/pokaz/2034635—8d6d.html

Source:

#include 

#include 


using namespace std;


double srednia_harmoniczna_n(void);

double srednia_harmoniczna_zero(void);

double srednia_geometryczna_n(void);

double srednia_geometryczna_zero(void);


// ******************************************************

int main()

{

  int wybor,dalej;

  while(1)

  {

	  system("cls");

	  cout << "Wybierz jedna z czterech opcji: "

		   << "\n1. Srednia harmoniczna z n wyrazow"

		   << "\n2. Srednia harmoniczna liczona do czasu wprowadzenia 0"

		   << "\n3. Srednia geometryczna z n wyrazow"

		   << "\n4. Srednia geometryczna liczona do czasu wprowadzenia 0\n"

		   << "Twoj wybor: ";

	  cin >> wybor;

	  switch(wybor)

		{

			case 1:

			{

				cout << srednia_harmoniczna_n() << endl;

				break;

			}

			case 2:

			{

				cout << srednia_harmoniczna_zero() << endl;

				break;

			}

			case 3:

			{

				cout << srednia_geometryczna_n() << endl;

				break;

			}

			case 4:

			{

				cout << srednia_geometryczna_zero() << endl;

				break;

			}

		}

	 cout << "Czy chcesz dalej liczyc? Tak=1";

	 cin >> dalej;

	 if (dalej!=1) break;

	}

  return 0;

}

// *******************************************************


double srednia_harmoniczna_zero(void)

{

  int i=1;

  double wynik=0, liczba, liczba2=1, suma=0;

  while(liczba2!=0)

    {

      cout << "Podaj liczbe nr " << (i++) << ": ";

      cin >> liczba;

      liczba2=int(liczba);

      if(liczba)

		{

		  liczba=1./liczba;

		  suma=suma+liczba;

		}

    }

  cout << "Srednia z tych " << i-2 << " liczb wynosi: ";

  wynik=(i-2)/suma;

  return wynik;

}


// **********************************************************


double srednia_harmoniczna_n(void)

{

  int n;

  double wynik=0, liczba, suma=0;

  cout << "Z ilu liczb chcesz policzyc srednia harmoniczna: ";

  cin >> n;

  for(int i=0; i
    {

      cout << "Podaj liczbe nr " << i+1 << ": ";

      cin >> liczba;

      liczba=1./liczba;

      suma=suma+liczba;

    }

  cout << "Srednia z tych " << n << " liczb wynosi: ";

  wynik=n/suma;

  return wynik;

}

// **********************************************************


double srednia_geometryczna_n(void)

{

  int n;

  double wynik=0, liczba, iloczyn=1;

  cout << "Z ilu liczb chcesz policzyc srednia geometryczna: ";

  cin >> n;

  for(int i=0; i
    {

      cout << "Podaj liczbe nr " << i+1 << ": ";

      cin >> liczba;

      iloczyn=iloczyn*liczba;

    }

  cout << "Srednia z tych " << n << " liczb wynosi: ";

  cout << pow(iloczyn,(1./n));

  return wynik;

}

// **********************************************************


double srednia_geometryczna_zero(void)

{

  int i=1;

  double wynik=0, liczba, liczba2=1, iloczyn=1;

  while(liczba2!=0)

    {

      cout << "Podaj liczbe nr " << (i++) << ": ";

      cin >> liczba;

      liczba2=int(liczba);

      if(liczba)

		{

		 iloczyn=iloczyn*liczba;

		}

    }

  cout << "Srednia z tych " << i-2 << " liczb wynosi: ";

  wynik=pow(iloczyn,(1./(i-2)));

  return wynik;

}

Proszę o komentarze, krytykę i wytknięcie błędów o ile zauważycie. :slight_smile:

W C++ do oznaczenia pustej listy parametrów raczej nie pisze się nic, natomiast w C jest to void. Choć może i tak być, chyba to nie narusza standardu.

Przede wszystkim funkcje nie powinny pobierać danych od użytkownika, jeżeli funkcja liczy średnią to ma liczyć średnią i nic więcej. No chyba, że nazwiesz je pobierz_dane_od_użytkownika_i_wylicz_z_nich_srednia, ale wg mnie lepszym pomysłem jest napisanie funkcji która liczy średnią, a osobno pobierać dane od użytkownika. To znakomicie zwiększa reusability (polski czasem nie jest zbyt elastyczny).

Wszystko zależy co znasz a czego jeszcze nie znasz :smiley:

Wprowadzenie tablic po podaniu ilości lub do wcześniej ustalonej liczby jest dosyć prymitywne, może użyj czegoś w rodzaju:

cout<<"Wprowadzenie ciągu liczb, wpisz znak '/' zamiast liczby aby zakonczyc"<<endl;unsigned N=0;true)

Aha i mam wątpliwość do tego kodu: jak dam w switchu default: continue, to mi zapętla w nieskończoność i pomimo cin >> wybor nie zatrzymuje się aby odczytać wartość z klawiatury. Dlaczego tak się dzieje?

Jeżeli dasz jakaś liczbę to default: continue zadziała, natomiast jak dasz literkę to cin ustawia sobie flag ios::bad i dalej odmawia współpracy dopóki tej flagi nie zdejmiesz:

Sprawdzanie czy jest ustawiony: if(cin.bad())

Sprawdzanie czy nie jest ustawiony: if(cin.good()) lub if(cin)

Likwidacja wszystkich flag: cin.clear();

Ale samej likwidacji flag będzie za mało bo w buforze klawiatury nadał tkwi ta literka.

Wyczyszczane buforu klawiatury: while(cin.get()!=’\n’); lub cin.ignore(IMT_MAX,’\n’);

Dzięki za uwagi. Ulepszona wersja:

#include 

#include 


using namespace std;


double srednia_harmoniczna_n(void);

double srednia_harmoniczna_zero(void);

double srednia_geometryczna_n(void);

double srednia_geometryczna_zero(void);


// ******************************************************

int main()

{

  int wybor,dalej;

  while(1)

  {				

	  system("cls");

	  cout << "Wybierz jedna z czterech opcji: "

		   << "\n1. Srednia harmoniczna z n wyrazow"

		   << "\n2. Srednia harmoniczna liczona do czasu wprowadzenia 0"

		   << "\n3. Srednia geometryczna z n wyrazow"

		   << "\n4. Srednia geometryczna liczona do czasu wprowadzenia 0\n"

		   << "Twoj wybor: ";

	  cin >> wybor;


	  switch(wybor)

		{

			case 1:

			{

				cout << srednia_harmoniczna_n() << endl;

				break;

			}

			case 2:

			{

				cout << srednia_harmoniczna_zero() << endl;

				break;

			}

			case 3:

			{

				cout << srednia_geometryczna_n() << endl;

				break;

			}

			case 4:

			{

				cout << srednia_geometryczna_zero() << endl;

				break;

			}

			default:

				{

					cin.clear();

					while(cin.get()!='\n'); 

					continue;

				}

		}


	 cout << "Czy chcesz dalej liczyc? (Tak=1): ";

	 cin >> dalej;

	 if (dalej!=1) break;

	}

  return 0;

}

// *******************************************************


double srednia_harmoniczna_zero(void)

{

  int i=1;

  double wynik=0, liczba, liczba2=1, suma=0;

  while(liczba2!=0)

    {

      cout << "Podaj liczbe nr " << (i++) << ": ";

      cin >> liczba;

      liczba2=int(liczba);

      if(liczba)

		{

		  liczba=1/liczba;

		  suma=suma+liczba;

		}

    }

  cout << "Srednia z tych " << i-2 << " liczb wynosi: ";

  wynik=(i-2)/suma;

  return wynik;

}


// **********************************************************


double srednia_harmoniczna_n(void)

{

  int n,m;

  double wynik=0, liczba, suma=0;

  cout << "Z ilu liczb chcesz policzyc srednia harmoniczna: ";

  cin >> n;

  m=n;

  for(int i=0; i
    {

      cout << "Podaj liczbe nr " << i+1 << ": ";

      cin >> liczba;

	  if(liczba)

		{

		  liczba=1/liczba;

		  suma=suma+liczba;

	    }

	  else

		{

		  m--;

		}

    }


  cout << "Srednia z tych " << n << " liczb wynosi: ";

  wynik=m/suma;

  return wynik;

}

// **********************************************************


double srednia_geometryczna_n(void)

{

  int n;

  double wynik=0, liczba, iloczyn=1;

  cout << "Z ilu liczb chcesz policzyc srednia geometryczna: ";

  cin >> n;

  for(int i=0; i
    {

      cout << "Podaj liczbe nr " << i+1 << ": ";

      cin >> liczba;

      iloczyn=iloczyn*liczba;

    }

  cout << "Srednia z tych " << n << " liczb wynosi: ";

  cout << pow(iloczyn,(1/n));

  return wynik;

}

// **********************************************************


double srednia_geometryczna_zero(void)

{

  int i=1;

  double wynik=0, liczba, liczba2=1, iloczyn=1;

  while(liczba2!=0)

    {

      cout << "Podaj liczbe nr " << (i++) << ": ";

      cin >> liczba;

      liczba2=int(liczba);

      if(liczba)

		{

		 iloczyn=iloczyn*liczba;

		}

    }

  cout << "Srednia z tych " << i-2 << " liczb wynosi: ";

  wynik=pow(iloczyn,(1./(i-2)));

  return wynik;

}