基于数据结构和C语言实现公交管理系统(含文档和代码)数据结构课程设计
目錄
第1章 課程設計內容及要求?
第2章 需求分析?
第3章 算法設計?
3.1 設計思想?
3.2 設計表示?
第4章 系統調試及測試(含代碼)?
4.1 功能截圖?
4.2 實現代碼?
第5章 課程設計心得?
5.1 設計體會?
5.2 系統改進?
第6章 參考文獻?
謝辭?
課程設計內容及要求
設計一個公交線路管理系統,為乘客提供各種信息查詢服務。系統中處理的道路信息和公交線路信息保存在文件busline.txt 中,系統執行時所處理的數據要對此文件分別進行讀寫操作。整個系統由前臺服務和后臺管理兩個子系統組成。
后臺管理具體功能包括:
(1)公交站點的增加:能根據需要增加公交站點。
(2)道路信息的增加:能根據需要增加道路信息。
(3)公交線路的增加:能根據需要增加新的公交線路信息。
(4)公交線路的刪除:能根據需要刪除已有的公交線路信息。
前臺服務具體功能包括:
(1)公交線路信息查詢:輸入線路號,輸出該線路所有站點。
(2)乘車線路方案查詢:輸入起點站和終點站,輸出兩站點之間所有乘車方案。
(3)乘車線路最優查詢:輸入起點站和終點站,輸出兩站點之間乘車時間(或距離)最短的乘車方案。
第2章 需求分析
本系統主要功能是實現對公交路線的管理和維護。我們都知道,每個城市都會有公交路線的改動,如果使用這個系統,就可以及時的對路線信息進行修改和保存,是非常方便的,而且該系統使用起來也很方便。用戶只需根據顯示的提示信息進行選擇和輸入就可以實現你要求的功能。該系統具有錄入,查詢,刪除,修改和顯示所有記錄的功能。用戶可以根據實際情況進行相應的功能選擇。其具體功能簡單描述如下:
(1)保存:即將信息存入指定文件中。當用戶對原始數據進行相關的改動(主要是對路線信息進行增加、刪除、修改)之后,用戶可以根據自己的選擇判斷是否要保存到文件中,這樣就實現了信息的記錄功能,以方便用戶隨時進行查看。
(2)錄入:即錄入一條新的公交路線或者是某一條路線上的站點。每次可以錄入一條路線信息,若用戶想錄入多條路線信息的話可以重復執行該功能,同樣的,錄入站點的話也是每一次錄入一個站點,若用戶想錄入多條路線信息的話也只需要重復執行該功能即可。這樣,就實現了對公交路線的錄入信息管理。
(3)查詢:即能夠查找出你要的公交路線信息和總共有多少站。簡單地說,就是用戶先選擇你要查詢的公交路線號,在輸入起點站和終點站名稱,然后系統就會自動顯示出起點站和終點站之間共有多少站點,以及起點站和終點站之間所有站點的序號和名稱,從而使用戶一目了然的知道站點信息,而不需要像看地圖那樣一個站點一個站點的用肉眼進行查找,這就為用戶節省了很多時間。
(4)刪除:即能刪除掉一條你所不需要的公交路線信息和某一條路線上的站點。若要刪除路線時只需要輸入你要刪除的公交路線號即可,若要刪除站點也只需輸入你要刪除的站點序號,不需要輸入該站點名稱。
(5)修改:即能修改一條你需要該的路線信息。修改內容包括:修改該條公交路線號、修改站點名稱(輸入新的信息時該條路線的站點長度不能改變,若要改變站點長促可以選擇增加和刪除功能,即可實現)。
(6)顯示路線信息:即將路線信息顯示到屏幕中,供用戶查看。該功能比較簡單,在這里不具體說明。
第3章 算法設計
3.1 設計思想
本系統的設計流程簡單比較簡單,原始數據全部都保存在文件中,用戶就不必自己一個一個的輸入信息。程序執行時從文件中讀出,文件的讀取操作在下文中我會詳細說明,這里就不做具體說明了。創建動態鏈表和結構體數組對路線信息進行存儲,因為使用鏈表時對程序的插入、刪除會比較方便,那么插入和刪除就相當于對鏈表節點的刪除和插入。寫無返回值的主函數?void?main()對系統的功能進行顯示,每次用戶選擇某一功能時都可以看到路線的大致信息,以便于用戶更準確的選擇功能。其中利用switch?條件分支語句進行子函數功能的選擇和調用。并且使用while循環語句進行多次循環執行,就可以實現對信息的多次刪除、增加、修改,知道達到用戶滿意時由用戶自己選擇退出系統。通同時使用了清屏函數,對上一次程序運行的結果清楚只顯示本次運行的相關信息,這樣的話就做到了界面的友好化,簡單明了,不冗雜,更方便觀看。當用戶對信息進行有關的改動之后,用戶根據自己的選擇是否保存入文件中,就可以保存他所要的信息了。
其主要流程圖如下:
3.2 設計表示
下面我將對各個子模塊的功能進行詳細的介紹和描述:
公交車信息:路線編號,司機姓名,途經站臺總數,第一個站臺名稱到最最后一個站臺名稱,公交車的起始時間和終止時間,票價。
模塊一:頭文件,函數聲明,定義結構體,各個子函數的定義,以便主函數能夠直接調用實現其功能。
模塊二:菜單顯示。顯示該系統所能完成的功能,一目了然。根據用戶的需求自由選擇功能實現。
模塊三:從文件中讀取信息。執行此程序時首先定義文件指針FILE?*fp,在打開此文件時,若沒有該文件,則顯示文件打開失敗,然后會自動創建一個新文件。當文本文檔里已經有用戶需要的數據,就可以從文件中正確讀取出來,若文件打開不成功則會顯示“文件打開失敗!”。讀取結束后必須要關閉文件,即?fclose(fp),這樣就完成了從文件中讀取信息的功能。
模塊四:顯示路線信息。該功能以子函數的形式給出,無返回值。當你選擇信息顯示功能時,你會進入公交車信息庫,然后你就可以查看到所有的公交車信息。
模塊五:錄入線路信息。輸入路線編號,司機姓名,途經站臺總數,第一個站臺名稱到最最后一個站臺名稱,公交車的起始時間和終止時間,再輸入票價,創建成功,保存公交車信息。
模塊六:刪除線路信息。選擇該功能后,再輸入你需要刪除的路線編號,若沒有該條路線編號,則顯示未找到該路線編號,若有,則顯示已找到。再輸入1,就將你需要刪除的公交車信息刪除了。
模塊七:修改線路信息。進入之后輸入需要修改的公交車路線編號,然后出現一個修改菜單:1.修改路線編號 2.修改車輛信息 3.修改行車路線 4.修改行車時間 5.返回到主菜單。選擇1,輸入新的路線編號,保存公交車信息。選擇2,輸入新的司機姓名和單程票價,保存公交車信息。選擇3,輸入新的行車路線,保存公交車信息。選擇4,輸入新的行車時間,保存公交車信息。
模塊八:查詢路線信息。該子函數是一個無返回值的函數。使用時會出現一個查詢菜單:1.路線導航查詢 2.路線編號查詢 3.站臺信息查詢 4.返回到主菜單。選擇1,輸入你所在的站點和要前往的站點,便會顯示出所有含這兩個站點的公交車信息。選擇2,輸入你要查找的公交路線編號,便會顯示出該編號的公交車信息。選擇3,輸入你要查詢的途經站臺名稱,便會顯示出所有經過這個站臺的公交車信息。
模塊九:將公交車信息保存到文件中。當用戶對原始路線信息進行改動之后,或許要將修改過后的信息保存起來,此時用戶就可以自己選擇是否要將信息保存起來,保存的位置是本系統實現設定好的,保存之后的信息在C:\Program Files (x86)\Microsoft Visual Studio\works\Debug\bus.txt目錄下,也方便用戶的查看。
模塊十:主函數。構建無返回值的主函數,主函數用來實現對子模塊的調用功能,用while循環語句來控制循環次數,用戶可以根據自己的需求選擇任何時候退出系統。對子模塊的調用主要使用switch開關控制語句,根據選擇實現用戶要求的功能。
實現注釋:
本系統對于菜單顯示表上的功能基本上都能實現,但是不是很完善,很多地方我還沒有考慮到,或許是考慮的不夠周全,但是有些不足的地方,是我的能力所不能達到的,還望老師體諒,不過等以后學過新的知識用新的方法或許就能將系統做進一步的改進。
算法設計中一些新的想法:
我覺得本系統很不完善,很多功能雖然能實現,但是實現的不夠完美,很多細節我都沒有考慮到,比如查詢路線時,不能大致故略出起點站和終點站需要的時間;修改路線信息時,重新輸入該條路線的信息時,路線上站點的個數不能改變,要改變的話還得選擇增加或刪除功能;還有就是用戶將改動過后的信息保存到文件中后,以后該文件中的數據用戶如果要使用的話,不能從文件中讀取顯示到屏幕上。這些都是我的系統一些不完善的地方,希望以后有能力的時候,能進一步對系統進行修改和完善。
4.1 功能截圖
主菜單:
信息錄入:
信息顯示:
信息修改:
信息刪除:
信息查詢:
4.2 實現代碼
/**************************頭文件聲明************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**************************函數聲明************************************/
void init(); ??????????//初始化函數
void add(); ????????????//信息錄入函數
void view(); ????????????//信息顯示函數
void mod(); ????????????//信息修改函數
void modmeun(); ??????????//修改菜單
void modnavimeun(); ????????//路線修改菜單
void del(); ????????????//信息刪除函數
void find(); ????????????//信息查詢函數
void findmeun(); ??????????//查詢菜單
void findnavi(); ??????????//路線導航查詢函數
void findnum(); ??????????//路線編號查詢函數
void findstameun(); ????????//站臺信息查詢菜單
void findsta(); ??????????//站臺信息查詢函數
void save(); ????????????//信息保存函數
void mainmeun(); ??????????//主菜單
char Test(char a,char b,char c); ??//菜單輸入檢測函數
/**************************宏定義聲明************************************/
#define N 100 ?????????//公交車數量
/**************************結構體定義************************************/
struct station ?????????//途徑站點信息
{
?char c[20]; ????????//站點名稱
};
struct bus ???????????//公交車信息
{
?char num[20]; ???????//公交車路線編號
?char name[20]; ???????//司機姓名
?int n; ???????????//站臺數目
?struct station b[12]; ???//站臺名稱
?char topen[20]; ??????//起始時間
?char tclose[20]; ??????//終止時間
?int money; ?????????//票價
}a[N];
/**************************子函數定義************************************/
void init() ??//初始化函數 ???
{
?FILE *fp; ???????????//文件指針
?int i;
?if((fp=fopen("bus.txt","r+"))==NULL) ????????//初次嘗試打開"bus.txt"文本文件
?{
?printf("\n\t\t文件打開失敗\n\n\t\t正在嘗試創建新文件...\n");
?fp=fopen("bus.txt","w"); ????????????//創建"bus.txt"文本文件
?if((fp=fopen("bus.txt","r+"))==NULL) ??????//再次判斷是否打開成功
?{
??printf("\t\t文件創建失敗!!!\n");
??return;
?}
?}
?fp=fopen("bus.txt","r+");
?for(i=0;i<N;i++) ????????????????????//將磁盤中的信息輸出到內存中
?if(fread(&a[i],sizeof(struct bus),1,fp)!=1)
??break;
?fclose(fp);
?printf("\n\t\t初始化完成!!!\n\n");
?return;
}
void add() ??//信息錄入函數 ??
{
?FILE *fp=NULL; ???????????//文件指針
?int i,j;
?char cc[20];
?for(i=0;i<N;i++)
?{
?if(*a[i].num!='\0')
??continue;
?else
?{
??printf("\n添加第%d輛公交車路線記錄:\n",i+1); ???????????????
??printf("\n請輸入路線編碼(3位編碼,第一位為大寫字母,后兩位為數字):\n"); ?//路線編碼
??scanf("%s",cc);
??for(j=0;j<N;j++) ?????????????????????????????//檢驗是否重復
??if(strcmp(a[j].num,cc)==0)
??{
???printf("\n與已有路線編碼重復,按回車鍵返回!!!\n");
???fflush(stdin); ?????????????//清除鍵盤緩沖區
???getchar();
???system("cls");
???return;
??}
??strcpy(a[i].num,cc);
??printf("\n請輸入司機姓名: "); ??????????????????????//司機姓名
??scanf("%s",a[i].name);
??printf("\n請輸入途經站臺總數(>=2): "); ??????????????????//站臺總數
??scanf("%d",&a[i].n);
??printf("\n");
??if(a[i].n<2||a[i].n>12)
??{
??while(a[i].n<2||a[i].n>12)
??{
???printf("\n站臺總數應滿足(2<=n<=12),請重新輸入: ");
???scanf("%d",&a[i].n);
???printf("\n");
??}
??}
??for(j=0;j<a[i].n;j++)
??{
??printf("請輸入第%d個站臺名稱: ",j+1); ?????????//站臺名稱
??scanf("%s",a[i].b[j].c);
??}
??printf("\n自動生成公交路線:(1) %s",a[i].b[0].c);
??for(j=1;j<a[i].n;j++)
??{
??printf(" ----> (%d) %s",j+1,a[i].b[j].c);
??}
??printf("\n\n請輸入公交車的起始時間(格式為:時:分): "); ???//起始時間
??scanf("%s",a[i].topen);
??printf("請輸入公交車的終止時間(格式為:時:分): "); ?????//終止時間
??scanf("%s",a[i].tclose);
??printf("\n請輸入公交車的票價: "); ?????????????//票價
??scanf("%d",&a[i].money);
??printf("\n第%d輛公交車路線記錄創建成功!!!\n",i+1);
??save();
??printf("\n\t按回車鍵返回!!!\n");
??fflush(stdin); ?????????????//清除鍵盤緩沖區
??getchar();
??system("cls");
??return;
?}
?}
?if(i==N)
?printf("\n\n\n\t空間已滿,不能錄入!!!\n");
?printf("\n\t按回車鍵返回!!!\n");
?fflush(stdin); ?????????????//清除鍵盤緩沖區
?getchar();
?system("cls");
?return;
}
void view() ?//信息顯示函數 ??
{
?int i,j,min;
?struct bus t; ?????????????????
?for(i=0;*a[i].num!='\0'&&i<N;i++) ???????//按“路線編號”用選擇法排序
?{
?min=i;
?for(j=i+1;*a[j].num!='\0'&&j<N;j++)
??if(strcmp(a[i].num,a[j].num)>0)
??min=j;
?t=a[i];
?a[i]=a[min];
?a[min]=t;
?}
?printf("\n\n ??????????????公交車信息庫");
?printf("\n********************************************************************************\n");
?for(i=0;*a[i].num!='\0'&&i<N;i++)
?{
?printf("\t路線編號: %-6s\t單程票價: %d 元\t\t司機姓名: %s\n",a[i].num,a[i].money,a[i].name);
?printf("\t起始時間: %-6s\t終止時間: %-6s\t站臺總數: %d\n",a[i].topen,a[i].tclose,a[i].n);
?printf("\t公交路線:(1) %s",a[i].b[0].c);
?for(j=1;j<a[i].n;j++)
??printf(" ---->(%d) %s",j+1,a[i].b[j].c);
?printf("\n\n");
?}
?printf("\n********************************************************************************\n");
?printf("\n\t\t公交車信息顯示完畢!!!\n");
?printf("\n\t\t輸入回車鍵返回主菜單:");
?fflush(stdin); ?????????????//清除鍵盤緩沖區
?getchar();
?system("cls");
?return;
}
void mod() ????????????//信息修改函數
{
?int i,j,m=0;
?char t,cc[20],mod[20];
?printf("請輸入要修改信息的公交車路線編號:\n");
?scanf("%s",cc);
?for(i=0;*a[i].num!='\0'&&i<N;i++) ??//查找所輸入的公交車
?{
?if(strcmp(a[i].num,cc)==0) ???
?{
??m=1;
??printf("\n\n\t\t已找到!!!\n");
??while(1)
??{
??system("cls");
??printf("\n\n ?????????????正在修改的公交車信息\n");
??printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
??printf("\t路線編號: %-6s\t單程票價: %d 元\t\t司機姓名: %s\n",a[i].num,a[i].money,a[i].name);
??printf("\t起始時間: %-6s\t終止時間: %-6s\t站臺總數: %d\n",a[i].topen,a[i].tclose,a[i].n);
??printf("\t公交路線:(1) %s",a[i].b[0].c);
??for(j=1;j<a[i].n;j++)
???printf(" ---->(%d) %s",j+1,a[i].b[j].c);
??printf("\n\n");
??printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n\n");
??modmeun();
??fflush(stdin); ?????????????//清除鍵盤緩沖區
??t=Test(getchar(),'1','5'); ??//菜單檢測輸入函數
??system("cls");
??switch(t)
??{
??case '1': ?????//修改路線編號
???{
???int k;
???printf("\n請輸入新的公交車編號:");
???scanf("%s",mod);
???for(k=0;*a[k].num!='\0'&&k<N;k++)
???{
????if(strcmp(a[k].num,mod)==0)
????{
????printf("與已有編號重復,按回車鍵返回主菜單\n");
????fflush(stdin); ?????????????//清除鍵盤緩沖區
????getchar();
????system("cls");
????return;
????}
???}
???strcpy(a[i].num,mod);
???save();
???break;
???}
??case '2': ?????//修改車輛信息
???{
???printf("\n請輸入新的司機姓名:");
???scanf("%s",a[i].name);
???printf("\n請輸入新的公交車票價:");
???scanf("%d",&a[i].money);
???save();
???break;
???}
??case '3': ?????//修改行車路線
???{
???void modnavimeun(); //路線修改菜單
???int k;
???char z;
???while(1)
???{
????system("cls");
????modnavimeun();
????fflush(stdin); ?????????????//清除鍵盤緩沖區
????z=Test(getchar(),'1','5'); ??//菜單檢測輸入函數
????system("cls");
????switch(z)
????{
????case '1': ??//添加站點
????{
?????if(a[i].n+1>12) ??????//判斷是否滿足條件
?????{
?????printf("\n站臺總數達到12個,無法添加新站點\n\n按回車鍵返回\n");
?????fflush(stdin); ?????????????//清除鍵盤緩沖區
?????getchar();
?????system("cls");
?????return;
?????}
?????printf("\n請輸入需要添加第幾個站點:");
?????scanf("%d",&k);
?????while(a[i].n+1<k)
?????{
?????printf("目前共%d個站點,無法添加第%d個站點\n請重新輸入:",a[i].n,k);
?????scanf("%d",&k);
?????printf("\n");
?????}
?????a[i].n=a[i].n+1;
?????for(j=a[i].n;j>k-1;j--)
?????{
??????a[i].b[j]=a[i].b[j-1];
?????}
?????printf("\n請輸入新添加的站點名稱:");
?????scanf("%s",a[i].b[k-1].c);
?????save();
?????break;
????}
????case '2': ??//修改站點
????{
?????printf("\n請輸入需要修改第幾個站點:");
?????scanf("%d",&k);
?????printf("\n請輸入新的站點名稱:");
?????scanf("%s",a[i].b[k-1].c);
?????save();
?????break;
????}
????case '3': ??//刪除站點
????{
?????printf("\n請輸入需要刪除第幾個站點:");
?????scanf("%d",&k);
?????for(j=k-1;j<a[i].n;j++)
?????{
?????a[i].b[j]=a[i].b[j+1];
?????}
?????a[i].n=a[i].n-1;
?????save();
?????break;
????}
????case '4': ??//重置路線
????{
?????printf("\n請輸入新的途徑站臺總數(2<=n<=12): ");
?????scanf("%d",&a[i].n);
?????printf("\n");
?????while(a[i].n<2||a[i].n>12) ??????//判斷是否滿足條件
?????{
?????printf("\n站臺總數應滿足(2<=n<=12),請重新輸入: ");
?????scanf("%d",&a[i].n);
?????printf("\n");
?????}
?????for(j=0;j<a[i].n;j++)
?????{
?????printf("請輸入新的第%d個站臺名稱: ",j+1);
?????scanf("%s",a[i].b[j].c);
?????}
?????printf("\t公交路線:(1) %s",a[i].b[0].c);
?????for(j=1;j<a[i].n;j++)
?????printf(" ---->(%d) %s",j+1,a[i].b[j].c);
?????printf("\n\n");
?????save();
?????break;
????}
????case '5': ??//返回菜單
????{
?????printf("\n\t\t按回車鍵返回菜單\n");
?????fflush(stdin); ?????????????//清除鍵盤緩沖區
?????getchar();
?????system("cls");
?????return; ?????????????//返回主菜單
????}
????}
???}
???}
??case '4': ?????//修改行車時間
???{
???printf("\n\n請輸入公交車的起始時間(格式為:時:分): ");
???scanf("%s",a[i].topen);
???printf("請輸入公交車的終止時間(格式為:時:分): ");
???scanf("%s",a[i].tclose);
???save();
???break;
???}
??case '5':
???{
???printf("\n\t\t按回車鍵返回主菜單\n");
???fflush(stdin); ?????????????//清除鍵盤緩沖區
???getchar();
???system("cls");
???return; ?????????????//返回主菜單
???}
??}
??}
?}
?}
?if(m==0)
?printf("\n\n\t\t無此公交車信息!!!\n");
?printf("\n\t\t按回車鍵返回\n");
?fflush(stdin); ?????????????//清除鍵盤緩沖區
?getchar();
?system("cls");
?return;
}
void modmeun() //修改菜單
{
?printf("\n\t\t ????????修改菜單 ?????????");
?printf("\n\t\t********************************************");
?printf("\n\t\t* ?????1、修改路線編號 ???????*");
?printf("\n\t\t* ?????2、修改車輛信息 ???????*");
?printf("\n\t\t* ?????3、修改行車路線 ???????*");
?printf("\n\t\t* ?????4、修改行車時間 ???????*");
?printf("\n\t\t* ?????5、返回到主菜單 ???????*");
?printf("\n\t\t********************************************");
?printf("\n\n\t\t請輸入您的選擇:");
}
void modnavimeun() //路線修改菜單
{
?printf("\n\t\t ???????路線修改菜單 ????????");
?printf("\n\t\t********************************************");
?printf("\n\t\t* ?????1、 站 點 添 加 ???????*");
?printf("\n\t\t* ?????2、 站 點 修 改 ???????*");
?printf("\n\t\t* ?????3、 站 點 刪 除 ???????*");
?printf("\n\t\t* ?????4、 路 線 重 置 ???????*");
?printf("\n\t\t* ?????5、 返 回 菜 單 ???????*");
?printf("\n\t\t********************************************");
?printf("\n\n\t\t請輸入您的選擇:");
}
void del() ???//信息刪除函數
{
?int i,j,t,m=0;
?char cc[20];
?printf("\n請輸入要刪改信息的公交車路線編號:\n");
?scanf("%s",cc);
?for(i=0;*a[i].num!='\0'&&i<N;i++) ??//查找所輸入的公交車
?{
?if(strcmp(a[i].num,cc)==0) ???
?{
??m=1;
??printf("\n已找到:\n");
??printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
??printf("\t路線編號: %-6s\t單程票價: %d 元\t\t司機姓名: %s\n",a[i].num,a[i].money,a[i].name);
??printf("\t起始時間: %-6s\t終止時間: %-6s\t站臺總數: %d\n",a[i].topen,a[i].tclose,a[i].n);
??printf("\t公交路線:(1) %s",a[i].b[0].c);
??for(j=1;j<a[i].n;j++)
??printf(" ---->(%d) %s",j+1,a[i].b[j].c);
??printf("\n\n");
??printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n\n");
??printf("即將刪除該公交車信息!!!\n確定請按1:");
??scanf("%d",&t);
??if(t==1)
??{
??if(i+1==N)
???memset(&a[i],'\0',sizeof(struct bus)); ??//最后一輛直接進行清空
??else
???for(j=i;*a[j].num!='\0'&&j+1<N;j++) ????//后面的公交車信息補上刪去的公家車信息
???a[j]=a[j+1];
??printf("編號為%s的公交車信息刪除完畢!\n",cc);
??save();
??break;
??}
?}
?}
?if(m==0)
?printf("\n\n\t\t無此公交車信息!!!\n");
?printf("\n\n\t輸入回車鍵返回主菜單:");
?fflush(stdin); ?????????????//清除鍵盤緩沖區
?getchar();
?system("cls");
?return;
}
void find() ?//信息查詢函數
{
?char t;
?while(1)
?{
?findmeun();
?fflush(stdin); ?????????????//清除鍵盤緩沖區
?t=Test(getchar(),'1','4'); ??//菜單檢測輸入函數
?switch(t)
?{
?case '1': system("cls"); findnavi();break; ????//路線導航查詢
?case '2': system("cls"); findnum();break; ????//路線編號查詢函數
?case '3': system("cls"); findsta();break; ????//站臺信息查詢函數
?case '4': system("cls"); return; ?????????//返回主菜單
?}
?}
?return;
}
void findmeun() //查詢菜單
{
?printf("\n\t\t ????????查詢菜單 ?????????");
?printf("\n\t\t********************************************");
?printf("\n\t\t* ?????1、路線導航查詢 ???????*");
?printf("\n\t\t* ?????2、路線編號查詢 ???????*");
?printf("\n\t\t* ?????3、站臺信息查詢 ???????*");
?printf("\n\t\t* ?????4、返回到主菜單 ???????*");
?printf("\n\t\t********************************************");
?printf("\n\n\t\t請輸入您的選擇:");
}
void findnavi() ???//路線導航查詢函數
{
?int i,j,k,m=0;
?char c1[20],c2[20];
?printf("請輸入您目前所在的站點:\n\t\t");
?scanf("%s",c1);
?printf("請輸入您想要前往的站點:\n\t\t");
?scanf("%s",c2);
?printf("\n\n您可選擇的公交車信息如下\n");
?printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
?for(i=0;*a[i].num!='\0'&&i<N;i++)
?{
?for(j=0;j<a[i].n;j++)
??for(k=j+1;k<a[i].n;k++)
??if(strcmp(a[i].b[j].c,c1)==0&&strcmp(a[i].b[k].c,c2)==0)
??{
???m=1;
???printf("\n");
???printf("\t路線編號: %-6s\t單程票價: %d 元\t\t司機姓名: %s\n",a[i].num,a[i].money,a[i].name);
???printf("\t起始時間: %-6s\t終止時間: %-6s\t站臺總數: %d\n",a[i].topen,a[i].tclose,a[i].n);
???printf("\t公交路線:(1) %s",a[i].b[0].c);
???for(j=1;j<a[i].n;j++)
???printf(" ---->(%d) %s",j+1,a[i].b[j].c);
???printf("\n\n");
??}
?}
?printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n\n");
?printf("\t\t\t\t顯示完畢\n");
?if(m==0)
?printf("\n\n\t\t\t\t抱歉,無途經此路線的公交車\n");
?printf("\n\t\t\t\t輸入回車鍵返回查詢菜單:");
?fflush(stdin); ?????????????//清除鍵盤緩沖區
?getchar();
?system("cls");
?return;
}
void findnum() ?????//路線編號查詢函數
{
?int i,j,m=0;
?char cc[20];
?printf("請輸入您想要查找的公交路線編號:\n");
?scanf("%s",cc);
?for(i=0;*a[i].num!='\0'&&i<N;i++)
?{
?if(strcmp(a[i].num,cc)==0) ???
?{
??m=1;
??printf("\n已找到:\n");
??printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
??printf("\t路線編號: %-6s\t單程票價: %d 元\t\t司機姓名: %s\n",a[i].num,a[i].money,a[i].name);
??printf("\t起始時間: %-6s\t終止時間: %-6s\t站臺總數: %d\n",a[i].topen,a[i].tclose,a[i].n);
??printf("\t公交路線:(1) %s",a[i].b[0].c);
??for(j=1;j<a[i].n;j++)
??printf(" ---->(%d) %s",j+1,a[i].b[j].c);
??printf("\n\n");
??printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n\n");
??break;
?}
?}
?if(m==0)
?printf("\n\t\t無此公交車信息\n");
?printf("\n\t\t輸入回車鍵返回查詢菜單:");
?fflush(stdin); ?????????????//清除鍵盤緩沖區
?getchar();
?system("cls");
?return;
}
?void findstameun() //站臺信息查詢菜單
{
?printf("\n\t\t ??????站臺信息查詢菜單");
?printf("\n\t\t********************************************");
?printf("\n\t\t* ?????1、起始站臺查詢 ???????*");
?printf("\n\t\t* ?????2、終止站臺查詢 ???????*");
?printf("\n\t\t* ?????3、途徑站臺查詢 ???????*");
?printf("\n\t\t* ?????4、返回查詢菜單 ???????*");
?printf("\n\t\t********************************************");
?printf("\n\n\t\t請輸入您的選擇:");
}
void findsta() ???//站臺信息查詢函數
{
?int i,j,k;
?char t;
?char cc[20];
?while(1)
?{
?int m=0;
?findstameun();
?fflush(stdin); ?????????????//清除鍵盤緩沖區
?t=Test(getchar(),'1','4'); ??//菜單檢測輸入函數
?system("cls");
?switch(t)
?{
?case '1':
??{
??printf("請輸入您所要查詢的起始站臺名稱:\n");
??scanf("%s",cc);
??printf("\n以%s為起始站臺的公交車如下:\n",cc);
??printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
??for(i=0;*a[i].num!='\0'&&i<N;i++)
??{
???if(strcmp(a[i].b[0].c,cc)==0)
???{
???m=1;
???printf("\n");
???printf("\t路線編號: %-6s\t單程票價: %d 元\t\t司機姓名: %s\n",a[i].num,a[i].money,a[i].name);
???printf("\t起始時間: %-6s\t終止時間: %-6s\t站臺總數: %d\n",a[i].topen,a[i].tclose,a[i].n);
???printf("\t公交路線:(1) %s",a[i].b[0].c);
???for(j=1;j<a[i].n;j++)
????printf(" ---->(%d) %s",j+1,a[i].b[j].c);
???printf("\n\n");
???}
??}
??printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n\n");
??printf("\t已全部顯示完畢!!!\n");
??if(m==0)
???printf("\n\t沒有公交車以該站點為起始站臺\n");
??break;
??}
?case '2':
??{
??printf("請輸入您所要查詢的終止站臺名稱:\n");
??scanf("%s",cc);
??printf("\n以%s為終止站臺的公交車如下:\n",cc);
??printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
??for(i=0;*a[i].num!='\0'&&i<N;i++)
??{
???k=a[i].n;
???if(strcmp(a[i].b[k-1].c,cc)==0)
???{
???m=1;
???printf("\n");
???printf("\t路線編號: %-6s\t單程票價: %d 元\t\t司機姓名: %s\n",a[i].num,a[i].money,a[i].name);
???printf("\t起始時間: %-6s\t終止時間: %-6s\t站臺總數: %d\n",a[i].topen,a[i].tclose,a[i].n);
???printf("\t公交路線:(1) %s",a[i].b[0].c);
???for(j=1;j<a[i].n;j++)
????printf(" ---->(%d) %s",j+1,a[i].b[j].c);
???printf("\n\n");
???}
??}
??printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n\n");
??printf("\t已全部顯示完畢!!!\n");
??if(m==0)
???printf("\n\t沒有公交車以該站點為起始站臺\n");
??break;
??}
?case '3':
??{
??printf("請輸入您所要查詢的途經站臺名稱:\n");
??scanf("%s",cc);
??printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
??for(i=0;*a[i].num!='\0'&&i<N;i++)
???for(k=1;k<a[i].n-1;k++)
???if(strcmp(a[i].b[k].c,cc)==0)
???{
????m=1;
????printf("\n");
????printf("\t路線編號: %-6s\t單程票價: %d 元\t\t司機姓名: %s\n",a[i].num,a[i].money,a[i].name);
????printf("\t起始時間: %-6s\t終止時間: %-6s\t站臺總數: %d\n",a[i].topen,a[i].tclose,a[i].n);
????printf("\t公交路線:(1) %s",a[i].b[0].c);
????for(j=1;j<a[i].n;j++)
????printf(" ---->(%d) %s",j+1,a[i].b[j].c);
????printf("\n\n");
???}
??printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n\n");
??printf("\t已全部顯示完畢!!!\n");
??if(m==0)
???printf("\n\t沒有公交車以該站點為途經站臺\n");
??break;
??}
?case '4':
??{
??printf("\n\t\t按回車鍵返回查詢菜單\n");
??fflush(stdin); ?????????????//清除鍵盤緩沖區
??getchar();
??system("cls");
??return; ?????????????//返回主菜單
??}
?fflush(stdin); ?????????????//清除鍵盤緩沖區
?getchar();
?system("cls");
?}
?}
?return;
}
void save() ????//信息保存函數
{
?FILE *fp=NULL;
?int i;
?if((fp=fopen("bus.txt","w+"))==NULL) ?????//以讀寫的方式打開名稱為"bus"的文本文件
?{
?printf("文件打開錯誤!!!\n");
?return;
?}
?fp=fopen("bus.txt","w+");
?for(i=0;*a[i].num!='\0'&&i<N;i++) ?????????//將內存中的數據輸出到磁盤中
?if(fwrite(&a[i],sizeof(struct bus),1,fp)!=1)
??break;
?printf("\n\t保存成功!!!\n");
?fclose(fp);
?return;
}
void mainmeun() //主菜單
{
?printf("\n\t\t ???????主菜單");
?printf("\n\t\t****************************************");
?printf("\n\t\t* ?????1、信息錄入 ???????*");
?printf("\n\t\t* ?????2、信息顯示 ???????*");
?printf("\n\t\t* ?????3、信息修改 ???????*");
?printf("\n\t\t* ?????4、信息刪除 ???????*");
?printf("\n\t\t* ?????5、信息查詢 ???????*");
?printf("\n\t\t* ?????6、退出系統 ???????*");
?printf("\n\t\t****************************************");
?printf("\n\n\t\t\t請輸入您的選擇:");
}
//菜單輸入檢測函數
char Test(char a,char b,char c)
{
?while(a<b||a>c)
?{
?printf("\n\t\t\t輸入錯誤,請重新輸入: ");
?fflush(stdin); ?????????????//清除鍵盤緩沖區
?a=getchar();
?}
?return a;
}
/**************************主函數定義************************************/
int main()
{
?char a;
?init();
?printf("\n\t\t目前所能錄入的公交車數量上限為 %d 輛\n\n",N);
?printf("\n\t\t輸入回車鍵繼續\n");
?fflush(stdin); ?????????????//清除鍵盤緩沖區
?while(1)
?{
?system("cls");
?mainmeun();
?a=Test(getchar(),'1','6'); ??//菜單檢測輸入函數
?switch(a)
?{
?case '1': system("cls"); add(); break;
?case '2': system("cls"); view(); break;
?case '3': system("cls"); mod(); break;
?case '4': system("cls"); del(); break;
?case '5': ?system("cls"); find(); break;
?case '6': ?return 0;
?}
?}
?return 0;
}
第5章 課程設計心得
5.1 設計體會
經過這段時間的輔導討論,我們組的公交線路管理系統基本開發完畢。其功能基本符合設計需求。對于線路的增加、修改、查詢、刪除等問題通過程序進行了有效解決,并且能夠對文件進行有效管理。
通過此次課程設計,使我更加扎實的掌握了有關C語言和數據結構方面的知識,在設計過程中雖然遇到了一些問題,但經過一次又一次的思考,一遍又一遍地檢查終于找出了原因所在,也暴露出了前期我在這一方面知識欠缺和經驗不足。實踐出真知,通過親自動手制作,使我們掌握的知識不再是紙上談兵。過而能改,善莫大焉。在課程設計中,我們不斷發現錯誤,不斷改正,不斷領悟,不斷獲取。最終的檢測調試環節,本身就是在踐行“過而能改,善莫大焉”的知行觀。這次課程設計終于順利完成了,在課設中遇到了很多問題,最后在老師的指導下,終于游逆而解。在今后社會的發展和學習實踐過程中,一定要不懈努力,不能遇到困難就想要退宿,一定要不厭其煩的發現問題所在,然后一一進行解決,只有這樣,才能成功的做成想做的事,才能在今后的道路上披荊斬棘,而不是知難而退,那樣永遠不可能獲得成功,收獲喜悅,也永遠不可能得到社會及其他人對你的認可。
回顧起此次課程設計,至今我仍感慨頗多,從理論到實踐,在這段日子里,可以說是苦多于甜,但是學到了很多很多東西,不僅鞏固了以前的知識,還學到了很多書本上沒有學到的知識。通過此次課程設計使我懂得了理論和實際結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識和實際相結合,從理論中得出結論,才能真正為社會服務,從而提高自己的實際動手能力和獨立思考的能力。實驗過程中,也對團隊精神進行了考察,讓我們在合作中更加默契,在成功之后一起體會喜悅的心情。果然是團結就是力量,只有相互之間默契融洽的配合才能換來最終完美的結果。
5.2 系統改進
由于設計時間較短和本人知識有限,無法做到盡善盡美,所以該系統還有一些不盡人意的地方。系統主要存在以下一些問題:
這些都有待進一步的改善。因此,以后還應加強這幾個方面的工作和學習。
第6章 參考文獻
[1]黃明等編著《C語言課程設計》北京:電子工業出版社;
[2]郭翠英編著《C語言課程設計案例精編》北京:中國水利水電出版社;
[3〕寧正元《數據結構(c語言)》南京:東南大學出版社。2000年6月第1版;
[4]嚴蔚敏等《數據結構(c語言版)》北京:清華大學出版社,1997年4月第1版;
[5]譚浩強編著《C程序設計題解與上機指導(第3版)》北京:清華大學出版社;
[6]譚浩強編著《C程序設計(第3版)》北京:清華大學出版社;
[7]洪國勝等編著《C++?Builder程序設計輕松上手》北京:清華大學出版社;
[8〕寧正元《數據結構(c語言)》南京:東南大學出版社。2000年6月第1版;
[10]明日科技編著《Visual?C++程序開發范例寶典》北京:人民郵電出版社;
[11]胡學鋼等《數據結構算法設計指導》北京:清華大學出版社,1999年第1版。
謝辭
首先非常感謝學校能開設這個課題,為我日后從事計算機方面的工作提供了經驗,奠定了基礎。
其次,我要特別感謝歐斌老師對我的悉心指導,在設計期間老師幫助我理清設計思路,指導操作方法,并對我所做的課題提出有效的改進方案。老師淵博的知識、嚴謹的作風、誨人不倦的態度和學術上精益求精的精神讓我受益終生。這期間凝結了老師很多的心血,在此我表示由衷的感謝。沒有他的幫助,我將無法順利完成這次設計。
再次,學校在這方面也給我們提供了很大的支持和幫助,學校領導比較重視,給我們安排了較多的上機次數和足夠的計算機,讓我們有盡可能多的時間上機;并為我們開通了網線,方便我們上網查找信息;另外提供了專門的教室方便我們上機調試;對于學校和老師為我的畢業設計所提供的極大幫助和關心,在此我致以衷心的感謝!
最后還要感謝我的父母和家人,是他們深深的愛和不懈的支持給了我信心和勇氣,使我在今后的道路上勇往直前,樂觀向上!
總結
以上是生活随笔為你收集整理的基于数据结构和C语言实现公交管理系统(含文档和代码)数据结构课程设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【排序】折半插入排序
- 下一篇: VS2017编译文件遇到fatal er