日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python通讯录管理系统 tk_通讯录管理系统课程设计

發布時間:2024/7/23 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_通讯录管理系统课程设计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。