PDA

View Full Version : سوال: کلاس عملگر های اعداد مختلط



hossein2kk
دوشنبه 09 فروردین 1389, 22:14 عصر
وقت بخیر دوستان :چشمک:
این کلاس رو من نوشتم که میشه گفت حل یکی از تمرین های کتاب آقای قمی هست ، یک سری مشکل وجود داره که که هنوز نتونستم اونعا رو رفه کنم که گفتم از شما دوستان برای حل اون کمک بگیرم . کلاس اصلی من به شرح زیر هست :

# include <iostream.h>
# include <conio.h>
# include <stdio.h>
# include <string.h>

class complex {
float x1,x2,y1,y2;
char *answer;
char ope;
void sum();
void min();
void mul();
void div();
void core();
void read();
void again();
public:
complex ();
};
void main (){
complex obj ;
getch();
}
complex::complex(){
strcpy(answer,"yes");
core();
}

void complex::core(){
read();
while (1){
if(ope == '+'){
sum();
}else if (ope == '-') {
min();
}else if (ope == '*'){
mul();
}else if (ope == '/'){
div();
}else{
cout << "Invalid Entry." << endl;
break;
}
cout << "Your result is " << x1 << ((y1 > 0) ? "+" : "") << y1 << "i" << " (do you want to have a new operation on this result ? yes/no)" <<endl;
cin.get(answer,4);
cin.get();
if(!strcmp(answer,"yes")){
cout << "Enter your optional operation with "<< x1 << ((y1 > 0) ? "+" : "") << y1 << "i" << " (Example : *(4-6i) )" << endl;
scanf ("%c(%e%ei)",&ope,&x2,&y2);
continue;
}else{
break;
}
}
again();
}
void complex::sum(){
x1= x1+x2;
y1 = y1+y2;
}
void complex::min(){
x1=x1-x2;
y1=y1-y2;
}
void complex::mul(){
x1=(x1*x2)-(y1*y2);
y1=(x1*y2)+(x2*y1);
}
void complex::div(){
cout <<endl<< x1 << " " << y1 <<endl; ;
x1=(x1*x2+y1*y2)/(x2*x2+y2*y2);
y1=(y1*x2-y2*x1)/(x2*x2+y2*y2);
cout <<endl<< x1 << " " << y1 <<endl; ;
}
void complex::read(){
cout << "Enter your optional operation (Example : (2+3i)*(4-6i) )" << endl;
scanf ("(%e%ei)%c(%e%ei)",&x1,&y1,&ope,&x2,&y2);
}
void complex::again (){
cout << "Do you want to have a new operation with two new numbers ? yes/no" << endl;
cin.get(answer,4);
cin.get();
if (!strcmp(answer,"yes")){
core();
}
}اولین مشکل اینجاست که وقتی ما از حلقه while در تابع core بیرون میایم از ما سوال میشه که آیا می خواهیم دوباره اجرا کنیم عملیات ها رو یا نه(تابع again) ، که در این صورت تابع دوباره تابع core فراخوانی خواهد شد یا خیر . ولی مشکل اینجاست که وقتی دوباره به ابتدای تابع برمیگرده برنامه خط scanf از تابع read رو کاملا skip می کنه و به Invalid Entry میره .
دومین مشکل برنامه من اینه که اگه هیچ علامتی بین دو تا عدد موهومی نذارم می خوام عملیات ضرب انجام بشه مثلا (x+iy)(k+mi) .
سومین مشکلم اینه که قبل از i مقدار موهومی عدد مختلط هست رو بتونیم اگه هیچی وارد نکنیم 1 برای i و -1 برای -i در نظر بگیره ، مثلا x-i .
یه اشکال محاسباتی هم داره کلاس نمی دونم چرا . مثلا 1-2i ضرب در 3+1i باید بشه 5-5i ولی خروجی میده 5+1i . من چند بار الگوریتم رو چک کردم ولی نفهمیدم مشکل از کجاست.

پیشاپیش ممنون از توجهتون :لبخندساده:

hossein2kk
جمعه 13 فروردین 1389, 11:25 صبح
سلام دوستان
پس از مدت خیلی زیادی آخر با کمک دوست خوبم علی تونستیم مشکل اصلی برنامه رو حل کنیم . کافی بود :

scanf ("%c(%e%ei)",&ope,&x2,&y2);
رو به :

scanf (" %c(%e%ei)",&ope,&x2,&y2);
تغییر بدیم ( فقط اضافه کمردن یه اسپیس قبل از %c . حالا به نظرتون این دلیلش چی بوده ؟!
دو سوال قبلیمم هنوز سر جاشه :

دومین مشکل برنامه من اینه که اگه هیچ علامتی بین دو تا عدد موهومی نذارم می خوام عملیات ضرب انجام بشه مثلا (x+iy)(k+mi) .
سومین مشکلم اینه که قبل از i مقدار موهومی عدد مختلط هست رو بتونیم اگه هیچی وارد نکنیم 1 برای i و -1 برای -i در نظر بگیره ، مثلا x-i .
با تشکر پیشاپیش :چشمک:

hossein2kk
جمعه 13 فروردین 1389, 12:18 عصر
اون اشکال محاسباتی رو هم حل کردم ولی بازم دلیلش برام روشن نیست !
من این قسمت کد رو :

x1=(x1*x2)-(y1*y2);
y1=(x1*y2)+(x2*y1);رو به :

result_x=(x1*x2)-(y1*y2);
result_y=(x1*y2)+(x2*y1);
x1 = result_x;
y1 = result_y;تغییر دادم و کد محاسبه رو درست انجام داد !
د تست های مختلفی انجام دادم تا دلیل رو بفهمم ولی نفهمیدم مشکل کار از کجاست .
ممنون:چشمک: