Leogict
(Kanaliaon)
2 Kwiecień 2009 20:22
#1
Program liczy 2 rodzaje średniej:
na 2 sposoby:
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.
nr47
(Sawyer47)
2 Kwiecień 2009 20:42
#2
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).
_alex
([alex])
2 Kwiecień 2009 20:50
#3
Wszystko zależy co znasz a czego jeszcze nie znasz
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)
Leogict
(Kanaliaon)
2 Kwiecień 2009 22:52
#4
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?
_alex
([alex])
3 Kwiecień 2009 03:52
#5
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’);
Leogict
(Kanaliaon)
3 Kwiecień 2009 07:54
#6
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;
}