数据结构课程设计

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

一、问题及要求

【问题描述】

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

【基本要求】

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

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

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

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

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

【设计要求】

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

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

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

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

【测试数据】 

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

【实现提示】 

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

二、数据结构的选择和概要设计

初步思考

1)从交互性来看,为了更好的参与感,我首先编写了一个菜单栏,使用者可以通过键入选择想要进行的操作。一开始本来想要使用列表和数组来写,但是貌似有些不兼容,并且二者对应起来十分的麻烦,我的朋友向我推荐了C++里面的结构体,但是对我而言还是Java更加的熟悉,奈何Java的结构体不是很了解,故先搁置。

2)我慢慢的搞清楚了一些Java的结构体的用法,值得注意的是使用的时候要创建对象。然后就有一个新的问题出现,那就是应该怎么定义?或者说定义几个结构体。如果我以项目为基本单位,以"项目编号,项目名称,参加项目的学校的编号,参加项目学校的名称,该学校取得的分数"这样写,那么单项目总分和学校排名以及取前三名将会变得非常简单,但是这样的话我就需要思考的是学校总分如何去计算。

数据结构的选择

赛事统计系统,选择数据结构里的树的结构来解决

概要设计

流程图

 

详细设计和编码

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

}

}

}

}

}

}

  • 用户使用说明

如上文注释

项目2:校园导游咨询

一、问题及要求

【问题描述】 

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

基本要求】

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

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

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

【测试数据】 

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

【实现提示】 

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

二、数据结构的选择和概要设计

数据结构的选择

校园导游系统,选择数据结构里的图的结构来解决

概要设计

 

 

  1. 行政楼 2.计算机学院楼 3.图书馆
    4.文理大楼 5.东苑食堂 6.明德楼
    7.西操场 8.文体中心 9.东操场
    10.笃学楼 11.西苑食堂 12.48栋学生宿舍
    13.校医院
  • 详细设计和编码

#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;

}

用户使用说明

如上文注释

项目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)功能分析

实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入)

表达式计算规则

先乘除,后加减

从左到右计算

先括号内,后括号外

2)基本思想 

 由于用户输入的算数表达式是中缀表达式,不利于机器的自动求解。而我们知道在语法扫描分析等应用场合我们一般采用后缀表达式(逆波兰式)做运算。对逆波兰式求值只需从左到右扫描,遇到操作符就将左边的两个操作数进行计算,直到整个式子扫描结束为止。

详细设计和编码

1.逻辑设计

1)优先级矩阵

//优先级矩阵 1表示优先级更高,0表示优先级更低,2表示括号相遇,-1表示不合法

//0~5 表示 (+-*/)

int priority[6][6] = {

{0,0,0,0,0,2},

{0,1,1,0,0,1},

{0,1,1,0,0,1},

{0,1,1,1,1,1},

{0,1,1,1,1,1},

{-1,1,1,1,1,1}

};

(2)数据栈和符号栈

stack<double> values;   //存放运算数

stack<char> operators;  //存放运算符

【主要功能函数】

int turnToNum(char c):将符号转变成对应的数字编号,非法符号返回-1

int compare(char a, char b):比较符号a和符号b的优先级

bool isNumber(char c):判断是否为数字

double result(double a, char c, double b):产生运算结果

2.物理设计

【核心算法段】

        for (int i = 0; i < (int)strlen(expression); i++) {

            char &c = expression[i];  //c为引用当前字符

            if (isNumber(c)) { num = num * 10 + c - '0'; }

            else if (c == ' ') continue;

            else if (turnToNum(c) != -1) {

                if (c != '(') {

                    int pre = i - 1;

                    while (expression[pre] == ' ') pre--;

                    if (expression[pre] != ')') {

                        values.push((double)num);

                        if(show)cout << "压入" << num << "\n";

                        num = 0;

                    }

                }

                if (c == '=') break;

                if (operators.empty()) {

                    if (show) cout << "压入" << c << "\n";

                    operators.push(c);

                }

                else {

                    bool goOn = true; //标记是否要继续

                    double a, b, r;        //a,b分别存放数字栈最上面的两个数字,c存放运算结果

                    while (!operators.empty() && goOn) {

                        char cTop = operators.top();

                        switch (compare(cTop, c)) {

                        case 1: //栈顶优先级比当前大,消耗栈顶操作符,并计算

                            operators.pop();

                            if (show) cout << "弹出" << cTop << "\n";

                            b = values.top(); values.pop();

                            if (show)cout << "弹出" << b << "\n";

                            a = values.top(); values.pop();

                            if (show)cout << "弹出" << a << "\n";

                            r = result(a, cTop, b);

                            values.push(r);

                            if (show)cout << "压入" << r << "\n";

                            break;

                        case 0: //栈顶优先级比当前小,将当前符号压入

                            operators.push(c);

                            if (show)cout << "压入" << c << "\n";

                            goOn = false;

                            break;

                        case 2: //特殊的,当括号相遇,仅做弹出括号操作

                            if (show)cout << "弹出" << cTop << "\n";

                            operators.pop();

                            goOn = false;

                            break;

                        }

                    }

                    if (operators.empty() && goOn) {

                        operators.push(c);

                        if (show)cout << "压入" << c << "\n";

                    }

                }

            }

            else {

                cout << "该算式非法\n";

                continue;

            }

        }

        

        while (!operators.empty()) {

            int a, b, c;

            char cTop = operators.top();

            operators.pop();

            b = values.top(); values.pop();

            a = values.top(); values.pop();

            c = result(a, cTop, b);

            values.push(c);

        }

        cout << "Answer is " << values.top() << endl;

用户使用说明

如上文注释

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值