C語(yǔ)言程序設(shè)計(jì)實(shí)習(xí)報(bào)告 行編輯器 學(xué)生管理系統(tǒng)
《C語(yǔ)言程序設(shè)計(jì)實(shí)習(xí)報(bào)告 行編輯器 學(xué)生管理系統(tǒng)》由會(huì)員分享,可在線閱讀,更多相關(guān)《C語(yǔ)言程序設(shè)計(jì)實(shí)習(xí)報(bào)告 行編輯器 學(xué)生管理系統(tǒng)(47頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、 C程序設(shè)計(jì)實(shí)習(xí)報(bào)告 題目:簡(jiǎn)單的行編輯器(修改版) 學(xué) 院: 專(zhuān) 業(yè): 姓 名: 班級(jí)學(xué)號(hào): 指導(dǎo)教師: 2009年 7 月 3 日 前言 由于我們班選題是題號(hào)和學(xué)號(hào)一一對(duì)應(yīng),所以我抽到了16題,簡(jiǎn)單的行編輯器。剛開(kāi)始時(shí)不知道什么叫行編輯器,以為這個(gè)題目有多么的神秘,第二次實(shí)習(xí)時(shí)老師說(shuō)選這個(gè)題目最好換個(gè)題,與老師交流,老師建議在原有的題目上加些功能。只是還是不知道什么叫行編輯器,上網(wǎng),問(wèn)同學(xué),沒(méi)有一點(diǎn)思路。再一次問(wèn)老師,老師說(shuō)不用管它什么是行編輯器,編輯的目的是為了后面對(duì)文件進(jìn)行處理,于是這一次總算有了新的思
2、路。等到這個(gè)題快要做完時(shí),也明白了為什么老師說(shuō)它太簡(jiǎn)單了,做完后自己感覺(jué)都有串改題目之嫌疑,原題的要求實(shí)在太簡(jiǎn)單了,自己加的功能占了程序的大部分。8天下來(lái)感覺(jué)自己對(duì)C語(yǔ)言以及程序編輯的認(rèn)識(shí)加深了許多。以前覺(jué)得很難的結(jié)構(gòu)體,數(shù)組,文件全部用到了,雖然并不能完全掌握,那也有一些成就感。在這里要感謝老師以及我的同學(xué),在整個(gè)編程中給了我很大的幫助。 目錄 前言 II 目錄 III 1題目要求 - 1 - 2需求分析 - 1 - 3概要設(shè)計(jì) - 1 - 3.1設(shè)計(jì)思想 - 1 - 3.2軟件運(yùn)行與開(kāi)發(fā)平臺(tái) -
3、 2 - 3.3數(shù)據(jù)結(jié)構(gòu) - 2 - 3.4系統(tǒng)結(jié)構(gòu)圖 - 2 - 4詳細(xì)設(shè)計(jì) - 3 - 4.1主函數(shù) - 3 - 4.2各功能模塊設(shè)計(jì) - 4 - (1)輸入模塊 - 4 - (2)瀏覽模塊 - 5 - (3)添加模塊 - 6 - (4)查找模塊 - 8 - (5)修改模塊 - 13 - (6)排序模塊 - 16 - (7)保存模塊 - 19 - 4.3公共函數(shù) - 19 - (1)加載函數(shù) - 19 - (2) 學(xué)號(hào)輸入函數(shù) - 20 - (3)輸入三個(gè)科目分?jǐn)?shù)函數(shù) - 20 - (4)求平均值函數(shù) - 21 - (5)輸入整個(gè)記錄函數(shù) - 21 -
4、 (6)修改整條記錄函數(shù) - 21 - (7)顯示數(shù)據(jù)結(jié)構(gòu)項(xiàng)目 - 22 - (8)顯示一個(gè)記錄的函數(shù) - 22 - 5測(cè)試、結(jié)果進(jìn)行分析 - 23 - 5.1進(jìn)入頁(yè)面 - 23 - 5.2數(shù)據(jù)錄入 - 24 - 5.3數(shù)據(jù)錄入成功,直接返回菜單 - 24 - 5.4不進(jìn)行數(shù)據(jù)錄入,直接進(jìn)入菜單。 - 25 - 5.5瀏覽數(shù)據(jù) - 25 - 5.6添加數(shù)據(jù) - 26 - 5.7瀏覽添加后的數(shù)據(jù) - 26 - 5.8查找—按姓名查找 - 27 - 5.9查找—按學(xué)號(hào)查找 - 27 - 5.10修改—對(duì)分?jǐn)?shù)2進(jìn)行修改 - 28 - 5.11排序——按平均分進(jìn)行排序 -
5、28 - 6總結(jié) - 30 - 7參考文獻(xiàn) - 30 - 8附錄 - 31 - 主要程序模塊清單 - 31 - - 43 - 1題目要求 原題:簡(jiǎn)單的行編輯器 【要求】 (1) 設(shè)置一個(gè)簡(jiǎn)單的行編輯器,每行以回車(chē)結(jié)束。 (2) 數(shù)據(jù)以文件形式儲(chǔ)存。 (3) 編輯器具有查找、替換、修改數(shù)據(jù)的功能。 修改后:修改思路是將由行編輯器生成的文件換成有關(guān)結(jié)構(gòu)體的內(nèi)容,建立一個(gè)結(jié)構(gòu)體輸入關(guān)信息,生成文件,再實(shí)現(xiàn)查找、替換、修改數(shù)據(jù)等的功能。這里具體是參考書(shū)上學(xué)生成績(jī)管理系統(tǒng),實(shí)現(xiàn)成績(jī)的錄入,顯示,查找,添加,保存等功能模塊。 2需求分析 根據(jù)題目
6、要求,由于學(xué)生信息是存放在文件中,所以應(yīng)提供文件的輸入、輸出等操作;在程序中需要瀏覽學(xué)生的信息,應(yīng)提供顯示、查找、排序等操作;另外還應(yīng)提供鍵盤(pán)式選擇菜單實(shí)現(xiàn)功能選擇。 3概要設(shè)計(jì) 3.1設(shè)計(jì)思想 由于原題的特點(diǎn),對(duì)題目進(jìn)行了一定的拓展。本著提高自己編程能力,加深對(duì)C語(yǔ)言重點(diǎn)、難點(diǎn)內(nèi)容的理解,添加了關(guān)于結(jié)構(gòu)體、數(shù)組以及文件的運(yùn)用。將程序模塊化,使程序條理清楚,制作簡(jiǎn)單,容易讀懂,并能體會(huì)到程序開(kāi)發(fā)的思想與方法,加深對(duì)C語(yǔ)言編程的認(rèn)識(shí)。 3.2軟件運(yùn)行與開(kāi)發(fā)平臺(tái) C語(yǔ)言,Windows平臺(tái),VC6.0, 3.3數(shù)據(jù)結(jié)構(gòu) 此處選用了結(jié)構(gòu)體的形式來(lái)存放每一個(gè)學(xué)生的信息,對(duì)與若干個(gè)學(xué)生采用
7、了結(jié)構(gòu)體數(shù)組。 3.4系統(tǒng)結(jié)構(gòu)圖 學(xué)生成績(jī)管理系統(tǒng) 數(shù)據(jù)輸入 數(shù)據(jù)顯示 數(shù)據(jù)添加 數(shù)據(jù)查找 數(shù)據(jù)修改 排序 數(shù)據(jù)保存 按姓名查找 按學(xué)號(hào)查找 按分?jǐn)?shù)1排序 按分?jǐn)?shù)2排序 按分?jǐn)?shù)3排序 按平均分排序 4詳細(xì)設(shè)計(jì) 4.1主函數(shù) 主函數(shù)比較簡(jiǎn)單,只提供了輸入和菜單函數(shù)的調(diào)用。各個(gè)功能的模塊用菜單方式選擇。 圖4.1—1 N Y 開(kāi)始 顯示一系列功能選項(xiàng) 輸入n,判斷m是否是1~2 根據(jù)n的值調(diào)用各功能模塊函數(shù) 結(jié)束 【程序】 void main() {int q,w1; printf("\t\t************
8、****行編輯器(修改拓展版)****************\n\n"); printf("\t\t\t\t\t072092\t周磊\t20091002238\n\n"); do { printf("\t\t重新錄入數(shù)據(jù)請(qǐng)按1\t\t進(jìn)入菜單請(qǐng)按2: [ ]\b\b"); scanf("%d",&q); if(q!=1&&q!=2) /*對(duì)選擇數(shù)字作出判斷*/ { w1=1; getchar(); } else w1=0; } while(w1==1); if(q==1) /*i
9、f語(yǔ)句選擇要進(jìn)行的操作*/ enter(); else menu(); } 4.2各功能模塊設(shè)計(jì) (1)輸入模塊 考慮到自己在C學(xué)習(xí)時(shí)遇到的問(wèn)題,以及在考計(jì)算機(jī)二級(jí)時(shí)薄弱的地方,以及聯(lián)系這個(gè)題目的要求,此處選用了結(jié)構(gòu)體的形式來(lái)存放每一個(gè)學(xué)生的信息,對(duì)與若干個(gè)學(xué)生采用了結(jié)構(gòu)體數(shù)組。具體到各個(gè)數(shù)據(jù)的信息,學(xué)號(hào)和姓名采用了字符型數(shù)組,分?jǐn)?shù)為整型,而平均分采用了實(shí)型。 /***************************定義結(jié)構(gòu)體變量*****************************/ struct student { char num[20];/*學(xué)號(hào)*/
10、 char name[100];/*姓名*/ int score[3];/*分?jǐn)?shù)*/ float ave;/*平均分*/ }stu[N]; /*stu[N]中每個(gè)元素對(duì)應(yīng)一個(gè)學(xué)生*/ N采用了宏定義的方式,可以隨時(shí)在源程序中修改。 【程序】 /*************輸入模塊****************/ void enter() Y N 圖4.2—1 開(kāi)始 輸入用戶要輸入學(xué)生記錄的個(gè)數(shù)n 從0~n-1調(diào)用輸入函數(shù)input(i) i!=0嗎? 調(diào)用保存函數(shù)save() 返回主菜單 結(jié)束
11、{
int i,n;
printf("請(qǐng)輸入學(xué)生數(shù)量(0-%d)?:",N-1);
scanf("%d",&n);
printf("\n請(qǐng)輸入數(shù)據(jù)\n\n");
for(i=0;i 12、
【程序】
/*********瀏覽函數(shù)*********/
void browse()/*瀏覽模塊,前面多次用到*/
{
int i,n;
n=load();
printf_face();
for(i=0;i 13、n\n");
getch();
menu();
}
(3)添加模塊
該模塊的功能是用戶需要增加新的學(xué)生記錄,注意新添加的內(nèi)容不能覆蓋原來(lái)的記錄。
追加模塊流程圖:
圖4.2—3
開(kāi)始
調(diào)用加載函數(shù),并計(jì)算可以記錄的個(gè)數(shù)
K==m+n
i從n到k調(diào)用輸入函數(shù)input(i)
保存追加的記錄
結(jié)束
輸入用戶要追加學(xué)生記錄個(gè)數(shù)
【程序】
/***************添加模塊********************/
void add()
{
int i,n,m,k;
FILE *fp;
n=load();
printf("請(qǐng)輸入添加的學(xué) 14、生個(gè)數(shù)(0-%d)?:",N-1-n);
scanf("%d",&m); /*m為添加學(xué)生的個(gè)數(shù)*/
k=m+n-1;
for(i=n;i<=k;i++)
{
printf("\n 輸入第%d個(gè)學(xué)生記錄\n",i-n+1);
input(i); /*調(diào)用輸入函數(shù)*/
}
if((fp=fopen("zhoulei.txt","ab"))==NULL)
{
printf("\n文件無(wú)法打開(kāi)\n");
}
for(i=n;i<=k;i++)
if(fwrite(&stu[i],sizeo 15、f(struct student),1,fp)==0)
printf("文件寫(xiě)入錯(cuò)誤\n");
fclose(fp);
save();
}
(4)查找模塊
該模塊在參考程序上做的一定邏輯上的修改,可以按姓名和按學(xué)號(hào)進(jìn)行查找,找到以后,可進(jìn)行修改和刪除信息的操作。
由于改動(dòng)方便,這里的按姓名和按學(xué)號(hào)查找分了兩個(gè)函數(shù),使函數(shù)比較煩綴,故函數(shù)還可以進(jìn)行優(yōu)化。
圖4.2—4
其他
2
1
開(kāi)始
顯示查找方式
讓用戶選擇
調(diào)用按姓名查找函數(shù)search_name()
調(diào)用按學(xué)號(hào)查找函數(shù)search_no()
結(jié)束
【程序】
a)查找模塊
/* 16、*******查找函數(shù)********/
void search()
{
int z,w1;
do
{
printf("請(qǐng)輸入查找方式:1).按姓名查找 2).按學(xué)號(hào)查找 [ ]\b\b");
scanf("%d",&z);
if(z!=1&&z!=2) /*對(duì)選擇數(shù)字作出判斷*/
{
w1=1;
getchar();
}
else w1=0;
}
while(w1==1);
if(z==1)
search_name(); /*調(diào)用按姓名查找程序*/
else
search 17、_no(); /*調(diào)用按學(xué)號(hào)查找程序*/
}
b) 按姓名查找模塊
這個(gè)是根據(jù)姓名查找到對(duì)應(yīng)的學(xué)生記錄,但在此處程序有一定的缺陷,就是如果有相同的姓名,只能查到最上面的一個(gè),而其他的則不能找到。后來(lái)嘗試修改時(shí)發(fā)現(xiàn),還需要改動(dòng)其他相應(yīng)的函數(shù),故沒(méi)有進(jìn)行下去。
N
Y
Y
N
開(kāi)始
輸入學(xué)生姓名
是否找到此學(xué)生記錄
顯示找到的記錄
提示沒(méi)有找到
詢問(wèn)用戶是否繼續(xù)查找
讓用戶做出選擇
結(jié)束
圖4.2—5
【程序】
/**********按姓名查找***************/
void search_name()
{
int i,n 18、,k,w1=1,w2,w3,w4;
struct student s;
n=load();
do
{
do
{k=-1;
printf("\n\n請(qǐng)輸入要查找的姓名! 姓名:");
scanf("%s",s.name); /*輸入要修改的數(shù)據(jù)的姓名*/
printf_face(); /*調(diào)用顯示數(shù)據(jù)結(jié)構(gòu)項(xiàng)目的函數(shù)*/
for(i=0;i 19、 /*找到要修改的記錄*/
printf_one(k);break; /*調(diào)用顯示一個(gè)記錄的函數(shù)*/
}
if(k==-1)
{ printf("\n\n記錄不存在!");
printf("\n\n是否繼續(xù)?\n\t1).是 2).否 返回 [ ]\b\b");
scanf("%d",&w1);
if(w1==1)
search();
else menu();
}
}
while(k==-1&&w1==1);
w4=0;w3=0;
20、if(k!=-1)
{printf("\n\n請(qǐng)選擇下一步:\n\t1).查找其他 2).修改 3).刪除 4).返回菜單 [ ]\b\b");
scanf("%d",&w2);
switch(w2)
{ case 2:w3=modify_data(k,n);break;
case 3: {printf("\n確定刪除?\n\t1).確定 2).返回 [ ]\b\b");
scanf("%d",&w4);
if(w4==1)
stu[k].ave=0;
break;
}
21、
}
if(w3==1||w4==1)
{
save();
printf("\n\n操作成功^_^");
printf("\n\n請(qǐng)選擇下一步:\n\t1).查找其他 2).返回 [ ]\b\b");
scanf("%d",&w2);
}
}
}while(w2==1);
menu();
}
c) 按學(xué)號(hào)查找模塊
這個(gè)函數(shù)是在按姓名查找模塊的基礎(chǔ)上做了相應(yīng)的改動(dòng),由于學(xué)號(hào)具有唯一性,故不存在查不到相同學(xué)號(hào)的情況。
N
Y
Y
N
開(kāi)始
輸入學(xué)生學(xué)號(hào)
是否找到此學(xué)生記錄
顯示找到的記錄
提示沒(méi)有找到
詢問(wèn)用戶是否繼 22、續(xù)查找
讓用戶做出選擇
結(jié)束
圖4.2—6
【程序】
/*********按學(xué)號(hào)查找程序***********/
void search_no()
{
int i,n,k,w1=1,w2,w3,w4;
struct student s;
n=load();
do
{
do
{k=-1;
printf("/n/n請(qǐng)輸入要查找的學(xué)號(hào)! 學(xué)號(hào):");
scanf("%s",s.num);
printf_face();
for(i=0;i 23、
{k=i;
printf_one(k);break;
}
if(k==-1)
{ printf("\n\n記錄不存在!");
printf("\n\n是否繼續(xù)?\n\t1).是 2).否 返回 [ ]\b\b");
scanf("%d",&w1);
if(w1==1)
search();
else menu();
}
}
while(k==-1&&w1==1);
w4=0;w3=0;
if(k!=-1)
{printf("\n\n請(qǐng)選擇下一步:\n\ 24、t1).查找下一個(gè) 2).修改 3).刪除 4).返回菜單 [ ]\b\b");
scanf("%d",&w2);
switch(w2)
{ case 2:w3=modify_data(k,n);break;
case 3: {printf("\n確定刪除?\n\t1).確定 2).返回 [ ]\b\b");
scanf("%d",&w4);
if(w4==1)
stu[k].ave=0;
break;
}
}
if(w3==1||w4==1)
{
sa 25、ve();
printf("\n\n操作成功^_^");
printf("\n\n請(qǐng)選擇下一步:\n\t1).查找其他 2).返回 [ ]\b\b");
scanf("%d",&w2);
}
}
}while(w2==1);
menu();
}
/*********瀏覽函數(shù)*********/
void browse()/*瀏覽模塊,前面多次用到*/
{
int i,n;
n=load();
printf_face();
for(i=0;i 26、 {
printf("任意鍵繼續(xù)\n");
getch();
puts("\n\n");
}
printf_one(i);
}
printf("\n\t共有%d條記錄.\n",n);
printf("\n任意鍵返回\n\n");
getch();
menu();
}
(5)修改模塊
該模塊首先要顯示所有學(xué)生的信息,并采用分屏顯示。顯示完所有記錄后,用戶輸入要修改的學(xué)生的學(xué)號(hào),根據(jù)學(xué)號(hào)查找學(xué)生記錄,并提示用戶修改該記錄的哪部分信息。
N
Y
Y
N
開(kāi)始
顯示所有記錄,讓用戶看哪條信息需要修改
輸入要修改的學(xué)號(hào)
i!=0嗎 27、?
顯示找到的記錄,調(diào)用修改函數(shù)
提示沒(méi)有找到
詢問(wèn)用戶是否繼續(xù)修改
返回主菜單
結(jié)束
圖4.2—7
【程序】
/*************修改函數(shù)***********/
void modify()
{
struct student s;
int i,n,k,w0=1,w1,w2=0;
n=load();
do
{
k=-1;
printf_face(); /*調(diào)用顯示數(shù)據(jù)結(jié)構(gòu)項(xiàng)目函數(shù)*/
for(i=0;i 28、/*目的是分屏顯示*/
{ printf("\n\n記住你要修改的學(xué)號(hào).任意鍵繼續(xù) ...");
getch();
puts("\n\n");
}
printf_one(i); /*調(diào)用顯示一個(gè)記錄的函數(shù)*/
}
do
{
printf("\n\n請(qǐng)輸入你想要修改的學(xué)號(hào):");
scanf("%s",s.num); /*輸入要修改的數(shù)據(jù)的學(xué)號(hào)*/
for(i=0;i 29、 {
k=i; /*找到要修改的記錄*/
s=stu[i]; /*備份當(dāng)次要修改的學(xué)生記錄stu[i]*/
}
if(k==-1) printf("\n\n記錄不存在!"); /*當(dāng)k=-1表示沒(méi)有找到*/
}
while(k==-1);
printf_face();
printf_one(k);
w1=modify_data(k,n); /*修改學(xué)生記錄并返回保存控制值*/
if(w1==1)
{
prin 30、tf("\n操作成功^_^.\n\n是否繼續(xù)修改?\n\n\t1).是2).返回并保存\t[ ]\b\b");
scanf("%d",&w0);
w2=1; /*用來(lái)控制保存,使w2=1是標(biāo)記已有過(guò)的修改*/
}
else
{
w0=0;
if(w2==1)
stu[k]=s;
}
if(w0!=1&&w2==1)
save();/*w2不等于1表示在此次之前沒(méi)有修改過(guò),這是就保存用戶已確認(rèn)的修改并返回*/
}
while(w0==1);
printf("\n\n你所修改的內(nèi)容不存在 31、");
menu();
}
(6)排序模塊
該模塊在原有的排序模塊上做了一定的修改,可以按照分?jǐn)?shù)1,、分?jǐn)?shù)2、分?jǐn)?shù)3以及平均數(shù)進(jìn)行由大到小的排序。這里選擇了冒泡法排序。
由于改動(dòng)方便,這里的4種排序方法在程序上其實(shí)是大同小異,因此程序還需進(jìn)行一定的優(yōu)化。
還有一個(gè)問(wèn)題就是排序結(jié)束后不能直接瀏覽,需要手動(dòng)調(diào)用瀏覽模塊。其原因是在排序后調(diào)用了保存函數(shù),而保存函數(shù)保存完畢要直接返回主菜單。如果先進(jìn)行瀏覽的話,所顯示內(nèi)容不是排序后的。
非1~4
1~4
開(kāi)始
顯示要進(jìn)行的排序方式
用戶做出選擇
調(diào)用相應(yīng)的函數(shù)
結(jié)束
圖4.2—8
【程序】
a) 排序模塊
/ 32、********************排序模塊********************/
void order()
{ int m;
printf("請(qǐng)選擇排序方式:1).按分?jǐn)?shù)1排序 2).按分?jǐn)?shù)2排序 3).按分?jǐn)?shù)3排序 4).按平均分排序\n\n");
scanf("%d",&m);
switch(m)
{ case 1:order_score1();break;/*分?jǐn)?shù)1*/
case 2:order_score2();break;/*分?jǐn)?shù)2*/
case 3:order_score3();break;/*分?jǐn)?shù)3*/
case 33、 4:order_ave();break; /*平均分*/
}
}
b) 按四種方式排序
圖4.2—9
開(kāi)始
用冒泡法排序
保存
返回主菜單
結(jié)束
/*********按平均分排序*****************/
void order_ave()
{ int i,j,n;
struct student s;
n=load();
for(i=0;i 34、u[i] =stu[j];
stu[j] =s;
}
}
save();
puts("\n\n");
menu();
}
/*********按分?jǐn)?shù)1排序*****************/
void order_score1()
{ int i,j,n;
struct student s;
n=load();
for(i=0;i 35、[i] =stu[j];
stu[j] =s;
}
}
save();
puts("\n\n");
menu();
}
/*********按分?jǐn)?shù)2排序*****************/
void order_score2()
{ int i,j,n;
struct student s;
n=load();
for(i=0;i 36、] =stu[j];
stu[j] =s;
}
}
save();
puts("\n\n");
menu();
}
/*********按分?jǐn)?shù)3排序*****************/
void order_score3()
{ int i,j,n;
struct student s;
n=load();
for(i=0;i 37、 =stu[j];
stu[j] =s;
}
}
save();
puts("\n\n");
menu();
}
(7)保存模塊
這個(gè)模塊單獨(dú)放在菜單里其實(shí)有點(diǎn)綴余,因?yàn)槊總€(gè)對(duì)文件進(jìn)行寫(xiě)入或修改的操作都單獨(dú)進(jìn)行了保存。這里文件的讀寫(xiě)全用的是二進(jìn)制,所以保存的文件直接以文本打開(kāi)后會(huì)出現(xiàn)亂碼。
【程序】
/************************保存函數(shù)*******************************/
void save()/*存儲(chǔ)函數(shù)*/
{
int i;
FILE *fp;
if((fp=fopen("zhou 38、lei.txt","w"))==NULL) /*按只寫(xiě)方式打開(kāi)文件*/
{
printf("文件無(wú)法打開(kāi)\n");/*防止文件為空,并報(bào)錯(cuò)*/
}
for(i=0;i 39、保存成功!\n\n按任意鍵繼續(xù)\n\n");
getch();
menu();
}
/*一般的保存模塊,用于各種變動(dòng)之后,文件的保存*/
4.3公共函數(shù)
這里都是些在每個(gè)模塊都可能用到的公共函數(shù)
(1)加載函數(shù)
/********加載函數(shù)********/
int load()
{
FILE *fp;
int i;
if((fp=fopen("zhoulei.txt","rb"))==NULL) /*以只讀方式打開(kāi)一個(gè)二進(jìn)制文件*/
{
printf("\n無(wú)法打開(kāi)文件\n");
return NULL;
}
40、for(i=0;!feof(fp);i++)
fread(&stu[i],sizeof(struct student),1,fp);
fclose(fp);
return(i-1); /*返回記錄個(gè)數(shù)*/
}
(2) 學(xué)號(hào)輸入函數(shù)
/**********學(xué)號(hào)輸入函數(shù)************/
void no_input(int i,int n) /*i表示第i個(gè)學(xué)生的信息,n表示比較到第n個(gè)學(xué)生*/
{
int j,k,w1;
do
{w1=0;
printf("學(xué)號(hào):");
scanf("%s",stu[i].num); 41、
for(j=0;stu[i].num[j]!='\0';j++) /*學(xué)號(hào)輸入函數(shù),作了嚴(yán)格的規(guī)定*/
if(stu[i].num[j]<'0'||stu[i].num[j]>'9') /*判斷學(xué)號(hào)是否為數(shù)字*/
{
puts("輸入錯(cuò)誤!僅可輸入(0-9),請(qǐng)重新輸入!\n");
w1=1;break;
}
if(w1!=1)
for(k=0;k 42、
puts("此記錄已存在,請(qǐng)重新輸入!\n");
w1=1;break;
}
}
while(w1==1);
}
(3)輸入三個(gè)科目分?jǐn)?shù)函數(shù)
/***i表示第i個(gè)學(xué)生記錄****/
void score_input(int i)
{
int j;
for(j=0;j<3;j++)
{
printf("分?jǐn)?shù) %d:",j+1);
scanf("%d",&stu[i].score[j]);/*循環(huán)語(yǔ)句依次輸入三個(gè)分?jǐn)?shù)*/
}
}
(4)求平均值函數(shù)
/********求平均值函數(shù)*********/
void avera 43、ge(int i)
{
int j,sum;
for(sum=0,j=0;j<3;j++)
sum+=stu[i].score[j];
stu[i].ave=(float)(sum/3.0);/*循環(huán)語(yǔ)句求平均值,強(qiáng)制類(lèi)型轉(zhuǎn)換成浮點(diǎn)型*/
}
(5)輸入整個(gè)記錄函數(shù)
/**********輸入整個(gè)記錄函數(shù)**************/
void input(int i)
{
no_input(i,i); /*****調(diào)用學(xué)號(hào)輸入函數(shù)******/
printf("姓名:");
scanf("%s",stu[i].name);
sc 44、ore_input(i); /*****調(diào)用分?jǐn)?shù)輸入函數(shù)******/
average(i); /*****調(diào)用求平均值函數(shù)******/
}
(6)修改整條記錄函數(shù)
/***************修改整條記錄函數(shù)****************/
int modify_data(int i,int n) /*修改第i個(gè)記錄*/
{int c,w1;
do
{ puts("\n請(qǐng)選擇修改方式\n\n 1).學(xué)號(hào) 2).姓名 3).分?jǐn)?shù)1 4).分?jǐn)?shù)2 5).分?jǐn)?shù)3 6).所有分?jǐn)?shù) 7).所有數(shù)據(jù) 8).取消并返回");
45、printf("請(qǐng)選擇:[ ]\b\b");
scanf("%d",&c);
if(c>8||c<1)
{puts("\n選擇錯(cuò)誤,請(qǐng)重新輸入!");
getchar(); /*當(dāng)輸入是字符時(shí)可以防止是死循環(huán)*/
}
}while(!(c<=8&&c>=1));
do
{
switch(c) /*選擇要修改的項(xiàng)目*/
{
case 1:no_input(i,n);break;
case 2:printf("姓名:");scanf("%s",stu[i].name);break;
ca 46、se 3:printf("分?jǐn)?shù)1:");scanf("%d",&stu[i].score[0]);break;
case 4:printf("分?jǐn)?shù)2:");scanf("%d",&stu[i].score[1]);break;
case 5:printf("分?jǐn)?shù)3:");scanf("%d",&stu[i].score[2]);break;
case 6:score_input(i);break;
case 7:input(i);break;
}
if(c>2&&c<7)
average(i);
puts("\n新數(shù)據(jù):\n");
printf_face( 47、); /*顯示數(shù)據(jù)結(jié)構(gòu)項(xiàng)目*/
printf_one(i); /*修改后的數(shù)據(jù)讓用戶確認(rèn)*/
printf("\n是否確定?\n\n\t1).是 2).否,重新修改 3).直接返回 [ ]\b\b");
scanf("%d",&w1);
}while(w1==2);
return(w1); /*返回控制值*/
}
(7)顯示數(shù)據(jù)結(jié)構(gòu)項(xiàng)目
/*********顯示數(shù)據(jù)結(jié)構(gòu)項(xiàng)目函數(shù)******/
void printf_face() /**顯示數(shù)據(jù)結(jié)構(gòu)項(xiàng)目函數(shù)**/
{
pri 48、ntf("\n\t學(xué)號(hào)\t姓名 分?jǐn)?shù)1 分?jǐn)?shù)2 分?jǐn)?shù)3 平均\n");
}
(8)顯示一個(gè)記錄的函數(shù)
/********顯示一個(gè)記錄的函數(shù)***********/
void printf_one(int i)
{
int j;
printf("%11s\t%-17s",stu[i].num,stu[i].name );
for(j=0;j<3;j++)
printf("%9d",stu[i].score[j]);
printf("\t%9.2f\n",stu[i].ave); /*保留兩位小數(shù)* 49、/
}
5測(cè)試、結(jié)果進(jìn)行分析
5.1進(jìn)入頁(yè)面
選擇1是重新錄入數(shù)據(jù),不管原文件是否有內(nèi)容,都會(huì)進(jìn)行覆蓋。
選擇2直接進(jìn)入主菜單,可對(duì)原有文件進(jìn)行數(shù)據(jù)處理。
圖5—1
5.2數(shù)據(jù)錄入
圖5—2
5.3數(shù)據(jù)錄入成功,直接返回菜單
圖5—3
5.4不進(jìn)行數(shù)據(jù)錄入,直接進(jìn)入菜單。
圖5—4
5.5瀏覽數(shù)據(jù)
圖5—5
5.6添加數(shù)據(jù)
圖5—6
5.7瀏覽添加后的數(shù)據(jù)
圖5—7
5.8查找—按姓名查找
圖5—8
5.9查找—按學(xué)號(hào)查找
圖5—9
5.10修改—對(duì)分?jǐn)?shù)2進(jìn)行修改
圖5—10
5.11排序——按平均分進(jìn)行排序 50、
這里的一個(gè)問(wèn)題是排序完了程序沒(méi)有自動(dòng)進(jìn)行瀏覽,需要手動(dòng)調(diào)用瀏覽函數(shù)
圖5—11
5.12退出
圖5—12
6總結(jié)
8天的實(shí)習(xí)是短暫的,頭兩天主要是對(duì)C語(yǔ)言的快速?gòu)?fù)習(xí)以及對(duì)題目的分析,第三天才開(kāi)始進(jìn)行程序的編寫(xiě)。而最后一天主要是進(jìn)行了界面的優(yōu)化。從剛開(kāi)始為了完成這項(xiàng)任務(wù)而實(shí)習(xí),變成了為了鍛煉自己,提高C語(yǔ)言編程能力而實(shí)習(xí)。
8天下來(lái)感覺(jué)自己對(duì)C語(yǔ)言以及程序編輯的認(rèn)識(shí)加深了許多。以前覺(jué)得很難的結(jié)構(gòu)體,數(shù)組,文件全部用到了,雖然并不能完全掌握,那也有一些成就感。先說(shuō)中間遇到的小問(wèn)題,幾乎每一個(gè)模塊的錄入,都會(huì)因?yàn)橥思臃痔?hào),忘了加括號(hào),忘了加引號(hào)而出錯(cuò),雖然好解決,但浪費(fèi)了很 51、大的時(shí)間,去修改語(yǔ)法上的錯(cuò)誤。然后就是邏輯錯(cuò)誤的修改,現(xiàn)在意識(shí)到,如果自己實(shí)在找不到錯(cuò)誤的話,就主動(dòng)找別人看一下,打破了自己思維定勢(shì),也許別人會(huì)很快的找到。程序的注釋也是同樣重要,編完一段程序再反過(guò)來(lái)看的時(shí)候,沒(méi)有注釋有時(shí)會(huì)出現(xiàn)看不懂自己編的程序的情況。還有一個(gè)收獲就是當(dāng)自己遇到什么不懂時(shí),要積極的和同學(xué)們一起討論,這樣從中學(xué)到的就不只是你不懂的問(wèn)題。
編程讓人最感到快樂(lè)的就是一個(gè)個(gè)的改掉上百的錯(cuò)誤,然后運(yùn)行出想要的結(jié)果,那種心情是無(wú)法用言語(yǔ)來(lái)描述的。
雖然最后完成了自己的題目,但總感覺(jué)我們C語(yǔ)言編程的能力還是僅僅在皮毛上,程序很大一部分參考了書(shū)上,尤其是算法的設(shè)計(jì),自己做的就是搭建一個(gè)框 52、架。路漫漫其修遠(yuǎn)兮,今后還有很多的東西等著我們?nèi)W(xué)習(xí),希望通過(guò)這次的實(shí)習(xí),我們能更容易的學(xué)習(xí)其他程序的編寫(xiě),爭(zhēng)取做到學(xué)以致用。
最后再一次感謝整個(gè)過(guò)程中幫助我的老師和同學(xué)們。
7參考文獻(xiàn)
[1] 張冬梅 劉遠(yuǎn)興 陳晶 王媛妮 編著,《C語(yǔ)言課程設(shè)計(jì)與程序指導(dǎo)》,中國(guó)鐵道出版社,2008年7月第一版。
[2] 作者:譚浩強(qiáng) 《C程序設(shè)計(jì)》(第三版),清華大學(xué)出版社,2005年7月第三版
8附錄
主要程序模塊清單
#include 53、ne N 50
void save();
void enter();
void input(int i);
void no_input(int i,int n);
void score_input(int i);
void average(int i);
void menu();
void browse();
int modify_data(int i,int n);
void printf_face();
void search();
void add();
void modify();
int load();
void order();
void print 54、f_one(int i);
void search_name();
void search_no();
void order_ave();
void order_score1();
void order_score2();
void order_score3();
void main()
{int q,w1;
printf("\t\t****************行編輯器(修改拓展版)****************\n\n");
printf("\t\t\t\t\t072092\t周磊\t20091002238\n\n");
do
{
printf( 55、"\t\t重新錄入數(shù)據(jù)請(qǐng)按1\t\t進(jìn)入菜單請(qǐng)按2: [ ]\b\b");
scanf("%d",&q);
if(q!=1&&q!=2) /*對(duì)選擇數(shù)字作出判斷*/
{
w1=1;
getchar();
}
else w1=0;
}
while(w1==1);
if(q==1) /*if語(yǔ)句選擇要進(jìn)行的操作*/
enter();
else
menu();
}
/***************************定義結(jié)構(gòu)體變量*************************** 56、**/
struct student
{
char num[20];/*學(xué)號(hào)*/
char name[100];/*姓名*/
int score[3];/*分?jǐn)?shù)*/
float ave;/*平均分*/
}stu[N]; /*stu[N]中每個(gè)元素對(duì)應(yīng)一個(gè)學(xué)生*/
/****************************輸入模塊*************************************/
void enter()
{
int i,n;
printf("請(qǐng)輸入學(xué)生數(shù)量(0-%d)?:",N-1);
scanf("%d",&n);
57、
printf("\n請(qǐng)輸入數(shù)據(jù)\n\n");
for(i=0;i 58、 score_input(i); /*****調(diào)用分?jǐn)?shù)輸入函數(shù)******/
average(i); /*****調(diào)用求平均值函數(shù)******/
}
/**********學(xué)號(hào)輸入函數(shù)************/
void no_input(int i,int n) /*i表示第i個(gè)學(xué)生的信息,n表示比較到第n個(gè)學(xué)生*/
{
int j,k,w1;
do
{w1=0;
printf("學(xué)號(hào):");
scanf("%s",stu[i].num);
for(j=0;stu[i].num[j]!='\0';j++) /*學(xué)號(hào)輸入函數(shù),作 59、了嚴(yán)格的規(guī)定*/
if(stu[i].num[j]<'0'||stu[i].num[j]>'9') /*判斷學(xué)號(hào)是否為數(shù)字*/
{
puts("輸入錯(cuò)誤!僅可輸入(0-9),請(qǐng)重新輸入!\n");
w1=1;break;
}
if(w1!=1)
for(k=0;k 60、 }
}
while(w1==1);
}
/********輸入三個(gè)科目分?jǐn)?shù)函數(shù)*********/
/***i表示第i個(gè)學(xué)生記錄****/
void score_input(int i)
{
int j;
for(j=0;j<3;j++)
{
printf("分?jǐn)?shù) %d:",j+1);
scanf("%d",&stu[i].score[j]);/*循環(huán)語(yǔ)句依次輸入三個(gè)分?jǐn)?shù)*/
}
}
/********求平均值函數(shù)*********/
void average(int i)
{
int j,sum;
for(sum=0,j=0; 61、j<3;j++)
sum+=stu[i].score[j];
stu[i].ave=(float)(sum/3.0);/*循環(huán)語(yǔ)句求平均值,強(qiáng)制類(lèi)型轉(zhuǎn)換成浮點(diǎn)型*/
}
/************************保存函數(shù)*******************************/
void save()/*存儲(chǔ)函數(shù)*/
{
int i;
FILE *fp;
if((fp=fopen("zhoulei.txt","w"))==NULL) /*按只寫(xiě)方式打開(kāi)文件*/
{
printf("文件無(wú)法打開(kāi)\n");/*防止文件為空,并報(bào)錯(cuò)*/ 62、
}
for(i=0;i 63、的保存*/
/********菜單**********/
void menu()
{
int n,w;
printf("\t\t***************菜單***************\n\n");
printf("\t0.瀏覽");
printf("\t1.添加");
printf("\t2.查找");
printf("\t3.修改");
printf("\t4.排序");
printf("\t5.保存");
printf("\t6.退出");
do
{ printf("\n\n\t請(qǐng)選擇(0-6)") 64、;
scanf("%d",&n);
if(n<0||n>6) /*對(duì)選擇的數(shù)字作出判斷*/
{printf("輸入錯(cuò)誤,請(qǐng)重新輸入");
w=1;getchar();}
else {w=0;}
}while(w==1);
switch(n)
{case 0:browse();break; /*瀏覽*/
case 1:add();break; /*添加*/
case 2:search();break; /*查找*/
case 3:modify();break; /*修改*/
cas 65、e 4:order();break; /*排序*/
case 5:save(); break; /*保存*/
case 6:exit(0);break; /*推出*/
}
}
/***************添加模塊********************/
void add()
{
int i,n,m,k;
FILE *fp;
n=load();
printf("請(qǐng)輸入添加的學(xué)生個(gè)數(shù)(0-%d)?:",N-1-n);
scanf("%d",&m); /*m為添加學(xué)生的個(gè)數(shù)*/
k=m+n 66、-1;
for(i=n;i<=k;i++)
{
printf("\n 輸入第%d個(gè)學(xué)生記錄\n",i-n+1);
input(i); /*調(diào)用輸入函數(shù)*/
}
if((fp=fopen("zhoulei.txt","ab"))==NULL)
{
printf("\n文件無(wú)法打開(kāi)\n");
}
for(i=n;i<=k;i++)
if(fwrite(&stu[i],sizeof(struct student),1,fp)==0)
printf("文件寫(xiě)入錯(cuò)誤\n");
fclose(fp);
save();
}
/********加載函數(shù)********/
int load()
{
FILE *fp;
int i;
if((fp=fopen("zhoulei.txt","rb"))==NULL) /*以只讀方式打開(kāi)一個(gè)二進(jìn)制文件*/
{
printf("\n無(wú)法打開(kāi)文件\n");
return NULL;
}
for(i=0;!feof(f
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑施工重大危險(xiǎn)源安全管理制度
- 安全培訓(xùn)資料:典型建筑火災(zāi)的防治基本原則與救援技術(shù)
- 企業(yè)雙重預(yù)防體系應(yīng)知應(yīng)會(huì)知識(shí)問(wèn)答
- 8 各種煤礦安全考試試題
- 9 危險(xiǎn)化學(xué)品經(jīng)營(yíng)單位安全生產(chǎn)管理人員模擬考試題庫(kù)試卷附答案
- 加壓過(guò)濾機(jī)司機(jī)技術(shù)操作規(guī)程
- 樹(shù)脂砂混砂工藝知識(shí)總結(jié)
- XXXXX現(xiàn)場(chǎng)安全應(yīng)急處置預(yù)案
- 某公司消防安全檢查制度總結(jié)
- 1 煤礦安全檢查工(中級(jí))職業(yè)技能理論知識(shí)考核試題含答案
- 4.燃?xì)獍踩a(chǎn)企業(yè)主要負(fù)責(zé)人模擬考試題庫(kù)試卷含答案
- 工段(班組)級(jí)安全檢查表
- D 氯化工藝作業(yè)模擬考試題庫(kù)試卷含答案-4
- 建筑起重司索信號(hào)工安全操作要點(diǎn)
- 實(shí)驗(yàn)室計(jì)量常見(jiàn)的30個(gè)問(wèn)問(wèn)答題含解析