⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 运算器.c

📁 加减乘运算器,绝对完整,是初学者必不可少的编程内容
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -