项目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.测试结果及其分析