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

📄 加减乘运算器3.c

📁 用双向链表实现任意位数的正负整数或小数的加法、减法和乘法运算以及对文件的相关操作。 文件说明: 给定的文件a*.txt为第一个数
💻 C
📖 第 1 页 / 共 2 页
字号:
		{
			q->prior->next=q->next;
			q->next->prior=q->prior;
			free(q);
			break;
		}
		if(q->data=='0')
		{
			L->end->prior=q->prior;
			q->prior->next=L->end;
			q=q->prior;
		}
		else
			break;
	}
}//cut_zero
/**************************************************************************************/
int judge(list *L)									/*判断L的数据是否是零的函数*/
{
	lnode *p;
	int a=0;
	for(p=L->head->next;p!=L->end;p=p->next)
	{
		if(p->data!='0')
		{
			a=1;
			break;
		}
	}
	if(a)
		return(1);
	else
		return(0);
}//judge
/****************************************************************************************/
void readdata(char filename[],list *L)			    /*从文件读取数据函数,并记录整数位,小数位个数*/
{
	FILE *fp;
	char c;
	int n=0;
	int m=1;
	L->intlength=0;
	L->floatlength=0;
	fp=fopen(filename,"r");
	while(!feof(fp))
	{
		c=fgetc(fp);
		if(c>='0'&&c<='9'||c=='.'||c=='-')		    /*读完最后一位还要向下读取一位,故要舍去*/
		{
			if(c=='.')							    /*小数点不读取*/
			{
				m=0;
				continue;
			}
			if(c=='-')						        /*遇到负号就插到表L前*/
			{
				head_insert(L,c);           
				continue;
			}
			if(m)   
			{
				end_insert(L,c);                    /*将数的各个位上的字符从后插入到表L中*/      
				L->intlength++;                     /*表中数的整数位长度增加*/
			}
			if(!m)                                  /*若遇到了小数点*/
			{
				end_insert(L,c);            
			    L->floatlength++;                   /*小数位的长度增加*/
			}
		}
		else
			break;
	}
	fclose(fp);
}//readdata
/**********************************************************************************************/
int fabs(list *L)					               /*取数的绝对值的函数*/
{
	lnode *p;
	p=L->head->next;
	if(p->data=='-')                               /*若表中数是个负数,则将带'-'号的结点删去*/
	{
		p=L->head->next;
		L->head->next=p->next;
		p->next->prior=L->head;
		p->next=p;
		p->prior=p;
		free(p);
		return(1);
	}
	else 
		return(0);
}//fabs
/**********************************************************************************************/
void writedata(char filename[],list *L)	          /*将结果写入文件的函数*/
{
	FILE *fp;

	char c;
	lnode *p;	
	fp=fopen(filename,"w");
	for(p=L->head->next;p!=L->end;p=p->next)
	{
		c=p->data;
		fputc(c,fp);
	}
	fclose(fp);
}//writedata
/*********************************************************************************************/
void main()
{
	list *L1,*L2,*L3;
	int sign1=0,sign2=0;
	int com;
	char filename1[10],filename2[10];                                           /*定义存储两个运算数据的文件*/
	char filename3[]="add.txt";                                                 /*定义文件名*/
	char filename4[]="sub.txt";
	char filename5[]="mult.txt";
	initlist(&L1);								                                /*第一个数据在表1*/
	initlist(&L2);								                                /*第二个数据在表2*/
	initlist(&L3);								                                /*运算结果存储在表3*/

	printf("input the first file's name\n");
	gets(filename1);
	printf("input the second file's name\n");
	gets(filename2);
	readdata(filename1,L1);						                                /*将第一个数据保存在L1中*/
	readdata(filename2,L2);						                                /*将第二个数据保存在L2中*/
	sign1=fabs(L1);							                                    /*取L1的绝对值,并判断正负*/
	sign2=fabs(L2);						                                    	/*取L2的绝对值,并判断正负*/
	com=compare(L1,L2);						                                	/*比较表L1、表L2中数据的绝对值大小*/

	if(sign1==0&&sign2==0)/*表L1、表L2中数都是正数时*/

	{
		if(judge(L1)&&judge(L2))                                                /*若运算的两个数据均不为零*/
		{
			mult(L1,L2,&L3);                                                    /*进行乘法运算*/
			add_point(L3,(L1->floatlength+L2->floatlength));                    /*所得运算结果的小数位长度是两个运算数据的小数位长度之和*/
			cut_zero(L3);                                                       /*去掉运算结果中的多余的零*/
		}
		else                                                                    /*若运算的两个数据中至少有一个为零*/
			head_insert(L3,'0');                                                /*则所得的运算结果就是零*/
		writedata(filename5,L3);                                                /*将乘法运算的结果放到文件5中*/
		clean(L3);
		add_zero(L1,L2);                                                        /*补零,使运算的两个数的整数位和小数位长度相同*/
		add(&L1,&L2,L3);                                                        /*对两个数进行加法运算,并将运算结果存储到表3中*/
		add_point(L3,L1->floatlength);                                          /*所得运算结果的小数位长度与进行运算的两个数的小数位长度相同*/
		cut_zero(L3);                                                           /*去掉所得结果中多余的零*/
		writedata(filename3,L3);                                                /*将加法运算后的结果放到文件3中*/
		clean(L3);
		if(com!=2)                                                              /*若两个运算数的大小不相等*/
		{
			sub(L1,L2,L3);                                                      /*对两个数进行减法运算*/
			if(com==3)                                                          /*若前一个数小于后一个数*/
				head_insert(L3,'-');                                            /*由于在做减法运算的函数中保证大数减小数,所以此处要在结果前加负号*/
			add_point(L3,L1->floatlength);                                      /*所得运算结果的小数位长度与进行运算的两个数的小数位长度相同*/
			cut_zero(L3);                                                       /*去掉所得结果中多余的零*/
		}
		else                                                                    /*若两个运算数的大小相等*/
			head_insert(L3,'0');                                                /*则做减法运算后结果就是零*/
		writedata(filename4,L3);                                                /*将减法运算后的结果放入文件4中*/
		clean(L3);
		
	}

	if(sign1==1&&sign2==1)/*若表L1,表L2中的数都是负数*/

	{
		if(judge(L1)&&judge(L2))                                                /*若运算的两个数据均不为零*/
		{
			mult(L1,L2,&L3);                                                    /*进行乘法运算*/
			add_point(L3,(L1->floatlength+L2->floatlength));                    /*所得运算结果的小数位长度是两个运算数据的小数位长度之和*/
			cut_zero(L3);                                                       /*去掉运算结果中的多余的零*/
		}
		else                                                                    /*若运算的两个数据中至少有一个为零*/
			head_insert(L3,'0');                                                /*则所得的运算结果就是零*/
		writedata(filename5,L3);                                                /*将乘法运算结果放到文件5中*/
		clean(L3);
		add_zero(L1,L2);                                                        /*补零,使运算的两个数的整数位和小数位长度相同*/
		add(&L1,&L2,L3);                                                        /*对两个数进行加法运算,并将运算结果存储到表3中*/
		add_point(L3,L1->floatlength);                                          /*所得运算结果的小数位长度与进行运算的两个数的小数位长度相同*/
		cut_zero(L3);                                                           /*去掉所得结果中多余的零*/
		head_insert(L3,'-');                                                    /*在运算结果前加一个负号*/
		writedata(filename3,L3);                                                /*将加法运算结果放入文件3*/
		clean(L3);
		if(com!=2)                                                              /*若两个运算数的大小不相等*/
		{
			sub(L1,L2,L3);                                                      /*对两个数进行减法运算*/
			add_point(L3,(L1->floatlength,L2->floatlength));
			cut_zero(L3);                                                       /*去掉所得结果中多余的零*/
			if(com==1)                                                          /*去了负号后,若前一个数大于后一个数*/
				head_insert(L3,'-');                                            /*在结果前加一个负号*/
		}
		else                                                                    /*若两个运算数的大小相等*/
			head_insert(L3,'0');                                                /*则减法运算后结果就是零*/
		writedata(filename4,L3);                                                /*将减法运算结果放入文件4*/
		clean(L3);
	}

	if(sign1==0&&sign2==1)/*表L1中数为正,表L2中数为负*/

	{
		
		if(judge(L1)&&judge(L2))                                               /*若运算的两个数据均不为零*/
		{
			mult(L1,L2,&L3);                                                   /*进行乘法运算*/
			add_point(L3,(L1->floatlength+L2->floatlength));
			cut_zero(L3);                                                      /*去掉运算结果中多余的零*/
			head_insert(L3,'-');                                               /*由于是除去符号进行的运算,所以运算后要将负号加上*/
		}
		else                                                                   /*若运算的两个数据中至少有一个为零*/                                 
			head_insert(L3,'0');                                               /*则所得的运算结果就是零*/
		writedata(filename5,L3);                                               /*将乘法运算结果放入文件5*/
		clean(L3);
		add_zero(L1,L2);                                                       /*补零,使运算的两个数的整数位和小数位长度相同*/
		if(com!=2)                                                             /*若两个运算数的大小不相等*/
		{
			sub(L1,L2,L3);                                                     /*对两个数进行减法运算*/
			add_point(L3,L1->floatlength);
			cut_zero(L3);
			if(com==3)                                                         /*去掉负号后的前一个数小于后一个数*/
				head_insert(L3,'-');                                           /*在结果前加负号*/
		}
		else                                                                   /*若两个运算数的大小相等*/
			head_insert(L3,'0');                                               /*则减法运算后结果就是零*/
		writedata(filename4,L3);                                               /*将减法运算结果放入文件4*/
		clean(L3);
		add(&L1,&L2,L3);                                                       /*对两个数进行加法运算,并将运算结果存储到表3中*/
		add_point(L3,L1->floatlength);
		cut_zero(L3);                                                          /*去掉所得结果中多余的零*/
		writedata(filename3,L3);                                               /*将加法运算结果放入文件3*/
		clean(L3);
	}

	if(sign1==1&&sign2==0)/*表L1中数为负,表L2中数为正*/

	{
		if(judge(L1)&&judge(L2))                                               /*若运算的两个数据均不为零*/
		{
			mult(L1,L2,&L3);                                                   /*进行乘法运算*/
			add_point(L3,(L1->floatlength+L2->floatlength));
			cut_zero(L3);                                                      /*去掉运算结果中多余的零*/
			head_insert(L3,'-');
		}
		else                                                                   /*若运算的两个数据中至少有一个为零*/
			head_insert(L3,'0');                                               /*则所得的运算结果就是零*/
		writedata(filename5,L3);                                               /*将乘法运算结果放入文件5*/
		clean(L3);
		add_zero(L1,L2);                                                       /*补零,使运算的两个数的整数位和小数位长度相同*/
		if(com!=2)                                                             /*若两个运算数的大小不相等*/
		{
			sub(L1,L2,L3);                                                     /*对两个数进行减法运算*/
			add_point(L3,L1->floatlength);
			cut_zero(L3);                                                      /*去掉所得结果中多余的零*/
			if(com==1)                                                         /*若前一个数大于后一个数*/
				head_insert(L3,'-');
		}
		else                                                                   /*若两个运算数的大小相等*/
			head_insert(L3,'0');                                               /*则减法运算后结果就是零*/
		writedata(filename4,L3);                                               /*将减法运算结果放入文件4*/
		clean(L3);
		add(&L1,&L2,L3);                                                       /*对两个数进行加法运算,并将运算结果存储到表3中*/
		add_point(L3,L1->floatlength);
		cut_zero(L3);
		head_insert(L3,'-');
		writedata(filename3,L3);                                               /*将加法运算结果放入文件3*/
		clean(L3);
	}
	printf("The result of add is in the file of 'add.txt'\n");
    printf("The result of sub is in the file of 'sub.txt'\n");
	printf("The result of mult is in the file of 'mult.txt'\n");
}//main

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -