编程计算器-表达式求值(浮点数、标识符的实现)-顺序表链表实现-同维度向量运算-C语言

#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct{
	int *elem;
	int length;
	int listsize;
}Sqlist;  //线性表的顺序表储存结构
typedef struct{
	double coef;
	int expn;
}term;   //一元多项式的每一项 
typedef struct LNode{
	term data;
	struct LNode *next;
}LNode,*LinkList; //线性表的链表储存结构 
typedef LinkList polynomail;
typedef struct{
	term* elem;
	int length;
	int listsize;
}Sq_p;   //建立多项式的顺序表 
typedef struct{
	char* base;
	char* top;
	int stacksize;
}SqStack1; 
typedef struct{
	double* base;
	double* top;
	int stacksize; 
}SqStack2;
void InitList_Sq(Sqlist &l){
	//构造一个空的线性表
	l.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int));
	if(!l.elem)
		exit(OVERFLOW);
	l.length=0;
	l.listsize=LIST_INIT_SIZE;
}
void InitList_P(Sq_p &l){
	l.elem=(term*)malloc(LIST_INIT_SIZE*sizeof(term));
	if(!l.elem)
		exit(OVERFLOW);
	l.length=0;
	l.listsize=LIST_INIT_SIZE;
}
void ClearList_Sq(Sqlist &l){  //清空一个线性表 
	l.length=0;
	l.listsize=LIST_INIT_SIZE;
}
void ClearList_P(Sq_p &l){  //清空一个线性表 
	l.length=0;
	l.listsize=LIST_INIT_SIZE;
}
int ListLength(Sqlist l){   //查看一个线性表的长度 
	if(!l.elem)
		exit(OVERFLOW);
	return l.length;
}
int ListLength_P(Sq_p l){   //查看一个线性表的长度 
	if(!l.elem)
		exit(OVERFLOW);
	return l.length;
}
void Show(Sqlist l){   //遍历 
	printf("("); 
	for(int i=0;i<l.length;i++){
		if(i<l.length-1)
			printf("%d,",l.elem[i]);
		else
			printf("%d)\n",l.elem[i]);
	}
}
int ListInsert_Sq(Sqlist &l,int i,int e){  //插入元素,成功返回1,不成功返回0 
	if(i<1||i>l.length+1)  //防御处理 
		return 0;
	if(l.length>=l.listsize){
		int* newbase=(int*)realloc(l.elem,(l.listsize+LISTINCREMENT)*sizeof(int));  //realloc申请更大的空间,同时释放原空间 
		if(!newbase)
			exit(OVERFLOW);
		l.elem=newbase;
		l.listsize=l.listsize+LISTINCREMENT;
	} 
	if(!l.length){
		l.elem[0]=e;
		l.length++;
	//	Show(l);
		return 1;
	}
	int* q=&(l.elem[i-1]);
	for(int* p=&(l.elem[l.length-1]);p>=q;--p)
		*(p+1)=*p;
	*q=e;
	++l.length;
	//printf("%d\n",l.length);
	//Show(l);
	return 1;
}
int ListInsert_P(Sq_p &l,int i,term e){  //插入多项式元素 
	if(i<1||i>l.length+1)  //防御处理 
		return 0;
	if(l.length>=l.listsize){
		term* newbase=(term*)realloc(l.elem,(l.listsize+LISTINCREMENT)*sizeof(term));  //realloc申请更大的空间,同时释放原空间 
		if(!newbase)
			exit(OVERFLOW);
		l.elem=newbase;
		l.listsize=l.listsize+LISTINCREMENT;
	} 
	if(!l.length){
		l.elem[0].coef=e.coef;
		l.elem[0].expn=e.expn;
		l.length++;
		return 1;
	}
	term* q=&(l.elem[i-1]);
	for(term* p=&(l.elem[l.length-1]);p>=q;--p)
		*(p+1)=*p;
	*q=e;
	++l.length;
	//printf("%d %lf\n",e.coef,e.expn);
	return 1;
}
int ListDelete(Sqlist &l,int i,int e){  //删除元素,成功返回1,不成功返回0 
	if(i<1||i>l.length)
		return 0;
	int* p=&(l.elem[i-1]);
	e=*p;
	int* q=l.elem+l.length-1;
	for(++p;p<=q;++p)   
		*(p-1)=*p;
	--l.length; 
}
int ListDelete_P(Sq_p &l,int i,term e){  //删除多项式元素,成功返回1,不成功返回0 
	if(i<1||i>l.length)
		return 0;
	term* p=&(l.elem[i-1]);
	e=*p;
	term* q=l.elem+l.length-1;
	for(++p;p<=q;++p)   
		*(p-1)=*p;
	--l.length; 
}
Sqlist add(Sqlist l1,Sqlist l2){  //线性表向量的加法运算 
	Sqlist l3;
	int e1,e2;
	InitList_Sq(l3);
	for(int i=0;i<l1.length;i++){
		ListInsert_Sq(l3,i+1,l1.elem[i]+l2.elem[i]);
	}
	return l3;
}
Sqlist sub(Sqlist l1,Sqlist l2){  //线性表向量的减法运算 
	Sqlist l3;
	int e1,e2;
	InitList_Sq(l3);
	for(int i=0;i<l1.length;i++)
		ListInsert_Sq(l3,i+1,l1.elem[i]-l2.elem[i]);
	return l3;
}
Sqlist multiply(Sqlist l1,Sqlist l2){  //线性表向量的数乘运算 
	Sqlist l3;
	int e1,e2;
	InitList_Sq(l3);
	for(int i=0;i<l1.length;i++)
		ListInsert_Sq(l3,i+1,l1.elem[i]*l2.elem[i]);
	return l3;
}
double cos_value(Sqlist l1,Sqlist l2){   //计算两个向量的夹角余弦值 
	double t1=0,t2=0,t3=0;
	for(int i=0;i<l1.length;i++){
		t1=t1+l1.elem[i]*l2.elem[i];
		t2=t2+l1.elem[i]*l1.elem[i];
		t3=t3+l2.elem[i]*l2.elem[i];
	}
	t2=sqrt(t2);
	t3=sqrt(t3);
	return t1/(t2*t3);    
} 
void Show_P(Sq_p l){   //显示出多项式 
	for(int i=0;i<l.length;i++){
		if(i<l.length-1){  //未到多项式最后一项 
			if(l.elem[i].expn){
				printf("%.2lfx^%d+",l.elem[i].coef,l.elem[i].expn);}
			else{
				printf("%.2lf+",l.elem[i].coef);
			} 
		}
		else{  //到了多项式最后一项 
			if(l.elem[i].coef){
				printf("%.2lfx^%d",l.elem[i].coef,l.elem[i].expn);}
			else
				printf("%.2lf",l.elem[i].coef);
			} 
		} 
	printf("\n");
} 
void Sort_P(Sq_p &l){   //对存放一元多项式的顺序表进行排序
	int min_e=999;
	int min_pos=-1;
	for(int i=0;i<l.length;i++){
		for(int j=i;j<l.length;j++){
			if(l.elem[j].expn<min_e){
				min_e=l.elem[j].expn;
				min_pos=j;
			}
		}  //此时已经找到了最小的次数 
		int cmp=l.elem[i].expn;
		double cmp1=l.elem[i].coef;
		l.elem[i].expn=min_e;
		l.elem[i].coef=l.elem[min_pos].coef;
		l.elem[min_pos].expn=cmp;
		l.elem[min_pos].coef=cmp1;   //交换排序主体 
		min_e=999;  //重置最小值 
	}
}
void Add_P(Sq_p l1,Sq_p l2){     //对两个多项式进行加法运算 
	Sq_p l3;
	InitList_P(l3);
	double coef=0;   
	int i=0,j=0,k=1;   //i,j指示目前进行运算的元素
						//k指示目前l3中元素进行的个数 
	while(i<l1.length&&j<l2.length){
		if(l1.elem[i].expn<l2.elem[j].expn) { //如果l1的次数小于l2次数 
			ListInsert_P(l3,k++,l1.elem[i]);   //在l3的第k(k=1)个元素之前插入元素,同时k++
			i++;		
		} 
		else if(l1.elem[i].expn>l2.elem[j].expn){
			ListInsert_P(l3,k++,l2.elem[i]);   //在l3的第k(k=1)个元素之前插入元素,同时k++
			j++;
		}
		else{
			term t1;
			t1.coef=l1.elem[i].coef+l2.elem[j].coef;
			t1.expn=l1.elem[i].expn;
			if(t1.coef){   //如果系数不为0,才把它放进去 
				ListInsert_P(l3,k++,t1);
				i++;
				j++;
			}
		}
}
	if(i>=l1.length){
		for(j;j<l2.length;j++){
			ListInsert_P(l3,j+1,l2.elem[i]);
		}
	}
	else{
		for(i;i<l1.length;i++){
			ListInsert_P(l3,i+1,l1.elem[i]);
		}
	}
	Show_P(l3); 
}
void Sub_P(Sq_p l1,Sq_p l2){     //对两个多项式进行减法运算 
	Sq_p l3;
	InitList_P(l3);
	double coef=0;   
	int i=0,j=0,k=1;   //i,j指示目前进行运算的元素
						//k指示目前l3中元素进行的个数 
	while(i<l1.length&&j<l2.length){
		if(l1.elem[i].expn<l2.elem[j].expn) { //如果l1的次数小于l2次数 
			ListInsert_P(l3,k++,l1.elem[i]);   //在l3的第k(k=1)个元素之前插入元素,同时k++
			i++;		
		} 
		else if(l1.elem[i].expn>l2.elem[j].expn){
			l2.elem[j].coef=-l2.elem[j].coef;   //相减后系数变为负数 
			ListInsert_P(l3,k++,l2.elem[i]);   //在l3的第k(k=1)个元素之前插入元素,同时k++
			j++;
		}
		else{
			term t1;
			t1.coef=l1.elem[i].coef-l2.elem[j].coef;
			t1.expn=l1.elem[i].expn;
			if(t1.coef){   //如果系数不为0,才把它放进去 
				ListInsert_P(l3,k++,t1);
				i++;
				j++;
			}
		}
	}
	if(i=l1.length){
		for(i;i<l2.length;i++){
			l2.elem[i].coef=-l2.elem[i].coef;
			ListInsert_P(l3,i,l2.elem[i]);
		}
	}
	else{
		for(i;i<l1.length;i++){
			ListInsert_P(l3,i,l1.elem[i]);
		}
	}
	Show_P(l3);
}
int Seek_P(term* a,int expn){  //若数组中存在指数为expn,则返回位置。否则返回第一个空位置
	int i=0;
	for(i=0;i<100;i++){
		if(a[i].expn==expn)   //找到指数,返回指数所在位置 
			return i;
		if(a[i].expn==0&&a[i].coef==0)  //找到了第一个空位还没有找到,跳出循环 
			break; 
	}
	return i;  //没有找到,返回下一个空闲值 
} 
void Multiply_P(Sq_p l1,Sq_p l2){  //两个多项式相乘 
	term a[100];
	term b;
	int expn=0;
	Sq_p l3;   
	InitList_P(l3);  //初始化一个多项式的顺序表 
	double coef; //临时储存指数和系数 
	for(int i=0;i<100;i++){
		a[i].coef=0;
		a[i].expn=0;
	} //将系数和指数清零
	for(int i=0;i<l1.length;i++){
		for(int j=0;j<l2.length;j++){
			expn=l1.elem[i].expn+l2.elem[j].expn;  //多项式相乘,指数相加
			coef=l1.elem[i].coef*l2.elem[j].coef;
			int t=Seek_P(a,expn);
			a[t].expn=expn;  
			a[t].coef=a[t].coef+coef;   
		}
	} 
	int j=1;
	for(int i=0;i<100;i++){
		if(a[i].coef){
			b.coef=a[i].coef;
			b.expn=a[i].expn;
			ListInsert_P(l3,j++,b);
		}
	}   //将所有系数非0的元素都插入顺序表中
	Sort_P(l3);
	Show_P(l3); 
} 
void Derivation_P(Sq_p l,int n){  //对一个多项式求n次导数
	term a[100];
	Sq_p l1;
	InitList_P(l1); 
	int expn=0;
	double coef=0;
	for(int i=0;i<100;i++){
		a[i].coef=0;
		a[i].expn=0;
	}
	if(n>l.elem[l.length-1].expn){//如果求导次数大于最高次数,则直接返回0
		printf("导数为0\n");
		return;
	} 
	for(int i=0;i<l.length;i++){
		if(l.elem[i].expn>=n){  //只有这种情况这一项的导数才不为0 
			expn=l.elem[i].expn;  //用于等会求系数的项 
			coef=l.elem[i].coef;
			for(int j=0;j<n;j++){
				coef=coef*expn;
				expn--;
			} //算出了求导后的系数值,此时需将次数值重置 
			expn=l.elem[i].expn-n;
			int t=Seek_P(a,expn);
			a[t].coef=coef;
			a[t].expn=expn;  //将新值放入数组中 
		}
	}
	for(int i=0;;i++){
		if(!a[i].coef)
			break;
		ListInsert_P(l1,i+1,a[i]);
	}
	Show_P(l1);	
	return;
}
void CreatePolyn(polynomail &P){//建立一元多项式的有序链表P 
	P=(polynomail)malloc(sizeof(LNode));
	P->next=NULL;
	/*printf("请按次数从大到小的顺序依次输入次数,系数\n");
	for(int i=0;i<m;i++){
		polynomail q=(polynomail)malloc(sizeof(LNode));
		scanf("%d %lf",&q->data.expn,&q->data.coef);//输入指数、系数
		q->next=P->next;
		P->next=q;   //头插入 
	} */
}
void PrintPolyn(polynomail P){  //打印一元多项式P 
	polynomail q=P->next;
	int j=1;
	while(q){
		if(q->data.coef>0&&j!=1)
			printf("+");
		if(q->data.expn&&q->data.coef)
			printf("%.3fx^%d",q->data.coef,q->data.expn);
		else if(q->data.expn==0&&q->data.coef)
			printf("%.3f",q->data.coef);  //若次数为0则不打印出x 
		q=q->next;
		j++; 
	} 
	printf("\n");	
}
void Sort_S(polynomail &P){  //对输进来的一元多项式按次数从小到大的顺序排列 
	int min=999;
	polynomail min_p=P; //指向最小元素的指针 
	polynomail q=P,p=P;
	if(!q->next->next)
		return;  
	while(q->next){
		min=q->next->data.expn;    
		p=q->next;
		while(p){
			if(p->data.expn<min){
				min=p->data.expn;
				min_p=p;
			}
			p=p->next;
		}
		if(q->next->data.expn>min){   //最小的元素不在当前位置的情况,需要交换 
			int cmp1=q->next->data.expn;
			double cmp2=q->next->data.coef; 
			q->next->data.coef=min_p->data.coef;
			q->next->data.expn=min_p->data.expn;
			min_p->data.expn=cmp1;
			min_p->data.coef=cmp2;
		}
		q=q->next;
		min=999;  //此处需要将min值恢复,否则会影响下一轮的判断 
	}
} 
int PolynLength(polynomail P){
	polynomail q=P;
	int j=0;
	while(q->next){
		q=q->next;
		j++;
	}
	return j;
}
void ListInsert_L(polynomail &Pa,term e){  //往链表的尾端加入e元素 
	polynomail p=Pa;
	while(p->next)
		p=p->next;
	polynomail p3=(polynomail)malloc(sizeof(LNode));
	p3->data=e;
	p->next=p3;
	p3->next=NULL;
}
void AddPolyn(polynomail Pa,polynomail Pb,polynomail &Pc){
	polynomail la=Pa->next,lb=Pb->next;
	polynomail lc;
	Pc=lc=Pa;
	while(la&&lb){
		if(la->data.expn<lb->data.expn){//la的指数比lb小
			lc->next=la;
			lc=la;
			la=la->next;
		} 
		else if(la->data.expn>lb->data.expn){  //la的指数比lb大 
			lc->next=lb;
			lc=lb;
			lb=lb->next;
		}
		else if(la->data.expn==lb->data.expn){  //la指数与lb指数相同
			la->data.coef=la->data.coef+lb->data.coef;
			lc->next=la; 
			lc=la;
			la=la->next;
			lb=lb->next; //lb的指针也需后移一位 
		}
	}
	lc->next=la?la:lb;
	free(Pb);
}
void SubtractPolyn(polynomail Pa,polynomail Pb,polynomail &Pc){
	polynomail la=Pa->next,lb=Pb->next;
	polynomail lc;
	Pc=lc=Pa;
	while(la&&lb){
		if(la->data.expn<lb->data.expn){//la的指数比lb小
			lc->next=la;
			lc=la;
			la=la->next;
		} 
		else if(la->data.expn>lb->data.expn){  //la的指数比lb大 
			lb->data.coef=-lb->data.coef; 
			lc->next=lb;
			lc=lb;
			lb=lb->next;
		}
		else if(la->data.expn==lb->data.expn){  //la指数与lb指数相同
			la->data.coef=la->data.coef-lb->data.coef;
			lc->next=la; 
			lc=la;
			la=la->next;
			lb=lb->next; //lb的指针也需后移一位 
		}
	}
	if(la)
		lc->next=la;
	else{
		polynomail lb1=lb;
		while(lb){
			lb->data.coef=-lb->data.coef;
			lb=lb->next;
		}
		lc->next=lb1; 
	}
	free(Pb);
} 
void MultiplyPolyn(polynomail Pa,polynomail Pb){  //两个链表方式存储的一元多项式相乘
	polynomail Pc;
	CreatePolyn(Pc);
	polynomail p1=Pa,p2=Pb;
	term t;
	int expn;
	double coef; 
	while(p1->next){
		while(p2->next){   //对第一个多项式的每一项,遍历第二个多项式的每一项 
		expn=p1->next->data.expn+p2->next->data.expn;
		coef=p1->next->data.coef*p2->next->data.coef;
		t.expn=expn;
		t.coef=coef;
		ListInsert_L(Pc,t);  //往链表里插入元素 
		p2=p2->next;
		}
		p1=p1->next;
		p2=Pb;   
	}  //此时,相乘的项已经都放进了链表Pc
	//PrintPolyn(Pc);  //√ 
	polynomail p3=Pc,p4;  
	while(p3->next){
		p4=p3->next;
		while(p4->next){
			if(p4->next->data.expn==p3->next->data.expn){
				p3->next->data.coef=p3->next->data.coef+p4->next->data.coef; 
				p4->next=p4->next->next;  //删除p4->next节点 
			}
			p4=p4->next;   //节点向后移动 
		}
		p3=p3->next; 
	}
	PrintPolyn(Pc);
}
void Derivation_S(polynomail Pc,int n){  //对一个多项式求n次导 
	polynomail p=Pc;
	double coef;
	int expn;
	while(p->next)
		p=p->next;
	if(p->data.expn<n){
		printf("所求导数为0\n");
		return;
	} 
	p=Pc;
	while(p->next){
		expn=p->next->data.expn;
		coef=p->next->data.coef;
		for(int i=0;i<n;i++){
			coef=coef*expn;
			expn--;
		}
		expn=p->next->data.expn-n;
		p->next->data.expn=expn;
		p->next->data.coef=coef; 
		p=p->next; 
	} 
	PrintPolyn(Pc);
}
void InitStack2(SqStack2 &s){
	s.base=(double*)malloc(STACK_INIT_SIZE*sizeof(double));
	if(!s.base)
		exit(OVERFLOW);
	s.stacksize=STACK_INIT_SIZE;
	s.top=s.base;
	return; 
}
double GetTop2(SqStack2 s){
	if(s.top==s.base){
		printf("ERROR When get top\n");
		return 0;
	}
	double e=*(s.top-1);
	return e;
}
void Push2(SqStack2 &s,double e){
	if(s.top-s.base>=s.stacksize){
		s.base=(double*)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(double));
		if(!s.base)
			exit(OVERFLOW);
		s.top=s.base+s.stacksize;
		s.stacksize+STACKINCREMENT; 
	}
	*s.top=e;
	s.top++;
	return;
}
void Pop2(SqStack2 &s,double &e){  //若栈不空,则删除s的栈顶元素,用e返回值 
	if(s.top==s.base){
		printf("ERROR When pop\n");
		return;
	}
	e=*--s.top;
	return;
}
void InitStack1(SqStack1 &s){
	s.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
	if(!s.base)
		exit(OVERFLOW);
	s.stacksize=STACK_INIT_SIZE;
	s.top=s.base;
	return;
}
char GetTop1(SqStack1 s){  //用e返回栈顶元素 
	if(s.top==s.base){
		printf("ERROR When get top\n");
		return '0'; 
	}
	char e=*(s.top-1);
	return e;
}
void Push1(SqStack1 &s,char e){  //在栈中插入元素为e的新的栈顶元素 
	if(s.top-s.base>=s.stacksize){
		s.base=(char*)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(char));
		if(!s.base)
			exit(OVERFLOW);
		s.top=s.base+s.stacksize;
		s.stacksize+STACKINCREMENT;
	}
	*s.top=e;
	s.top++;
	return;
}
void Pop1(SqStack1 &s,char &e){  //若栈不空,则删除s的栈顶元素,用e返回值 
	if(s.top==s.base){
		printf("ERROR When pop\n");
		return;
	}
	e=*--s.top;
	return;
}
int In(char e){  //判断读入的字符是否为运算符 
	if(e=='+'||e=='-'||e=='*'||e=='/'||e=='('||e==')'||e=='#')
		return 1;  //是运算符
	else 
		return 0;//不是运算符	
} 
int Letter(char e){    //判断输入的字符是否为字母 
	if((e>='a'&&e<='z')||(e>='A'&&e<='Z'))
		return 1;
	else
		return 0;
}
char Compare(char a,char b){ //比较运算符的优先级 
	char f;
	if(a=='+'||a=='-'){
		if(b=='+'||b=='-'||b==')'||b=='#')
			f='>';
		else if(b=='('||b=='*'||b=='/')
			f='<';
	}
	else if(a=='*'||a=='/'){
		if(b=='+'||b=='-'||b=='*'||b=='/'||b==')'||b=='#')
			f='>';
		else if(b=='(')
			f='<';
	}
	else if(a=='('){
		if(b=='+'||b=='-'||b=='*'||b=='/'||b=='(')
			f='<';
		else if(b==')')
			f='=';		
	}
	else if(a==')'){
		if(b=='+'||b=='-'||b=='*'||b=='/'||b==')'||b=='#')
			f='>';
	}
	else if(a=='#'){
		if(b=='+'||b=='-'||b=='*'||b=='/'||b=='(')
			f='<';
		else if(b=='#')
			f='=';
	}
	return f;
}
double cal(double a,char theta,double b){  //运算,theta为运算符 
	double c;//保存结果
	if(theta=='+')
		c=a+b;
	else if(theta=='-')
		c=a-b;
	else if(theta=='*')
		c=a*b;
	else if(theta=='/')
		c=a/b;
	return c;
}
double EvaluateExpression(char* s){  //表达式求值 
	SqStack1 OPTR;  //存放操作符 
	SqStack2 OPND;  //存放运算数 
	char c,theta,x;
	double a=0,b=0;
	InitStack2(OPND);
	InitStack1(OPTR);
	Push1(OPTR,'#');
	int i=0;
	bool decimal=false;  //判断存入的数据是否是小数 
	c=s[i++];
	while(c!='#'||GetTop1(OPTR)!='#'){
		if(!In(c)&&!Letter(c)){
			double d=0;
			while(!In(c)){
				if(decimal==false){  //如果不为小数 
					d=d*10+c-'0';
					c=s[i++];  //正常运算 
				}
				if(c=='.'){
					decimal=true;
					c=s[i++];
				}
				if(decimal==true){
					d=(d*10+c-'0')/10;
					c=s[i++];
				}
			}
			Push2(OPND,d);
			decimal=false;
		} 
		else if(Letter(c)){   //有字母出现,代表出现了单变量 
			while(!In(c))  //当它是数字时
				c=s[i++];
			printf("请输入变量的值\n");
			double d=0;
			scanf("%lf",&d);
			Push2(OPND,d); 
		}
		else if(In(c)){
			switch(Compare(GetTop1(OPTR),c)){
				case'<':
					Push1(OPTR,c);
					c=s[i++];
					break;
				case'>':
					Pop1(OPTR,theta);
					Pop2(OPND,b);
					Pop2(OPND,a);
					Push2(OPND,cal(a,theta,b));
					break;
				case'=':
					Pop1(OPTR,x);
					c=s[i++];
					break;
			}
		}
	} 
	return GetTop2(OPND);
}
int main(){
	int dim=-1,ans1=-1,ans2=-1,ans3=-1,ans4=-1;
	Sqlist l1,l2,l3;
	Sq_p  l4,l5,l6;
	polynomail l7,l8,l9;
	int a[10]={0};  //存放向量数据的临时数组 
	term cmp;  //存放一元多项式数据 
	char s[100]; //存放表达式的数组 
	printf("===========Welcome to CJY's Counter(* ▽* )/========\n");
	printf("请输入向量的维数\n"); 
	scanf("%d",&dim); 
	printf("请输入第一组向量的数据\n");
	InitList_Sq(l1);
	for(int i=0;i<dim;i++)
		scanf("%d",&a[i]);
	for(int i=1;i<=dim;i++){
		ListInsert_Sq(l1,i,a[i-1]);
	}
	printf("你输入的第一组向量为(");
	for(int i=0;i<dim;i++){
		if(i<dim-1)
			printf("%d,",a[i]);
		else
			printf("%d)\n",a[i]);
	}
	printf("请输入第二组向量的数据\n"); 
	InitList_Sq(l2);
	for(int i=0;i<dim;i++)
		scanf("%d",&a[i]);
	for(int i=1;i<=dim;i++){
		ListInsert_Sq(l2,i,a[i-1]);
	}
	printf("你输入的第二组向量为(");
	for(int i=0;i<dim;i++){
		if(i<dim-1)
			printf("%d,",a[i]);
		else
			printf("%d)\n",a[i]);
	}
	for(int i=0;i<10;i++)
		a[i]=0; //清零      
	printf("若你想进行加法运算,请输入1,减法运算请输入2,向量的数乘请输入3,计算夹角的余弦值请输入4\n");
	scanf("%d",&ans1);
	if(ans1==1)
		l3=add(l1,l2);
	if(ans1==2){
		printf("如果你想让第一个向量为被减数,请输入1,反之请输入0\n");
		scanf("%d",&ans2); 
		if(ans2==1)
			l3=sub(l1,l2);
		else
			l3=sub(l2,l1);
	}
	if(ans1==3)
		l3=multiply(l1,l2);		
	printf("运算的结果是:"); 
	if(ans1<=3)
		Show(l3);
	else
		printf("%lf",cos_value(l1,l2));
	printf("现在,所有的数据将被清空\n");
	ClearList_Sq(l1);
	ClearList_Sq(l2);
	ClearList_Sq(l3); 
	ans1=-1,ans2=-1;   //清空储存选择的信息 
	printf("如果你想用顺序表完成一元多项式相关的运算,请输入1,如果想用链表请输入2\n");
	scanf("%d",&ans4);
	if(ans4==1){
		printf("请输入第一个一元多项式的项数\n");
		
		scanf("%d",&dim); 
		printf("请输入第一个一元多项式的系数和次数\n");  //用顺序表存储一元多项式的信息 
		InitList_P(l4);
		for(int i=0;i<dim;i++){
			scanf("%lf %d",&cmp.coef,&cmp.expn);  //输入一元多项式的系数和次数;
			ListInsert_P(l4,i+1,cmp);
		}
		Sort_P(l4);  //对l4按次数从小到大排序
		Show_P(l4);
		printf("请输入第二个一元多项式的项数\n");
		scanf("%d",&dim);
		printf("请输入第二个一元多项式的系数和次数\n");   
		InitList_P(l5);
		for(int i=0;i<dim;i++){
			scanf("%lf %d",&cmp.coef,&cmp.expn);  //输入一元多项式的系数和次数;
			ListInsert_P(l5,i+1,cmp);
		}
		Sort_P(l5);  //对l5按次数从小到大排序	
		Show_P(l5);
		printf("如果你想进行加法运算,请输入1,减法运算请输入2,乘法运算请输入3\n");
		scanf("%d",&ans1);  
		if(ans1==1)
			Add_P(l4,l5); 
		else if(ans1==2){
			printf("如果你想让第一个多项式为被减项,请输入1,否则请输入2\n");
			scanf("%d",&ans2);
			if(ans2==1)
				Sub_P(l4,l5);
			else
				Sub_P(l5,l4);
		}
		else if(ans1==3){
			Multiply_P(l4,l5);
		}
		ans1=-1,ans2=-1;
		printf("如果你想进行求导运算,请输入1\n");
		scanf("%d",&ans1);
		if(ans1==1){
			printf("如果你想对第一个多项式求导,请输入1,否则请输入2\n");
			scanf("%d",&ans2);
			printf("请输入想求导的次数\n");
			scanf("%d",&ans3);
			if(ans2==1)
				Derivation_P(l4,ans3);
			else
				Derivation_P(l5,ans3);
		}
	}
	else{
		printf("请输入第一个多项式的项数\n");
		scanf("%d",&dim);
		CreatePolyn(l7);  
		printf("请输入第一个一元多项式的系数和次数\n");
		for(int i=0;i<dim;i++){
			scanf("%lf %d",&cmp.coef,&cmp.expn); 
			ListInsert_L(l7,cmp);
		} 
		Sort_S(l7);
		PrintPolyn(l7);
		printf("请输入第二个一元多项式的项数\n");
		scanf("%d",&dim);
		CreatePolyn(l8);
		printf("请输入第二个一元多项式的系数和次数\n");
		for(int i=0;i<dim;i++){
			scanf("%lf %d",&cmp.coef,&cmp.expn);
			ListInsert_L(l8,cmp);
		} 
		Sort_S(l8);
		PrintPolyn(l8);
		printf("如果你想做加法,请输入1,想做减法请输入2,想做乘法请输入3\n");
		CreatePolyn(l9);
		scanf("%d",&ans1);
		if(ans1==1){
			AddPolyn(l7,l8,l9);
			PrintPolyn(l9);
		}
		else if(ans1==2){
			printf("如果你想让第一个多项式为被减项,请输入1,否则请输入2\n");
			scanf("%d",&ans2);
			if(ans2==1){
				SubtractPolyn(l7,l8,l9);
				PrintPolyn(l9);
			}
			else{
				
				SubtractPolyn(l8,l7,l9);
				PrintPolyn(l9);
			}
		}
		else{
			MultiplyPolyn(l7,l8);
		}	
		ans1=-1;
		ans2=-1;
		printf("如果你想求导数,请输入1\n");
		scanf("%d",&ans1);
		if(ans1==1){
			printf("如果是对第一个多项式求导,请输入1,否则请输入2\n");
			scanf("%d",&ans2);
			printf("请输入求导的次数\n");
			scanf("%d",&ans3);
			if(ans2==1){  //对第一个多项式求导 
				Derivation_S(l7,ans3);
			} 
			else{
				Derivation_S(l8,ans3);
			}
		}
	}
	printf("请输入你想要计算的表达式的值"); 
	scanf("%s",s);
	double f=EvaluateExpression(s);
	printf("结果为:%lf",f); 
	return 0;
} 
 
 
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
递归实现表达式运算需要考虑一个算术表达式的各个元素以及运算符的优先级。下面是一个用C语言实现加减乘除模取模的递归解法的示例代码: ```c #include <stdio.h> int calculate(char *exp, int start); int parseNumber(char *exp, int *start) { int num = 0; while (exp[*start] >= '0' && exp[*start] <= '9') { num = num * 10 + (exp[*start] - '0'); (*start)++; } return num; } int calculate(char *exp, int start) { int num1 = parseNumber(exp, &start); while (exp[start] != '\0' && exp[start] != ')') { char op = exp[start++]; int num2 = parseNumber(exp, &start); switch (op) { case '+': num1 += num2; break; case '-': num1 -= num2; break; case '*': num1 *= num2; break; case '/': num1 /= num2; break; case '%': num1 %= num2; break; default: printf("Invalid operator\n"); return -1; } } return num1; } int main() { char expression[100]; printf("请输入要计算的表达式:"); scanf("%s", expression); int result = calculate(expression, 0); printf("计算结果为:%d\n", result); return 0; } ``` 以上代码,函数`parseNumber`用于解析一个数值。函数`calculate`用于递归计算表达式,包括优先级高的乘除取模和优先级低的加减。在主函数,用户输入一个表达式,然后调用`calculate`函数进行计算,并输出结果。 这个递归实现表达式运算的方法可以解析加减乘除取模运算,并且支持嵌套括号。但需要注意的是,这个实现有一些限制,例如不支持负数和浮点数运算。如果需要更复杂的功能,可能需要更复杂的实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值