📄 运算器.c
字号:
p1=a->ge;p2=b->ge;q1=res->ge;//指针初始化,指向个位
while(p1->next!=a->head&&p2->next!=b->head){//当原始数据指针下一位不为头结点时继续运算
p1=p1->next;p2=p2->next;//指针后移
q2=(PDuLNode)malloc(sizeof(DuLNode));//申请新的结点空间,初始化并插入链表中
q2->next=q1->next;q1->next->prior=q2;q2->prior=q1;q1->next=q2;
q2->data=p1->data+p2->data*t;//运算第一位之和或减,t同上
while(q2->data<0&&q2!=res->head) {q2->data+=10;q2=q2->prior;q2->data--;}//结果小于0时退位,直到首位
q2=q1->next;
while(q2->data>9&&q2!=res->head) {q2->prior->data+=q2->data/10;q2->data=q2->data%10;q2=q2->prior;}//结果大于9时进位,直到首位
if(q2==res->head&&q2->data>9)//当首位的值还大于9时,创建新的首位并进位
{
q=(PDuLNode)malloc(sizeof(DuLNode));
q->prior=q2->prior;q2->prior->next=q;q->next=q2;q2->prior=q;
q->data=q2->data/10;q2->data=q2->data%10;
res->head=res->head->prior;
}
q1=q1->next;//指针后移
}
p=(PDuLNode)malloc(sizeof(DuLNode));//此三名同整数部分
ph=(PDuLNode)malloc(sizeof(DuLNode));
p->next=ph;
if(p1->next!=a->head) {p=p1;ph=a->head;t2=1;}//当a中还有数据时,复制到res中,t2功能同上面的t,控制复制时是加还是减
if(p2->next!=b->head) {p=p2;ph=b->head;t2=t;}//当b中还有数据时,复制到res中
while(p->next!=ph){//具体的复制语句,各句功能与前面的雷同
p=p->next;//指针后移
q2=(PDuLNode)malloc(sizeof(DuLNode));
q2->next=q1->next;q1->next->prior=q2;q2->prior=q1;q1->next=q2;
q2->data=p->data*t2;
while(q2->data<0&&q2!=res->head) {q2->data+=10;q2->prior->data--;q2=q2->prior;}
q2=q1->next;
while(q2->data>9&&q2!=res->head) {q2->prior->data+=q2->data/10;q2->data=q2->data%10;q2=q2->prior;}
if(q2->data>9&&q2==res->head){
q=(PDuLNode)malloc(sizeof(DuLNode));
q->prior=q2->prior;q2->prior->next=q;q->next=q2;q2->prior=q;
q->data=q2->data/10;q2->data=q2->data%10;
res->head=res->head->prior;}//if
q1=q1->next;
}//while
if(res->head->data==-1)//此语句用于当所得结果的首位为-1时,对结果进行修正。结果首位为-1的来由及此函数的功能请参见报告
{
q1=res->head;res->head=q1->next;//头指针后移
q1->prior->next=q1->next;q1->next->prior=q1->prior;free(q1);//删除数值为-1的结点
q1=res->head;
q1->data=10-q1->data;q1=q1->next;//首位用10减
while(q1!=res->head){//以后第位用0减
q1->data=-q1->data;q2=q1->next;
while(q1->data<0){q1->data+=10;q1->prior->data--;q1=q1->prior;}
q1=q2;}//while
}//if
Adjust(res);//修正结果链表,去掉前后多余的0
return res;//返回结果链表头结点的地址
}
PDuLinkList Mul(PDuLinkList a,PDuLinkList b)
//乘法运算,返回a*b的值
{
int s,n,t1,t2;//s为每次两位相乘的积;t1、t2分别为了第一次能够进入循环,n为结果的小数位数
PDuLinkList res;//res同上一函数,为结果链表
PDuLNode p1,p2,q,q1,q2,qh;//p1,p2都为原始数据链表指针;q,q1,q2,qh都为结果链表指针
res=(PDuLinkList)malloc(sizeof(DuLinkList));//以下几行是为结果链表申请空间并初始化
q1=(PDuLNode)malloc(sizeof(DuLNode));
res->head=q1;res->ge=q1;res->n2=a->n2+b->n2;res->trag=a->trag*b->trag;//res->head初始指向结果链表的末位
q1->data=0;q1->next=q1;q1->prior=q1;
p2=b->head->prior;t2=0;qh=q1;
while (p2->next!=b->head||t2==0){//双重循环,用a中的每一位去乘b中的每一位,并存入结果链表中
t2=1;//首次进入循环后,t2赋值为1,使循环能够结束
q1=qh;p1=a->head->prior;t1=0;//res的指针初始化,使指向a的指针初始化,使指向末位,每次t1赋值为0使其进入一下循环
while(p1->next!=a->head||t1==0){
t1=1;
s=p1->data*p2->data;q1->data+=s;
q2=q1->prior;
if(q2==res->head){//当q2等于末位时,插入新的结点
q2=(PDuLNode)malloc(sizeof(DuLNode));q2->data=0;
q2->prior=q1->prior;q1->prior->next=q2;q2->next=q1;q1->prior=q2;}
while (q1->data>9&&q1->prior!=res->head){q1->prior->data+=q1->data/10;q1->data=q1->data%10;q1=q1->prior;}//结果大于9时进位,直到首位
if(q1->data>9&&q1->prior==res->head){//当首位的值还大于9时,创建新的首位并进位
q=(PDuLNode)malloc(sizeof(DuLNode));
q->prior=q1->prior;q1->prior->next=q;q->next=q1;q1->prior=q;
q->data=q1->data/10;q1->data=q1->data%10;}
q1=q2;p1=p1->prior;}//while
qh=qh->prior;p2=p2->prior;}//while
res->head=res->head->next;//res->head后移,使其指向结果链表的首位
n=res->n2;//以下几句为确定结果的个位所在结点
while(n>0) {res->ge=res->ge->prior;n--;}
Adjust(res);//修正结果链表,去掉前后多余的0
return res;//返回结果链表头结点的地址
}
void Perform()
//此函数为程序运行界面
{
printf("\n 加减乘运算器\n");
printf("***************************************\n");
printf(" 请选择数据输入、输出方式:\n");
printf("\n 1. 默认文件输入、输出\n");
printf(" 2. 自定文件输入、输出\n");
printf(" 3. 键盘屏幕输入、输出\n");
printf("***************************************\n");
printf("选 0 退出\n\n");
printf(">>>");
}
void main()
{
int choose=1,i;//choose用于控制用名选择的不同操作
char c;
char a[2]="a",b[2]="b",add[4]="add",sub[4]="sub",mul[4]="mul",txt[5]=".txt";//此两行定义的字符变量用于合成默认文件名
char name[11][3]={"0","1","2","3","4","5","6","7","8","9","10",};
char fname[10];//文件名
PDuLinkList num1,num2,sum,minus,product;
while (choose){//进入循环,当choose为0是退出
Perform();//输出运行界面
RE: scanf("%d",&choose);getchar();//读入用户选择运行不同的操作
if (choose==0) break;//当choose=0时退出
switch(choose){
case 1://当choose=1时
for (i=1;i<=10;i++){
strcat(strcat(strcpy(fname,a),name[i]),txt);num1=Inicreat(fname);//生成默认文件名,并输入数据
strcat(strcat(strcpy(fname,b),name[i]),txt);num2=Inicreat(fname);
sum=AddSub(num1,num2,1);minus=AddSub(num1,num2,-1);product=Mul(num1,num2);//加减乘运算
strcat(strcat(strcpy(fname,add),name[i]),txt);print(sum,fname);//生成默认文件名,并输出结
strcat(strcat(strcpy(fname,sub),name[i]),txt);print(minus,fname);
strcat(strcat(strcpy(fname,mul),name[i]),txt);print(product,fname);}
printf("\n\t计算完成,按ESC键退出,按其它任意键继续");//按ESC键退出
if(getch()==27) choose=0;
break;
case 2://当choose=2时
printf("\t请输入储存数据a的文件名:");scanf("%s",fname);num1=Inicreat(fname); //读入输入文件名,并输入数据
printf("\t请输入储存数据b的文件名:");scanf("%s",fname);num2=Inicreat(fname);
sum=AddSub(num1,num2,1);minus=AddSub(num1,num2,-1);product=Mul(num1,num2);//加减乘运算
printf("\t请输入储存和的文件名:");scanf("%s",fname);print(sum,fname);//读入输出文件名,并输出结果
printf("\t请输入储存差的文件名:");scanf("%s",fname);print(minus,fname);
printf("\t请输入储存积的文件名:");scanf("%s",fname);print(product,fname);
printf("\n\t计算完成,按ESC键退出,按其它任意键继续");//按ESC键退出
if(getch()==27) choose=0;
break;
case 3: //当choose=3时
printf("\t请输入第一个数据:");num1=Inicreat("\0"); //输入数据
printf("\t请输入第二个数据:");num2=Inicreat("\0");
sum=AddSub(num1,num2,1);minus=AddSub(num1,num2,-1);product=Mul(num1,num2);//加减乘运算
printf("\t两数之和为:");print(sum,"\0");//输出结果
printf("\t两数之差为:");print(minus,"\0");
printf("\t两数之积为:");print(product,"\0");
printf("\t如果需要把结果输出到指定文件请按 Y 键,不需要请按其它任意键\n");//按Y键储存结果
c=getch();
if(c=='Y'||c=='y'){
printf("\t请输入储存a的文件名:");scanf("%s",fname);print(num1,fname);
printf("\t请输入储存b的文件名:");scanf("%s",fname);print(num2,fname);
printf("\t请输入储存和的文件名:");scanf("%s",fname);print(sum,fname);//读入输出文件名,并输出结果
printf("\t请输入储存差的文件名:");scanf("%s",fname);print(minus,fname);
printf("\t请输入储存积的文件名:");scanf("%s",fname);print(product,fname);}
printf("\n\t计算完成,按ESC键退出,按其它任意键继续");//按ESC键退出
if(getch()==27) choose=0;
break;
default: printf("\t选择错误,请重新选择!\n\t>>>");goto RE;//当用户选择错误时,返回重新选择
}//switch
printf("\n\n\n\n\n");
}//while
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -