数据结构实验报告

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

【问题描述】

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

【基本要求】

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

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

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

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

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

【设计要求】

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

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

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

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

【测试数据】

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

【实现提示】

  假设3<赛事项目数量<=10,学校名称长度不超过20个字符。每个赛事结束时,将其编号、名称输入,并依次输入参赛学校编号、学校名称和成绩。

1.问题分析和任务定义

【所需功能】

(1)数据保存
         学校名称(ID)、队伍名称、参加项目、所得分数

(2)数据统计

学校名称(ID)、队伍名称、该队伍参加项目、该队伍在该项目所得分数

各个项目的获奖情况(4种情况:一等、二等、三等、未获奖)

(3)数据查询

输出学校总分

根据学校编号或名称输出学校的总分、各项目的总分排序(降序)

根据学校编号或名称查询学校某个项目的获奖情况

根据项目编号查询取得前三名的学校;

2.数据结构的选择和概要设计

【类的建立】 

School类:含括学校ID,学校名称,学校参赛队伍个数,总分等字段

Team类:含括所属学校ID,队伍名称,参加项目和所得分数等字段

Event类:含括一个存储Team类对象的集合表示参加该项目的队伍以及项目

Function类:其内容涉及一个存储所有参赛项目的集合events和一个存储所有参赛学校的集合schools以及各项查询功能

【算法函数】 

项目添加函数:用于添加相应的项目

学校添加函数:用于添加参赛学校

队伍添加函数:用于添加参赛队伍,该函数为主要添加函数,若在添加过程中发现不存在当前所要添加的项目或学校,则在执行结果命令行显示添加错误及原因,若学校参赛队伍达到上限,同上,学校总分计算函数:计算某学校的总分;学校总分排名的函数:按总分进行降序排序;学校的项目总分排名函数:返回一个字典集合,内含项目id和项目总分;单个项目获奖情况函数:对项目内的队伍按分数进行排名,索引为0,1,2,3;0,1,2即为前三;3则代表未获奖学校各项目获奖情况函数、

3.详细设计和编码

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);
                    }
                }
            }
        }
    }
}

4.测试结果及其分析

 

 

  

 

项目2:校园导游咨询

【问题描述】

设计一个校园导游程序,为来访的客人提供各种信息查询服务。

【基本要求】

1.设计你所在学校的校园平面图,所含景点不少于10个.以图中顶点表示校内各景点,存放景点名称、代号、简介  等信息;以边表示路径,存放路径长度等相关信息。

2.为来访客人提供图中任意景点相关信息的查询。

3.为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。

【测试数据】

以江苏科技大学长山校区为例。

【实现提示】

一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网.顶点和边均含有相关信息.

1.问题分析和任务定义

【所需功能】

(1)景点信息查询:校内各景点名称、代号、简介  等信息

(2)路径信息查询:路径长度、两景点之间的路径信息

(3)最短路径计算:输出任意两个景点之间的一条最短的简单路径

(4)交互界面:实现用户查询功能

2.数据结构的选择和概要设计

【数据结构】

选择图结构解决此问题

【功能函数设计】

(1)欢迎界面,向用户显示菜单
(2)显示云图和简化图
(3)输出学校景点的基本信息
(4)查询任意两景点间的最短路径
(5)查询从某个景点开始最短路程游历完所有景点
(6)删除某个景点
(7)增加某条道路
(8)删除某条道路
(9)退出系统

  3.详细设计和编码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#define inf 99999999
using namespace std;
void kaishidaohang();
void daohanglan();
int map[110][110], book[110], dis[110];

struct A		//定义结构体存储景点信息 
{
	char name[100];
	char jieshao[800];
}q[100];

void cuntu()		//存储景点信息、同时存图,各边信息 
{
	int i, j;
	strcpy(q[1].name, "学校大门"); strcpy(q[1].jieshao, "设有公交站");
	strcpy(q[2].name, "体育馆"); strcpy(q[2].jieshao, "设有室内乒乓球、室内羽毛球、室内篮球场地");
	strcpy(q[3].name, "行政楼"); strcpy(q[3].jieshao, "学校领导办公场所");
	strcpy(q[4].name, "经世楼"); strcpy(q[4].jieshao, "正门为创办人纪念馆、学校大型活动举办场所");
	strcpy(q[5].name, "图书馆"); strcpy(q[5].jieshao, "学校图书馆");
	strcpy(q[6].name, "西苑餐厅"); strcpy(q[6].jieshao, "一、二楼为餐厅,三楼为报告厅");
	strcpy(q[7].name, "笃学楼"); strcpy(q[7].jieshao, "教学楼");
	strcpy(q[8].name, "文理大楼"); strcpy(q[8].jieshao, "教学楼");
	strcpy(q[9].name, "计算机学院楼"); strcpy(q[9].jieshao, "教学楼");
	strcpy(q[10].name, "能动学院楼"); strcpy(q[10].jieshao, "教学楼");
	strcpy(q[11].name, "粮食学院大楼"); strcpy(q[11].jieshao, "教学楼");
	strcpy(q[12].name, "西门"); strcpy(q[12].jieshao, "教学楼");
	strcpy(q[13].name, "东区组团"); strcpy(q[13].jieshao, "学生宿舍楼");
	strcpy(q[14].name, "西区组团"); strcpy(q[14].jieshao, "一楼为商店学生买一些生活用品、二楼为餐厅");
	strcpy(q[15].name, "西体育场"); strcpy(q[15].jieshao, "举办运动会、锻炼身体的好去处");
	strcpy(q[16].name, "东体育场"); strcpy(q[16].jieshao, "外有小吃");
	strcpy(q[17].name, "东苑餐厅"); strcpy(q[17].jieshao, "学生活动场所");
	strcpy(q[18].name, "东门"); strcpy(q[18].jieshao, "一楼二楼为餐厅、三楼为学生社团活动室");
	strcpy(q[19].name, "好又多超市"); strcpy(q[19].jieshao, "二楼大盘鸡面不错哦!");
	strcpy(q[20].name, "后勤服务楼"); strcpy(q[20].jieshao, "一楼麻辣烫可以哦!");
	strcpy(q[21].name, "材料学院楼"); strcpy(q[21].jieshao, "学生宿舍楼");
	strcpy(q[22].name, "蚕研所"); strcpy(q[22].jieshao, "学生娱乐场所");
	strcpy(q[23].name, "环湖跑道"); strcpy(q[23].jieshao, "一圈1100米!");
	strcpy(q[24].name, "海韵湖"); strcpy(q[24].jieshao, "学生宿舍楼");
	strcpy(q[25].name, "云书山"); strcpy(q[25].jieshao, "那个大斜坡下雪后滑雪不错哦!");
	strcpy(q[26].name, "北苑教职工餐厅"); strcpy(q[26].jieshao, "教学楼");
	for (i = 1; i <= 28; i++)
		for (j = 1; j <= 28; j++)
		{
			if (i == j)
				map[i][j] = 0;
			else
				map[i][j] = inf;
		}
	map[1][2] = 40; map[1][16] = 140; map[1][3] = 80;
	map[2][3] = 50; map[2][1] = 40;
	map[3][4] = 50; map[3][5] = 90; map[3][17] = 50; map[3][1] = 80; map[3][2] = 50;
	map[4][6] = 70; map[4][15] = 80; map[4][3] = 50;
	map[5][3] = 90; map[5][20] = 140; map[5][17] = 130; map[5][7] = 90;
	map[6][4] = 70; map[6][8] = 40; map[6][7] = 30;
	map[7][6] = 30; map[7][10] = 80; map[7][5] = 90;
	map[8][6] = 40; map[8][9] = 30;
	map[9][8] = 30; map[9][10] = 60; map[9][15] = 90;
	map[10][9] = 60; map[10][7] = 80; map[10][11] = 60;
	map[11][10] = 60; map[11][12] = 60;
	map[12][11] = 60; map[12][13] = 100;
	map[13][12] = 100; map[13][14] = 70;
	map[14][13] = 70; map[14][16] = 100; map[14][15] = 80;
	map[15][9] = 90; map[15][4] = 80; map[15][14] = 80; map[15][16] = 90;
	map[16][1] = 140; map[16][15] = 90; map[16][14] = 100;
	map[17][3] = 50; map[17][5] = 130; map[17][18] = 40;
	map[18][17] = 40; map[18][19] = 50; map[18][20] = 40;
	map[19][18] = 50; map[19][24] = 150;
	map[20][18] = 40; map[20][21] = 30; map[20][5] = 140;
	map[21][20] = 30;
	map[22][23] = 50; map[22][25] = 70;
	map[23][22] = 50; map[23][24] = 130;
	map[24][19] = 150; map[24][23] = 130; map[24][25] = 100;
	map[25][22] = 70; map[25][24] = 100; map[25][26] = 200;
	map[26][25] = 200;
	//	for(i=1;i<=26;i++)
	//	{
	//		for(j=1;j<=26;j++)
	//			printf("%d ",map[i][j]);
	//		printf("\n"); 
	//	}
	for (i = 1; i <= 26; i++)
		for (j = 1; j <= 26; j++)
			map[j][i] = map[i][j];
	//	printf("\n\n\n\n");
	//	for(i=1;i<=26;i++)
	//	{
	//		for(j=1;j<=26;j++)
	//			printf("%d ",map[i][j]);
	//		printf("\n"); 
	//	}
}

