python通讯录管理系统 tk_通讯录管理系统课程设计
按照慣例,一波課程設計走起~
這次寫的是通訊錄管理系統,經過幾番大修和N+1次小修之后BUG已經很少了~先來看看期間遇到的哪些問題吧:
Qusetion
1:針對手機號的排序問題(即交換結構體)
2:文件寫入和調用時亂碼的問題
3:界面美化問題和用戶體驗感優化
一:針對手機號的排序問題(即交換結構體)
void swap(person *p){ //交換結構體
person *temp;
temp = p->next->next; //temp=p3
p->next->next = p->next->next->next; //p3=p4
temp->next = p->next; //p4=p2
p->next = temp; //p2=p3
}
emmm,你可以試著想想四個杯子在一起放著(p1-p4),然后再拿出一個空的(temp),把第三個杯子的水倒入空杯子中,然后第四個杯子倒入第三個,第二個倒入第四個,第三個倒入第二個,即完成結構體的交換= = 好了自己理解理解~
然后應用:
while (p2->next->next != NULL){
if (atoi(p2->next->phone)>atoi(p2->next->next->phone)){ //防止輸入非int型數據
swap(p2); k++;
}
p2 = p2->next;
}
即可完成~
二:文件寫入和調用時亂碼的問題
void save(person *head){ //**保存文件信息**
FILE *fp;
if ((fp = fopen("1.txt", "w")) == NULL){
cout << "The file 1.txt can not be opened." << endl;
return;
}
person *p = head->next;
while (p != NULL){
fprintf(fp, "%s %s %s %s \n", p->name, p->city, p->phone,p->num);
p = p->next;
}
fclose(fp);
}
如果運行,可以發現這里是不會報錯的。 而運行程序后,輸入數據,程序就會出錯而關閉,此時輸入的數據并未存儲下來,進而也就無法讀取。
想辦法處理,發現定義的數據類型不盡相同:
struct person {
char name[20];
char city[20];
char phone[20];
int num;
struct person *next;
};
手機號num定義的是int整型變量,所以先將上面的%s換為%d,再運行試試。結果繼續報錯,也未成功存儲數據。
再來看看讀取文件的錯誤:
void duqu(person *head){ //**讀取文件信息**
FILE *fp;
if ((fp = fopen("1.txt", "r")) == NULL){
return;
}
while (!feof(fp)){
person *p = head;
person *p2 = new person;
fscanf(fp, "%s %s %s %d", p2->name, p2->city, p2->phone,p2->num);
while (p->next != NULL){
p = p->next;
}
p->next = p2;
p2->next = NULL;
}
fclose(fp);
}
細心地同學會發現,已經把%s改了過來,但是讀取數據時候程序仍然會出錯停止運行,然而更扯淡的是改來改去Dev都不會報錯= = 此時發現這款編譯器的辣雞之處了!
忽然想起某大佬(劉性大佬)曾說過scanf使用格式,發現沒有加取地址符&,改正之,運行,仍然報錯。后來搜尋無果,只得重頭看起代碼來~發現person *p = head ;定義在while里,從頭到尾都是打渣子的,并未起到應該起的作用,只是p2指向的緩存區不停地讀值,釋放,肯定會報錯。將它定義在while前,即在FILE *fp;后,就完美解決了問題~輸入也運行并保存成功了!!
三:界面美化問題和用戶體驗感優化
讀取文件時,如果1.txt不存在,將會創建該txt文本文檔 ,并出現一行美美的提示語~
void duqu(person *head){ //**讀取文件信息**
FILE *fp;
person *p = head;
if ((fp = fopen("1.txt", "r+")) == NULL){
cout<<"\n\n\n\n\n\n\n 初次啟動 系統加載中";
Sleep(500);cout << "●";Sleep(500);cout << "●";Sleep(500);cout << "●";
Sleep(500);cout << "●";Sleep(500);cout << "●";Sleep(500);cout << "●";
return;
}
else{
while (!(feof(fp))){
person *p2 = new person;
fscanf(fp, "%s %s %s %d\n", &p2->name, &p2->city, &p2->phone, &p2->num);
p->next = p2;
p = p->next;
p->next = NULL;
}
}
fclose(fp);
}
效果如圖:
就問你美不美!!.png
在顯示功能中加入:cout << "顯示完成\n" << endl;system("pause");cout << "返回主菜單";
在輸入聯系人功能中排除相同姓名用戶(理論是可以重名的,但是強迫癥= =)
while (p->next != NULL){
if (strcmp(p->next->name, p2->name) == 0){
cout << "此聯系人已經存在\n即將返回主窗口" << endl;
Sleep(1000);
return;
}
p = p->next;
}
在修改聯系人功能中加入和添加相同的功能:
while (p3->next != NULL){
if (strcmp(p3->next->name, p2->name) == 0){
cout << "與其他聯系人姓名重復 即將返回主菜單";
Sleep(1000);
return;
}
p3 = p3->next;
}
界面美化:
圖片.png
添加大量Sleep(),getch(),system()等函數,提升用戶體驗感和友好度。
因為某兔子說過,一款程序寫的再好,如果用戶體驗感極差,它也是要GG的~
感謝某兔學姐,某李性大佬,某浪學長給予的大力支持與鼓勵!
總結
以上是生活随笔為你收集整理的python通讯录管理系统 tk_通讯录管理系统课程设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机字体原理,字体图标生成原理(1)
- 下一篇: 单目相机 svd 从图像恢复3维位置_论