Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: Proxain в May 16, 2011, 13:16



Титла: Въпрос за "малко" по-напреднали в ООП
Публикувано от: 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 ) )  }