void liebiao()			//景点列表 
{
	system("cls");			//清屏 
	printf("\n\n\n");
	printf("\t\t\t\t\t * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n");
	printf("\t\t\t\t\t * *                     *景点列表*                     * *\n");
	printf("\t\t\t\t\t * ****************************************************** *\n");
	printf("\t\t\t\t\t * *                                                    * *\n");
	printf("\t\t\t\t\t * *  <1>学校大门  <2>体育馆  <3>行政楼   <4>经世楼     * *\n");
	printf("\t\t\t\t\t * *                                                    * *\n");
	printf("\t\t\t\t\t * *  <5>图书馆  <6>西苑餐厅   <7>笃学楼   <8>文理大楼  * *\n");
	printf("\t\t\t\t\t * *                                                    * *\n");
	printf("\t\t\t\t\t * *  <9>计算机学院楼  <10>能动学院楼  <11>粮食学院大楼 * *\n");
	printf("\t\t\t\t\t * *                                                    * *\n");
	printf("\t\t\t\t\t * *  <12>西门       <13>西区组团      <14>东区组团     * *\n");
	printf("\t\t\t\t\t * *                                                    * *\n");
	printf("\t\t\t\t\t * *  <15>西体育场     <16>东体育场     <17>东苑餐厅    * *\n");
	printf("\t\t\t\t\t * *                                                    * *\n");
	printf("\t\t\t\t\t * *  <18>东门    <19>好又多超市    <20>后勤服务楼      * *\n");
	printf("\t\t\t\t\t * *                                                    * *\n");
	printf("\t\t\t\t\t * *  <21>材料学院楼   <22>蚕研所   <23>环湖跑道        * *\n");
	printf("\t\t\t\t\t * *                                                    * *\n");
	printf("\t\t\t\t\t * *  <24>海韵湖   <25>云书山   <26>北苑教职工餐厅      * *\n");
	printf("\t\t\t\t\t * *                                                    * *\n");
	printf("\t\t\t\t\t * ****************************************************** *\n");
	printf("\t\t\t\t\t * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n");
	printf("\n\n\n");
}

//查询方式 
int chaxunfangshi(int x)
{
	int i;
	system("cls");			//清屏 
	printf("\n");
	printf("\t\t\t\t\t                    *请输入查询方式*\n\n");
	printf("\t\t\t\t\t                  1、输入景点编号查询\n\n");
	printf("\t\t\t\t\t                  2、输入景点名称查询\n\n");
	printf("\t\t\t\t\t                  0、返回上一界面\n\n\n\n\n\n\n");
	scanf("%d", &i);
	return i;
}

//查询景点编号 
int bianhao(char s[])
{
	int f = 0, i;
	for (i = 1; i <= 26; i++)
	{
		if (strcmp(q[i].name, s) == 0)
			return i;
	}
	return -1;
}

