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

📄 main.cpp

📁 数据结构课程设计,表达式,用C语言实现,难度系数较高
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>

#include <conio.h>


//#include "../header/bitree.h"
//#include "../header/queue.h"
//#include "../header/stack.h"
#include "../header/expr.h"
//#include "../header/FileRead.h"



void main()
{
	//Visit=Print;
	ExpTree E,e1,e2,e[10];
	char V;
	char v[20];
	float C;
	float F;
	char c;		//用于吸收回车
	int n,i;	//临时变量
	int j = 0;	//地址下标变量
	int choice;
	int rand[10];	//储存随机数
	char oper[] = {'*', '/', '+', '-'};
	char p;
	char ch[20];
	char ch5[2][20];
	
	FILE *fp;
	if((fp=fopen("test/data.txt","rb"))==NULL)//read
	{
		printf("Cannot open file strike any key exit!");
		exit(0);
	}
	int num[9]; 
	char ch1[30][20];
	char ch3[10][20];
	char ch6[10][20];
	char ch7[15][20];
	char ch8[10][20];

	i = -1, j;
	fscanf( fp, "%d \n", &num[++i] );	//ch1
	for( j = 0; j < num[i]; ++j )		
		fscanf( fp, "%s \n",ch1[j]);

	fscanf( fp, "%d \n", &num[++i] );	//ch3
	for( j = 0; j < num[i]; ++j )		
		fscanf( fp, "%s \n", ch3[j] );

	fscanf( fp, "%d \n", &num[++i] );	//ch6
	for( j = 0; j < num[i]; ++j )		
		fscanf( fp, "%s \n", ch6[j] );

	fscanf( fp, "%d \n", &num[++i] );	//ch7
	for( j = 0; j < num[i]; ++j )		
		fscanf( fp, "%s \n", ch7[j] );

	fscanf( fp, "%d \n", &num[++i] );	//ch8
	for( j = 0; j < num[i]; ++j )		
		fscanf( fp, "%s \n", ch8[j] );
/*
//ch1
	i = -1;
	printf("\n%d \n", num[++i] );
	for( j = 0; j < num[i]; ++j )		
		printf( "%s \n",ch1[j]);

//ch3	
	printf("\n%d \n", num[++i] );
	for( j = 0; j < num[i]; ++j )		
		printf( "%s \n", ch3[j] );

//ch6
	printf("\n%d \n", num[++i] );
	for( j = 0; j < num[i]; ++j )		
		printf( "%s \n", ch6[j] );

//ch7
	printf("\n%d \n", num[++i] );
	for( j = 0; j < num[i]; ++j )		
		printf( "%s \n", ch7[j] );

//ch8
	printf("\n%d \n", num[++i] );
	for( j = 0; j < num[i]; ++j )		
		printf( "%s \n", ch8[j] );
	printf("\n数据录入成功!\n");
	printf("请输入回车键继续\n");
    getchar();
*/
	fclose(fp);

	while( 1 )
	{
		system("cls");//清屏,用clrscr()不可以,vc里没有这个函数
		for( i = 0; i < 40; ++i )	printf("%c ",127);	//printf("\n");
		/*printf("\t\t\t班级:05级计算机科学与技术01班\n");
		printf("\t\t\t学号为3105006800\n");
		printf("\t\t\t姓名:     郑培钿\n\n");*/
		printf("    欢迎使用 05级计算机科学与技术01班 学号为3105006800 郑培钿同学的课程设计\n");
		for( i = 0; i < 40; ++i )	printf("%c ",'-');
		printf("\t\t题目:算术表达式类型的实现\n");printf("\n");
		printf("  1.以数组形式输入前缀表示式函数构造表达式.\n");
		printf("  2.以字符序列输入前缀表示式函数构造表达式.\n");		
		printf("  3.实现对变量V的赋值(V=c).\n");
		printf("  4.对算术表达式E求值.\n");
		printf("  5.构造一个新的复合表示式(E1)P(E2).\n");
		printf("  6.求偏导函数Diff(E,V).\n");
		printf("  7.对三角函数的测试.\n");
		printf("  8.常数合并.\n");
		printf("  0.结束 \n");
		printf("请选择编号(0—9):");

		scanf("%d",&n);		fflush(stdin);//c = getchar();//吸收回车
		switch( n )
		{
			case 1:			//CreateExp( T, ch, j )
				system("cls");		//清屏
				printf("  1.以数组形式输入前缀表示式函数构造表达式.\n\n");				
				rand[0] = Random( 0, 5 );
				for(  i = 0; i < 29 ; i++ )				
				{	 
					printf("第%d组测试数据:\n", i );
					printf("读入的字符串:   %s\n",ch1[i]);
					CreateExp( E, ch1[i], j);
					printf("波兰式输出:     "); PreOrderTraverse ( E, Visit ); printf("\n");
					printf("逆波兰式输出:   "); PostOrderTraverse( E, Visit ); printf("\n\n");
				}
				break;

			case 2:			//Status InputCreateExp( ExpTree &E )
				system("cls");		//清屏
				printf("  2.以字符序列输入前缀表示式函数构造表达式.\n\n");
				printf("请以字符序列输入前缀表示式函数构造表达式.\n");				
				scanf("%s", ch);fflush(stdin);
				CreateExp( E, ch, j);
				printf("波兰式输出:     "); PreOrderTraverse ( E, Visit ); printf("\n");
				printf("逆波兰式输出:   "); PostOrderTraverse( E, Visit ); printf("\n");
				printf("%c",V);
				printf("\n");
				/*下面的不是调用CreateExp( E, ch, j);而是直接调用InputCreateExp( E )构建表达式树
				if( InputCreateExp( E ) )
				{
					InorderExp( E, Visit );//用带括号的中缀表示式输出
					printf("\n\n");
				}
				else
					printf("构造树失败!");*/
				break;
			
			case 3:			//Status Assign( ExpTree E, char v, int c ) 
				system("cls");		//清屏
				printf("  3.实现对变量V的赋值(V=c).\n\n");
				printf("请选择手动输入还是程序自动输入测试:\n");
				printf("(0-代表手动输入,1-代表自动输入)\n");
				scanf("%d",&choice);fflush(stdin);
				if( ! choice )	//手动输入
				{
					printf("请以字符序列输入前缀表示式函数构造表达式.\n");				
					scanf("%s", ch);
					fflush(stdin);
					CreateExp( E, ch, j);
					FindVary( v, ch );
					//printf("请输入你要赋值的变量:");//手动输入要赋值的变量
					//scanf("%c",&V);
					//fflush(stdin);//getchar();
					i = -1;
					while( v[++i] )
					{
						printf("赋值为: %c = ",v[i] );
						scanf("%f",&C);
						if( ! Assign( E, v[i], C ) )
						{
							printf("赋值失败!\n");
							break;
						}
					}
					printf("赋值成功!\n");
					printf("赋值后的表达式是");
					InorderExp( E, Visit );\
				}
				else						//自动输入构造
				{
					rand[0] = Random( 0, 6 );
					printf("随机抽取测试数据:%s\n", ch3[rand[0]] );
					CreateExp( E, ch3[rand[0]], j );
					FindVary( v, ch3[rand[0]] );//找出表达式中的变量
					i = -1;
					while( v[++i] )
					{
						C = Random( i+1, 9 );//随机数赋值
						printf("自动赋值:    ");
						printf("%c = %f\n", v[i], C );
						if( ! Assign( E, v[i], C ) )
						{
							printf("赋值失败!\n");
							break;
						}
					}
					printf("赋值成功!\n");
					printf("赋值后的表达式是 ");
					InorderExp( E, Visit );
				}
				break;

			case 4:		//float Value( ExpTree E );
				system("cls");		//清屏
				printf("  4.对算术表达式E求值.\n\n");
				printf("请选择手动输入还是程序自动输入测试:\n");
				printf("(0-代表手动输入,1-代表自动输入)\n");
				scanf("%d",&choice);
				fflush(stdin);
				if( ! choice )	//手动输入
				{
					printf("请以字符序列输入前缀表示式函数构造表达式.\n");				
					scanf("%s", ch);fflush(stdin);
					CreateExp( E, ch, j);
					FindVary( v, ch );
					i = -1;
					while( v[++i] )
					{
						printf("赋值为: %c = ",v[i] );
						scanf("%f", &C);
						if( ! Assign( E, v[i], C ) )
						{
							printf("赋值失败!\n");
							break;
						}
					}
					printf("赋值成功!\n");
					printf("赋值后的表达式是 ");
					InorderExp( E, Visit );
				}
				else						//自动输入构造
				{
					rand[0] = Random( 0, 6 );
					CreateExp( E, ch3[rand[0]], j );
					FindVary( v, ch3[rand[0]] );	//找出表达式中的变量
					i = -1;
					while( v[++i] )
					{
						C = Random( i+1, 9 );			//随机数赋值
						printf("%c = %f\n", v[i], C );
						if( ! Assign( E, v[i], C ) )
						{
							printf("赋值失败!\n");
							break;
						}
					}
					printf("赋值成功!\n");
					printf("赋值后的表达式是 ");
					InorderExp( E, Visit );
				}
				printf("\nE的值是 %0.4f\n", Value( E ) );
				break;						

			case 5:			//ExpTree Compound( char p, ExpTree e1, ExpTree e2 );				
				system("cls");		//清屏
				printf("  5.构造一个新的复合表示式(E1)P(E2).\n\n");
				printf("请选择手动输入还是程序自动输入测试:\n");
				printf("(0-代表手动输入,1-代表自动输入)\n");
				scanf("%d",&choice);				fflush(stdin);
				if( ! choice )	//手动输入
				{
					printf("请以字符序列输入前缀表示式函数构造表达式E1.\n");				
					scanf("%s", ch5[0] );  fflush(stdin);
					printf("请以字符序列输入前缀表示式函数构造表达式E2.\n");				
					scanf("%s", ch5[1] );  fflush(stdin);
					printf("请输入要连接的运算符:  ");
					scanf("%c", &p );  fflush(stdin);
					CreateExp( e1, ch5[0], j ); 
					CreateExp( e2, ch5[1], j );
				}
				else						//自动输入构造
				{
					rand[0] = Random( 0, 28 );
					rand[1] = Random( 1, 28 );					
					printf("E1: %s\n", ch1[rand[0]]);
					CreateExp( e1, ch1[rand[0]], j ); 
					printf("E2: %s\n", ch1[rand[1]]);
					CreateExp( e2, ch1[rand[1]], j );
					rand[2] = Random( 0, 3 );
					p = oper[rand[2]];
					printf("符号P: %c\n", p );
				}				 
				if( E = Compound( p, e1, e2 ) )
				{	
					InorderExp( E, Visit );//用带括号的中缀表示式输出
					printf("\n");
				}					
				break;

			case 6:		//Status Diff( ExpTree &E, char V )
				system("cls");		//清屏
				printf("  6.求偏导函数Diff(E,V).\n\n");
				printf("请选择手动输入还是程序自动输入测试:\n");
				printf("(0-代表手动输入,1-代表自动输入)\n");
				scanf("%d", &choice);				fflush(stdin);
				if( ! choice )	//手动输入
				{
					printf("请以字符序列输入前缀表示式函数构造表达式.\n");				
					scanf("%s", ch);fflush(stdin);
					printf("请输入你要求导的变量:");
					scanf("%c", &V );					
					printf("求偏导前:");
					CreateExp( E, ch, j);
					Diff( E, V );
					printf("求偏导后:");
					InorderExp( E, Visit );
					printf("\n\n");
				}
				else						//自动输入构造
				{
					for( i = 0; i < 5; ++i )
					{
						printf("求偏导前:");
						CreateExp( E, ch6[i], j );
						V = 'x';
						Diff( E, V );
						printf("求偏导后:");
						InorderExp( E, Visit );
						printf("\n\n");
					}
				}
				break;	

			case 7://三角函数
				system("cls");		//清屏
				printf("  7.对三角函数的测试.\n\n");
				printf("请选择手动输入还是程序自动输入测试:\n");
				printf("(0-代表手动输入,1-代表自动输入)\n");
				scanf("%d", &choice);				fflush(stdin);
				if( ! choice )	//手动输入
				{
					printf("请以字符序列输入前缀表示式函数构造表达式.\n");				
					scanf("%s", ch);fflush(stdin);
					CreateExp( E, ch, j);
					FindVary( v, ch );
					i = -1;
					while( v[++i] )
					{
						printf("赋值(弧度制): %c = ", v[i] );
						scanf("%f", &F );
						if( ! Assign( E, v[i], F ) )
						{
							printf("赋值失败!\n");
							break;
						}
					}
					printf("赋值成功!\n");
					printf("赋值后的表达式是 ");
					InorderExp( E, Visit );
				}
				else						//自动输入构造
				{
					rand[0] = Random( 0, 3 );
					CreateExp( E, ch7[rand[0]], j );
					FindVary( v, ch7[rand[0]] );	//找出表达式中的变量
					i = -1;
					while( v[++i] )
					{
						F = ( float )Random( i, 31 )/10;			//随机数赋值
						printf("%c = %f\n", v[i], F );
						if( ! Assign( E, v[i], F ) )
						{
							printf("赋值失败!\n");
							break;
						}
					}
					printf("赋值成功!\n");
					printf("赋值后的表达式是 ");
					InorderExp( E, Visit );
				}
				printf("\nE的值是 %f\n", Value( E ) );
				break;	

			case 8:			//void MergeConst( BiTree T );
				system("cls");		//清屏
				printf("  8.常数合并.\n\n");

				printf("请选择手动输入还是程序自动输入测试:\n");
				printf("(0-代表手动输入,1-代表自动输入)\n");
				scanf("%d",&choice);
				fflush(stdin);
				if( ! choice )	//手动输入
				{
					printf("请以字符序列输入前缀表示式函数构造表达式.\n");				
					scanf("%s", ch);fflush(stdin);
					CreateExp( E, ch, j);
					MergeConst( E );
					printf("常数合并结果:  ");
					InorderExp( E, Visit );
					printf("\n\n");
				}
				else						//自动输入构造
				{
					rand[0] = Random( 0, 4 );
					//随机抽取测试
					for(  i = 0; i < 5 ; i++, rand[i] = rand[i-1] + 1  )				
					{	 
						if( rand[i] >= 5 )	rand[i] -= 5;
						printf("随机抽取到第%d组数据测试\n", i );
						CreateExp( E, ch8[rand[i]], j );
						MergeConst( E );
						printf("常数合并结果:  ");
						InorderExp( E, Visit );
						printf("\n\n");
					}
				}
				break;	

			case 0:
				printf("\n\n");
				for( i = 0; i < 40; ++i )		printf("%c ",29);
				printf("\n");
				printf("\t谢谢您的使用!\n");
				printf("\t如果您对本程序有任何意见或建议\n");
				printf("\t可以通过邮箱:zpeitian@126.com.联系我!谢谢!\n\n");
				exit(0);
		}
		printf("\n\n请输入任意键结束\n");
		getch();	//暂停一下
	}
}				

⌨️ 快捷键说明

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