📄 main.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 + -