void Dijkstra(int v0, int s)		//迪杰斯特拉求最短路径,并输出路线 
{
	int min, i, j, u, v;
	int p[110], l[110];
	memset(p, -1, sizeof(p));
	memset(l, 0, sizeof(l));
	memset(book, 0, sizeof(book));
	for (i = 1; i <= 26; i++)
	{
		dis[i] = map[v0][i];
		if (dis[i] < inf)			//v0能直接到达,即上一站点为v0 
			p[i] = v0;
	}

	book[v0] = 1;

	for (i = 1; i < 26; i++)
	{
		min = inf;
		for (j = 1; j <= 26; j++)			//每次找出距离v0最近点 
		{
			if (book[j] == 0 && dis[j] < min)
			{
				min = dis[j];
				u = j;
			}
		}
		book[u] = 1;			//标记该点 
		for (v = 1; v <= 26; v++)
		{
			if (book[v] == 0 && dis[v] > dis[u] + map[u][v])			//通过最近点更新其他边 
			{
				p[v] = u;					//存储更新的边,即为路线 
				dis[v] = dis[u] + map[u][v];
			}
		}
	}
	v = s;
	i = 1;
	while (p[v] != v0)			//将路线存入栈中,正序输出 
	{

		l[i++] = p[v];
		v = p[v];
	}
	printf("\n");
	u = i - 1;
	printf("路线为:\n");
	printf("%s--->", q[v0].name);
	for (i = u; i >= 1; i--)
		printf("%s--->", q[l[i]].name);
	printf("%s\n", q[s].name);
	printf("最短路径长度为:%d 米\n", dis[s]);
}

