C語言課程設(shè)計(jì)手機(jī)通信錄管理系統(tǒng)計(jì)
C程序上機(jī)實(shí)習(xí)報(bào)告
C語言課程設(shè)計(jì)
課程名稱 C語言課程設(shè)計(jì)
教師姓名
本科生姓名
本科生學(xué)號(hào)
本科生專業(yè)
所在院系
類別:
日期:
課程設(shè)計(jì)評(píng)語
對(duì)課程論文的評(píng)語:
平時(shí)成績:
課程論文成績:
總 成 績:
評(píng)閱人簽名:
注:1、無評(píng)閱人簽名成績無效;
2、必須用鋼筆或圓珠筆批閱,用鉛筆閱卷無效;
3、如有平時(shí)成績,必須在上面評(píng)分表中標(biāo)出,并計(jì)算入總成績。
目 錄
課程設(shè)計(jì)評(píng)語…………………………………………………………..2
目錄……………………………………………………………………..3
1.課程論文題目………………………………………………………. 4
2. 程序設(shè)計(jì)思路…………………………….……………….…….…..4
3.功能模塊圖…………………………………………………………..4
4.?dāng)?shù)據(jù)結(jié)構(gòu)設(shè)計(jì)………………………………………………………..5
5.算法設(shè)計(jì)……………………………………………………………..5
6.程序代碼……………………………………………………………15
7.程序運(yùn)行結(jié)果………………………………………………………21
8.編程中遇到的問題及解決辦法…………………………………28
9.總結(jié)心得及良好建議……………………………………………28
10.致謝………………………………………………………………29
1.課程論文題目
手機(jī)通信錄管理系統(tǒng)設(shè)計(jì)
模擬手機(jī)通訊錄管理系統(tǒng),實(shí)現(xiàn)對(duì)手機(jī)中的通訊錄進(jìn)行管理。功能要求
下:
(1)查看功能:選擇此功能時(shí),列出下列三類選擇。
A 辦公類 B 個(gè)人類 C 商務(wù)類 ,當(dāng)選中某類型時(shí),顯示出此類所有數(shù)據(jù)中的姓名和電話號(hào)
(2)增加功能:能錄入新數(shù)據(jù)
一個(gè)結(jié)點(diǎn)包括:姓名、電話號(hào)碼、分類(可選項(xiàng)有:A 辦公類 B 個(gè)人類C商務(wù)類)、電子郵件。例如:楊春 13589664454 商務(wù)類 chuny@
當(dāng)錄入了重復(fù)的姓名和電話號(hào)碼時(shí),則提示數(shù)據(jù)錄入重復(fù)并取消錄入;當(dāng)通信錄中超過15條信息時(shí),存儲(chǔ)空間已滿,不能再錄入新數(shù)據(jù);錄入的新數(shù)據(jù)能按遞增的順序自動(dòng)進(jìn)行條目編號(hào)。
(3)修改功能:選中某個(gè)人的姓名時(shí),可對(duì)此人的相應(yīng)數(shù)據(jù)進(jìn)行修改
(4)刪除功能:選中某個(gè)人的姓名時(shí),可對(duì)此人的相應(yīng)數(shù)據(jù)進(jìn)行刪除,并自
動(dòng)調(diào)整后續(xù)條目的編號(hào)。
2.程序設(shè)計(jì)思路
根據(jù)題目要求,通訊錄中的每一條信息應(yīng)當(dāng)是以文本文件的方式存放,所以要提供文件的輸入輸出等操作;在程序中需要對(duì)通訊錄內(nèi)容的管理,應(yīng)提供查看,增加,修改,刪除條目等操作;另外還應(yīng)提供鍵盤是選擇菜單實(shí)現(xiàn)功能的選擇。
3.功能模塊圖
手機(jī)通信錄管理系統(tǒng)
退 出
刪除功能
修改功能
增加功能
4.?dāng)?shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
根據(jù)題目要求,也是為了方便以后調(diào)用,我們選擇應(yīng)用結(jié)構(gòu)體來進(jìn)行該程序的編寫。本程序也可以使用數(shù)組和鏈表完成,但是考慮到,鏈表對(duì)于我們還過于復(fù)雜,時(shí)間有限,且題目中有所謂“儲(chǔ)存空間”的限制,所以沒有必要應(yīng)用鏈表。沒有應(yīng)用數(shù)組是考慮到結(jié)構(gòu)體能更好的完成調(diào)用工作。而且可以使程序看起來更有條理。
程序中應(yīng)用函數(shù)調(diào)用是必須的。這種程序中,應(yīng)用函數(shù)調(diào)用可以使系統(tǒng)更具模塊化。本程序的函數(shù)調(diào)用中,主函數(shù)只是對(duì)菜單函數(shù)進(jìn)行了調(diào)用,這樣由于子函數(shù)之間是可以相互調(diào)用的關(guān)系,所以,為后面調(diào)用菜單提供方便。
5. 算法設(shè)計(jì)
1、主函數(shù)
主函數(shù)設(shè)計(jì)得應(yīng)簡單、直觀,所以我應(yīng)用了大量的函數(shù)調(diào)用。為了方便主菜單也可以調(diào)用,所以把菜單設(shè)計(jì)成了一個(gè)調(diào)用函數(shù),具體方法流程可見流程圖。
【流程圖】
顯示菜單
列出功能
輸入n選擇需要的功能,判斷n的值是否在1—5之間
否
是
根據(jù)n的值調(diào)用各功能模塊函數(shù)
【程序】
/*菜單函數(shù)*/
void menu()
{int n,w1;
do
{puts("\n\t\t*歡迎使用手機(jī)通訊錄管理系統(tǒng)*\n");
puts("\t\t************菜單************\n");
puts("\t\t\t1.查看功能");
puts("\t\t\t2.增加功能");
puts("\t\t\t3.修改功能");
puts("\t\t\t4.刪除功能");
puts("\t\t\t5.退出");
puts("\n\t\t****************************\n");
printf("請(qǐng)選擇你想要的功能序號(hào)(1-5):"); scanf("%d",&n);
if(n<1||n>5)
{w1=1;getchar();printf("輸入錯(cuò)誤返回主菜單\n");menu();}
else w1=0;}
while(w1==1);
switch(n)
{case 1:search();break;
case 2:add();break;
case 3:modify();break;
case 4:del();break;
case 5:exit(0);break;
}
}
/*主函數(shù)*/
main()
{menu();}
2、各功能模塊設(shè)計(jì)
(1)查看功能模塊
【需求分析】
該模塊的功能是選擇一個(gè)查詢的類別就可以顯示出該類別中的所有信息條目(辦公類,個(gè)人類,商務(wù)類),并且其重要考慮到該類中的內(nèi)容是否
有為空的情況,以及在選擇類別的過程中是否有輸入錯(cuò)誤的情況。
【流程圖】
顯示已有的種類菜單
輸入n選擇想要查看的種類,并判斷n的值是否在1-3之間
根據(jù)n值輸出各種類中所有成員信息
是
否
返回主菜單
【程序】
/*查看功能*/
void search()
{int n,w1;
do
{
puts("\t\t**********查看類別**********\n");
puts("\t\t\tA.辦公類\t\n");
puts("\t\t\tB.個(gè)人類\t\n");
puts("\t\t\tC.商務(wù)類\t\n");
puts("\t\t****************************\n");
printf("請(qǐng)輸入類別(辦公類請(qǐng)輸入“1”,個(gè)人類請(qǐng)輸入“2”,商務(wù)類請(qǐng)輸入“3”):");
scanf("%d",&n);
printf("\n");
if(n<1||n>3)
{w1=1;getchar();printf("輸入錯(cuò)誤返回主菜單\n");menu();}
else w1=0;
}
while(w1==1);
switch(n)
{case 1:putout(1);break;
case 2:putout(2);break;
case 3:putout(3);break;
}}
(2)添加功能模塊
【需求分析】
該模塊的功能是要求增添一個(gè)信息條目(其中包括姓名、電話號(hào)碼、分類、電子郵件),觀察這種信息條目,很容易就聯(lián)想到用結(jié)構(gòu)體的方式來儲(chǔ)存。在添加之前應(yīng)該先檢查儲(chǔ)存器是否已滿;當(dāng)然在添加過程應(yīng)考慮到是否有姓名或電話號(hào)碼重復(fù)的情況,在這種情況下應(yīng)提醒操作者并退出操作。
調(diào)用加載函數(shù)n=load();并計(jì)算可以記錄個(gè)數(shù)n
【流程圖】
判斷儲(chǔ)存器是否已滿
是
否
輸入姓名
判斷輸入的姓名是否存在
是
否
輸入電話號(hào)碼
判斷輸入的電話號(hào)碼是否存在
是
否
通過n來輸入類別,并判斷n是否在1-3之間
是
輸入電子郵件地址
返回主菜單
【程序】
/*添加功能*/
void add()
{int i,n,m,w1;
do
{n=load();/*打開文件*/
if(n==N) {printf("儲(chǔ)存器已滿返回主菜單\n");menu();}/*判斷儲(chǔ)存是否已滿*/
if(n!=0)
{printf("請(qǐng)輸入姓名:");
scanf("%s",&a[n].name);
for(i=0;i<n;i++)
if(strcmp(a[i].name,a[n].name)==0){printf("已存在返回主菜單\n");menu();}/*判斷姓名是否存在*/
printf("請(qǐng)輸入電話號(hào)碼:");
scanf("%s",&a[n].phone);
for(i=0;i<n;i++)
if(strcmp(a[i].phone,a[n].phone)==0){printf("已存在返回主菜單\n");menu();}
}
if(n==0)
{ printf("請(qǐng)輸入姓名:");
scanf("%s",&a[n].name);
printf("請(qǐng)輸入電話號(hào)碼:");
scanf("%s",&a[n].phone);
}
printf("請(qǐng)輸入類別(辦公類請(qǐng)輸入“1”,個(gè)人類請(qǐng)輸入“2”,商務(wù)類請(qǐng)輸入“3”):");
scanf("%d",&a[n].zhonglei);
m=a[n].zhonglei;
if(m<1||m>3)
{w1=1;getchar();printf("輸入錯(cuò)誤返回主菜單\n");menu();}
else w1=0;
}
while(w1==1);
switch(m)
{case 1:strcpy(a[n].type,"BGL");break;
case 2:strcpy(a[n].type,"GRL");break;
case 3:strcpy(a[n].type,"SWL");break;
default:printf("輸入錯(cuò)誤返回上一菜單\n");menu();
}
printf("請(qǐng)輸入電子郵件地址:");
scanf("%s",&a[n].mail);
saveA(n); /*將新的信息添加進(jìn)通訊錄*/
choice();
}
(3)修改功能模塊
【需求分析】
該模塊的功能是先判斷通訊錄是否為空,不為空的前提下輸入所想要修改的姓名,如果不存在則提醒操作者輸入錯(cuò)誤并返回主菜單,如果存在則顯示其信息,并作出提示依次輸入修改后的內(nèi)容并記錄保存。
判斷通訊錄是否為空
【流程圖】
是
否
輸入想要修改的姓名
判斷要修改的姓名是否存在
是 否
輸入新的類別
輸入新的姓名
輸入新的電話號(hào)碼
輸入新的電子郵箱地址
返回主菜單
【程序】
/*修改功能*/
void modify()
{int i,n,k,w1;
do
{char c[100];
n=load();
if(n==0)
{printf("\n");printf("通訊錄為空返回主菜單\n\n");menu();}
printf("請(qǐng)輸入你要修改的人物名稱:");
scanf("%s",&c);
for(i=0;i<n;i++)
if(strcmp(c,a[i].name)==0)break;/* 將輸入的名字存入c中,在依次與文件中的名字進(jìn)行比較。*/
if(i==n){printf("\n");printf("查無此人返回主菜單\n\n");menu();}
printf("%-20s %-15s %-5s %s\n",a[i].name,a[i].phone,a[i].type,a[i].mail);
printf("請(qǐng)輸入新的類別(辦公類請(qǐng)輸入“1”,個(gè)人類請(qǐng)輸入“2”,商務(wù)類請(qǐng)輸入“3”,取消修改請(qǐng)輸入“4”):");
scanf("%d",&a[i].zhonglei);
k=a[i].zhonglei;
if(k<1||k>5)
{w1=1;getchar();printf("輸入錯(cuò)誤返回主菜單\n");menu();
}
else w1=0;
}
while(w1==1);
switch(k)
{case 1:strcpy(a[i].type,"BGL");break;
case 2:strcpy(a[i].type,"GRL");break;
case 3:strcpy(a[i].type,"SWL");break;
case 4:printf("取消操作返回上一菜單\n");menu();
}
printf("請(qǐng)輸入新的姓名:");
scanf("%s",&(a[i].name));
printf("請(qǐng)輸入新的電話號(hào)碼:");
scanf("%s",&(a[i].phone));
printf("請(qǐng)輸入新的郵箱地址:");
scanf("%s",&(a[i].mail));
saveB(n);
choice();
}
(4) 刪除功能模塊
【需求分析】
該模塊的功能是通過輸入某一姓名,判斷改姓名是否存在,如果不存在,返回主菜單;如果存在則輸出該姓名的全部信息,再由操作者判斷是否刪除該條目。刪除后將其他的數(shù)據(jù)保存。
【流程圖】
判斷通訊錄是否為空
是
否
輸入想要?jiǎng)h除的姓名
判斷該姓名是否存在
否
是
確定刪除?
是
刪除成功,保存數(shù)據(jù)
否
返回主菜單
【程序】
/*刪除功能*/
void del()
{
int i,n,j,w1,k;
char b[100];
do
{n=load();
if(n==0)
{printf("\n");printf("通訊錄為空返回主菜單\n\n");menu();}
printf("請(qǐng)輸入你要?jiǎng)h除的人物名稱:");
scanf("%s",&b);
for(i=0;i<n;i++)
if(strcmp(b,a[i].name)==0) break;
if(i==N) {printf("查無此人返回主菜單\n");menu;}
printf("%-20s%-15s%-5s %s\n",a[i].name,a[i].phone,a[i].type,a[i].mail);
printf("確定要?jiǎng)h除此人嗎?(“是”請(qǐng)輸入“1”,“否”請(qǐng)輸入“2”):");
scanf("%d",&k);
if(k<1||k>2)
{w1=1;getchar();printf("輸入錯(cuò)誤返回主菜單\n");menu();}
else w1=0;
}
while(w1==1);
switch(k)
{case 1:for(j=i;j<n;j++) a[j]=a[j+1];saveB(j);choice();menu();break;
case 2:printf("取消操作返回主菜單\n");menu();
}
}
3、公共函數(shù)
下面是在每個(gè)功能模塊中都有可能用到的一些公共函數(shù)。
(1) 加載函數(shù)load()
【說明】
該函數(shù)可以用來加載所有的記錄,并且可以返回所有記錄的個(gè)數(shù)。
#define MAGE struct message
MAGE
{int zhonglei;
char name[20];
char phone[15];
char type[5];
char mail[100];
};
(在整個(gè)程序的開頭有聲明)
【程序】
load()
{FILE *fp;
int i;
if((fp=fopen("file.txt","ab+"))==NULL)
{printf("\n不能打開此文件返回主菜單\n");
return NULL;}
for(i=0;!feof(fp);i++)
fread(&a[i],sizeof(MAGE),1,fp);
fclose(fp);
return(i-1);
}
(2)用于添加時(shí)的保存函數(shù)saveA()
【說明】
該函數(shù)用于在將新信息添加至文件尾。
【程序】
void saveA(int i)
{FILE *fp;
if((fp=fopen("file.txt","ab"))==NULL)
{printf("\n不能打開此文件\n"); return NULL;}
if(fwrite(&a[i],sizeof(MAGE),1,fp)!=1)
printf("讀寫錯(cuò)誤\n");
fclose(fp);
}
(3)用于將修改或刪除之后記錄的保存函數(shù)saveB()
【說明】
該函數(shù)與上面的函數(shù)不同在于,它是將原有的文件覆蓋后重新將記錄全部錄入
【程序】
void saveB(int n)
{FILE *fp;
int i;
if((fp=fopen("file.txt","wb"))==NULL)/* 以wb的方式打開時(shí),會(huì)將原來的文件刪去重建*/
{printf("\n無法打開文件\n");return NULL;}
for(i=0;i<n;i++)
if(fwrite(&a[i],sizeof(MAGE),1,fp)!=1)
{printf("讀寫錯(cuò)誤返回主菜單\n");menu();}
fclose(fp);
}
(4)用于查看時(shí)的輸出函數(shù)putout()
【說明】
該函數(shù)用于查看時(shí)輸出某一類別所有的信息。
【程序】
void putout(int m)
{int i,n;
int k=0;
n=load();
for(i=0;i<n;i++)
if(a[i].zhonglei==m) k++;
if(k==0) {printf("通訊錄中該類別為空,返回主菜單\n");printf("\n");menu();}
for(i=0;i<n;i++)
{if(a[i].zhonglei==m)
printf("%-20s %-15s %-5s %s\n",a[i].name,a[i].phone,a[i].type,a[i].mail);};
menu();
}
(5)操作成功函數(shù)choice()
【說明】
該函數(shù)用于在執(zhí)行完某一操作時(shí)讓操作者選擇下一步的操作。
【程序】
void choice()
{int k,w1;
do
{printf("操作已成功,請(qǐng)選擇下面的操作(1.返回主菜單 2.退出):");
scanf("%d",&k);
if(k<1||k>2)
{w1=1;getchar();printf("輸入錯(cuò)誤返回主菜單\n");menu();}
else w1=0;
}
while(w1==1);
switch(k)
{case 1:menu();break;
case 2:exit(0);break;
}
}
6.程序代碼
#include "stdio.h"
#include "string.h"
#include"malloc.h"
#define MAGE struct message
#define N 15
MAGE
{int zhonglei;
char name[20];
char phone[15];
char type[5];
char mail[100];
}a[N];
load();
void saveA();
void saveB();
void menu();
void choice();
/*輸出功能*/
void putout(int m)
{int i,n;
int k=0;
n=load();
for(i=0;i<n;i++)
if(a[i].zhonglei==m) k++;
if(k==0) {printf("通訊錄中該類別為空,返回主菜單\n");printf("\n");menu();}
for(i=0;i<n;i++)
{if(a[i].zhonglei==m)
printf("%-20s %-15s %-5s %s\n",a[i].name,a[i].phone,a[i].type,a[i].mail);};
menu();
}
/*查看功能*/
void search()
{int n,w1;
do
{
puts("\t\t**********查看類別**********\n");
puts("\t\t\tA.辦公類\t\n");
puts("\t\t\tB.個(gè)人類\t\n");
puts("\t\t\tC.商務(wù)類\t\n");
puts("\t\t****************************\n");
printf("請(qǐng)輸入類別(辦公類請(qǐng)輸入“1”,個(gè)人類請(qǐng)輸入“2”,商務(wù)類請(qǐng)輸入“3”):");
scanf("%d",&n);
printf("\n");
if(n<1||n>3)
{w1=1;getchar();printf("輸入錯(cuò)誤返回主菜單\n");menu();
}
else w1=0;
}
while(w1==1);
switch(n)
{case 1:putout(1);break;
case 2:putout(2);break;
case 3:putout(3);break;
}
}
/*添加功能*/
void add()
{int i,n,m,w1;
do
{n=load();/*打開文件*/
if(n==N) {printf("儲(chǔ)存器已滿返回主菜單\n");menu();}/*判斷儲(chǔ)存是否已滿*/
if(n!=0)
{
printf("請(qǐng)輸入姓名:");
scanf("%s",&a[n].name);
for(i=0;i<n;i++)
if(strcmp(a[i].name,a[n].name)==0){printf("已存在返回主菜單\n");menu();}
printf("請(qǐng)輸入電話號(hào)碼:");
scanf("%s",&a[n].phone);
for(i=0;i<n;i++)
if(strcmp(a[i].phone,a[n].phone)==0){printf("已存在返回主菜單\n");menu();}
}
if(n==0)
{printf("請(qǐng)輸入姓名:");
scanf("%s",&a[n].name);
printf("請(qǐng)輸入電話號(hào)碼:");
scanf("%s",&a[n].phone);
}
printf("請(qǐng)輸入類別(辦公類請(qǐng)輸入“1”,個(gè)人類請(qǐng)輸入“2”,商務(wù)類請(qǐng)輸入“3”):");
scanf("%d",&a[n].zhonglei);
m=a[n].zhonglei;
if(m<1||m>3)
{w1=1;getchar();printf("輸入錯(cuò)誤返回主菜單\n");menu();
}
else w1=0;}
while(w1==1);
switch(m)
{case 1:strcpy(a[n].type,"BGL");break;
case 2:strcpy(a[n].type,"GRL");break;
case 3:strcpy(a[n].type,"SWL");break;
default:printf("輸入錯(cuò)誤返回上一菜單\n");menu();}
printf("請(qǐng)輸入電子郵件地址:");
scanf("%s",&a[n].mail);
saveA(n); /*將新的信息添加進(jìn)通訊錄*/
choice();
}
/*修改功能*/
void modify()
{int i,n,k,w1;
do
{
char c[100];
n=load();
if(n==0) {printf("\n");printf("通訊錄為空返回主菜單\n\n");menu();}
printf("請(qǐng)輸入你要修改的人物名稱:");
scanf("%s",&c);
for(i=0;i<n;i++)
if(strcmp(c,a[i].name)==0)break;
if(i==n){printf("\n");printf("查無此人返回主菜單\n\n");menu();}
printf("%-20s %-15s %-5s %s\n",a[i].name,a[i].phone,a[i].type,a[i].mail);
printf("請(qǐng)輸入新的類別(辦公類請(qǐng)輸入“1”,個(gè)人類請(qǐng)輸入“2”,商務(wù)類請(qǐng)輸入“3”,取消修改請(qǐng)輸入“4”):");
scanf("%d",&a[i].zhonglei);
k=a[i].zhonglei;
if(k<1||k>5)
{w1=1;getchar();printf("輸入錯(cuò)誤返回主菜單\n");menu();
}
else w1=0;
}
while(w1==1);
switch(k)
{case 1:strcpy(a[i].type,"BGL");break;
case 2:strcpy(a[i].type,"GRL");break;
case 3:strcpy(a[i].type,"SWL");break;
case 4:printf("取消操作返回上一菜單\n");menu();
}
printf("請(qǐng)輸入新的姓名:");
scanf("%s",&(a[i].name));
printf("請(qǐng)輸入新的電話號(hào)碼:");
scanf("%s",&(a[i].phone));
printf("請(qǐng)輸入新的郵箱地址:");
scanf("%s",&(a[i].mail));
saveB(n);choice();
}
/*刪除功能*/
void del()
{
int i,n,j,w1,k;
char b[100];
do
{
n=load();
if(n==0) {printf("\n");printf("通訊錄為空返回主菜單\n\n");menu();}
printf("請(qǐng)輸入你要?jiǎng)h除的人物名稱:");
scanf("%s",&b);
for(i=0;i<n;i++)
if(strcmp(b,a[i].name)==0) break;
if(i==N){printf("查無此人返回主菜單\n");menu;}
printf("%-20s%-15s%-5s %s\n",a[i].name,a[i].phone,a[i].type,a[i].mail);
printf("確定要?jiǎng)h除此人嗎?(“是”請(qǐng)輸入“1”,“否”請(qǐng)輸入“2”):");
scanf("%d",&k);
if(k<1||k>2)
{w1=1;getchar();printf("輸入錯(cuò)誤返回主菜單\n");menu();
}
else w1=0;
}
while(w1==1);
switch(k)
{case 1:for(j=i;j<n;j++) a[j]=a[j+1];saveB(j);choice();menu();break;
case 2:printf("取消操作返回主菜單\n");menu();
}
}
/*加載函數(shù)*/
load()
{FILE *fp;
int i;
if((fp=fopen("file.txt","ab+"))==NULL)
{printf("\n不能打開此文件返回主菜單\n"); return NULL;}
for(i=0;!feof(fp);i++)
fread(&a[i],sizeof(MAGE),1,fp);
fclose(fp);
return(i-1);
}
/*保存函數(shù)*/
void saveA(int i)
{FILE *fp;
if((fp=fopen("file.txt","ab"))==NULL)
{printf("\n不能打開此文件\n"); return NULL;}
if(fwrite(&a[i],sizeof(MAGE),1,fp)!=1)
printf("讀寫錯(cuò)誤\n");
fclose(fp);
}
void saveB(int n)
{FILE *fp;
int i;
if((fp=fopen("file.txt","wb"))==NULL)
{printf("\n無法打開文件\n");return NULL;}
for(i=0;i<n;i++)
if(fwrite(&a[i],sizeof(MAGE),1,fp)!=1)
{printf("讀寫錯(cuò)誤返回主菜單\n");menu();}
fclose(fp);
}
/*操作成功函數(shù)*/
void choice()
{int k,w1;
do
{ printf("操作已成功,請(qǐng)選擇下面的操作(1.返回主菜單 2.退出):");
scanf("%d",&k);
if(k<1||k>2)
{w1=1;getchar();printf("輸入錯(cuò)誤返回主菜單\n");menu();}
else w1=0;
}
while(w1==1);
switch(k)
{case 1:menu();break;
case 2:exit(0);break;
}
}
/*菜單函數(shù)*/
void menu()
{int n,w1;
do
{puts("\n\t\t*歡迎使用手機(jī)通訊錄管理系統(tǒng)*\n");
puts("\t\t************菜單************\n");
puts("\t\t\t1.查看功能");
puts("\t\t\t2.增加功能");
puts("\t\t\t3.修改功能");
puts("\t\t\t4.刪除功能");
puts("\t\t\t5.退出");
puts("\n\t\t****************************\n");
printf("請(qǐng)選擇你想要的功能序號(hào)(1-5):");
scanf("%d",&n);
if(n<1||n>5)
{w1=1;getchar();printf("輸入錯(cuò)誤返回主菜單\n");menu();
}
else w1=0;}
while(w1==1);
switch(n)
{case 1:search();break;
case 2:add();break;
case 3:modify();break;
case 4:del();break;
case 5:exit(0);break;
}
}
/*主函數(shù)*/
main()
{menu();
}
7.程序運(yùn)行結(jié)果
歡迎界面:
查看功能:
增加功能:
修改功能:
刪除功能:
退出:
輸入5,再輸入【enter】,即可退出。
8.編程中遇到的困難及解決方法
此次的編程對(duì)于我而言無疑是一件巨大的挑戰(zhàn),因自己的能力的問題,在編程過程中可以說是困難重重,首先便是時(shí)間的問題,雖然足足有好幾天的時(shí)間讓我們?cè)谕瓿梢粋€(gè)程序,但是水平確實(shí)比較水,在程序中發(fā)現(xiàn),由于函數(shù)過多,鏈接的問題自己無法解決。在運(yùn)行程序的時(shí)候發(fā)現(xiàn)了其中的一些問題,并且得以解決,如運(yùn)行中使用查看的時(shí)候,排版因?yàn)樽謹(jǐn)?shù)問題產(chǎn)生錯(cuò)位,這個(gè)可以通過轉(zhuǎn)移字符來糾正。
該程序應(yīng)用了文件的儲(chǔ)存、調(diào)用。文件在載入和保存的使用上可以應(yīng)用不同的函數(shù)來完成,在此我使用了wb的方式來打開文件,并且用fwrite及fread進(jìn)行文件的讀寫。文件在進(jìn)行調(diào)用或打開時(shí)應(yīng)注意文件是否正常打開,這個(gè)細(xì)節(jié)十分重要,可以防止在操作過程中產(chǎn)生不必要的麻煩。
最大的問題便是由于大量并且長時(shí)間的運(yùn)轉(zhuǎn),程序中的函數(shù)調(diào)用過多之后部分細(xì)節(jié)出現(xiàn)問題,目前自己依舊是無法通過更改程序數(shù)據(jù)來更改,但是通過推出保存,再重新運(yùn)行便可以了。
9.總結(jié)心得及良好建議
通過這次設(shè)計(jì),讓我得到了真正的鍛煉。我的程序中還有一些不足,但是由于時(shí)間問題,和自己經(jīng)驗(yàn)不足的原因,導(dǎo)致沒能得到及時(shí)修改,請(qǐng)老師見諒。
該程序應(yīng)用了數(shù)組,這是因?yàn)轭}目中有要求,有所謂“儲(chǔ)存空間”的限制。但是現(xiàn)實(shí)生活中,一般儲(chǔ)存設(shè)備都已很大,更適合用鏈表完成,這點(diǎn)可以在以后進(jìn)行改進(jìn),通過判斷再完成,儲(chǔ)存空間的提示。這樣通用性會(huì)大大提高到的。
自然,上面只是一個(gè)例子,程序中自然還有很多或大或小的毛病。比如,在對(duì)程序長期操作后,可能出現(xiàn)計(jì)算運(yùn)行錯(cuò)誤。這點(diǎn)是平常不容易看出來的。我到現(xiàn)在仍沒有找到問題的原因。還需要后續(xù)檢測。
此次的課程設(shè)計(jì)基本上是我們所以同學(xué)的第一次經(jīng)歷,日后這樣的機(jī)會(huì)還會(huì)有,并且以后我們會(huì)更多的去獨(dú)立完成這樣的項(xiàng)目。但是對(duì)于初次體驗(yàn)的我們而言,確實(shí)由于時(shí)間以及經(jīng)驗(yàn)不足等等方面的原因,這個(gè)任務(wù)很艱巨,相信很多同學(xué)雖然盡了自己的努力依舊無法完成,因此我希望老師在我們學(xué)習(xí)的過程中能夠給予我們更多的幫助以及稍微的減輕一下課程的難度,這樣的話同學(xué)們會(huì)更專心的投入到編程的快樂之中,品嘗到c語言,計(jì)算機(jī)給我們帶來的,以及老師們不懈努力下讓我們收獲的成果。這樣可以更好的達(dá)到老師們的目的,也更能讓學(xué)生們學(xué)到更多的知識(shí)。
10.致謝
這次學(xué)期結(jié)束的C語言課程設(shè)計(jì)雖然只有幾天,但是卻充實(shí)了我的整個(gè)假期,這次經(jīng)歷讓我對(duì)編程產(chǎn)生了更多興趣,讓我渴望用更多的時(shí)間在編程上。同樣這次的學(xué)習(xí)讓我了解了許多不止是編程的東西,我對(duì)電腦的理解范圍也進(jìn)一步擴(kuò)大,作為一名計(jì)算機(jī)學(xué)院的學(xué)生,這是意義深遠(yuǎn)的。非常感謝老師們給予我們這樣一個(gè)學(xué)習(xí)的平臺(tái),不但讓我們得到了展現(xiàn)自我能力的機(jī)會(huì)同樣讓我們發(fā)現(xiàn)許多自身存在的問題,也在學(xué)習(xí)交流之中得到一些重要信息。這讓我對(duì)計(jì)算機(jī)產(chǎn)生了更多的熱情,豐富了我的學(xué)習(xí)以及課余生活,感謝學(xué)校給予的機(jī)會(huì),感謝老師們的付出。衷心的希望老師們身體健康,活到老學(xué)到老,在幫助我們的同時(shí)也能夠有所收獲。謝謝?。?!
29