目录
项目一: 中国计算机设计大赛赛事统计
【问题描述】
参加计算机设计大赛的n个学校编号为1~n,赛事分成m个项目,项目的编号为1~m.比赛获奖按照得分降序,取前三名,写一个统计程序产生各种成绩单和得分报表。
【基本要求】
-
每个比赛项目至少有10支参赛队;每个学校最多有6支队伍参赛;
-
能统计各学校的总分;
-
可以按照学校编号或名称,学校的总分、各项目的总分排序输出;
-
可以按学校编号查询学校某个项目的获奖情况;可以按项目编号查询取得前三名的学校;
-
数据存入文件并能随时查询
-
。
【设计要求】
-
输入数据形式和范围:可以输入学校的名称,赛事项目的名称。
-
输出形式:有中文提示,各学校分数为整数
-
界面要求:交互设计要合理,每个功能可以设立菜单,根据提示,可以完成相关功能的要求。
-
存储结构:学生自己根据系统功能要求自己设计,但是赛事相关数据要存储在文件中。
【测试数据】
要求使用全部合法数据,整体非法数据,局部非法数据。进行程序测试,以保证程序的稳定。
【实现提示】
假设3<赛事项目数量<=10,学校名称长度不超过20个字符。每个赛事结束时,将其编号、名称输入,并依次输入参赛学校编号、学校名称和成绩。
【初步思考】
其中存在一些需要考虑的问题
1.对于成绩相同的,输入测试数据以后应该如何处理
2.同一只队伍能不能参加两只赛事,给队伍编号的话,四只队伍参加四只赛事
3.依据每个学校的id查询各个学校的获奖情况(不能用数据库,只能用数据结构)
如果我以项目为基本单位,以"项目编号,项目名称,参加项目的学校的编号,参加项目学校的名称,该学校取得的分数"这样写,那么单项目总分和学校排名以及取前三名将会变得非常简单,但是这样的话我就需要思考的是学校总分如何去计算
【流程图】
【需实现的功能】
- 统计各学校的总分
- 能按照学校编号或名称查找并排序,使学校的总分、各项目的总分排序输出;
- 能按照学校编号查询学校某个项目的获奖情况;能按照项目编号查询取得前三名的学校;
- 赛事数据存入文件并能随时查询
【代码实现】
import java.util.*;
public class test {
static int m;
//项目数
static int n;
//学校数
static Project[] project = new Project[10];
//项目
static School[] school = new School[10];
//学校
static class Project {
int projectCode;
//项目编码
String projectName;
//项目名称
int teamnum;
//参赛队伍数量
int[] jointeam = new int[10];
//参赛队伍编号
int[] score = new int[10];
//参赛队伍成绩
}
static class School {
int schoolCode;
//学校编码
String schoolName;
//学校名称
int sum;
//项目总分
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入项目的数目:");
m = sc.nextInt();
if (m <= 0) {
System.out.println("输入有误!");
System.exit(0);
}
System.out.println("请输入学校的数目:");
n = sc.nextInt();
if (n <= 0) {
System.out.println("输入有误!");
System.exit(0);
}
while (true) {
System.out.println("**********************");
System.out.println("欢迎使用赛事统计查询系统");
System.out.println("1.添加信息");
System.out.println("2.按学校编号排序输出");
System.out.println("3.按项目总分排序输出");
System.out.println("4.按学校编号查询学校某个项目的获奖情况");
System.out.println("5.按项目编号查询取得前三名的学校");
System.out.println("0.退出");
System.out.println("**********************");
System.out.println("请输入你的选择:");
String nothing = sc.nextLine(); //防止空格
int option = sc.nextInt();
if (option != 0 && option != 1 && option != 2 && option != 3 && option != 4 && option != 5) {
System.out.println("输入有误!");
System.exit(0);
}
switch (option) {
case 1:
addInformation();
break;
case 2:
printByCodes();
break;
case 3:
printByScore();
break;
case 4:
findByCodes();
break;
case 5:
getTopThree();
break;
case 0:
System.out.println("谢谢使用");
System.exit(0);
}
}
}
public static void addInformation() {
//录入信息
//录入项目
Scanner sc = new Scanner(System.in);
for (int i = 0; i < m; i++) {
project[i] = new Project();
project[i].projectCode = i + 1;
System.out.println("请输入第" + (i + 1) + "个项目的名称:");
project[i].projectName = sc.nextLine();
System.out.println("添加成功!");
}
for (int i = 0; i < m; i++) {
System.out.println("项目编号" + project[i].projectCode +
"项目名称" + project[i].projectName);
}
//录入学校
for (int i = 0; i < n; i++) {
school[i] = new School();
school[i].schoolCode = i + 1;
System.out.println("请输入第" + (i + 1) + "个学校的名称:");
school[i].schoolName = sc.nextLine();
System.out.println("添加成功!");
}
for (int i = 0; i < n; i++) {
System.out.println("学校编号" + school[i].schoolCode +
"学校名称" + school[i].schoolName);
}
for (int i = 0; i < m; i++) {
System.out.println("请输入参加" + project[i].projectName + "的学校数量:");
project[i].teamnum = sc.nextInt();
System.out.println("请依次输入参加" + project[i].projectName + "的学校编号:");
for (int j = 0; j < project[i].teamnum; j++) {
project[i].jointeam[j] = sc.nextInt();
System.out.println("输入成功!");
}
System.out.println("参加项目" + project[i].projectName + "的学校有");
for (int j = 0; j < project[i].teamnum; j++) {
System.out.println(project[i].jointeam[j] + " ");
}
//录入分数
System.out.println("请依次输入参加" + project[i].projectName + "的学校的分数");
for (int j = 0; j < project[i].teamnum; j++) {
int score = sc.nextInt();
if (score >= 0 && score <= 100) {
project[i].score[j] = score;
System.out.println("输入成功!");
} else {
System.out.println("您输入的有误!");
System.exit(0);
}
}
System.out.println("显示如下:");
for (int j = 0; j < project[i].teamnum; j++) {
System.out.println("编号" + project[i].jointeam[j] + "的学校取得的成绩:" + project[i].score[j]);
}
}
}
public static void printByCodes() {
//按学校编号排序输出
int sum = 0;
for (int i = 0; i < n; i++) {
System.out.println("学校编号:" + school[i].schoolCode);
System.out.println("学校名称:" + school[i].schoolName);
for (int j = 0; j < m; j++) {
for (int k = 0; k < project[j].jointeam[k]; k++) {
if (project[j].jointeam[k] == school[i].schoolCode) {
System.out.println("参赛项目:" + project[j].projectName);
System.out.println("取得成绩:" + project[j].score[k]);
System.out.println("*****");
sum += project[j].score[k];
}
}
}
System.out.println("学校取得的总分是:" + sum);
school[i].sum = sum;
sum = 0;
System.out.println("**********************");
}
}
public static void printByScore() {
//按总分排序
int temp = 0;
int[] temps = new int[n];
for (int i = 0; i < n; i++) {
temps[i] = school[i].sum;
}
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
if (temps[i] > temps[j]) {
temp = temps[i];
temps[i] = temps[j];
temps[j] = temp;
}
}
}
System.out.println("按照总分排序学校如下:");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (temps[i] == school[j].sum) {
System.out.println("总分第" + (n - i) + "名的学校是" + school[j].schoolName);
System.out.println("其总分是:" + school[j].sum);
System.out.println("*******");
}
}
}
}
public static void findByCodes() {
//按学校编号查询学校某个项目的获奖情况
Scanner sc = new Scanner(System.in);
System.out.println("请输入你想要查询的学校编号");
int scode = sc.nextInt();
System.out.println("请输入你想要查询的项目编号");
int pcode = sc.nextInt();
int[] temps = new int[project[pcode - 1].teamnum];
int len = temps.length;
for (int i = 0; i < len; i++) {
temps[i] = project[pcode - 1].score[i];
}
int temp = 0;
for (int i = 0; i < len; i++) {
for (int j = i; j < len; j++) {
if (temps[i] > temps[j]) {
temp = temps[i];
temps[i] = temps[j];
temps[j] = temp;
}
}
}
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
if (project[pcode - 1].score[i] == temps[j]) {
System.out.println("该学校在该项目中排第" + j + "名");
}
}
}
}
public static void getTopThree() {
//按项目编号查询取得前三名的学校
Scanner sc = new Scanner(System.in);
System.out.println("请输入您想要查询的项目的编号:");
int code = sc.nextInt();
int[] temps = new int[project[code - 1].teamnum];
int len = temps.length;
for (int i = 0; i < len; i++) {
temps[i] = project[code - 1].score[i];
}
int temp = 0;
for (int i = 0; i < len; i++) {
for (int j = i; j < len; j++) {
if (temps[i] > temps[j]) {
temp = temps[i];
temps[i] = temps[j];
temps[j] = temp;
}
}
}
for (int i = 0; i < len; i++) {
for (int j = 0; j < n; j++) {
if (temps[len - 1] == project[code - 1].score[i]) {
if (school[j].schoolCode == project[code - 1].jointeam[i]) {
System.out.println("第一名的学校是:" + school[j].schoolName);
}
}
if (temps[len - 2] == project[code - 1].score[i]) {
if (school[j].schoolCode == project[code - 1].jointeam[i]) {
System.out.println("第二名的学校是:" + school[j].schoolName);
}
}
if (temps[len - 3] == project[code - 1].score[i]) {
if (school[j].schoolCode == project[code - 1].jointeam[i]) {
System.out.println("第三名的学校是:" + school[j].schoolName);
}
}
}
}
}
}
项目二:校园导游咨询
【问题描述】设计一个校园导游程序,为来访的客人提供各种信息查询服务。
【基本要求】(1) 设计你所在学校的校园平面图,所含景点不少于10个.以图中顶点表示校内各景点,存放景点名称、代号、简介 等信息;以边表示路径,存放路径长度等相关信息。 (2) 为来访客人提供图中任意景点相关信息的查询。(3) 为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
【测试数据】以江苏科技大学长山校区为例。
【实现提示】一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网.顶点和边均含有相关信息.
【算法分析】
用直接赋值的方法给予各个景点信息,若两景点之间可达,则对路径长度赋值,对于自己到自己的路径,赋值为0,其他均赋成最大值。查看所有景点时,就遍历结构体数组,然后全部输出;查询景点,根据输入的景点代号,遍历数组然后利用字符串比较方法找到所查询的景点,输出景点的具体信息;修改景点信息的第一步为查找到该景点,然后将该景点的所有信息清空,重新输入即可;问路求最短路径及长度即是采用弗洛伊德算法,获得具体的最短路径时,从后往前追溯走过的结点,并且用一个数组记录下它的位置,然后再遍历数组输出所经过的每个点的信息。
【算法设计】
- 菜单显示供用户选择的功能菜单。
- 输出景点名称、代号和简介。
- 用直接赋值的方法给予各个景点信息,若两景点之间可达,则对路径长度赋值,对于自己到自己的路径,赋值为0,其他均赋成最大值。
- 修改景点信息的第一步为查找到该景点,然后将该景点的所有信息清空,重新输入即可。
- 查询景点,根据输入的景点代号,遍历数组然后利用字符串比较方法找到所查询的景点,输出景点的具体信息。
- 用弗洛伊德算法获得最短路径及长度。
- 从后往前追溯走过的结点,并且用一个数组记录下它的位置,然后再遍历数组输出所经过的每个点的信息。
- 调用函数输出具体路径及长度。
- 主函数int main()先调用建图函数,然后用while循环实现不断地对功能进行选择。
【代码实现】
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define Max 11
#define MX 999999
int D[Max][Max];
int path[Max][Max];
typedef struct Ver{//顶点信息
char num[5];
char name[51];
char instruct[101];
}Ver;
typedef struct{//邻接矩阵
Ver vex[Max];//顶点表
int arcs[Max][Max];
int vnum,arcnum;
}AMGragh;
void menu(){
cout<<"************欢迎您************"<<endl;
cout<<" 1、查看所有景点 "<<endl;
cout<<" 2、景点查询 "<<endl;
cout<<" 3、问路 "<<endl;
cout<<" 4、修改景点基本信息 "<<endl;
cout<<" 5、退出 "<<endl;
cout<<"**********************************"<<endl;
cout<<"请选择..."<<endl;
}
void Allprint(AMGragh G){//输出所有景点信息
cout<<"---------------校园景点总览---------------"<<endl;
cout<<"景点名称 "<<" "<<"代号"<<" "<<" 简介"<<endl;
for(int i=0;i<G.vnum;i++){
cout<<G.vex[i].name<<" "<<G.vex[i].num<<" "<<G.vex[i].instruct<<endl;
}
cout<<endl;
}
void CreateUDG(AMGragh &G){//建图
G.vnum=10;
strcpy(G.vex[0].num,"01");
strcpy(G.vex[1].num,"02");
strcpy(G.vex[2].num,"03");
strcpy(G.vex[3].num,"04");
strcpy(G.vex[4].num,"05");
strcpy(G.vex[5].num,"06");
strcpy(G.vex[6].num,"07");
strcpy(G.vex[7].num,"08");
strcpy(G.vex[8].num,"09");
strcpy(G.vex[9].num,"10");
strcpy(G.vex[0].name,"北苑美食城");
strcpy(G.vex[1].name,"北操场 ");
strcpy(G.vex[2].name,"体育馆 ");
strcpy(G.vex[3].name,"图书馆 ");
strcpy(G.vex[4].name,"广场1 ");
strcpy(G.vex[5].name,"广场2 ");
strcpy(G.vex[6].name,"湿地公园 ");
strcpy(G.vex[7].name,"公园2 ");
strcpy(G.vex[8].name,"湖 1 ");
strcpy(G.vex[9].name,"公园3 ");
strcpy(G.vex[0].instruct,"北苑美食城里面有各种各样的美食,可以让你大饱口福");
strcpy(G.vex[1].instruct,"北操场是北苑的一个运动场地,也是一个篮球场");
strcpy(G.vex[2].instruct,"体育馆设施齐全,建筑优美,在此可以尽情享受运动的快乐!");
strcpy(G.vex[3].instruct,"图书馆环境安适,藏书丰富,让人感受阅读的美好");
strcpy(G.vex[4].instruct,"广场1与学校西门相邻,也是升国旗的地方");
strcpy(G.vex[5].instruct,"广场2上会举办一些文艺晚会和校园招聘会,更是轮滑爱好者的乐园");
strcpy(G.vex[6].instruct,"湿地公园有小石桥和美丽的树木,让人心旷神怡");
strcpy(G.vex[7].instruct,"公园2的标志是一对白色的大海豚,坐落在水中央,夏天水中开有漂亮的莲花");
strcpy(G.vex[8].instruct,"湖 1的水清澈见底,还能看到活泼的小鱼");
strcpy(G.vex[9].instruct,"公园3里往届校友栽的树,生机勃勃,代表着他们对母校的爱");
G.arcs[1][2]=G.arcs[2][1]=2;
G.arcs[1][9]=G.arcs[9][1]=19;
G.arcs[2][3]=G.arcs[3][2]=3;
G.arcs[2][4]=G.arcs[4][2]=5;
G.arcs[3][4]=G.arcs[4][3]=2;
G.arcs[4][5]=G.arcs[5][4]=3;
G.arcs[4][7]=G.arcs[7][4]=29;
G.arcs[4][10]=G.arcs[10][4]=33;
G.arcs[5][6]=G.arcs[6][5]=6;
G.arcs[6][7]=G.arcs[7][6]=7;
G.arcs[7][8]=G.arcs[8][7]=8;
G.arcs[8][9]=G.arcs[9][8]=1;
G.arcs[9][10]=G.arcs[10][9]=2;
for(int i=1;i<=10;i++)//初始化路径长度
for(int j=1;j<=10;j++){
if(G.arcs[i][j]==0&&i!=j)
G.arcs[i][j]=MX;
}
G.arcnum=13;
}
void Change(AMGragh &G){//修改信息
Allprint(G);
cout<<"请输入要修改信息的代号:";
char c[5];
cin>>c;
for(int i=0;i<G.vnum;i++){
if(strcmp(c,G.vex[i].num)==0)//字符串比较的方法进行查找
{
memset(G.vex[i].name,0,sizeof(G.vex[i].name));
memset(G.vex[i].num,0,sizeof(G.vex[i].num));
memset(G.vex[i].instruct,0,sizeof(G.vex[i].instruct));
char num1[5];
char name1[51];
char instruct1[101];
cout<<"请输入修改后的景点信息:"<<endl;
cout<<"景点名称:";
scanf("%s",name1);
cout<<"代号:";
scanf("%s",num1);
cout<<"简介:";
scanf("%s",instruct1);
strcpy(G.vex[i].name,name1);
strcpy(G.vex[i].num,num1);
strcpy(G.vex[i].instruct,instruct1);
cout<<"修改成功!"<<endl;
break;
}
}
}
void Query(AMGragh G){//查询景点
cout<<"请输入查询景点的代号:";
char c[5];
cin>>c;
int i;
for(i=0;i<G.vnum;i++)
if(strcmp(c,G.vex[i].num)==0)
{
cout<<"景点名称:"<<G.vex[i].name<<" ";
cout<<"代号:"<<G.vex[i].num<<" ";
cout<<"简介:"<<G.vex[i].instruct<<endl;
break;
}
if(i==G.vnum)
cout<<"该代号不存在!"<<endl;
}
void Floyd(AMGragh G){//弗洛伊德算法,获得最短路径
int i,j,k;
for(i=1;i<=G.vnum;++i)
for(j=1;j<=G.vnum;j++){
D[i][j]=G.arcs[i][j];
if(D[i][j]<MX&&i!=j)
path[i][j]=i;
else
path[i][j]=-1;
}
for(k=1;k<=G.vnum;k++)
for(i=1;i<=G.vnum;++i)
for(j=1;j<=G.vnum;j++)
if(D[i][k]+D[k][j]<D[i][j]){
D[i][j]=D[i][k]+D[k][j];
path[i][j]=path[k][j];
}
}
void Path(AMGragh G,int a,int b){//获得具体路径
int p[Max];
p[0]=b;
int i=1;
while(a!=b){
b=path[a][b];
p[i]=b;
++i;
}
cout<<"路径:"<<G.vex[a-1].name;
i=i-2;
while(i>=0){
cout<<"--->"<<G.vex[p[i]-1].name;
--i;
}
}
void Ask(AMGragh G){//问路
Allprint(G);
cout<<"请输入起点和目的地(1~10,即第几个景点,中间用空格隔开):";
int a,b;
cin>>a>>b;
Floyd(G);
cout<<endl<<endl<<"从"<<G.vex[a-1].name<<"到"<<G.vex[b-1].name<<":"<<endl<<endl<<"最短路径长度:"<<D[a][b]*10<<"米"<<endl;
Path(G,a,b);
cout<<endl;
}
int main(){
AMGragh G;
memset(G.arcs,0,sizeof(G.arcs));
CreateUDG(G);
int m;
while(m!=5){
menu();
cin>>m;
switch(m){
case 1:
Allprint(G);
break;
case 2:
Query(G);
break;
case 3:
Ask(G);
break;
case 4:
Change(G);
break;
case 5:
cout<<"感谢您的使用!"<<endl;
return 0;
default:
cout<<"没有该选项!"<<endl;
}
system("pause");
system("cls");
}
return 0;
}
项目三:算数表达式求解
【问题描述】设计一个简单的算术表达式计算器。
【基本要求】 实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入).
【测试数据】(30+2*70)/3-12*3 5+(9*(62-37)+15)*6 要求自行设计非法表达式,进行程序测试,以保证程序的稳定运行。
【实现提示】可以设计以下辅助函数status isNumber(char ReadInChar); //视ReadInchar 是否是数字而返回 TRUE 或 FALSE 。int TurnToInteger(char IntChar); // 将字符’0’.’9’ 转换为整数 9
【思路】
算数表达式由三个部分组成,操作数,运算符和括号。在中缀表达式中有时括号是必须的,计算过程中必须用括号将操作数和对应的操作符括起来,用于只是运算的次序。而在前缀或后缀表达式中不会存在括号,运算符都是按照优先级排序的。为了方便计算表达式的值,一般都是采用前缀表达式或者后缀表达式,所以这就需要我们把中缀表达式进行相应的转换。
【逻辑设计】
数据结构:
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define TRUE 1
#define FALSE 0
#define MAXSIZE 10
typedef int Status;
template<typename ElemType>//首先确定元素类型
struct SqStack {
ElemType data[10];//声明数
int top;//栈顶指针
};
template<typename SqStack>
Status InitStack(SqStack* S) {
S->top = -1;
return OK;
}
template<typename SqStack>
Status StackEmpty(SqStack S) {
if (S.top != -1)//判断栈顶指针是否指向栈外
return FALSE;
return TRUE;
}
template<typename SqStack, typename ElemType>
ElemType GetTop(SqStack S) {
if (S.top == -1)
return ERROR;
return S.data[S.top];
}
template<typename SqStack, typename ElemType>
Status Push(SqStack* S, ElemType e) {
if (S->top == MAXSIZE - 1)
return ERROR;
S->top++;
S->data[S->top] = e;
return OK;
}
template<typename SqStack, typename ElemType>
Status Pop(SqStack* S, ElemType* e) {
if (S->top == -1)
return ERROR;
*e = S->data[S->top];//将要删除的栈顶元素赋值给e
S->top--;
return OK;
}//删除S的栈顶元素,并用e返回其值
Status StartOrEnd(int flag) {
if (flag == TRUE)//若为开始状态,则切换为结束
return FALSE;
return TRUE;
}//切换计算表达式的运行和结束状态
char getOperand(SqStack<double>& OPND, char c) {
double i = 0;
int flag = 0;//入栈的标志
scanf("%c", &c);
if (c <= '9' && c >= '0')//计算整数部分
{
flag = 1;
while (c <= '9' && c >= '0')//判断是否为整数
{
i *= 10;
i += (double)(c - '0');//将字符型操作数转换为double型
scanf("%c", &c);
}
}
if (c == '.')
{
double count = 0.1, decimal;//count为小数位数,decimal为小数部分
scanf("%c", &c);
while (c <= '9' && c >= '0')//判断是否为小数
{
flag = 1;
decimal = (double)(c - '0') * count;//转换为小数
i += decimal;//小数位加到操作数中
count /= 10;//小数位数+1
scanf("%c", &c);//是否存在更小位
}
}
if (flag == 1)
Push(&OPND, i);
return c;
}
double getResult(double x, double y, char c) {
if (c == '*')
return x * y;
if (c == '/'){
if(y == 0){
default:
printf(被除数不能为0!);
exit(OVERFLOW);
}
return x / y;
if (c == '+')
return x + y;
if (c == '-')
return x - y;
}
Status Operation(SqStack<char>& OPTR, SqStack<double>& OPND) {
double x, y;
char c;
Pop(&OPND, &y);//取出第二个操作数
Pop(&OPND, &x);//取出第一个操作数
Pop(&OPTR, &c);//取出运算符
Push(&OPND, getResult(x, y, c));//将运算结果压入操作数栈
return OK;
}
int main() {
SqStack<char> OPTR;//运算符栈
SqStack<double> OPND;//操作数栈
InitStack(&OPTR);//初始化栈
InitStack(&OPND);
char c = 0, t;//c为输入的运算符,t为从运算符栈中取出的运算符
int flag = FALSE;//计算状态置为未开始
printf("请输入以#开始和结束的表达式(注意!!输入的括号要为运算符括号):");
do {
c = getOperand(OPND, c);
if (c == '#')
flag = StartOrEnd(flag);
switch (c)
{
case '#'://若为开始或结束运算符
if (flag == FALSE) //得出结果
{
double result;
while (StackEmpty(OPTR) != TRUE)
Operation(OPTR, OPND);//循环运算
Pop(&OPND, &result);//
printf("\n运算结果为:%.3f", result);
}
break;
case ')'://右括号,不入栈
while (GetTop<SqStack<char>, char>(OPTR) != '(')
Operation(OPTR, OPND);
Pop(&OPTR, &t);
break;
case '*'://乘号优先级最高
Push(&OPTR, c);//直接入栈
break;
case '/':
Push(&OPTR, c);
break;
case '(':
Push(&OPTR, c);
break;
case '+'://若输入加号仅高于左括号
t = GetTop<SqStack<char>, char>(OPTR);//判断栈顶优先级
if (t == '*' || t == '/')
while (t != ERROR && t != '(')
{
Operation(OPTR, OPND);
t = GetTop<SqStack<char>, char>(OPTR);//判断是否到栈底
}
Push(&OPTR, c);
break;
case '-':
t = GetTop<SqStack<char>, char>(OPTR);
if (t == '*' || t == '/')
while (t != ERROR && t != '(')
{
Operation(OPTR, OPND);
t = GetTop<SqStack<char>, char>(OPTR);
}
Push(&OPTR, c);
break;
default://输入字符异常结束
printf("输入不正确!");
exit(OVERFLOW);
}
} while (flag == TRUE);