//导航界面 
void kaishidaohang()
{
	int x, m, n, u, v, i, j;
	char c[100];
	system("cls");			//清屏 
	printf("\n\n\n");
	printf("\t\t\t\t ■■■■■■■■■■■■■■■■■■■■■■■■■■\n");
	printf("\t\t\t\t ■                                                ■\n");
	printf("\t\t\t\t ■欢 迎 使 用 江 苏 科 技 大 学 校 园 导 航 系 统 ■\n");
	printf("\t\t\t\t ■                                                ■\n");
	printf("\t\t\t\t ■■■■■■■■■■■■■■■■■■■■■■■■■■\n");
	printf("\n\n\n");
	printf("\t\t\t    1、遍历所有景点;\t\t\t2、查询任意景点信息;\n\n\n");
	printf("\t\t\t    3、查询任意两景点间的最短路径;     4、返回至主界面;\n");
	printf("\n\n\n");

	while (1)//实现输入错误可重新输入 
	{
		scanf("%d", &x);
		if (x == 1)
		{
			v = chaxunfangshi(x);
			while (1)
			{
				if (v == 1)
				{
					liebiao();
					printf("请输入当前所在景点编号:\n");
					scanf("%d", &n);
					while (1)
					{
						if (n >= 1 && n <= 26)
						{
							for (i = 1; i <= 26; i++)
							{
								if (i != n)
									Dijkstra(n, i);
							}
							printf("\n\n按回车键返回至导航系统界面\n\n");
							getchar(); getchar();
							kaishidaohang();
							break;
						}
						else
						{
							printf("\n该景点不存在!请重新输入景点编号:\n");
							scanf("%d", &n);
						}
					}
					break;
				}
				else if (v == 2)
				{
					liebiao();
					printf("请输入当前所在景点名称:\n");
					scanf("%s", c);
					n = bianhao(c);
					while (1)
					{
						if (n >= 1 && n <= 26)
						{
							for (i = 1; i <= 26; i++)
							{
								if (i != n)
									Dijkstra(n, i);
							}
							printf("\n\n按回车键返回至导航系统界面\n\n");
							getchar(); getchar();
							kaishidaohang();
							break;
						}
						else
						{
							printf("\n该景点不存在!请重新输入景点名称:\n");
							scanf("%s", c);
							n = bianhao(c);
						}
					}
					break;
				}
				else if (v == 0)
				{
					kaishidaohang();
					break;
				}
				else
				{
					printf("\n\n输入错误请重新输入!\n\n");
					scanf("%d", &v);
				}
			}
			break;
		}
		else if (x == 2)
		{
			v = chaxunfangshi(x);
			while (1)
			{
				if (v == 1)
				{
					liebiao();
					printf("请输入景点编号:\n");
					scanf("%d", &n);
					while (1)
					{
						if (n >= 1 && n <= 26)
						{
							printf("\n\n%s\n\n%s\n\n", q[n].name, q[n].jieshao);
							printf("按回车键返回至导航系统界面\n\n");
							getchar(); getchar();
							kaishidaohang();
							break;
						}
						else
						{
							printf("\n该景点不存在!请重新输入景点编号:\n");
							scanf("%d", &n);
						}
					}
					break;
				}
				else if (v == 2)
				{
					liebiao();
					printf("请输入景点名称:\n");
					scanf("%s", c);
					n = bianhao(c);
					while (1)
					{
						if (n >= 1 && n <= 26)
						{
							printf("\n\n%s\n\n%s\n\n", q[n].name, q[n].jieshao);
							printf("按回车键返回至导航系统界面\n\n");
							getchar(); getchar();
							kaishidaohang();
							break;
						}
						else
						{
							printf("\n该景点不存在!请重新输入景点名称:\n");
							scanf("%s", c);
							n = bianhao(c);
						}
					}
					break;
				}
				else if (v == 0)
				{
					kaishidaohang();
					break;
				}
				else
				{
					printf("\n\n输入错误请重新输入!\n\n");
					scanf("%d", &v);
				}
			}
			break;
		}
		else if (x == 3)
		{
			v = chaxunfangshi(x);
			while (1)
			{
				if (v == 1)
				{
					liebiao();
					printf("请输入起点景点编号:\n");
					scanf("%d", &n);
					printf("\n请输入终点景点编号:\n");
					scanf("%d", &m);
					while (1)
					{
						if (n >= 1 && n <= 26 && m >= 1 && m <= 26 && n != m)
						{
							Dijkstra(n, m);
							printf("\n\n按回车键返回至导航系统界面\n\n");
							getchar(); getchar();
							kaishidaohang();
							break;
						}
						else
						{
							printf("\n输入不合法!请重新输入!\n\n");
							printf("请输入起点景点编号:\n");
							scanf("%d", &n);
							printf("\n请输入终点景点编号:\n");
							scanf("%d", &m);
						}
					}
					break;
				}
				else if (v == 2)
				{
					liebiao();
					printf("请输入起点景点名称:\n");
					scanf("%s", c);
					n = bianhao(c);
					printf("\n请输入终点景点名称:\n");
					scanf("%s", c);
					m = bianhao(c);
					while (1)
					{
						if (n >= 1 && n <= 26 && m >= 1 && m <= 26 && n != m)
						{
							Dijkstra(n, m);
							printf("\n\n按回车键返回至导航系统界面\n\n");
							getchar(); getchar();
							kaishidaohang();
							break;
						}
						else
						{
							printf("\n输入不合法!请重新输入!\n\n");
							printf("请输入起点景点名称:\n");
							scanf("%s", c);
							n = bianhao(c);
							printf("\n请输入终点景点名称:\n");
							scanf("%s", c);
							m = bianhao(c);
						}
					}
					break;
				}
				else if (v == 0)
				{
					kaishidaohang();
					break;
				}
				else
				{
					printf("\n\n输入错误请重新输入!\n\n");
					scanf("%d", &v);
				}
			}
			break;
		}
		else if (x == 4)
		{
			daohanglan();
			break;
		}
		else
		{
			printf("\n\n输入错误!请重新输入!\n");
		}
	}

}

