以下經驗是個人埋頭苦幹了一個星期的成果,程式不是十分完善!不過你如要需要可以到我人百度網盤下載;uk=3006152706
一、系統分析
1.1問題描述
此程式要求開發一個具有如下功能:
(1)使用者登入:輸入使用者名稱和密碼,密碼正確才允許登入。
(2)錄入通訊資訊;
(3)給定人名,修改該人的通訊資訊;
(4)給定人名,刪除該人的通訊資訊;
(5)根據輸入的人名或姓,顯示查詢到的相應通訊資訊;
(6)根據輸入的分類,顯示該分類的所有人的通訊資訊;
(7)統計功能:統計各分類的人數。
另外要求用連結串列來儲存通訊錄的資訊並實現增刪功能。
1.2系統功能分析
主要包含一下多種功能:
新增:新增通訊錄記錄,逐個新增聯絡人。
顯示:顯示通訊錄記錄,顯示所有的聯絡人。
刪除:刪除通訊錄記錄,輸入人名刪除相應的資訊。
查詢:查詢通訊錄記錄,其中分為按人名查詢和按類查詢。
修改:修改通訊錄記錄,選擇性修改。
儲存:將資訊儲存到檔案,以檔案形式儲存到硬碟。
讀取:將資訊從檔案讀取到記憶體中。
退出:退出程式。
1.3開發平臺及工具介紹
開發平臺為windows 7ultimate,
開發工具為code::blocks 10.05
二、系統設計
2.1系統總體結構設計(由於貼不是設計圖紙,在這就沒有給出)
2.2系統各個功能模組詳細設計
Login() //登入
CreatePerson_L(per,i) //新增聯絡人
Load_All_Person_L(per) //顯示所有的聯絡人
DeletePerson_L(per) //按名字刪除聯絡人
Load_Some_Person_L(per) //輸出同類聯絡人
ResetPerson_L(per) //修改聯絡人
Save_Person_L(per) //儲存通訊錄
Read_Person_L() //讀取通訊錄
Statisticsrson_L(per) //統計同類的聯絡人
2.2.1登入功能模組
登入模組的設計思想主要為:
當用戶輸入使用者名稱或密碼錯誤時,提示使用者輸入錯誤
呼叫自身
程式碼如下:
charlocaluser[7]={"admin"}; //原始使用者
charlocalpassword[7]={"123456"};//原始使用者密碼
char username[16]; //用來接收使用者登入的資訊
char password[20];
void login()
{printf("請你輸入使用者名稱和密碼 ");
printf("username:");gets(username);
printf("password:");gets(password);
if((strcmp(localuser,username)!=0) (strcmp(localpassword,password)!=0))
{printf("你輸入的使用者名稱或密碼有誤,請重新輸入 ");
login();
}
system("cls");
}
........................................
..........................................
...............................此處省略一千字
三、總結與體會
剛聽到老師說個人完成程式設計時,我心裡有點慌,心想自己上學期的C語言沒有學得很好,尤其是有關指標的操作和檔案操作。再加上細看題目時發現要求要用到連結串列,這下我就更慌了,因為連結串列這方面的知識上學期完全沒有學的樣子,幸好這個學期資料結構有學連結串列的方面的知識。但是,對於連結串列這學期才剛學沒多久!所以就慌了!
上個月很忙,所以一直拖到5月份初才開始著手準備!首先,我抽出一天的時間去圖書館複習了連結串列、指標、檔案方面的知識!即使如此,看著題目還是無從下手!所以我在網上找了有關此方面的程式,然後對照著題目開始設計整體構架!
先是設計了登入函式login(),這裡用到了當用戶輸入使用者名稱或密碼錯誤時,login()自己呼叫自己!剛開始我想到的是用goto語句來實現函式自身呼叫的功能,但是由於編譯時不知道為什麼沒有通過,也就放棄了,第二天翻書時無意之間看到了函式自身呼叫,所以就用了自身呼叫。
第二設計新增聯絡人的函式CreatePerson_L(),設計這個函式時花費了好多心思!剛開始就遇到了沒法通過編譯,一直不知道為什麼,我請教了同學,發現原來是在printf("是否繼續新增聯絡人Y/N:");這個語句後面忘記了加一個接收回車鍵的語句getchar();這個問題解決了!還有問題,那就是我錯誤地直接把初始化函式那就是InitPerson()的功能寫在CreatePerson_L()裡,當登入到通訊錄且通訊錄為空時,由於Person per;沒有頭結點,即沒有初始化,導致其它函式(如Load_All_Person_L())沒有辦法判斷通訊錄是否為空!後來我InitPerson()單獨出來,並且在int main()裡剛開始呼叫它。修改了上面兩個錯誤後,在後來測試中有個隱藏中錯誤被發現了,那就是當你第二以上呼叫CreatePerson_L()時,我發現新增加的聯絡人根本就沒有連結在原來聯絡人的後面,這個問題,我設定了一個整型變數I用來判斷是否為第一次呼叫CreatePerson_L(),當第二以上呼叫時我寫下如下程式碼解決它!
Person p,s;
s=L;
if(i>=2) //第二次以上呼叫CreatePerson_()時,指標s是重新分配的,不再指向連結串列最後一個元素
{ Person q;
q=L; //故需要重新定位指向最後一個元素
q=q->next;
while(q) //使指標跳到最後一個元素
{ s=q; //指向最後一個元素
q=q->next;
}
第三設計刪除函式,這個函式主要是要找到相應人聯絡人,然後設定兩個Person型別的指標p,s。其中s是用來跟在p的後面的,當p->name==需要刪除的聯絡人時,只需讓s->next=p->next;並釋放p。
第四、設計按類查詢函式等等。總體上,這次個人完成設計程式雖然設計的程式不好,而且很累,在電腦面前坐了差不多一個星期,腰痠背疼,但是讓我感覺很有成就感,大大提升了我對程式設計的信心。