项目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)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
【测试数据】
以江苏科技大学长山校区为例。
【实现提示】
一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网.顶点和边均含有相关信息.
二、数据结构的选择和概要设计
【数据结构的选择】
校园导游系统,选择数据结构里的图的结构来解决
【概要设计】
- 行政楼 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;
五、用户使用说明
如上文注释