//导航栏主界面 
void daohanglan()
{
	system("cls");		//清屏 
	int m;
	printf("\n\n\n\n\n");
	printf("\t\t\t\t\t    ******************************************************\n");
	printf("\t\t\t\t\t    *----------------------主界面------------------------*\n");
	printf("\t\t\t\t\t    *----------------------------------------------------*\n");
	printf("\t\t\t\t\t    *----------------1、进入导航系统---------------------*\n");
	printf("\t\t\t\t\t    *----------------------------------------------------*\n");
	printf("\t\t\t\t\t    *----------------2、学校简介-------------------------*\n");
	printf("\t\t\t\t\t    *----------------------------------------------------*\n");
	printf("\t\t\t\t\t    *----------------3、退出程序-------------------------*\n");
	printf("\t\t\t\t\t    *----------------------------------------------------*\n");
	printf("\t\t\t\t\t    *----------------4、制作人---------------------------*\n");
	printf("\t\t\t\t\t    *----------------------------------------------------*\n");
	printf("\t\t\t\t\t    ******************************************************\n");
	scanf("%d", &m);
	while (1)
	{
		if (m == 1)
		{
			kaishidaohang();
			break;
		}
		else if (m == 2)
		{
			system("cls");
			printf("\n\n\n\n\n");
			printf("\t\t\t\t\t    ****************************************************\n");
			printf("\t\t\t\t\t    *                                                  *\n");
			printf("\t\t\t\t\t    *   江苏科技大学,简称“江科大”,位于江苏省镇江市 *\n");
			printf("\t\t\t\t\t    *                                                  *\n");
			printf("\t\t\t\t\t    * 是江苏省重点建设高校,江苏省人民政府与中国船舶集 *\n");
			printf("\t\t\t\t\t    *                                                  *\n");
			printf("\t\t\t\t\t    * 团有限公司共建高校,国家国防科技工业局与江苏省人 *\n");
			printf("\t\t\t\t\t    *                                                  *\n");
			printf("\t\t\t\t\t    * 民政府共建高校。学校源自1933年创办的上海大公职业 *\n");
			printf("\t\t\t\t\t    *                                                  *\n");
			printf("\t\t\t\t\t    * 学校,于2004年更名为江苏科技大学。               *\n");
			printf("\t\t\t\t\t    *                                                  *\n");
			printf("\t\t\t\t\t    ****************************************************\n");
			printf("\n\n\n\n\n");
			printf("按回车键返回主界面\n");
			getchar(); getchar();
			daohanglan();
			break;
		}
		else if (m == 3)
		{
			system("cls");
			printf("\n\n\n\n\n");
			printf("\t\t\t\t\t∴∵∴∵∴∵∴∵∴∵∴∵∴∵∴\n");
			printf("\t\t\t\t\t∴∵                      ∴∵\n");
			printf("\t\t\t\t\t∴∵      欢 迎 使 用     ∴∵\n");
			printf("\t\t\t\t\t∴∵                      ∴∵\n");
			printf("\t\t\t\t\t∴∵∴∵∴∵∴∵∴∵∴∵∴∵∴\n");
			printf("\n\n\n");
			break;
		}
		else if (m == 4)
		{
			system("cls");		//清屏 
			printf("\n\n\n\n\n");
			printf("\t\t\t\t\t    ****************************************************\n");
			printf("\t\t\t\t\t    *                     制作人                       *\n");
			printf("\t\t\t\t\t    *                                                  *\n");
			printf("\t\t\t\t\t    *              江苏科技大学计算机学院              *\n");
			printf("\t\t\t\t\t    *                                                  *\n");
			printf("\t\t\t\t\t    *                20级软件工程2班                   *\n");
			printf("\t\t\t\t\t    *                                                  *\n");
			printf("\t\t\t\t\t    *                     崔捍博                       *\n");
			printf("\t\t\t\t\t    *                                                  *\n");
			printf("\t\t\t\t\t    ****************************************************\n");
			printf("\n\n\n\n\n");
			printf("按回车键返回主界面\n");
			getchar(); getchar();
			daohanglan();
			break;
		}
		else
		{
			printf("\n\n\n\t\t输入错误请重新输入!\n\n\n\n");
			scanf("%d", &m);
		}
	}

}

//欢迎进入 
void zhujiemian()
{
	printf("\n\n\n\n\n");
	printf("\t\t\t\t\t    ******************************************************\n");
	printf("\t\t\t\t\t    *----------------------------------------------------*\n");
	printf("\t\t\t\t\t    *----------------------------------------------------*\n");
	printf("\t\t\t\t\t    *---------------------Welcome!-----------------------*\n");
	printf("\t\t\t\t\t    *----------------------------------------------------*\n");
	printf("\t\t\t\t\t    *--------------江苏科技大学校园导航系统--------------*\n");
	printf("\t\t\t\t\t    *----------------------------------------------------*\n");
	printf("\t\t\t\t\t    *-------------------按回车键继续---------------------*\n");
	printf("\t\t\t\t\t    *----------------------------------------------------*\n");
	printf("\t\t\t\t\t    *----------------------------------------------------*\n");
	printf("\t\t\t\t\t    ******************************************************\n");
	getchar();

	daohanglan();
}

