Титла: Въпрос за "малко" по-напреднали в ООП
Публикувано от: Proxain в May 16, 2011, 13:16
Здравейте, беше ми зададена следната задача(прилагам я с моето решение): /* Представяне на функционална зависимост между три реални числа имащи вида: F(X, Y, Z) = (X сигма1 Y) сигма2 (X сигма3 Z), където всчка от операциите сигма1, сигма2 и сигма3 е заместена със някое от математическите дейстшия събиране, изваждане, умножение, деление.
@Изготвил: Тодор Тодоров
*/
#include <iostream> using namespace std;
class mathFunc { // Създаване на клас mathFunc char SIGMA1, SIGMA2, SIGMA3; public: mathFunc() {}
void Read() { // Въвеждане на сигма1, сигма2, сигма3
cout<<"Vyvedete stoinosti za Sigma:\n"; cout<<"SIGMA1 = "; cin>>SIGMA1; cout<<"SIGMA2 = "; cin>>SIGMA2; cout<<"SIGMA3 = "; cin>>SIGMA3; }
double Sum(double x,double y, double z) { /* Използвайки сигма1. сигма2 сигма3 създаваме метод, чрез който да решим дадената функция */
double sum=0, sum1=0, sum2=0;
switch (SIGMA1) { //В sum1 се записва получената стойност на Х и У
case '+': sum1 = x+y; break; case '-': sum1 = x-y; break; case '*': sum1 = x*y; break; case '/': sum1 = x/y; break; default: sum1 = x*y; break; }
switch (SIGMA3) { //В sum2 се записва получената стойност на Х и Z
case '+': sum2 = x+z; break; case '-': sum2 = x-z; break; case '*': sum2 = x*z; break; case '/': sum2 = x/z; break; default: sum2 = x*z; break; }
switch (SIGMA2) { /* Тук се пресмятат междинните стойности получени в sum1 и sum2 и получаваме решение на функцията със зададените параметри */
case '+': sum = sum1+sum2; break; case '-': sum = sum1-sum2; break; case '*': sum = sum1*sum2; break; case '/': sum = sum1/sum2; break; default: sum = sum1*sum2; break; }
return sum; }
void Write (double x,double y, double z) { // Изход
cout<<"F("<<x<<", "<<y<<", "<<z<<") = ("<<x<<" "<<SIGMA1<<" "<<y<<") "<<SIGMA2<< " ("<<x<<" "<<SIGMA3<<" "<<z<<") = "<<Sum(x,y,z)<<endl; } };
int main () { double x,y,z; do { /* В цикъл до въвеждане на стойност единица за Z се въвеждат тройки стойности за X, Y, Z, както и сигма1, сигма2 и сигма3 */ cout<<"Vyvedete stoinosti za x, y, z: \n"; cout<<" X = "; cin>>x; cout<<" Y = "; cin>>y; cout<<" Z = "; cin>>z;
cout<<"F("<<x<<", "<<y<<", "<<z<<") = ("<<x<<" SIGMA1 "<<y <<") SIGMA2 ("<<x<<" SIGMA3 "<<z<<")\n"; mathFunc F1; F1.Read(); F1.Sum(x,y,z); F1.Write(x,y,z); } while (z != 1);
return 0;
}
Въпросът ми е следният. Някой може ли да ми каже има ли начин тези 3 switch case-a да могат да се заместят само с един или пък с отделен метод при използването на който да се извършва определеното аритметично действие за подадени x,y или x,z например.
Титла: Re: Въпрос за "малко" по-напреднали в ООП
Публикувано от: task_struct в May 16, 2011, 13:45
Здравей, има начин: за пример: double applySigma( char sigma, double arg1, double arg2 ) { double result = 0;
switch (sigma) { //В sum1 се записва получената стойност на Х и У
case '+': sum1 = x+y; break; case '-': sum1 = x-y; break; case '*': sum1 = x*y; break; case '/': sum1 = x/y; break; default: sum1 = x*y; break; }
return result; }
и тогава F(X, Y, Z) ще ти е: applySigma( sigma2 ,applySigma( sigma1, X, Y, ), applySigma( sigma3, X, Z ) ) т.е double Sum(double x,double y, double z) { return applySigma( SIGMA2 ,applySigma( SIGMA1, x, y, ), applySigma( SIGMA3, x, z ) ) }
|