簡(jiǎn)單利用C設(shè)計(jì)航空管理員系統(tǒng)

? 這其實(shí)是學(xué)校小學(xué)期的課題,拿來分享一下設(shè)計(jì)的過程蛤。劃分一下水平,本人處于大二。這篇設(shè)計(jì)經(jīng)歷適用于那些出入C語言基礎(chǔ)一段時(shí)間的娃。

? 航空訂票系統(tǒng)是個(gè)較為復(fù)雜的系統(tǒng),我負(fù)責(zé)其中管理員一塊,寫管理員登陸系統(tǒng)以及訂單管理,個(gè)人信息管理一塊。下面是我從提交論文篩選出來的部分。

Part 0-系統(tǒng)總體框架

藍(lán)色是我負(fù)責(zé)的部分,另外包括個(gè)人信息管理

然后是具體細(xì)則


Part 1-管理員登錄系統(tǒng)


登錄系統(tǒng)簡(jiǎn)單流程

登錄系統(tǒng)需要解決的重點(diǎn)主要有這么幾個(gè)問題:字符串匹配,密碼和賬戶名綁定的問題。下面具體描述碼代碼的過程,問題也會(huì)順便解決闡述。

管理員輸入賬戶和密碼,分別存放在兩個(gè)已經(jīng)預(yù)留足夠空間大小的字符串中。為了說明簡(jiǎn)便,先將賬戶放在聲明過的su_account[81]中,密碼放在su_password[81]中。

printf("ID:");

gets(su_account); ?//接受一個(gè)字符串,放在su_account中

printf("Password:");

gets(su_password);//接受一個(gè)字符串,放在su_password中

? 這里沒有添加容錯(cuò)機(jī)制,因?yàn)楣芾韱T賬戶不需要通過注冊(cè)系統(tǒng)來添加,是固定的。

? 在輸入賬戶和密碼之后,系統(tǒng)就需要開始進(jìn)行驗(yàn)證賬戶確定性以及身份。簡(jiǎn)單原理是字符串匹配:

? 首先和賬戶匹配,然后再和密碼匹配。就是說,先在一個(gè)存放賬戶和密碼的txt文檔里找到賬戶,然后在找是否有這個(gè)密碼,找到了就成功了。但事實(shí)上會(huì)存在一個(gè)bug:我輸入的賬戶和001管理員匹配上了,但我輸入的密碼是002的,這種情況下,上面的簡(jiǎn)單匹配是識(shí)別不出來的。所以需要一個(gè)手段將賬戶和密碼對(duì)應(yīng)起來,防止錯(cuò)亂匹配的情況發(fā)生。

? 所以,這時(shí)候使用結(jié)構(gòu)體數(shù)據(jù)類型是一個(gè)很好的辦法。

? 具體是這樣操作的:

? 在編譯時(shí)會(huì)聲明一個(gè)結(jié)構(gòu)體數(shù)組,這個(gè)數(shù)組能夠存放足夠的管理員帳戶信息條目。每個(gè)結(jié)果結(jié)構(gòu)體數(shù)組元素有:管理員帳戶,密碼,公司,姓名,性別,郵箱。

上圖一個(gè)實(shí)例txt

?這樣就可以將密碼和同一賬戶綁定起來了。只要先檢索賬戶,賬戶名匹配成功后,在同一個(gè)結(jié)構(gòu)體中匹配密碼,這樣就不會(huì)出現(xiàn)錯(cuò)亂匹配。


outfile語句可以忽略,infile是用來讀取管理員帳戶的文件流。

小功能

Html網(wǎng)頁輸入密碼時(shí),往往不會(huì)在密碼欄顯示明文密碼,而是顯示實(shí)心圓


事實(shí)上C語言可以做到類似的密碼輸入,而且很簡(jiǎn)單。

關(guān)鍵只需要掌握getch()函數(shù)。這個(gè)函數(shù)會(huì)接受一個(gè)字符,但不顯示在屏幕上。

? 所以簡(jiǎn)單描述功能具體實(shí)現(xiàn):設(shè)置一個(gè)存放密碼的字符串(預(yù)留足夠空間),使用循環(huán),每使用getch接受一個(gè)字符,就將字符存放在字符串的一個(gè)元素里,然后字符數(shù)組偏移量加一,繼續(xù)使用getch存放在下一個(gè)元素里。同時(shí),每輸入一個(gè)字符(循環(huán)),就在屏幕上輸出"*",以此類推,知道輸入一個(gè)回車鍵(轉(zhuǎn)義字符\r)。基本功能就是這樣。


不能忘了在結(jié)尾加一個(gè)'\0'作為字符串結(jié)尾。

Part2 簡(jiǎn)單接口菜單

登錄過后應(yīng)該是進(jìn)入管理員系統(tǒng),之前簡(jiǎn)單寫過具體功能實(shí)現(xiàn)。在眾多功能下,需要一個(gè)總體菜單,通往各個(gè)具體的功能。這個(gè)菜單非常容易,只需要一個(gè)system函數(shù)就好。


菜單部分代碼

system函數(shù)只需要在引號(hào)里放入文件路徑就好,其實(shí)system也有其他的功能,簡(jiǎn)單列出幾個(gè):

? ? ?1.system(“cls”);清屏

? ? ?2.system(“pause”);執(zhí)行時(shí)暫停

? ? ?3.system(“路徑”);通往某個(gè)文件或者網(wǎng)址(不過需要完整的域名)

另外需要注意到的是,在通往新程序時(shí),如果當(dāng)前程序沒有必要繼續(xù)存在,需要關(guān)閉,防止占用內(nèi)存(exit(0);

Part3 具體功能實(shí)現(xiàn)

由簡(jiǎn)入難,首先完成訂單查詢部分。

這個(gè)部分不需要什么特殊難度,只需要將txt文檔中的數(shù)據(jù)按規(guī)格讀取,顯示在屏幕中即可。


簡(jiǎn)單讀取,輸出

流程可以簡(jiǎn)化為:打開文件流,按格式讀取txt文件的內(nèi)容,格式化輸出顯示屏幕,這里我另外寫了一個(gè)back函數(shù),內(nèi)容和菜單部分大部分相同。

因?yàn)楫?dāng)初為了簡(jiǎn)單些,所以基本每個(gè)功能都是分開的,但是這樣就造成了不好調(diào)取另一個(gè)文件內(nèi)的函數(shù),于是有幾種辦法可以在兩個(gè)獨(dú)立文件之間調(diào)取函數(shù):

1.使用#include。實(shí)際代碼是

#include“文件路徑名”

這個(gè)就可以將另一個(gè)文件里的所有函數(shù)都包括了。當(dāng)然,main也會(huì)被包括,如果沒注意到這點(diǎn)的話,可能會(huì)被警告previous main() function has been included之類的。

2.這個(gè)還沒試,就是通過函數(shù)地址來實(shí)現(xiàn)。如一般數(shù)據(jù)類型在被聲明之后,都會(huì)有一個(gè)固定的地址。你可以使用指針,或直接訪問地址來獲取數(shù)據(jù)。當(dāng)然,函數(shù)也有地址,也可以使用類似方式訪問。實(shí)際代碼會(huì)在過后幾天寫在下面



然后可以進(jìn)行較復(fù)雜功能的實(shí)現(xiàn)。比如按上座率進(jìn)行歷史航班查詢。


進(jìn)行讀取的文件,存有航班信息


需要解決的重點(diǎn)我以粗體顯示。也就是如何排序和在一大堆航班那中只顯示歷史航班的問題。

上座率是根據(jù)已給數(shù)據(jù)計(jì)算的,這里給一個(gè)簡(jiǎn)單的一行數(shù)據(jù)提取。