int main(void)
{
	system("mode con cols=150 lines=200");		//改变运行窗口大小 
	cuntu();
	//getchar();getchar();
	zhujiemian();
	return 0;
}

  4.测试结果及其分析

  

项目3:算术表达式求解

【问题描述】
设计一个简单的算术表达式计算器。
【基本要求】
 实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入).
【测试数据】
(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

1.问题分析和任务定义

【简要分析】

首先可以想到的是双栈,一个作为数栈用来存放数,另一个作为符号栈用来存放运算符。遍  历算数表达式,如果是数字就入数栈,如果是符号就分情况:

1.如果当前符号栈为空,则直接入栈;

2.如果当前符号栈不为空,则进行比较。如果当前的操作符的优先级小于或等于栈中操作符,就从栈中pop出两个数,从符号栈中pop出一个符号进行运算,再将得到的结果入数栈,然后将当前的符号入符号栈;如果当前的操作符的优先级大于栈中的操作符,就直接入符号栈。

3.算术表达式扫描完了后,顺序的从数栈和符号栈中pop出相应的数和符号并运行;

4.最后在数栈中剩下的最后的数字就是表达式的结果。

2.数据结构的选择和概要设计

【数据结构】

选择的是栈结构,分为操作栈和运算符栈

【流程图】 

3.详细设计和编码

#include<stdio.h>
#include<stdlib.h>
#define defaultsize 10
#define increasesize 5
typedef struct {
	char* base;
	char* top;
	int stacksize;//栈的存储容量 
}OPRTstack;
typedef struct {
	double* base;
	double* top;
	int stacksize;
}NUMstack;
int createStack(OPRTstack* s)
{
	s->base = (char*)malloc(sizeof(char) * defaultsize);
	if (!s->base)return 0;
	s->top = s->base;
	s->stacksize = 10;
	return 1;
}
int pop(OPRTstack* s, char* e)
{
	if (s->top == s->base)return 0;
	s->top--;
	*e = *(s->top);
	return 1;
}
int push(OPRTstack* s, char e)
{
	if (s->top - s->base >= s->stacksize)
	{
		s->base = (char*)realloc(s->base, sizeof(char) * (s->stacksize + increasesize));
		if (!s->base)return 0;
		s->top = s->base + s->stacksize;
		s->stacksize += increasesize;

	}
	*(s->top) = e;
	s->top++;
}
int isEmpty(OPRTstack* s)
{
	if (s->top == s->base)return 1;
	else return 0;
}
char GetTop(OPRTstack* s)
{
	if (!isEmpty(s))
	{
		char* temp = s->top;
		temp--;
		return *(temp);
	}
	else return '!';//这样定义的话,栈里面不能存储!这个数据 
}
void showStack(OPRTstack* s)
{
	if (isEmpty(s))return;
	for (int i = 0; i < s->top - s->base; i++)
	{
		printf("%c ", s->base[i]);
	}
	printf("  ");
}
//看起来代码很多,其实下面的函数定义和上面的几乎一模一样,只是传递的参数不同而已

int createStack(NUMstack* s)
{
	s->base = (double*)malloc(sizeof(double) * defaultsize);
	if (!s->base)return 0;
	s->top = s->base;
	s->stacksize = 10;
	return 1;
}
int pop(NUMstack* s, double* e)
{
	if (s->top == s->base)return 0;
	s->top--;
	*e = *(s->top);
	return 1;
}
int push(NUMstack* s, double e)
{
	if (s->top - s->base >= s->stacksize)
	{
		s->base = (double*)realloc(s->base, sizeof(double) * (s->stacksize + increasesize));
		if (!s->base)return 0;
		s->top = s->base + s->stacksize;
		s->stacksize += increasesize;

	}
	*(s->top) = e;
	s->top++;
}
int isEmpty(NUMstack* s)
{
	if (s->top == s->base)return 1;
	else return 0;
}
double GetTop(NUMstack* s)
{
	if (!isEmpty(s))
	{
		double* temp = s->top;
		temp--;
		return *(temp);
	}
	else return -1;//这样定义的话,栈里面不能存储!这个数据 
}
void showStack(NUMstack* s)
{
	if (isEmpty(s))return;
	for (int i = 0; i < s->top - s->base; i++)
	{
		printf("%f ", s->base[i]);
	}
	printf("  ");
}



int isOPRT(char c)//判断c是不是运算符 
{
	if (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')' || c == '#')return 1;
	else return 0;
}
char compare(char a, char b)
{
	if (a == '+')
	{
		if (b == '*' || b == '/' || b == '(') return '<';
		else return '>';
	}
	else if (a == '-')
	{
		if (b == '*' || b == '/' || b == '(') return '<';
		else return '>';
	}
	else if (a == '*')
	{
		if (b == '(')return '<';
		else return '>';
	}
	else if (a == '/')
	{
		if (b == '(')return '<';
		else return '>';
	}
	else if (a == '(')
	{
		if (b == ')')return '=';
		else if (b == '#') return '!';
		else return '<';
	}
	else if (a == ')')
	{
		if (b == '(')return '!';
		else return '>';

	}
	else if (a == '#')
	{
		if (b == ')')return '!';
		if (b == '#')return '=';
		else return '<';
	}
}
double calculate(double left, double right, char operators)
{
	switch (operators)
	{
	case '+':
		return left + right;

	case '-':
		return 1.0 * left - right;

	case '*':
		return left * right;

	case '/':
		return 1.0 * left / right;
	}
}


int main()
{
	OPRTstack oprt;//运算符栈 
	NUMstack  num;//运算数字栈 
	NUMstack temp;//缓冲区,用于构建完整的运算数字 
	int build = 0;//由若干数位构成的数字 
	double index;//某个数位上的数字 
	int complex = 1;//10的幂次 
	char operators;//基本表达式中的四则运算符 
	double left, right;//基本表达式中左右运算数字 
	createStack(&num);
	createStack(&oprt);
	createStack(&temp);
	printf("键入运算表达式,以#结束\n");
	push(&oprt, '#');
	char c = getchar();
	int error = 0;//syntax error 标识符 
	while (c != '#' || GetTop(&oprt) != '#')
	{
		while (!isOPRT(c))//读入的是数字 
		{
			push(&temp, c - '0');
			c = getchar();
		}
		while (!isEmpty(&temp))//将读取到的数字字符存入缓冲区,构建完整的运算数字 
		{
			pop(&temp, &index);
			build += (index * complex);
			complex *= 10;

		}
		complex = 1;
		if (build)push(&num, double(build));//将此运算数字压入栈num 
		printf("\n运算符栈:");
		showStack(&oprt);
		printf("运算数栈:");
		showStack(&num);//每次压栈弹栈都需要打印信息 
		build = 0;

		if (isOPRT(c))//读入的是运算符 
		{
			switch (compare(GetTop(&oprt), c)) {
			case '<':
				push(&oprt, c);
				c = getchar();
				printf("\n运算符栈:");
				showStack(&oprt);
				printf("运算数栈:");
				showStack(&num);
				break;

			case '=':
				pop(&oprt, &operators);
				c = getchar();
				printf("\n运算符栈:");
				showStack(&oprt);
				printf("运算数栈:");
				showStack(&num);
				break;

			case '>':
				pop(&oprt, &operators);
				pop(&num, &right);
				pop(&num, &left);
				push(&num, calculate(left, right, operators));//从num栈弹出两个运算数字,利用运算符栈顶元素进行计算 
				printf("\n运算符栈:");
				showStack(&oprt);
				printf("运算数栈:");
				showStack(&num);
				break;

			case '!':
				printf("Syntax Error!");
				error = 1;
				break;
			}



		}
		if (error)break;
	}
	if (!error)printf("结果为:%f", GetTop(&num));
	return 0;
}

4.测试结果及其分析

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值