##首先声明自定义函数
//实现复数的四则运算
double plural_addition(double,double); //复数加法
double plural_subtraction(double,double);//复数减法
double * plural_multiplication(double,double,double,double);//复数乘法
double * plural_algorithm(double,double,double,double);//复数除法
void plural_need(double *);//输入需要求的复数
//判断实部与虚部是否为零,是的话就不输出
void isPlural(double,double);
然后先实现输入复数的函数,我的设想是根据提示分别输入第一个复数的实部和虚部,然后在输入第二个复数的实部和虚部,
然后在让用户选择复数要进行的加减乘除
//输入需要求的复数
void plural_need(double * plural_ras)
{
register int i;
for(i = 0; i < 4; i++)
{
if(i == 0)
{
printf("plz input %d plural real pard:", i + 1);
}
else if(i == 1)
{
printf("plz input %d plural imaginary pard:", i);
}
else if(i == 2)
{
printf("plz input %d plural real pard:", i);
}
else if(i == 3)
{
printf("plz input %d plural imaginary pard:", i - 1);
}
scanf("%lf", plural_ras + i);
scanf("%*[^\n]");
scanf("%*c");
}
return plural_ras;
}
选择输入函数定义好了,我们在实现输出的自定义函数
判断好输出复数的格式
void isPlural(double num1,double num2)
{
printf("\n**********************************************\n");
printf("output after calculation plural:");
if(num1 != 0 || num2 == 0)
{
printf("%.2lf", num1);
}
if(num2 > 0)
{
if(num1 != 0)
{
printf("%c", '+');
}
printf("%.2lf%c", num2, 'i');
}
if(num2 < 0)
{
printf("%.2lf%c", num2, 'i');
}
printf("\n**********************************************\n");
return 0;
}
现在再来实现复数的加减乘除运算
加法
double plural_addition(double num1,double num2) //复数加法
{
return num1 + num2;
}
减法
double plural_subtraction(double num1,double num2) //复数减法
{
return num1 - num2;
}
乘法
分别输入2个复数的实部和虚部
假如有2个复数 a+bi ; c+di;
经过复数乘法运算后:复数=ac + adi + cbi - bd=ac - bd + (ad + bc)i;
所以复数的实部=ac - bd;
复数的虚部=ad + bc;
进行计算后返回复数的实部和虚部
// 实部 虚部 实部 虚部
double * plural_multiplication(double num1,double num2,double num3,double num4) //复数乘法
{
double * plural_ras = calloc(2, sizeof(double));//实部 虚部
*plural_ras = num1 * num3 - num2 * num4;//实部
*(plural_ras + 1) = num1 * num4 + num2 * num3;//实部
return plural_ras;
}
除法
除法建立在复数乘法的基础上,且输入的分母不能为零
假如有2个复数 a+bi ; c+di;(在这里默认第一个复数除以第二个复数)
除法运算 分子分母同时除以分母的共轭复数
即(a + bi)(c - di) / (c + di)(c - di)
直接调用我们自定义的复数乘法函数进行运算得到分子与分母
而分母=c^2 + d^2 一定为实数
double * plural_algorithm(double num1,double num2,double num3,double num4)//复数除法
{
register int i;
double * plural_ras = calloc(2 , sizeof(double));
double * x = NULL,* y = NULL; //引用2个指针来储存分子与分母的复数
x = plural_multiplication(num1,num2,num3,-num4);//记录分子的复数
y = plural_multiplication(num3,num4,num3,-num4);//记录分母的复数
*plural_ras = *x / *y; //复数实部
*(plural_ras + 1) = *(x + 1) / *y; //复数虚部
return plural_ras;
}
最后在是主函数
int main()
{
int i;
int choice; //用户的选择
int resurlt;
double plural_two[4];//复数的实部与虚部
double * x;
x = calloc(2, sizeof(double));
printf("\n\n**********************************************\n");
printf("这是复数运算程序,请按系统提示进行输入!!!\n");
printf("系统默认第一个复数%c %c %c %c第二个复数\n",'+','-','*','/');
printf("进行除法运算时第二个复数不能为零!!");
printf("\n**********************************************\n\n");
plural_need(plural_two);
fflush(stdin);
printf("\n**********************************************\n");
printf("1.%c\n", '+');
printf("2.%c\n", '-');
printf("3.%c\n", '*');
printf("4.%c\n", '/');
printf("5.leave this system\n");
printf("**********************************************\n");
printf("plz inptu number [1-4] plural need play algorithm:");
scanf("%d", &choice);
fflush(stdin);
switch(choice)
{
case 1://加法
*x = plural_addition(*plural_two ,*(plural_two + 2)); //将求出的实部存入x[0]
*(x + 1) = plural_addition(*(plural_two + 1),*(plural_two + 3));//将求出的虚部存入x[1]
isPlural(*x,*(x + 1));
break;
case 2://减法
*x = plural_subtraction(*plural_two ,*(plural_two + 2)); //将求出的实部存入x[0]
*(x + 1) = plural_subtraction(*(plural_two + 1),*(plural_two + 3));//将求出的虚部存入x[1]
isPlural(*x,*(x + 1));//输出复数
break;
case 3://乘法
x = plural_multiplication(*plural_two,*(plural_two + 1),*(plural_two +2),*(plural_two +3));
isPlural(*x,*(x + 1));//输出复数
break;
case 4://除法
x = plural_algorithm(*plural_two,*(plural_two + 1),*(plural_two +2),*(plural_two +3));
isPlural(*x,*(x + 1));
break;
default:
printf("Leaving the system!!!\n");
system("PAUSE");
}
printf("\n**********************************************");
printf("\nThank you for using this system!!\n");
printf("**********************************************\n");
return 0;
}
然后程序就结束了!!ヾ( ̄▽ ̄)ByeBye
后话,关于程序的改进
对于定义乘法与除法的函数,其实可以直接以录入复数的数组为自定义函数的参数,传入数组的指针,然后在进行操作,这样可以使程序运行效率更高,由于我开始只是初学自定义函数,对于概念没理解的那么清楚,所以把自定义函数的返回值定义为指针,还可以用一个大循环来增加复数输入时以及选择复数运算方法时的容错率,如果有非法输入的话使程序跳出或者使用户重新输入合法的选项。