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