CA1351? 中國國際航空公司 ?08:00? 11:00? 320? 2080? 1380 ? 8 ? ? ? 150 ? ?09/07/16 ? ? 0

航班號(hào) ? ? 航班公司 ? ? ? ? ? ? ?起飛點(diǎn) ?降落點(diǎn) 機(jī)型 ?票價(jià)1 ?票價(jià)2 ?余票1 余票2 ?起飛日期 ? ? ? 已購 ? ? ??

計(jì)算公式-->上座率=已購買票數(shù)/(已購買票數(shù)+余票數(shù))

接下來是進(jìn)行排序的部分,一般大量排序使用的方法是冒泡排序。這個(gè)原理很簡(jiǎn)單,就是兩個(gè)兩個(gè)比較,if (前一個(gè)如果大于后一個(gè)),{.....}(那么交換)。在進(jìn)行一遍交換后,繼續(xù)交換,直到不能交換為止。另:結(jié)構(gòu)體之間可以進(jìn)行直接交換,如下圖。

這是代碼部分


如果看得不清楚,可以點(diǎn)擊這里。事實(shí)上,在百度百科,甚至其他博客給的方法大同小異,設(shè)置一個(gè)最大比較數(shù),這樣可以絕對(duì)排序完畢。這是一種方式,也可以寫成別的方式。下面是基本思路。

比如在設(shè)置聲明一個(gè)多余的N。在每次比較后,如果出現(xiàn)交換情況,就加1,每次大循環(huán)初始化一次。如果在每次大循環(huán)結(jié)束時(shí),N!=0,進(jìn)行下一次循環(huán),如果N==0,就說明冒泡結(jié)束。

根據(jù)上座率排序完成后,另一個(gè)需要解決的是時(shí)間問題。事實(shí)上C語言有直接獲取當(dāng)前系統(tǒng)時(shí)間的代碼,這里直接給出。

來自百度的幫助,蛤蛤

如果想獲取該段代碼,點(diǎn)擊這里。

那么,如何利用這段代碼來篩選出歷史航班呢。簡(jiǎn)單說來,就是當(dāng)前時(shí)間和txt文件的時(shí)間進(jìn)行第比

CA1351? 中國國際航空公司? 08:00? 11:00? 320? 2080? 1380? 8? ? ? 150? ? 09/07/16? ? 0

航班號(hào)? ? 航班公司? ? ? ? ? ? ? 起飛點(diǎn)? 降落點(diǎn) 機(jī)型? 票價(jià)1? 票價(jià)2? 余票1 余票2? 起飛日期? ? ? 已購

再次展示出來,就不需要翻頁了。需要進(jìn)行對(duì)比的就是起飛時(shí)間。但實(shí)際上,起飛時(shí)間從txt文檔里賦值到結(jié)構(gòu)體時(shí),其數(shù)據(jù)類型是char,是字符串。所以不能和time函數(shù)獲取的時(shí)間進(jìn)行直接對(duì)比。解決辦法是:

設(shè)置一個(gè)新的字符串datex,然后讀取起飛時(shí)間的字符串(假設(shè)聲明為buy.date,內(nèi)容就是起飛日期,為09/07/16)。在c語言中,往往可以對(duì)字符串進(jìn)行數(shù)組處理,先讀取buy.date[1],就是9,然后賦值到datex[0],繼續(xù)將buy.date[3]&&buy.date[4]賦值到datex[1]&&datex[2]中,這樣得到一個(gè)datex="907",使用atoi函數(shù)進(jìn)行字符串轉(zhuǎn)化為int類型,得到一個(gè)整型數(shù)據(jù)907,然后將獲取到的整形數(shù)據(jù)和time函數(shù)得到的當(dāng)前時(shí)間進(jìn)行對(duì)比,就可以獲得跟歷史航班對(duì)比的條件。

一些識(shí)別身份之類的細(xì)節(jié),等明天繼續(xù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容