程序的功能:设计一个简单的复数四则运算计算器,可以实现复数的加法减法和乘法运算,并可以在上一步运算结果的基础上进行进一步运算或退出本次运算。
输入的形式和输入值的范围:输入符合a+bi形式的复数(其中实部a与虚部b均为绝对值小于1000的int型整数),输入字符串选择运算方式(加、减、乘)。
输出的形式:符合a+bi形式的复数。
测试数据:包括一般复数和只有实部或虚部的复数,进行多步运算检验结果的正确性。
抽象数据类型的定义:采用链表数据结构存储输入的复数,其中数据域包括复数的实部和虚部。
主程序的流程以及各程序模块之间的调用关系:在开始界面选择进入计算后输入复数、运算符和另一个复数即可计算运算结果,一次运算结束后可选择在上一步结果的基础上进行进一步运算或者返回开始界面,可以在开始界面选择关闭计算器。在主函数中,选择开始运算时调用calculate函数,在calculate函数中用CreateList函数初始化链表并读入第一个复数,输入复数时调用getnum函数将其存放到链表中,调用plusnum函数minusnum函数和mutinum函数分别可以进行加减法和乘法运算,输出复数时调用printnum函数输出结果。
源代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int a;//实部
int b;//虚部
struct LNode*next;
}LNode,*LinkList;
LinkList *CreateList(LinkList*L)
{
int a,b;
LinkList r,s;
*L=(LinkList)malloc(sizeof(LNode));
r=*L;
printf("请输入前一复数的实部和虚部,用空格分隔:\n");
scanf("%d %d",&a,&b);
s=(LinkList)malloc(sizeof(LNode));
s->a=a;
s->b=b;
s->next=NULL;
r->next=s;
return L;
}
void getnum(LinkList*L){
LinkList r= *L;LinkList s;
int a,b;
while(r->next!=NULL)r=r->next;
printf("请输入下一复数的实部和虚部,用空格分隔:\n");
scanf("%d %d",&a,&b);
s=(LinkList)malloc(sizeof(LNode));
s->a=a;
s->b=b;
s->next=NULL;
r->next=s;
}
void printnum(LinkList L)//输出复数,即当前指针所指的结点
{
LinkList r=L;
while(r->next!=NULL)r=r->next;
if(r->a==0&&r->b!=0)printf("运算结果为%di\n",r->b);
if(r->a==0&&r->b==0)printf("运算结果为0\n");
if(r->a!=0&&r->b<0)printf("运算结果为%d%di\n",r->a,r->b);
if(r->a!=0&&r->b>0)printf("运算结果为%d+%di\n",r->a,r->b);
if(r->a!=0&&r->b==0)printf("运算结果为%d\n",r->a);
}
void releaseList(LinkList p)
{
if(NULL == p->next)
free(p);
else
{
releaseList(p->next);
free(p);
}
}//释放空间
void plusnum(LinkList *L){
LinkList p=*L,s;
int suma=0,sumb=0;
if(!p||!p->next)
{
printf("wrong!");
}
while(p->next->next!=NULL)
{
p=p->next;
}
suma+=p->a;
sumb+=p->b;
p=p->next;
suma+=p->a;
sumb+=p->b;
s=(LinkList)malloc(sizeof(LNode));
s->a=suma;
s->b=sumb;
s->next=NULL;
p->next=s;
}//加法运算
void minusnum(LinkList *L){
LinkList p=*L,s;
int suma,sumb;
if(!p||!p->next)
{
printf("wrong!");
}
while(p->next->next!=NULL)
{
p=p->next;
}
suma=p->a;
sumb=p->b;
p=p->next;
suma-=p->a;
sumb-=p->b;
s=(LinkList)malloc(sizeof(LNode));
s->a=suma;
s->b=sumb;
s->next=NULL;
p->next=s;
}//减法运算
void multinum(LinkList *L){
LinkList p=*L,s;
int suma,sumb,a,b;
if(!p||!p->next)
{
printf("wrong!");
}
while(p->next->next!=NULL)
{
p=p->next;
}
suma=p->a;
sumb=p->b;
p=p->next;
a=p->a;
b=p->b;
int t=suma;
suma=suma*a-sumb*b;
sumb=t*b+sumb*a;
s=(LinkList)malloc(sizeof(LNode));
s->a=suma;
s->b=sumb;
s->next=NULL;
p->next=s;
}//乘法运算
void calculate(){
system("cls");
int b;
LinkList a;
a=*CreateList(&a);
getnum(&a);
printf("请输入你想进行的运算:\n");
char c;
scanf("%c",&c);
scanf("%c",&c);
switch(c){
case '+':plusnum(&a);break;
case '-':minusnum(&a);break;
case '*':multinum(&a);break;
default:break;
}
printnum(a);
printf("是否继续计算?\n");
printf(" 1.在该结果上继续计算\n");
printf(" 2.终止本次计算\n");
scanf("%d",&b);
while(b==1){getnum(&a);
printf("请输入你想进行的运算:\n");
scanf("%c",&c);//消去空格的影响
scanf("%c",&c);
switch(c){
case '+':plusnum(&a);break;
case '-':minusnum(&a);break;
case '*':multinum(&a);break;
default:break;
} printnum(a);
printf("是否继续计算?\n");
printf(" 1.在该结果上继续计算\n");
printf(" 2.终止本次计算\n");
scanf("%d",&b);
}
if(b==2){releaseList(a);printf("感谢使用");}
system("pause");
}
int main()
{
system("color F0");
while(1){ system("cls");
printf("\n\n\n\n");
printf(" ***********************************************\n");
printf(" ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^\n");
printf(" ***********************************************\n");
printf(" ____________________________________________ \n");
printf("┃ ┃\n");
printf("┃ 复数计算器 ┃\n");
printf("┃____________________________________________┃\n");
printf("***********************************************\n");
printf("***********************************************\n");
printf("** 1.进入计算 **\n");
printf("** 2.退出计算器 **\n");
printf("***********************************************\n");
printf("^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^\n");
printf("***********************************************\n");
printf(" 选择操作:");
int m;
scanf("%d",&m);
switch(m){
case 1:calculate();break;
case 2:{printf("感谢您的使用。");exit(0);break;}
default:break;}
}
return 0;}