数据结构课程设计预习报告

目录

项目一: 中国计算机设计大赛赛事统计

         【问题描述】

                  【基本要求】

                  【设计要求】

                  【测试数据】

                  【初步思考】

                  【流程图】

【需实现的功能】

【代码实现】

项目二:校园导游咨询

         【问题描述】

                  【基本要求】

                  【测试数据】

                  【算法分析】

                  【算法设计】

【代码实现】

项目三:算数表达式求解

         【问题描述】

                  【基本要求】

                  【测试数据】

                  【实现提示】

                  【思路】

                  【逻辑设计】

【代码实现】

项目一: 中国计算机设计大赛赛事统计

【问题描述】
参加计算机设计大赛的n个学校编号为1~n,赛事分成m个项目,项目的编号为1~m.比赛获奖按照得分降序,取前三名,写一个统计程序产生各种成绩单和得分报表。

【基本要求】

  1. 每个比赛项目至少有10支参赛队;每个学校最多有6支队伍参赛;

  2. 能统计各学校的总分;

  3. 可以按照学校编号或名称,学校的总分、各项目的总分排序输出;

  4. 可以按学校编号查询学校某个项目的获奖情况;可以按项目编号查询取得前三名的学校;

  5. 数据存入文件并能随时查询

【设计要求】

  1. 输入数据形式和范围:可以输入学校的名称,赛事项目的名称。

  2. 输出形式:有中文提示,各学校分数为整数

  3. 界面要求:交互设计要合理,每个功能可以设立菜单,根据提示,可以完成相关功能的要求。

  4. 存储结构:学生自己根据系统功能要求自己设计,但是赛事相关数据要存储在文件中。

【测试数据】
要求使用全部合法数据,整体非法数据,局部非法数据。进行程序测试,以保证程序的稳定。

【实现提示】
假设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 &amp;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&amp;&amp;i!=j)
                G.arcs[i][j]=MX;
        }
    G.arcnum=13;
}
void Change(AMGragh &amp;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&amp;&amp;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);
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值