数据结构课程设计
項目1:中國計算機設(shè)計大賽賽事統(tǒng)計
一、問題及要求
【問題描述】
?參加計算機設(shè)計大賽的n個學(xué)校編號為1~n,賽事分成m個項目,項目的編號為1~m.比賽獲獎按照得分降序,取前三名,寫一個統(tǒng)計程序產(chǎn)生各種成績單和得分報表。
【基本要求】
1)每個比賽項目至少有10支參賽隊;每個學(xué)校最多有6支隊伍參賽;
2)能統(tǒng)計各學(xué)校的總分;
3)可以按照學(xué)校編號或名稱,學(xué)校的總分、各項目的總分排序輸出;
4)可以按學(xué)校編號查詢學(xué)校某個項目的獲獎情況;可以按項目編號查詢?nèi)〉们叭膶W(xué)校;
5)數(shù)據(jù)存入文件并能隨時查詢
【設(shè)計要求】
1)輸入數(shù)據(jù)形式和范圍:可以輸入學(xué)校的名稱,賽事項目的名稱。
2)輸出形式:有中文提示,各學(xué)校分?jǐn)?shù)為整數(shù)
3)界面要求:交互設(shè)計要合理,每個功能可以設(shè)立菜單,根據(jù)提示,可以完成相關(guān)功能的要求。
4)存儲結(jié)構(gòu):學(xué)生自己根據(jù)系統(tǒng)功能要求自己設(shè)計,但是賽事相關(guān)數(shù)據(jù)要存儲在文件中。
【測試數(shù)據(jù)】?
要求使用全部合法數(shù)據(jù),整體非法數(shù)據(jù),局部非法數(shù)據(jù)。進行程序測試,以保證程序的穩(wěn)定。
【實現(xiàn)提示】?
假設(shè)3<賽事項目數(shù)量<=10,學(xué)校名稱長度不超過20個字符。每個賽事結(jié)束時,將其編號、名稱輸入,并依次輸入?yún)①悓W(xué)校編號、學(xué)校名稱和成績。
二、數(shù)據(jù)結(jié)構(gòu)的選擇和概要設(shè)計
【初步思考】
1)從交互性來看,為了更好的參與感,我首先編寫了一個菜單欄,使用者可以通過鍵入選擇想要進行的操作。一開始本來想要使用列表和數(shù)組來寫,但是貌似有些不兼容,并且二者對應(yīng)起來十分的麻煩,我的朋友向我推薦了C++里面的結(jié)構(gòu)體,但是對我而言還是Java更加的熟悉,奈何Java的結(jié)構(gòu)體不是很了解,故先擱置。
2)我慢慢的搞清楚了一些Java的結(jié)構(gòu)體的用法,值得注意的是使用的時候要創(chuàng)建對象。然后就有一個新的問題出現(xiàn),那就是應(yīng)該怎么定義?或者說定義幾個結(jié)構(gòu)體。如果我以項目為基本單位,以"項目編號,項目名稱,參加項目的學(xué)校的編號,參加項目學(xué)校的名稱,該學(xué)校取得的分?jǐn)?shù)"這樣寫,那么單項目總分和學(xué)校排名以及取前三名將會變得非常簡單,但是這樣的話我就需要思考的是學(xué)校總分如何去計算。
【數(shù)據(jù)結(jié)構(gòu)的選擇】
賽事統(tǒng)計系統(tǒng),選擇數(shù)據(jù)結(jié)構(gòu)里的樹的結(jié)構(gòu)來解決
【概要設(shè)計】
流程圖
?
三、詳細(xì)設(shè)計和編碼
import java.util.*;
public class test {
static int m;
//項目數(shù)
static int n;
//學(xué)校數(shù)
static Project[] project = new Project[10];
//項目
static School[] school = new School[10];
//學(xué)校
static class Project {
int projectCode;
//項目編碼
String projectName;
//項目名稱
int teamnum;
//參賽隊伍數(shù)量
int[] jointeam = new int[10];
//參賽隊伍編號
int[] score = new int[10];
//參賽隊伍成績
}
static class School {
int schoolCode;
//學(xué)校編碼
String schoolName;
//學(xué)校名稱
int sum;
//項目總分
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入項目的數(shù)目:");
m = sc.nextInt();
if (m <= 0) {
System.out.println("輸入有誤!");
System.exit(0);
}
System.out.println("請輸入學(xué)校的數(shù)目:");
n = sc.nextInt();
if (n <= 0) {
System.out.println("輸入有誤!");
System.exit(0);
}
while (true) {
System.out.println("**********************");
System.out.println("歡迎使用賽事統(tǒng)計查詢系統(tǒng)");
System.out.println("1.添加信息");
System.out.println("2.按學(xué)校編號排序輸出");
System.out.println("3.按項目總分排序輸出");
System.out.println("4.按學(xué)校編號查詢學(xué)校某個項目的獲獎情況");
System.out.println("5.按項目編號查詢?nèi)〉们叭膶W(xué)校");
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);
}
//錄入學(xué)校
for (int i = 0; i < n; i++) {
school[i] = new School();
school[i].schoolCode = i + 1;
System.out.println("請輸入第" + (i + 1) + "個學(xué)校的名稱:");
school[i].schoolName = sc.nextLine();
System.out.println("添加成功!");
}
for (int i = 0; i < n; i++) {
System.out.println("學(xué)校編號" + school[i].schoolCode +
"學(xué)校名稱" + school[i].schoolName);
}
for (int i = 0; i < m; i++) {
System.out.println("請輸入?yún)⒓?#34; + project[i].projectName + "的學(xué)校數(shù)量:");
project[i].teamnum = sc.nextInt();
System.out.println("請依次輸入?yún)⒓?#34; + project[i].projectName + "的學(xué)校編號:");
for (int j = 0; j < project[i].teamnum; j++) {
project[i].jointeam[j] = sc.nextInt();
System.out.println("輸入成功!");
}
System.out.println("參加項目" + project[i].projectName + "的學(xué)校有");
for (int j = 0; j < project[i].teamnum; j++) {
System.out.println(project[i].jointeam[j] + " ");
}
//錄入分?jǐn)?shù)
System.out.println("請依次輸入?yún)⒓?#34; + project[i].projectName + "的學(xué)校的分?jǐn)?shù)");
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] + "的學(xué)校取得的成績:" + project[i].score[j]);
}
}
}
public static void printByCodes() {
//按學(xué)校編號排序輸出
int sum = 0;
for (int i = 0; i < n; i++) {
System.out.println("學(xué)校編號:" + school[i].schoolCode);
System.out.println("學(xué)校名稱:" + 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("學(xué)校取得的總分是:" + 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("按照總分排序?qū)W校如下:");
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) + "名的學(xué)校是" + school[j].schoolName);
System.out.println("其總分是:" + school[j].sum);
System.out.println("*******");
}
}
}
}
public static void findByCodes() {
//按學(xué)校編號查詢學(xué)校某個項目的獲獎情況
Scanner sc = new Scanner(System.in);
System.out.println("請輸入你想要查詢的學(xué)校編號");
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("該學(xué)校在該項目中排第" + j + "名");
}
}
}
}
public static void getTopThree() {
//按項目編號查詢?nèi)〉们叭膶W(xué)校
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("第一名的學(xué)校是:" + school[j].schoolName);
}
}
if (temps[len - 2] == project[code - 1].score[i]) {
if (school[j].schoolCode == project[code - 1].jointeam[i]) {
System.out.println("第二名的學(xué)校是:" + school[j].schoolName);
}
}
if (temps[len - 3] == project[code - 1].score[i]) {
if (school[j].schoolCode == project[code - 1].jointeam[i]) {
System.out.println("第三名的學(xué)校是:" + school[j].schoolName);
}
}
}
}
}
}
- 五、用戶使用說明
如上文注釋
項目2:校園導(dǎo)游咨詢
一、問題及要求
【問題描述】?
設(shè)計一個校園導(dǎo)游程序,為來訪的客人提供各種信息查詢服務(wù)。
【基本要求】
1)設(shè)計你所在學(xué)校的校園平面圖,所含景點不少于10個.以圖中頂點表示校內(nèi)各景點,存放景點名稱、代號、簡介??等信息;以邊表示路徑,存放路徑長度等相關(guān)信息。
2)為來訪客人提供圖中任意景點相關(guān)信息的查詢。
3)為來訪客人提供圖中任意景點的問路查詢,即查詢?nèi)我鈨蓚€景點之間的一條最短的簡單路徑。
【測試數(shù)據(jù)】?
以江蘇科技大學(xué)長山校區(qū)為例。
【實現(xiàn)提示】?
一般情況下,校園的道路是雙向通行的,可設(shè)校園平面圖是一個無向網(wǎng).頂點和邊均含有相關(guān)信息.
二、數(shù)據(jù)結(jié)構(gòu)的選擇和概要設(shè)計
【數(shù)據(jù)結(jié)構(gòu)的選擇】
校園導(dǎo)游系統(tǒng),選擇數(shù)據(jù)結(jié)構(gòu)里的圖的結(jié)構(gòu)來解決
【概要設(shè)計】
?
?
4.文理大樓 5.東苑食堂 6.明德樓
7.西操場 8.文體中心 9.東操場
10.篤學(xué)樓 11.西苑食堂 12.48棟學(xué)生宿舍
13.校醫(yī)院
- 詳細(xì)設(shè)計和編碼
#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 //定義結(jié)構(gòu)體存儲景點信息
{
char name[100];
char jieshao[800];
}q[100];
void cuntu() //存儲景點信息、同時存圖,各邊信息
{
int i, j;
strcpy(q[1].name, "學(xué)校大門"); strcpy(q[1].jieshao, "設(shè)有公交站");
strcpy(q[2].name, "體育館"); strcpy(q[2].jieshao, "設(shè)有室內(nèi)乒乓球、室內(nèi)羽毛球、室內(nèi)籃球場地");
strcpy(q[3].name, "行政樓"); strcpy(q[3].jieshao, "學(xué)校領(lǐng)導(dǎo)辦公場所");
strcpy(q[4].name, "經(jīng)世樓"); strcpy(q[4].jieshao, "正門為創(chuàng)辦人紀(jì)念館、學(xué)校大型活動舉辦場所");
strcpy(q[5].name, "圖書館"); strcpy(q[5].jieshao, "學(xué)校圖書館");
strcpy(q[6].name, "西苑餐廳"); strcpy(q[6].jieshao, "一、二樓為餐廳,三樓為報告廳");
strcpy(q[7].name, "篤學(xué)樓"); strcpy(q[7].jieshao, "教學(xué)樓");
strcpy(q[8].name, "文理大樓"); strcpy(q[8].jieshao, "教學(xué)樓");
strcpy(q[9].name, "計算機學(xué)院樓"); strcpy(q[9].jieshao, "教學(xué)樓");
strcpy(q[10].name, "能動學(xué)院樓"); strcpy(q[10].jieshao, "教學(xué)樓");
strcpy(q[11].name, "糧食學(xué)院大樓"); strcpy(q[11].jieshao, "教學(xué)樓");
strcpy(q[12].name, "西門"); strcpy(q[12].jieshao, "教學(xué)樓");
strcpy(q[13].name, "東區(qū)組團"); strcpy(q[13].jieshao, "學(xué)生宿舍樓");
strcpy(q[14].name, "西區(qū)組團"); strcpy(q[14].jieshao, "一樓為商店學(xué)生買一些生活用品、二樓為餐廳");
strcpy(q[15].name, "西體育場"); strcpy(q[15].jieshao, "舉辦運動會、鍛煉身體的好去處");
strcpy(q[16].name, "東體育場"); strcpy(q[16].jieshao, "外有小吃");
strcpy(q[17].name, "東苑餐廳"); strcpy(q[17].jieshao, "學(xué)生活動場所");
strcpy(q[18].name, "東門"); strcpy(q[18].jieshao, "一樓二樓為餐廳、三樓為學(xué)生社團活動室");
strcpy(q[19].name, "好又多超市"); strcpy(q[19].jieshao, "二樓大盤雞面不錯哦!");
strcpy(q[20].name, "后勤服務(wù)樓"); strcpy(q[20].jieshao, "一樓麻辣燙可以哦!");
strcpy(q[21].name, "材料學(xué)院樓"); strcpy(q[21].jieshao, "學(xué)生宿舍樓");
strcpy(q[22].name, "蠶研所"); strcpy(q[22].jieshao, "學(xué)生娛樂場所");
strcpy(q[23].name, "環(huán)湖跑道"); strcpy(q[23].jieshao, "一圈1100米!");
strcpy(q[24].name, "海韻湖"); strcpy(q[24].jieshao, "學(xué)生宿舍樓");
strcpy(q[25].name, "云書山"); strcpy(q[25].jieshao, "那個大斜坡下雪后滑雪不錯哦!");
strcpy(q[26].name, "北苑教職工餐廳"); strcpy(q[26].jieshao, "教學(xué)樓");
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>學(xué)校大門 ?<2>體育館 ?<3>行政樓 ??<4>經(jīng)世樓 ????* *\n");
printf("\t\t\t\t\t * * ???????????????????????????????????????????????????* *\n");
printf("\t\t\t\t\t * * ?<5>圖書館 ?<6>西苑餐廳 ??<7>篤學(xué)樓 ??<8>文理大樓 ?* *\n");
printf("\t\t\t\t\t * * ???????????????????????????????????????????????????* *\n");
printf("\t\t\t\t\t * * ?<9>計算機學(xué)院樓 ?<10>能動學(xué)院樓 ?<11>糧食學(xué)院大樓 * *\n");
printf("\t\t\t\t\t * * ???????????????????????????????????????????????????* *\n");
printf("\t\t\t\t\t * * ?<12>西門 ??????<13>西區(qū)組團 ?????<14>東區(qū)組團 ????* *\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>后勤服務(wù)樓 ?????* *\n");
printf("\t\t\t\t\t * * ???????????????????????????????????????????????????* *\n");
printf("\t\t\t\t\t * * ?<21>材料學(xué)院樓 ??<22>蠶研所 ??<23>環(huán)湖跑道 ???????* *\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能直接到達(dá),即上一站點為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; //標(biāo)記該點
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]);
}
//導(dǎo)航界面
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 ■歡 迎 使 用 江 蘇 科 技 大 學(xué) 校 園 導(dǎo) 航 系 統(tǒng) ■\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èi)我饩包c信息;\n\n\n");
printf("\t\t\t ???3、查詢?nèi)我鈨删包c間的最短路徑; ????4、返回至主界面;\n");
printf("\n\n\n");
while (1)//實現(xiàn)輸入錯誤可重新輸入
{
scanf("%d", &x);
if (x == 1)
{
v = chaxunfangshi(x);
while (1)
{
if (v == 1)
{
liebiao();
printf("請輸入當(dāng)前所在景點編號:\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按回車鍵返回至導(dǎo)航系統(tǒng)界面\n\n");
getchar(); getchar();
kaishidaohang();
break;
}
else
{
printf("\n該景點不存在!請重新輸入景點編號:\n");
scanf("%d", &n);
}
}
break;
}
else if (v == 2)
{
liebiao();
printf("請輸入當(dāng)前所在景點名稱:\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按回車鍵返回至導(dǎo)航系統(tǒng)界面\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("按回車鍵返回至導(dǎo)航系統(tǒng)界面\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("按回車鍵返回至導(dǎo)航系統(tǒng)界面\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按回車鍵返回至導(dǎo)航系統(tǒng)界面\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按回車鍵返回至導(dǎo)航系統(tǒng)界面\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");
}
}
}
//導(dǎo)航欄主界面
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、進入導(dǎo)航系統(tǒng)---------------------*\n");
printf("\t\t\t\t\t ???*----------------------------------------------------*\n");
printf("\t\t\t\t\t ???*----------------2、學(xué)校簡介-------------------------*\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 ???* ??江蘇科技大學(xué),簡稱“江科大”,位于江蘇省鎮(zhèn)江市 *\n");
printf("\t\t\t\t\t ???* ?????????????????????????????????????????????????*\n");
printf("\t\t\t\t\t ???* 是江蘇省重點建設(shè)高校,江蘇省人民政府與中國船舶集 *\n");
printf("\t\t\t\t\t ???* ?????????????????????????????????????????????????*\n");
printf("\t\t\t\t\t ???* 團有限公司共建高校,國家國防科技工業(yè)局與江蘇省人 *\n");
printf("\t\t\t\t\t ???* ?????????????????????????????????????????????????*\n");
printf("\t\t\t\t\t ???* 民政府共建高校。學(xué)校源自1933年創(chuàng)辦的上海大公職業(yè) *\n");
printf("\t\t\t\t\t ???* ?????????????????????????????????????????????????*\n");
printf("\t\t\t\t\t ???* 學(xué)校,于2004年更名為江蘇科技大學(xué)。 ??????????????*\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 ???* ?????????????江蘇科技大學(xué)計算機學(xué)院 ?????????????*\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 ???*--------------江蘇科技大學(xué)校園導(dǎo)航系統(tǒng)--------------*\n");
printf("\t\t\t\t\t ???*----------------------------------------------------*\n");
printf("\t\t\t\t\t ???*-------------------按回車鍵繼續(xù)---------------------*\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:算術(shù)表達(dá)式求解
一、問題及要求
【問題描述】?設(shè)計一個簡單的算術(shù)表達(dá)式計算器。
【基本要求】?實現(xiàn)標(biāo)準(zhǔn)整數(shù)類型的四則運算表達(dá)式的求值(包含括號,可多層嵌入)
【測試數(shù)據(jù)】?(30+2*70)/3-12*3 5+(9*(62-37)+15)*6 要求自行設(shè)計非法表達(dá)式,進行程序測試,以保證程序的穩(wěn)定運行。
【實現(xiàn)提示】?可以設(shè)計以下輔助函數(shù) status isNumber(char ReadInChar); ?//視ReadInchar 是否是數(shù)字而返回 TRUE 或 FALSE 。
int TurnToInteger(char IntChar); ? // 將字符’0’.’9’ 轉(zhuǎn)換為整數(shù) 9
二、數(shù)據(jù)結(jié)構(gòu)的選擇和概要設(shè)計
【數(shù)據(jù)結(jié)構(gòu)的選擇】
計算器系統(tǒng),選擇數(shù)據(jù)結(jié)構(gòu)里的棧的結(jié)構(gòu)來解決
【概要設(shè)計】
1)功能分析
實現(xiàn)標(biāo)準(zhǔn)整數(shù)類型的四則運算表達(dá)式的求值(包含括號,可多層嵌入)
表達(dá)式計算規(guī)則
先乘除,后加減
從左到右計算
先括號內(nèi),后括號外
2)基本思想?
?由于用戶輸入的算數(shù)表達(dá)式是中綴表達(dá)式,不利于機器的自動求解。而我們知道在語法掃描分析等應(yīng)用場合我們一般采用后綴表達(dá)式(逆波蘭式)做運算。對逆波蘭式求值只需從左到右掃描,遇到操作符就將左邊的兩個操作數(shù)進行計算,直到整個式子掃描結(jié)束為止。
三、詳細(xì)設(shè)計和編碼
1.邏輯設(shè)計
1)優(yōu)先級矩陣
//優(yōu)先級矩陣 1表示優(yōu)先級更高,0表示優(yōu)先級更低,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)數(shù)據(jù)棧和符號棧
stack<double> values; ??//存放運算數(shù)
stack<char> operators; ?//存放運算符
【主要功能函數(shù)】
int turnToNum(char c):將符號轉(zhuǎn)變成對應(yīng)的數(shù)字編號,非法符號返回-1
int compare(char a, char b):比較符號a和符號b的優(yōu)先級
bool isNumber(char c):判斷是否為數(shù)字
double result(double a, char c, double b):產(chǎn)生運算結(jié)果
2.物理設(shè)計
【核心算法段】
????????for (int i = 0; i < (int)strlen(expression); i++) {
????????????char &c = expression[i]; ?//c為引用當(dāng)前字符
????????????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; //標(biāo)記是否要繼續(xù)
????????????????????double a, b, r; ???????//a,b分別存放數(shù)字棧最上面的兩個數(shù)字,c存放運算結(jié)果
????????????????????while (!operators.empty() && goOn) {
????????????????????????char cTop = operators.top();
????????????????????????switch (compare(cTop, c)) {
????????????????????????case 1: //棧頂優(yōu)先級比當(dāng)前大,消耗棧頂操作符,并計算
????????????????????????????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: //棧頂優(yōu)先級比當(dāng)前小,將當(dāng)前符號壓入
????????????????????????????operators.push(c);
????????????????????????????if (show)cout << "壓入" << c << "\n";
????????????????????????????goOn = false;
????????????????????????????break;
????????????????????????case 2: //特殊的,當(dāng)括號相遇,僅做彈出括號操作
????????????????????????????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;
五、用戶使用說明
如上文注釋
總結(jié)
- 上一篇: 常微分方程数值解法(2)
- 下一篇: 蓝屏蓝屏代码查询器_蓝屏点播?