C語言程序設(shè)計實(shí)習(xí)報告 行編輯器 學(xué)生管理系統(tǒng)
《C語言程序設(shè)計實(shí)習(xí)報告 行編輯器 學(xué)生管理系統(tǒng)》由會員分享,可在線閱讀,更多相關(guān)《C語言程序設(shè)計實(shí)習(xí)報告 行編輯器 學(xué)生管理系統(tǒng)(47頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 C程序設(shè)計實(shí)習(xí)報告 題目:簡單的行編輯器(修改版) 學(xué) 院: 專 業(yè): 姓 名: 班級學(xué)號: 指導(dǎo)教師: 2009年 7 月 3 日 前言 由于我們班選題是題號和學(xué)號一一對應(yīng),所以我抽到了16題,簡單的行編輯器。剛開始時不知道什么叫行編輯器,以為這個題目有多么的神秘,第二次實(shí)習(xí)時老師說選這個題目最好換個題,與老師交流,老師建議在原有的題目上加些功能。只是還是不知道什么叫行編輯器,上網(wǎng),問同學(xué),沒有一點(diǎn)思路。再一次問老師,老師說不用管它什么是行編輯器,編輯的目的是為了后面對文件進(jìn)行處理,于是這一次總算有了新的思
2、路。等到這個題快要做完時,也明白了為什么老師說它太簡單了,做完后自己感覺都有串改題目之嫌疑,原題的要求實(shí)在太簡單了,自己加的功能占了程序的大部分。8天下來感覺自己對C語言以及程序編輯的認(rèn)識加深了許多。以前覺得很難的結(jié)構(gòu)體,數(shù)組,文件全部用到了,雖然并不能完全掌握,那也有一些成就感。在這里要感謝老師以及我的同學(xué),在整個編程中給了我很大的幫助。 目錄 前言 II 目錄 III 1題目要求 - 1 - 2需求分析 - 1 - 3概要設(shè)計 - 1 - 3.1設(shè)計思想 - 1 - 3.2軟件運(yùn)行與開發(fā)平臺 -
3、 2 - 3.3數(shù)據(jù)結(jié)構(gòu) - 2 - 3.4系統(tǒng)結(jié)構(gòu)圖 - 2 - 4詳細(xì)設(shè)計 - 3 - 4.1主函數(shù) - 3 - 4.2各功能模塊設(shè)計 - 4 - (1)輸入模塊 - 4 - (2)瀏覽模塊 - 5 - (3)添加模塊 - 6 - (4)查找模塊 - 8 - (5)修改模塊 - 13 - (6)排序模塊 - 16 - (7)保存模塊 - 19 - 4.3公共函數(shù) - 19 - (1)加載函數(shù) - 19 - (2) 學(xué)號輸入函數(shù) - 20 - (3)輸入三個科目分?jǐn)?shù)函數(shù) - 20 - (4)求平均值函數(shù) - 21 - (5)輸入整個記錄函數(shù) - 21 -
4、 (6)修改整條記錄函數(shù) - 21 - (7)顯示數(shù)據(jù)結(jié)構(gòu)項(xiàng)目 - 22 - (8)顯示一個記錄的函數(shù) - 22 - 5測試、結(jié)果進(jìn)行分析 - 23 - 5.1進(jìn)入頁面 - 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é)號查找 - 27 - 5.10修改—對分?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題目要求 原題:簡單的行編輯器 【要求】 (1) 設(shè)置一個簡單的行編輯器,每行以回車結(jié)束。 (2) 數(shù)據(jù)以文件形式儲存。 (3) 編輯器具有查找、替換、修改數(shù)據(jù)的功能。 修改后:修改思路是將由行編輯器生成的文件換成有關(guān)結(jié)構(gòu)體的內(nèi)容,建立一個結(jié)構(gòu)體輸入關(guān)信息,生成文件,再實(shí)現(xiàn)查找、替換、修改數(shù)據(jù)等的功能。這里具體是參考書上學(xué)生成績管理系統(tǒng),實(shí)現(xiàn)成績的錄入,顯示,查找,添加,保存等功能模塊。 2需求分析 根據(jù)題目
6、要求,由于學(xué)生信息是存放在文件中,所以應(yīng)提供文件的輸入、輸出等操作;在程序中需要瀏覽學(xué)生的信息,應(yīng)提供顯示、查找、排序等操作;另外還應(yīng)提供鍵盤式選擇菜單實(shí)現(xiàn)功能選擇。 3概要設(shè)計 3.1設(shè)計思想 由于原題的特點(diǎn),對題目進(jìn)行了一定的拓展。本著提高自己編程能力,加深對C語言重點(diǎn)、難點(diǎn)內(nèi)容的理解,添加了關(guān)于結(jié)構(gòu)體、數(shù)組以及文件的運(yùn)用。將程序模塊化,使程序條理清楚,制作簡單,容易讀懂,并能體會到程序開發(fā)的思想與方法,加深對C語言編程的認(rèn)識。 3.2軟件運(yùn)行與開發(fā)平臺 C語言,Windows平臺,VC6.0, 3.3數(shù)據(jù)結(jié)構(gòu) 此處選用了結(jié)構(gòu)體的形式來存放每一個學(xué)生的信息,對與若干個學(xué)生采用
7、了結(jié)構(gòu)體數(shù)組。 3.4系統(tǒng)結(jié)構(gòu)圖 學(xué)生成績管理系統(tǒng) 數(shù)據(jù)輸入 數(shù)據(jù)顯示 數(shù)據(jù)添加 數(shù)據(jù)查找 數(shù)據(jù)修改 排序 數(shù)據(jù)保存 按姓名查找 按學(xué)號查找 按分?jǐn)?shù)1排序 按分?jǐn)?shù)2排序 按分?jǐn)?shù)3排序 按平均分排序 4詳細(xì)設(shè)計 4.1主函數(shù) 主函數(shù)比較簡單,只提供了輸入和菜單函數(shù)的調(diào)用。各個功能的模塊用菜單方式選擇。 圖4.1—1 N Y 開始 顯示一系列功能選項(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ù)請按1\t\t進(jìn)入菜單請按2: [ ]\b\b"); scanf("%d",&q); if(q!=1&&q!=2) /*對選擇數(shù)字作出判斷*/ { w1=1; getchar(); } else w1=0; } while(w1==1); if(q==1) /*i
9、f語句選擇要進(jìn)行的操作*/ enter(); else menu(); } 4.2各功能模塊設(shè)計 (1)輸入模塊 考慮到自己在C學(xué)習(xí)時遇到的問題,以及在考計算機(jī)二級時薄弱的地方,以及聯(lián)系這個題目的要求,此處選用了結(jié)構(gòu)體的形式來存放每一個學(xué)生的信息,對與若干個學(xué)生采用了結(jié)構(gòu)體數(shù)組。具體到各個數(shù)據(jù)的信息,學(xué)號和姓名采用了字符型數(shù)組,分?jǐn)?shù)為整型,而平均分采用了實(shí)型。 /***************************定義結(jié)構(gòu)體變量*****************************/ struct student { char num[20];/*學(xué)號*/
10、 char name[100];/*姓名*/ int score[3];/*分?jǐn)?shù)*/ float ave;/*平均分*/ }stu[N]; /*stu[N]中每個元素對應(yīng)一個學(xué)生*/ N采用了宏定義的方式,可以隨時在源程序中修改。 【程序】 /*************輸入模塊****************/ void enter() Y N 圖4.2—1 開始 輸入用戶要輸入學(xué)生記錄的個數(shù)n 從0~n-1調(diào)用輸入函數(shù)input(i) i!=0嗎? 調(diào)用保存函數(shù)save() 返回主菜單 結(jié)束
11、{
int i,n;
printf("請輸入學(xué)生數(shù)量(0-%d)?:",N-1);
scanf("%d",&n);
printf("\n請輸入數(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)容不能覆蓋原來的記錄。
追加模塊流程圖:
圖4.2—3
開始
調(diào)用加載函數(shù),并計算可以記錄的個數(shù)
K==m+n
i從n到k調(diào)用輸入函數(shù)input(i)
保存追加的記錄
結(jié)束
輸入用戶要追加學(xué)生記錄個數(shù)
【程序】
/***************添加模塊********************/
void add()
{
int i,n,m,k;
FILE *fp;
n=load();
printf("請輸入添加的學(xué) 14、生個數(shù)(0-%d)?:",N-1-n);
scanf("%d",&m); /*m為添加學(xué)生的個數(shù)*/
k=m+n-1;
for(i=n;i<=k;i++)
{
printf("\n 輸入第%d個學(xué)生記錄\n",i-n+1);
input(i); /*調(diào)用輸入函數(shù)*/
}
if((fp=fopen("zhoulei.txt","ab"))==NULL)
{
printf("\n文件無法打開\n");
}
for(i=n;i<=k;i++)
if(fwrite(&stu[i],sizeo 15、f(struct student),1,fp)==0)
printf("文件寫入錯誤\n");
fclose(fp);
save();
}
(4)查找模塊
該模塊在參考程序上做的一定邏輯上的修改,可以按姓名和按學(xué)號進(jìn)行查找,找到以后,可進(jìn)行修改和刪除信息的操作。
由于改動方便,這里的按姓名和按學(xué)號查找分了兩個函數(shù),使函數(shù)比較煩綴,故函數(shù)還可以進(jìn)行優(yōu)化。
圖4.2—4
其他
2
1
開始
顯示查找方式
讓用戶選擇
調(diào)用按姓名查找函數(shù)search_name()
調(diào)用按學(xué)號查找函數(shù)search_no()
結(jié)束
【程序】
a)查找模塊
/* 16、*******查找函數(shù)********/
void search()
{
int z,w1;
do
{
printf("請輸入查找方式:1).按姓名查找 2).按學(xué)號查找 [ ]\b\b");
scanf("%d",&z);
if(z!=1&&z!=2) /*對選擇數(shù)字作出判斷*/
{
w1=1;
getchar();
}
else w1=0;
}
while(w1==1);
if(z==1)
search_name(); /*調(diào)用按姓名查找程序*/
else
search 17、_no(); /*調(diào)用按學(xué)號查找程序*/
}
b) 按姓名查找模塊
這個是根據(jù)姓名查找到對應(yīng)的學(xué)生記錄,但在此處程序有一定的缺陷,就是如果有相同的姓名,只能查到最上面的一個,而其他的則不能找到。后來嘗試修改時發(fā)現(xiàn),還需要改動其他相應(yīng)的函數(shù),故沒有進(jìn)行下去。
N
Y
Y
N
開始
輸入學(xué)生姓名
是否找到此學(xué)生記錄
顯示找到的記錄
提示沒有找到
詢問用戶是否繼續(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請輸入要查找的姓名! 姓名:");
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)用顯示一個記錄的函數(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請選擇下一步:\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請選擇下一步:\n\t1).查找其他 2).返回 [ ]\b\b");
scanf("%d",&w2);
}
}
}while(w2==1);
menu();
}
c) 按學(xué)號查找模塊
這個函數(shù)是在按姓名查找模塊的基礎(chǔ)上做了相應(yīng)的改動,由于學(xué)號具有唯一性,故不存在查不到相同學(xué)號的情況。
N
Y
Y
N
開始
輸入學(xué)生學(xué)號
是否找到此學(xué)生記錄
顯示找到的記錄
提示沒有找到
詢問用戶是否繼 22、續(xù)查找
讓用戶做出選擇
結(jié)束
圖4.2—6
【程序】
/*********按學(xué)號查找程序***********/
void search_no()
{
int i,n,k,w1=1,w2,w3,w4;
struct student s;
n=load();
do
{
do
{k=-1;
printf("/n/n請輸入要查找的學(xué)號! 學(xué)號:");
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請選擇下一步:\n\ 24、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;
}
}
if(w3==1||w4==1)
{
sa 25、ve();
printf("\n\n操作成功^_^");
printf("\n\n請選擇下一步:\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é)號,根據(jù)學(xué)號查找學(xué)生記錄,并提示用戶修改該記錄的哪部分信息。
N
Y
Y
N
開始
顯示所有記錄,讓用戶看哪條信息需要修改
輸入要修改的學(xué)號
i!=0嗎 27、?
顯示找到的記錄,調(diào)用修改函數(shù)
提示沒有找到
詢問用戶是否繼續(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é)號.任意鍵繼續(xù) ...");
getch();
puts("\n\n");
}
printf_one(i); /*調(diào)用顯示一個記錄的函數(shù)*/
}
do
{
printf("\n\n請輸入你想要修改的學(xué)號:");
scanf("%s",s.num); /*輸入要修改的數(shù)據(jù)的學(xué)號*/
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表示沒有找到*/
}
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; /*用來控制保存,使w2=1是標(biāo)記已有過的修改*/
}
else
{
w0=0;
if(w2==1)
stu[k]=s;
}
if(w0!=1&&w2==1)
save();/*w2不等于1表示在此次之前沒有修改過,這是就保存用戶已確認(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)行由大到小的排序。這里選擇了冒泡法排序。
由于改動方便,這里的4種排序方法在程序上其實(shí)是大同小異,因此程序還需進(jìn)行一定的優(yōu)化。
還有一個問題就是排序結(jié)束后不能直接瀏覽,需要手動調(diào)用瀏覽模塊。其原因是在排序后調(diào)用了保存函數(shù),而保存函數(shù)保存完畢要直接返回主菜單。如果先進(jìn)行瀏覽的話,所顯示內(nèi)容不是排序后的。
非1~4
1~4
開始
顯示要進(jìn)行的排序方式
用戶做出選擇
調(diào)用相應(yīng)的函數(shù)
結(jié)束
圖4.2—8
【程序】
a) 排序模塊
/ 32、********************排序模塊********************/
void order()
{ int m;
printf("請選擇排序方式: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
開始
用冒泡法排序
保存
返回主菜單
結(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)保存模塊
這個模塊單獨(dú)放在菜單里其實(shí)有點(diǎn)綴余,因?yàn)槊總€對文件進(jìn)行寫入或修改的操作都單獨(dú)進(jìn)行了保存。這里文件的讀寫全用的是二進(jìn)制,所以保存的文件直接以文本打開后會出現(xiàn)亂碼。
【程序】
/************************保存函數(shù)*******************************/
void save()/*存儲函數(shù)*/
{
int i;
FILE *fp;
if((fp=fopen("zhou 38、lei.txt","w"))==NULL) /*按只寫方式打開文件*/
{
printf("文件無法打開\n");/*防止文件為空,并報錯*/
}
for(i=0;i 39、保存成功!\n\n按任意鍵繼續(xù)\n\n");
getch();
menu();
}
/*一般的保存模塊,用于各種變動之后,文件的保存*/
4.3公共函數(shù)
這里都是些在每個模塊都可能用到的公共函數(shù)
(1)加載函數(shù)
/********加載函數(shù)********/
int load()
{
FILE *fp;
int i;
if((fp=fopen("zhoulei.txt","rb"))==NULL) /*以只讀方式打開一個二進(jìn)制文件*/
{
printf("\n無法打開文件\n");
return NULL;
}
40、for(i=0;!feof(fp);i++)
fread(&stu[i],sizeof(struct student),1,fp);
fclose(fp);
return(i-1); /*返回記錄個數(shù)*/
}
(2) 學(xué)號輸入函數(shù)
/**********學(xué)號輸入函數(shù)************/
void no_input(int i,int n) /*i表示第i個學(xué)生的信息,n表示比較到第n個學(xué)生*/
{
int j,k,w1;
do
{w1=0;
printf("學(xué)號:");
scanf("%s",stu[i].num); 41、
for(j=0;stu[i].num[j]!='\0';j++) /*學(xué)號輸入函數(shù),作了嚴(yán)格的規(guī)定*/
if(stu[i].num[j]<'0'||stu[i].num[j]>'9') /*判斷學(xué)號是否為數(shù)字*/
{
puts("輸入錯誤!僅可輸入(0-9),請重新輸入!\n");
w1=1;break;
}
if(w1!=1)
for(k=0;k 42、
puts("此記錄已存在,請重新輸入!\n");
w1=1;break;
}
}
while(w1==1);
}
(3)輸入三個科目分?jǐn)?shù)函數(shù)
/***i表示第i個學(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)語句依次輸入三個分?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)語句求平均值,強(qiáng)制類型轉(zhuǎn)換成浮點(diǎn)型*/
}
(5)輸入整個記錄函數(shù)
/**********輸入整個記錄函數(shù)**************/
void input(int i)
{
no_input(i,i); /*****調(diào)用學(xué)號輸入函數(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個記錄*/
{int c,w1;
do
{ puts("\n請選擇修改方式\n\n 1).學(xué)號 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("請選擇:[ ]\b\b");
scanf("%d",&c);
if(c>8||c<1)
{puts("\n選擇錯誤,請重新輸入!");
getchar(); /*當(dāng)輸入是字符時可以防止是死循環(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é)號\t姓名 分?jǐn)?shù)1 分?jǐn)?shù)2 分?jǐn)?shù)3 平均\n");
}
(8)顯示一個記錄的函數(shù)
/********顯示一個記錄的函數(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測試、結(jié)果進(jìn)行分析
5.1進(jìn)入頁面
選擇1是重新錄入數(shù)據(jù),不管原文件是否有內(nèi)容,都會進(jìn)行覆蓋。
選擇2直接進(jìn)入主菜單,可對原有文件進(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é)號查找
圖5—9
5.10修改—對分?jǐn)?shù)2進(jìn)行修改
圖5—10
5.11排序——按平均分進(jìn)行排序 50、
這里的一個問題是排序完了程序沒有自動進(jìn)行瀏覽,需要手動調(diào)用瀏覽函數(shù)
圖5—11
5.12退出
圖5—12
6總結(jié)
8天的實(shí)習(xí)是短暫的,頭兩天主要是對C語言的快速復(fù)習(xí)以及對題目的分析,第三天才開始進(jìn)行程序的編寫。而最后一天主要是進(jìn)行了界面的優(yōu)化。從剛開始為了完成這項(xiàng)任務(wù)而實(shí)習(xí),變成了為了鍛煉自己,提高C語言編程能力而實(shí)習(xí)。
8天下來感覺自己對C語言以及程序編輯的認(rèn)識加深了許多。以前覺得很難的結(jié)構(gòu)體,數(shù)組,文件全部用到了,雖然并不能完全掌握,那也有一些成就感。先說中間遇到的小問題,幾乎每一個模塊的錄入,都會因?yàn)橥思臃痔?,忘了加括號,忘了加引號而出錯,雖然好解決,但浪費(fèi)了很 51、大的時間,去修改語法上的錯誤。然后就是邏輯錯誤的修改,現(xiàn)在意識到,如果自己實(shí)在找不到錯誤的話,就主動找別人看一下,打破了自己思維定勢,也許別人會很快的找到。程序的注釋也是同樣重要,編完一段程序再反過來看的時候,沒有注釋有時會出現(xiàn)看不懂自己編的程序的情況。還有一個收獲就是當(dāng)自己遇到什么不懂時,要積極的和同學(xué)們一起討論,這樣從中學(xué)到的就不只是你不懂的問題。
編程讓人最感到快樂的就是一個個的改掉上百的錯誤,然后運(yùn)行出想要的結(jié)果,那種心情是無法用言語來描述的。
雖然最后完成了自己的題目,但總感覺我們C語言編程的能力還是僅僅在皮毛上,程序很大一部分參考了書上,尤其是算法的設(shè)計,自己做的就是搭建一個框 52、架。路漫漫其修遠(yuǎn)兮,今后還有很多的東西等著我們?nèi)W(xué)習(xí),希望通過這次的實(shí)習(xí),我們能更容易的學(xué)習(xí)其他程序的編寫,爭取做到學(xué)以致用。
最后再一次感謝整個過程中幫助我的老師和同學(xué)們。
7參考文獻(xiàn)
[1] 張冬梅 劉遠(yuǎn)興 陳晶 王媛妮 編著,《C語言課程設(shè)計與程序指導(dǎo)》,中國鐵道出版社,2008年7月第一版。
[2] 作者:譚浩強(qiáng) 《C程序設(shè)計》(第三版),清華大學(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ù)請按1\t\t進(jìn)入菜單請按2: [ ]\b\b");
scanf("%d",&q);
if(q!=1&&q!=2) /*對選擇數(shù)字作出判斷*/
{
w1=1;
getchar();
}
else w1=0;
}
while(w1==1);
if(q==1) /*if語句選擇要進(jìn)行的操作*/
enter();
else
menu();
}
/***************************定義結(jié)構(gòu)體變量*************************** 56、**/
struct student
{
char num[20];/*學(xué)號*/
char name[100];/*姓名*/
int score[3];/*分?jǐn)?shù)*/
float ave;/*平均分*/
}stu[N]; /*stu[N]中每個元素對應(yīng)一個學(xué)生*/
/****************************輸入模塊*************************************/
void enter()
{
int i,n;
printf("請輸入學(xué)生數(shù)量(0-%d)?:",N-1);
scanf("%d",&n);
57、
printf("\n請輸入數(shù)據(jù)\n\n");
for(i=0;i 58、 score_input(i); /*****調(diào)用分?jǐn)?shù)輸入函數(shù)******/
average(i); /*****調(diào)用求平均值函數(shù)******/
}
/**********學(xué)號輸入函數(shù)************/
void no_input(int i,int n) /*i表示第i個學(xué)生的信息,n表示比較到第n個學(xué)生*/
{
int j,k,w1;
do
{w1=0;
printf("學(xué)號:");
scanf("%s",stu[i].num);
for(j=0;stu[i].num[j]!='\0';j++) /*學(xué)號輸入函數(shù),作 59、了嚴(yán)格的規(guī)定*/
if(stu[i].num[j]<'0'||stu[i].num[j]>'9') /*判斷學(xué)號是否為數(shù)字*/
{
puts("輸入錯誤!僅可輸入(0-9),請重新輸入!\n");
w1=1;break;
}
if(w1!=1)
for(k=0;k 60、 }
}
while(w1==1);
}
/********輸入三個科目分?jǐn)?shù)函數(shù)*********/
/***i表示第i個學(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)語句依次輸入三個分?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)語句求平均值,強(qiáng)制類型轉(zhuǎn)換成浮點(diǎn)型*/
}
/************************保存函數(shù)*******************************/
void save()/*存儲函數(shù)*/
{
int i;
FILE *fp;
if((fp=fopen("zhoulei.txt","w"))==NULL) /*按只寫方式打開文件*/
{
printf("文件無法打開\n");/*防止文件為空,并報錯*/ 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請選擇(0-6)") 64、;
scanf("%d",&n);
if(n<0||n>6) /*對選擇的數(shù)字作出判斷*/
{printf("輸入錯誤,請重新輸入");
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("請輸入添加的學(xué)生個數(shù)(0-%d)?:",N-1-n);
scanf("%d",&m); /*m為添加學(xué)生的個數(shù)*/
k=m+n 66、-1;
for(i=n;i<=k;i++)
{
printf("\n 輸入第%d個學(xué)生記錄\n",i-n+1);
input(i); /*調(diào)用輸入函數(shù)*/
}
if((fp=fopen("zhoulei.txt","ab"))==NULL)
{
printf("\n文件無法打開\n");
}
for(i=n;i<=k;i++)
if(fwrite(&stu[i],sizeof(struct student),1,fp)==0)
printf("文件寫入錯誤\n");
fclose(fp);
save();
}
/********加載函數(shù)********/
int load()
{
FILE *fp;
int i;
if((fp=fopen("zhoulei.txt","rb"))==NULL) /*以只讀方式打開一個二進(jìn)制文件*/
{
printf("\n無法打開文件\n");
return NULL;
}
for(i=0;!feof(f
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 外研版(一起)英語一年級上冊Module-5課件
- 外研版(一起)五上Module-10《Unit-1-You-should-tidy-your課件
- 認(rèn)識線段課件
- 患者病情評估培訓(xùn)完整
- 早產(chǎn)兒的護(hù)理教學(xué)
- 我們吃的食物安全嗎
- 鹽酸硫酸—浙教版九級科學(xué)上冊課件1
- 人工智能遺傳算法
- 硬質(zhì)景觀的細(xì)部處理龍湖
- 人教版小學(xué)二年級上冊數(shù)學(xué)8的乘法口訣
- 郵輪旅游世界郵輪產(chǎn)業(yè)經(jīng)濟(jì)的發(fā)展
- 如何繪制出高品質(zhì)的學(xué)科思維導(dǎo)圖
- 美國癲癇學(xué)會驚厥性癲癇持續(xù)狀態(tài)治療指南解讀
- 城市公共空間設(shè)計理論及方法課件
- (課件)正弦定理公開課