按照慣例,一波課程設(shè)計走起~
這次寫的是通訊錄管理系統(tǒng)布持,經(jīng)過幾番大修和N+1次小修之后BUG已經(jīng)很少了~先來看看期間遇到的哪些問題吧:
Qusetion
1:針對手機號的排序問題(即交換結(jié)構(gòu)體)
2:文件寫入和調(diào)用時亂碼的問題
3:界面美化問題和用戶體驗感優(yōu)化
一:針對手機號的排序問題(即交換結(jié)構(gòu)體)
void swap(person *p){ //交換結(jié)構(gòu)體
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)恳守,把第三個杯子的水倒入空杯子中峦耘,然后第四個杯子倒入第三個驳概,第二個倒入第四個赤嚼,第三個倒入第二個,即完成結(jié)構(gòu)體的交換= = 好了自己理解理解~
然后應(yīng)用:
while (p2->next->next != NULL){
if (atoi(p2->next->phone)>atoi(p2->next->next->phone)){ //防止輸入非int型數(shù)據(jù)
swap(p2); k++;
}
p2 = p2->next;
}
即可完成~
二:文件寫入和調(diào)用時亂碼的問題
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);
}
如果運行顺又,可以發(fā)現(xiàn)這里是不會報錯的更卒。 而運行程序后,輸入數(shù)據(jù)稚照,程序就會出錯而關(guān)閉蹂空,此時輸入的數(shù)據(jù)并未存儲下來,進而也就無法讀取果录。
想辦法處理上枕,發(fā)現(xiàn)定義的數(shù)據(jù)類型不盡相同:
struct person {
char name[20];
char city[20];
char phone[20];
int num;
struct person *next;
};
手機號num定義的是int整型變量,所以先將上面的%s換為%d,再運行試試弱恒。結(jié)果繼續(xù)報錯辨萍,也未成功存儲數(shù)據(jù)。
再來看看讀取文件的錯誤:
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);
}
細心地同學(xué)會發(fā)現(xiàn)返弹,已經(jīng)把%s改了過來锈玉,但是讀取數(shù)據(jù)時候程序仍然會出錯停止運行,然而更扯淡的是改來改去Dev都不會報錯= = 此時發(fā)現(xiàn)這款編譯器的辣雞之處了义起!
忽然想起某大佬(劉性大佬)曾說過scanf使用格式拉背,發(fā)現(xiàn)沒有加取地址符&,改正之默终,運行椅棺,仍然報錯。后來搜尋無果穷蛹,只得重頭看起代碼來~發(fā)現(xiàn)person *p = head ;
定義在while里土陪,從頭到尾都是打渣子的,并未起到應(yīng)該起的作用肴熏,只是p2指向的緩存區(qū)不停地讀值鬼雀,釋放,肯定會報錯蛙吏。將它定義在while前源哩,即在FILE *fp;
后鞋吉,就完美解決了問題~輸入也運行并保存成功了!励烦!
三:界面美化問題和用戶體驗感優(yōu)化
讀取文件時谓着,如果1.txt不存在,將會創(chuàng)建該txt文本文檔 坛掠,并出現(xiàn)一行美美的提示語~
void duqu(person *head){ //**讀取文件信息**
FILE *fp;
person *p = head;
if ((fp = fopen("1.txt", "r+")) == NULL){
cout<<"\n\n\n\n\n\n\n 初次啟動 系統(tǒng)加載中";
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);
}
效果如圖:
在顯示功能中加入:cout << "顯示完成\n" << endl;system("pause");cout << "返回主菜單";
在輸入聯(lián)系人功能中排除相同姓名用戶(理論是可以重名的屉栓,但是強迫癥= =)
while (p->next != NULL){
if (strcmp(p->next->name, p2->name) == 0){
cout << "此聯(lián)系人已經(jīng)存在\n即將返回主窗口" << endl;
Sleep(1000);
return;
}
p = p->next;
}
在修改聯(lián)系人功能中加入和添加相同的功能:
while (p3->next != NULL){
if (strcmp(p3->next->name, p2->name) == 0){
cout << "與其他聯(lián)系人姓名重復(fù) 即將返回主菜單";
Sleep(1000);
return;
}
p3 = p3->next;
}
界面美化:
添加大量Sleep()舷蒲,getch(),system()等函數(shù)友多,提升用戶體驗感和友好度牲平。
因為某兔子說過,一款程序寫的再好域滥,如果用戶體驗感極差纵柿,它也是要GG的~
感謝某兔學(xué)姐,某李性大佬启绰,某浪學(xué)長給予的大力支持與鼓勵昂儒!