【问题描述】
设计一个可进行复数运算的演示程序。
【基本要求】
实现下列六种基本运算:
-
由输入的实部和虚部生成一个复数;
-
两个复数求和;
-
两个复数求差;
-
两个复数求积;
-
从已知复数中分离出实部;
-
从已知复数中分离出虚部。
运算结果以相应的复数或实数的表示形式显示。
【测试数据】
对下列各对数据实现求和:
-
0 ; 0 ;应输出 “0”
-
3.1 , 0 ; 4.22 , 8.9 ;应输出 “7.32+i8.9”
-
-1.33 , 2.34 ; 0.1 , -6.5 ;应输出 “-1.23-i4.16”
-
0 , 9.7 ; -2.1 , -9.7 ;应输出 “-2.1”
-
7.7 , -8 ; -7.7 , 0 ;应输出 “-i8”
【实现提示】
定义复数为由两个相互之间存在次序关系的实数构成的抽象数据类型,则可以利用实数的操作来实现复数的操作。
【我的源码】
#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 100
typedef struct
{
double real;
double imag;
} Complex;
Complex InitComplex(double real, double imag)
{
Complex c;
c.real = real;
c.imag = imag;
return c;
}
Complex Add(Complex c1, Complex c2)
{
Complex c;
c.real = c1.real + c2.real;
c.imag = c1.imag + c2.imag;
return c;
}
Complex Subtract(Complex c1, Complex c2)
{
Complex c;
c.real = c1.real - c2.real;
c.imag = c1.imag - c2.imag;
return c;
}
Complex Multiply(Complex c1, Complex c2)
{
Complex c;
c.real = c1.real * c2.real - c1.imag * c2.imag;
c.imag = c1.real * c2.imag + c1.imag * c2.real;
return c;
}
double GetReal(Complex c)
{
return c.real;
}
double GetImag(Complex c)
{
return c.imag;
}
void Read(Complex *pc)
{
char a[MAXLINE];
int i, c;
for (i = 0; (c = getchar()) != ',' && c != ';'; i++)
a[i] = c;
a[i] = '/0';
pc->real = atof(a);
if (c == ';')
{
pc->imag = 0;
return;
}
for (i = 0; (c = getchar()) != ';'; i++)
a[i] = c;
a[i] = '/0';
pc->imag = atof(a);
}
void Print(Complex c)
{
if (c.real != 0 && c.imag != 0)
{
printf("%g", c.real);
if (c.imag > 0)
printf("+i%g", c.imag);
else
printf("-i%g", -c.imag);
}
else if (c.real == 0 && c.imag != 0)
{
if (c.imag > 0)
printf("i%g", c.imag);
else
printf("-i%g", -c.imag);
}
else
printf("%g", c.real);
}
main()
{
int c;
Complex c1, c2, result;
clrscr();
while (1)
{
printf("Select an operation (press 1, 2, 3 or 4):/n/n");
printf("--------------------------------------------/n/n");
printf("1. Add a complex to another/n/n");
printf("2. Subtract a complex from another/n/n");
printf("3. Multiply a complex to another/n/n");
printf("4. Quit/n/n");
printf("--------------------------------------------/n/n");
while ((c = getch()) != '1' && c != '2' && c != '3' && c != '4')
;
if (c == '4')
return;
printf("Input two complexes (e.g.: 1.3,2.4;6;):/n/n");
Read(&c1);
Read(&c2);
printf("/nThe result is:/t");
switch(c)
{
case '1':
result = Add(c1, c2);
break;
case '2':
result = Subtract(c1, c2);
break;
case '3':
result = Multiply(c1, c2);
break;
}
printf("/nThe real is:/t%g", GetReal(result));
printf("/nThe imag is:/t%g/n/n", GetImag(result));
}
}