#includestdio.h /*引用庫函數(shù)*/
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),樂平企業(yè)網(wǎng)站建設(shè),樂平品牌網(wǎng)站建設(shè),網(wǎng)站定制,樂平網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,樂平網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
#includestdlib.h
#includectype.h
#includestring.h
typedef struct /*定義結(jié)構(gòu)體數(shù)組*/
{
char num[10]; /*學(xué)號*/
char name[20]; /*姓名*/
int score; /*成績*/
}Student;
Student stu[80]; /*結(jié)構(gòu)體數(shù)組變量*/
int menu_select() /*菜單函數(shù)*/
{
char c;
do{
system("cls"); /*運行前清屏*/
printf("\t\t****Students' Grade Management System****\n"); /*菜單選擇*/
printf("\t\t | 1. Input Records |\n");
printf("\t\t | 2. Display All Records |\n");
printf("\t\t | 3. Sort |\n");
printf("\t\t | 4. Insert a Record |\n");
printf("\t\t | 5. Delete a Record |\n");
printf("\t\t | 6. Query |\n");
printf("\t\t | 7. Statistic |\n");
printf("\t\t | 8. Add Records from a Text File|\n");
printf("\t\t | 9. Write to a Text file |\n");
printf("\t\t | 0. Quit |\n");
printf("\t\t*****************************************\n");
printf("\t\t\tGive your Choice(0-9):");
c=getchar(); /*讀入選擇*/
}while(c'0'||c'9');
return(c-'0'); /*返回選擇*/
}
int Input(Student stud[],int n) /*輸入若干條記錄*/
{int i=0;
char sign,x[10]; /*x[10]為清除多余的數(shù)據(jù)所用*/
while(sign!='n'sign!='N') /*判斷*/
{ printf("\t\t\tstudent's num:"); /*交互輸入*/
scanf("\t\t\t%s",stud[n+i].num);
printf("\t\t\tstudent's name:");
scanf("\t\t\t%s",stud[n+i].name);
printf("\t\t\tstudent's score:");
scanf("\t\t\t%d",stud[n+i].score);
gets(x); /*清除多余的輸入*/
printf("\t\t\tany more records?(Y/N)");
scanf("\t\t\t%c",sign); /*輸入判斷*/
i++;
}
return(n+i);
}
void Display(Student stud[],int n) /*顯示所有記錄*/
{
int i;
printf("\t\t\t-----------------------------------\n"); /*格式頭*/
printf("\t\t\tnumber name score\n");
printf("\t\t\t-----------------------------------\n");
for(i=1;in+1;i++) /*循環(huán)輸入*/
{
printf("\t\t\t%-16s%-15s%d\n",stud[i-1].num,stud[i-1].name,stud[i-1].score);
if(i1i%10==0) /*每十個暫停*/
{printf("\t\t\t-----------------------------------\n"); /*格式*/
printf("\t\t\t");
system("pause");
printf("\t\t\t-----------------------------------\n");
}
}
printf("\t\t\t");
system("pause");
}
void Sort_by_num(Student stud[],int n) /*按學(xué)號排序*/
{ int i,j,*p,*q,s;
char t[10];
for(i=0;in-1;i++) /*冒泡法排序*/
for(j=0;jn-1-i;j++)
if(strcmp(stud[j].num,stud[j+1].num)0)
{strcpy(t,stud[j+1].num);
strcpy(stud[j+1].num,stud[j].num);
strcpy(stud[j].num,t);
strcpy(t,stud[j+1].name);
strcpy(stud[j+1].name,stud[j].name);
strcpy(stud[j].name,t);
p=stud[j+1].score;
q=stud[j].score;
s=*p;
*p=*q;
*q=s;
}
}
int Insert_a_record(Student stud[],int n) /*插入一條記錄*/
{char x[10]; /*清除多余輸入所用*/
printf("\t\t\tstudent's num:"); /*交互式輸入*/
scanf("\t\t\t%s",stud[n].num);
printf("\t\t\tstudent's name:");
scanf("\t\t\t%s",stud[n].name);
printf("\t\t\tstudent's score:");
scanf("\t\t\t%d",stud[n].score);
gets(x);
n++;
Sort_by_num(stud,n); /*調(diào)用排序函數(shù)*/
printf("\t\t\tInsert Successed!\n"); /*返回成功信息*/
return(n);
}
int Delete_a_record(Student stud[],int n) /*按姓名查找,刪除一條記錄*/
{ char s[20];
int i=0,j;
printf("\t\t\ttell me his(her) name:"); /*交互式問尋*/
scanf("%s",s);
while(strcmp(stud[i].name,s)!=0in) i++; /*查找判斷*/
if(i==n)
{ printf("\t\t\tnot find!\n"); /*返回失敗信息*/
return(n);
}
for(j=i;jn-1;j++) /*刪除操作*/
{
strcpy(stud[j].num,stud[j+1].num);
strcpy(stud[j].name,stud[j+1].name);
stud[j].score=stud[j+1].score;
}
printf("\t\t\tDelete Successed!\n"); /*返回成功信息*/
return(n-1);
}
void Query_a_record(Student stud[],int n) /*查找并顯示一個記錄*/
{ char s[20];
int i=0;
printf("\t\t\tinput his(her) name:"); /*交互式輸入*/
scanf("\t\t\t%s",s);
while(strcmp(stud[i].name,s)!=0in) i++; /*查找判斷*/
if(i==n)
{ printf("\t\t\tnot find!\n"); /*輸入失敗信息*/
return;
}
printf("\t\t\this(her) number:%s\n",stud[i].num); /*輸出該學(xué)生信息*/
printf("\t\t\this(her) score:%d\n",stud[i].score);
}
void Statistic(Student stud[],int n) /*新增功能,輸出統(tǒng)計信息*/
{ int i,j=0,k=0,sum=0;
float aver; /*成績平均值*/
for(i=0;in;i++) /*循環(huán)輸入判斷*/
{
sum+=stud[i].score;
if(stud[j].scorestud[i].score) j=i;
if(stud[k].scorestud[i].score) k=i;
}
aver=1.0*sum/n;
printf("\t\t\tthere are %d records.\n",n); /*總共記錄數(shù)*/
printf("\t\t\tthe hignest score:\n"); /*最高分*/
printf("\t\t\tnumber:%s name:%s score:%d\n",stud[j].num,stud[j].name,stud[j].score);
printf("\t\t\tthe lowest score:\n"); /*最低分*/
printf("\t\t\tnumber:%s name:%s score:%d\n",stud[k].num,stud[k].name,stud[k].score);
printf("\t\t\tthe average score is %5.2f\n",aver); /*平均分*/
}
int AddfromText(Student stud[],int n) /*從文件中讀入數(shù)據(jù)*/
{ int i=0,num;
FILE *fp; /*定義文件指針*/
char filename[20]; /*定義文件名*/
printf("\t\t\tInput the filename:");
scanf("\t\t\t%s",filename); /*輸入文件名*/
if((fp=fopen(filename,"rb"))==NULL) /*打開文件*/
{ printf("\t\t\tcann't open the file\n"); /*打開失敗信息*/
printf("\t\t\t");
system("pause");
return(n);
}
fscanf(fp,"%d",num); /*讀入總記錄量*/
while(inum) /*循環(huán)讀入數(shù)據(jù)*/
{
fscanf(fp,"%s%s%d",stud[n+i].num,stud[n+i].name,stud[n+i].score);
i++;
}
n+=num;
fclose(fp); /*關(guān)閉文件*/
printf("\t\t\tSuccessed!\n");
printf("\t\t\t");
system("pause");
return(n);
}
void WritetoText(Student stud[],int n) /*將所有記錄寫入文件*/
{
int i=0;
FILE *fp; /*定義文件指針*/
char filename[20]; /*定義文件名*/
printf("\t\t\tWrite Records to a Text File\n"); /*輸入文件名*/
printf("\t\t\tInput the filename:");
scanf("\t\t\t%s",filename);
if((fp=fopen(filename,"w"))==NULL) /*打開文件*/
{
printf("\t\t\tcann't open the file\n");
system("pause");
return;
}
fprintf(fp,"%d\n",n); /*循環(huán)寫入數(shù)據(jù)*/
while(in)
{
fprintf(fp,"%-16s%-15s%d\n",stud[i].num,stud[i].name,stud[i].score);
i++;
}
fclose(fp); /*關(guān)閉文件*/
printf("Successed!\n"); /*返回成功信息*/
}
void main() /*主函數(shù)*/
{
int n=0;
for(;;)
{
switch(menu_select()) /*選擇判斷*/
{
case 1:
printf("\t\t\tInput Records\n"); /*輸入若干條記錄*/
n=Input(stu,n);
break;
case 2:
printf("\t\t\tDisplay All Records\n"); /*顯示所有記錄*/
Display(stu,n);
break;
case 3:
printf("\t\t\tSort\n");
Sort_by_num(stu,n); /*按學(xué)號排序*/
printf("\t\t\tSort Suceessed!\n");
printf("\t\t\t");
system("pause");
break;
case 4:
printf("\t\t\tInsert a Record\n");
n=Insert_a_record(stu,n); /*插入一條記錄*/
printf("\t\t\t");
system("pause");
break;
case 5:
printf("\t\t\tDelete a Record\n");
n=Delete_a_record(stu,n); /*按姓名查找,刪除一條記錄*/
printf("\t\t\t");
system("pause");
break;
case 6:
printf("\t\t\tQuery\n");
Query_a_record(stu,n); /*查找并顯示一個記錄*/
printf("\t\t\t");
system("pause");
break;
case 7:
printf("\t\t\tStatistic\n");
Statistic(stu,n); /*新增功能,輸出統(tǒng)計信息*/
printf("\t\t\t");
system("pause");
break;
case 8:
printf("\t\t\tAdd Records from a Text File\n");
n=AddfromText(stu,n); /*新增功能,輸出統(tǒng)計信息*/
break;
case 9:
printf("\t\t\tWrite to a Text file\n");
WritetoText(stu,n); /*循環(huán)寫入數(shù)據(jù)*/
printf("\t\t\t");
system("pause");
break;
case 0:
printf("\t\t\tHave a Good Luck,Bye-bye!\n"); /*結(jié)束程序*/
printf("\t\t\t");
system("pause");
exit(0);
}
}
}
一、課程設(shè)計與目的
根據(jù)課堂講授內(nèi)容,學(xué)生做相應(yīng)的自主練習(xí),消化課堂所講解的內(nèi)容;通過調(diào)試典型例題或習(xí)題積累調(diào)試C程序的經(jīng)驗;通過完成輔導(dǎo)教材中的編程題,逐漸培養(yǎng)學(xué)生的編程能力、用計算機解決實際問題的能力。
二、課程設(shè)計基本要求
1、用數(shù)據(jù)結(jié)構(gòu)的方法設(shè)計出的學(xué)生信息管理系統(tǒng),能實現(xiàn)對學(xué)生信息的簡單管理。
2、具體要求:
建立一個若干學(xué)生的信息登記表,每個學(xué)生的信息包括:學(xué)號、姓名、性別、成績和系,建立一個管理系統(tǒng)。
程序運行時顯示一個菜單形式,例如
**********學(xué)生信息管理系統(tǒng)**********
| 1. 輸入信息 |
| 2. 顯示所有信息|
| 3. 信息按學(xué)號排序|
| 4. 插入一條記錄|
| 5. 刪除一條記錄|
| 6. 查找 |
| 7. 修改一條記錄 |
| 8. 退出 |
其中:
(1)輸入若干條記錄
(2)顯示所有記錄
(3)按學(xué)號排序
(4)插入一些記錄
(5)按學(xué)號查找,刪除一條記錄
(6)查找并顯示一條記錄
(7)修改一條記錄
(8)退出程序
三、系統(tǒng)功能和結(jié)構(gòu)
1、系統(tǒng)的功能
1設(shè)計一個簡單學(xué)生信息管理系統(tǒng),用戶可以通過系統(tǒng)簡單的管理學(xué)生信息。
2設(shè)計出一個菜單可以讓用戶選擇所執(zhí)行的內(nèi)容。
3建立單結(jié)構(gòu)體,輸入學(xué)生的信息(學(xué)號、姓名和、性別、系和成績)。
4根據(jù)單結(jié)構(gòu)體的特點采用冒泡法以總分為標準排序?qū)W生信息。
5根據(jù)用戶輸入的學(xué)號信息,固定的查詢學(xué)生的詳細信息。
6根據(jù)用戶的需求刪除或者添加某學(xué)生的信息。
2、概要設(shè)計
主要數(shù)據(jù)結(jié)構(gòu)描述
typedef struct student //定義結(jié)構(gòu)類型
{
char num[15]; //學(xué)號
char name[20]; //姓名
char sex; //性別
int score; //成績
char sdept[10]; //系
} ;
student stu[100]; //結(jié)構(gòu)體數(shù)組變量
算法分析及程序流程圖
該項目劃分為7個模塊加退出,主函數(shù)可以分別調(diào)用這些模塊,然后通過個模塊來實現(xiàn)各種需要的功能。
四、程序如何實現(xiàn)
模塊詳細設(shè)計
根據(jù)上面的流程圖,下面分析每個模塊具體的功能,包括每個模塊的參數(shù)和得出的結(jié)果
函數(shù)名 int Input(student stu[],int n) //輸入信息
入口參數(shù) 無
返回值 無
模塊功能 建立單結(jié)構(gòu)體并賦值,即錄入學(xué)生的信息
模塊1
函數(shù)名 void Display(student stu[],int n) //顯示所有信息
入口參數(shù) 無
返回值 無
模塊功能 用于顯示和方便查找學(xué)號的學(xué)生成績
模塊2
函數(shù)名 void Sort_by_num(student stu[],int n) //對輸入的信息按學(xué)號排序
入口參數(shù) 無
返回值 無
模塊功能 用于對學(xué)生按學(xué)號排序便于查看
模塊3
函數(shù)名 int Insert_a_record(student stu[],int n) //插入一些記錄
入口參數(shù) 無
返回值 無
模塊功能 用于追加新的學(xué)生信息
模塊4
函數(shù)名 int Delete_a_record(student stu[],int n) //查找,刪除一個記錄
入口參數(shù) 無
返回值 無
模塊功能 用于刪除學(xué)生一些信息
模塊5
函數(shù)名 void Query_a_record(student stu[],int n) //查找并顯示一個記錄
入口參數(shù) 無
返回值 無
模塊功能 用于查找并顯示一個記錄
模塊6
函數(shù)名 void Replace_a_record(student stu[],int n) //按學(xué)號查找修改
入口參數(shù) 無
返回值 無
模塊功能 按學(xué)號查找并修改一個學(xué)生信息
模塊7
函數(shù)名 exit(8)
入口參數(shù) 無
返回值 無
模塊功能 退出應(yīng)用程序
模塊8
五、程序源代碼
程序正文部分
#includestdio.h
#includestdlib.h
#includectype.h
#includestring.h
typedef struct student //定義結(jié)構(gòu)類型
{
char num[15]; //學(xué)號
char name[20]; //姓名
char sex; //性別
int score; //成績
char sdept[10]; //系
} ;
student stu[100]; //結(jié)構(gòu)體數(shù)組變量
int menu_select() //菜單函數(shù)聲明
{
char c;
do{
system("cls"); /*運行前清屏*/ ;
printf("\t\t**********學(xué)生信息管理系統(tǒng)**********\n"); /*菜單選擇*/
printf("\t\t | 1. 輸入信息 |\n");
printf("\t\t | 2. 顯示所有信息|\n");
printf("\t\t | 3. 信息按學(xué)號排序|\n");
printf("\t\t | 4. 插入一條記錄|\n");
printf("\t\t | 5. 刪除一條記錄|\n");
printf("\t\t | 6. 查找 |\n");
printf("\t\t | 7. 修改一條記錄 |\n");
printf("\t\t | 8. 退出 |\n");
printf("\t\t************************************\n");
printf("\t\t\t 你的選擇是(1-8):");
c=getchar(); //你的選擇c
}while(c'1'||c'8');
return(c-'0');
}
int Input(student stu[],int n) //輸入信息
{ int i=0;
char more;
while(more!='n'more!='N')
{printf("\t\t\t 請輸入學(xué)生學(xué)號:");
scanf("\t\t\t %s",stu[n+i].num);
printf("\t\t\t 請輸入學(xué)生姓名:");
scanf("\t\t\t %s",stu[n+i].name);
printf("\t\t\t 請輸入學(xué)生性別:");
scanf("\t\t\t %c",stu[n+i].sex);
printf("\t\t\t 請輸入學(xué)生成績:");
scanf("\t\t\t %d",stu[n+i].score);
printf("\t\t\t 請輸入學(xué)生所在系:");
scanf("\t\t\t %s",stu[n+i].sdept);
printf("\t\t\t 您有更多信息要輸入嗎?Y/N:");
scanf("\t\t\t %c",more);
i++;
}return(n+i);
}
void Display(student stu[],int n) //顯示所有信息
{ int i;
printf(" ---------------------------------------------------------------\n"); /*格式頭*/
printf(" | 學(xué) 號 | 姓 名 | 性別 | 成績 | 所在系 |\n");
printf(" ---------------------------------------------------------------\n");
for(i=1;i=n;i++)
{printf(" | %-15s| %-11s| %-5c| %-6d| %-12s|\n",stu[i-1].num,stu[i-1].name,
stu[i-1].sex,stu[i-1].score,stu[i-1].sdept );
printf(" ---------------------------------------------------------------\n"); //分格行
}
printf("\t\t\t");
system("pause");
}
void Sort_by_num(student stu[],int n) //對輸入的信息按學(xué)號排序
{ int i,j;
char l[15],t[20],q,k[10];
int p;
for(i=0;i=n-1;i++) //起泡法排序
for(j=0;jn-1-i;j++)
if(strcmp(stu[j].num,stu[j+1].num)0)
{ l=stu[j].num;
stu[j].num=stu[j+1].num;
stu[j+1].num=l;
t=stu[j].name;
stu[j].name=stu[j+1].name;
stu[j+1].name=t;
q=stu[j].sex;
stu[j].sex=stu[j+1].sex;
stu[j+1].sex=q;
p=stu[j].score;
stu[j].score=stu[j+1].score;
stu[j+1].score=p;
k=stu[j].sdept;
stu[j].sdept=stu[j+1].sdept;
stu[j+1].sdept=k;
}
}
int Insert_a_record(student stu[],int n) //插入一些記錄
{ int i=0;
char more;
while(more!='n'more!='N')
{printf("\t\t\t 請輸入學(xué)生學(xué)號:");
scanf("\t\t\t %s",stu[n+i].num);
printf("\t\t\t 請輸入學(xué)生姓名:");
scanf("\t\t\t %s",stu[n+i].name);
printf("\t\t\t 請輸入學(xué)生性別:");
scanf("\t\t\t %c",stu[n+i].sex);
printf("\t\t\t 請輸入學(xué)生成績:");
scanf("\t\t\t %d",stu[n+i].score);
printf("\t\t\t 請輸入學(xué)生所在系:");
scanf("\t\t\t %s",stu[n+i].sdept);
Sort_by_num(stu, n);
printf("\t\t\t Insert Successed!\n"); //插入成功
printf("\t\t\t 您有更多信息要輸入嗎?Y/N:");
scanf("\t\t\t %c",more);
i++;
}return(n+i);
}
int Delete_a_record(student stu[],int n) //查找,刪除一個記錄
{ char l[15];
int i=0, j;
printf("\t\t\t 請輸入學(xué)生學(xué)號:"); //按學(xué)號查找
scanf("\t\t\t %s",l);
while(strcmp(stu[i].num,l)!=0 in)i++; //查找判斷
if(i==n)
{printf("\t\t\tnot find!\n"); //查找失敗
return(n);}
for(j=i;jn-1;j++) //刪除操作
{ strcpy(stu[j].num,stu[j+1].num);
strcpy(stu[j].name,stu[j+1].name);
stu[j].sex=stu[j+1].sex;
stu[j].score=stu[j+1].score;
strcpy(stu[j].sdept,stu[j+1].sdept);
}
printf("\t\t\t Delete Successed!\n"); //刪除成功
return(n-1) ;
}
void Query_a_record(student stu[],int n) //查找并顯示一個記錄
{ char l[15];
int i=0;
printf("\t\t\t 請輸入學(xué)生學(xué)號:"); //按學(xué)號查找
scanf("\t\t\t %s",l);
while(strcmp(stu[i].num,l)!=0 in)i++; //查找判斷
if(i==n)
{ printf("\t\t\tnot find!\n"); //查找失敗
return;
}
printf("\t\t\t 學(xué)生的學(xué)號:%s\n",stu[i].num); //輸出該學(xué)生信息
printf("\t\t\t 學(xué)生的姓名:%s\n",stu[i].name);
printf("\t\t\t 學(xué)生的性別:%c\n",stu[i].sex);
printf("\t\t\t 學(xué)生的成績:%d\n",stu[i].score);
printf("\t\t\t 學(xué)生所在系:%s\n",stu[i].sdept);
}
void Replace_a_record(student stu[],int n) //按學(xué)號查找修改
{
char choice,l[15];
int i=0;
printf("\t\t\t 請輸入學(xué)生學(xué)號:"); //按學(xué)號查找
scanf("\t\t\t %s",l);
while(strcmp(stu[i].num,l)!=0 in)i++; //查找判斷
if(i==n)
{printf("\t\t\tnot find!\n"); //查找失敗
return;}
printf("\t\t\t請選擇您要修改的學(xué)生的信息內(nèi)容:\n");
printf("\t\t\t (1)修改學(xué)生姓名:\n");
printf("\t\t\t (2)修改學(xué)生性別\n:");
printf("\t\t\t (3)修改學(xué)生成績:\n");
printf("\t\t\t (4)修改學(xué)生所在系:\n");
printf("\t\t\t (5)取消 請按 5 \n");
printf("\t\t\t 請輸入您的選擇:\n");
scanf("%d", choice);
switch(choice)
{
case 1:
printf("\t\t\t 請輸入新姓名:\n");
scanf("%d", stu[i].name);
break;
case 2:
printf("\t\t\t 請輸入新性別:\n");
scanf("%s", stu[i].sex);
printf("\t\t\t");
system("pause");
break;
case 3:
printf("\t\t\t 請輸入新成績:\n");
scanf("%s", stu[i].score);
printf("\t\t\t");
system("pause");
break;
case 4:
printf("\t\t\t 請輸入新的所在系:\n");
scanf("%s", stu[i].sdept);
printf("\t\t\t");
system("pause");
break;
case 5:
printf("您選擇了取消,Bye-Bye!\n") ;
exit;
}
}
void main() //主函數(shù)
{
int n=0;
for(;;) //相當(dāng)于while(1)語句,不設(shè)初值,認為表達式2為真值,循
//環(huán)變量不增值,無終止的執(zhí)行循環(huán)
{
switch(menu_select())
{
case 1:
printf("\t\t\tInput Records\n"); //輸入若干條記錄
n=Input(stu,n);
break;
case 2:
printf("\t\t\tDisplay All Records\n"); //顯示所有記錄
Display(stu,n);
break;
case 3:
printf("\t\t\tSort\n");
Sort_by_num(stu,n); //按學(xué)號排序
printf("\t\t\tSort Suceessed!\n");
printf("\t\t\t");
system("pause");
break;
case 4:
printf("\t\t\tInsert a Record\n");
n=Insert_a_record(stu,n); //插入一些記錄
printf("\t\t\t");
system("pause");
break;
case 5:
printf("\t\t\tDelete a Record\n");
n=Delete_a_record(stu,n); //按姓名查找,刪除一條記錄
printf("\t\t\t");
system("pause");
break;
case 6:
printf("\t\t\tQuery\n");
Query_a_record(stu,n); //查找并顯示一個記錄
printf("\t\t\t");
system("pause");
break;
case 7:
printf("\t\t\treplace\n"); //修改一條信息
Replace_a_record(stu,n);
printf("\t\t\t");
system("pause");
break;
case 8:
printf("\t\t\tHave a Good Luck,Bye-bye!\n"); //結(jié)束程序
printf("\t\t\t");
system("pause");
exit(8);
}
} }
六、 程序的運行與實現(xiàn)
(1)輸入若干條記錄
(2)顯示所有記錄
(3)按學(xué)號排序
(4)插入一些記錄
(5)按學(xué)號查找,刪除一條記錄
(6)查找并顯示一條記錄
(7)修改一條記錄
(8)退出程序
如何在C語言中巧用正則表達式
看到大家討論這方面的東西,作點貢獻聊表各位高手對這個版快的無私奉獻 :oops:
如果用戶熟悉Linux下的sed、awk、grep或vi,那么對正則表達式這一概念肯定不會陌生。由于它可以極大地簡化處理字符串時的復(fù)雜
度,因此現(xiàn)在已經(jīng)在許多Linux實用工具中得到了應(yīng)用。千萬不要以為正則表達式只是Perl、Python、Bash等腳本語言的專利,作為C語言程序
員,用戶同樣可以在自己的程序中運用正則表達式。
標準的C和C++都不支持正則表達式,但有一些函數(shù)庫可以輔助C/C++程序員完成這一功能,其中最著名的當(dāng)數(shù)Philip Hazel的Perl-Compatible Regular Expression庫,許多Linux發(fā)行版本都帶有這個函數(shù)庫。
編譯正則表達式
為了提高效率,在將一個字符串與正則表達式進行比較之前,首先要用regcomp()函數(shù)對它進行編譯,將其轉(zhuǎn)化為regex_t結(jié)構(gòu):
int regcomp(regex_t *preg, const char *regex, int cflags);
參數(shù)regex是一個字符串,它代表將要被編譯的正則表達式;參數(shù)preg指向一個聲明為regex_t的數(shù)據(jù)結(jié)構(gòu),用來保存編譯結(jié)果;參數(shù)cflags決定了正則表達式該如何被處理的細節(jié)。
如果函數(shù)regcomp()執(zhí)行成功,并且編譯結(jié)果被正確填充到preg中后,函數(shù)將返回0,任何其它的返回結(jié)果都代表有某種錯誤產(chǎn)生。
匹配正則表達式
一旦用regcomp()函數(shù)成功地編譯了正則表達式,接下來就可以調(diào)用regexec()函數(shù)完成模式匹配:
int regexec(const regex_t *preg, const char *string, size_t nmatch,regmatch_t pmatch[], int eflags);
typedef struct {
regoff_t rm_so;
regoff_t rm_eo;
} regmatch_t;
參數(shù)preg指向編譯后的正則表達式,參數(shù)string是將要進行匹配的字符串,而參數(shù)nmatch和pmatch則用于把匹配結(jié)果返回給調(diào)用程序,最后一個參數(shù)eflags決定了匹配的細節(jié)。
在調(diào)用函數(shù)regexec()進行模式匹配的過程中,可能在字符串string中會有多處與給定的正則表達式相匹配,參數(shù)pmatch就是用來保
存這些匹配位置的,而參數(shù)nmatch則告訴函數(shù)regexec()最多可以把多少個匹配結(jié)果填充到pmatch數(shù)組中。當(dāng)regexec()函數(shù)成功返
回時,從string+pmatch[0].rm_so到string+pmatch[0].rm_eo是第一個匹配的字符串,而從
string+pmatch[1].rm_so到string+pmatch[1].rm_eo,則是第二個匹配的字符串,依此類推。
釋放正則表達式
無論什么時候,當(dāng)不再需要已經(jīng)編譯過的正則表達式時,都應(yīng)該調(diào)用函數(shù)regfree()將其釋放,以免產(chǎn)生內(nèi)存泄漏。
void regfree(regex_t *preg);
函數(shù)regfree()不會返回任何結(jié)果,它僅接收一個指向regex_t數(shù)據(jù)類型的指針,這是之前調(diào)用regcomp()函數(shù)所得到的編譯結(jié)果。
如果在程序中針對同一個regex_t結(jié)構(gòu)調(diào)用了多次regcomp()函數(shù),POSIX標準并沒有規(guī)定是否每次都必須調(diào)用regfree()函
數(shù)進行釋放,但建議每次調(diào)用regcomp()函數(shù)對正則表達式進行編譯后都調(diào)用一次regfree()函數(shù),以盡早釋放占用的存儲空間。
報告錯誤信息
如果調(diào)用函數(shù)regcomp()或regexec()得到的是一個非0的返回值,則表明在對正則表達式的處理過程中出現(xiàn)了某種錯誤,此時可以通過調(diào)用函數(shù)regerror()得到詳細的錯誤信息。
size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);
參數(shù)errcode是來自函數(shù)regcomp()或regexec()的錯誤代碼,而參數(shù)preg則是由函數(shù)regcomp()得到的編譯結(jié)果,
其目的是把格式化消息所必須的上下文提供給regerror()函數(shù)。在執(zhí)行函數(shù)regerror()時,將按照參數(shù)errbuf_size指明的最大字
節(jié)數(shù),在errbuf緩沖區(qū)中填入格式化后的錯誤信息,同時返回錯誤信息的長度。
應(yīng)用正則表達式
最后給出一個具體的實例,介紹如何在C語言程序中處理正則表達式。
#include stdio.h;
#include sys/types.h;
#include regex.h;
/* 取子串的函數(shù) */
static char* substr(const char*str, unsigned start, unsigned end)
{
unsigned n = end - start;
static char stbuf[256];
strncpy(stbuf, str + start, n);
stbuf[n] = 0;
return stbuf;
}
/* 主程序 */
int main(int argc, char** argv)
{
char * pattern;
int x, z, lno = 0, cflags = 0;
char ebuf[128], lbuf[256];
regex_t reg;
regmatch_t pm[10];
const size_t nmatch = 10;
/* 編譯正則表達式*/
pattern = argv[1];
z = regcomp(reg, pattern, cflags);
if (z != 0){
regerror(z, reg, ebuf, sizeof(ebuf));
fprintf(stderr, "%s: pattern '%s' \n", ebuf, pattern);
return 1;
}
/* 逐行處理輸入的數(shù)據(jù) */
while(fgets(lbuf, sizeof(lbuf), stdin)) {
++lno;
if ((z = strlen(lbuf)) ; 0 lbuf[z-1] == '\n')
lbuf[z - 1] = 0;
/* 對每一行應(yīng)用正則表達式進行匹配 */
z = regexec(reg, lbuf, nmatch, pm, 0);
if (z == REG_NOMATCH) continue;
else if (z != 0) {
regerror(z, reg, ebuf, sizeof(ebuf));
fprintf(stderr, "%s: regcom('%s')\n", ebuf, lbuf);
return 2;
}
/* 輸出處理結(jié)果 */
for (x = 0; x nmatch pm[x].rm_so != -1; ++ x) {
if (!x) printf("%04d: %s\n", lno, lbuf);
printf(" $%d='%s'\n", x, substr(lbuf, pm[x].rm_so, pm[x].rm_eo));
}
}
/* 釋放正則表達式 */
regfree(reg);
return 0;
}
上述程序負責(zé)從命令行獲取正則表達式,然后將其運用于從標準輸入得到的每行數(shù)據(jù),并打印出匹配結(jié)果。執(zhí)行下面的命令可以編譯并執(zhí)行該程序:
# gcc regexp.c -o regexp
# ./regexp 'regex[a-z]*' regexp.c
0003: #include regex.h;
$0='regex'
0027: regex_t reg;
$0='regex'
0054: z = regexec(reg, lbuf, nmatch, pm, 0);
$0='regexec'
小結(jié)
對那些需要進行復(fù)雜數(shù)據(jù)處理的程序來說,正則表達式無疑是一個非常有用的工具。本文重點在于闡述如何在C語言中利用正則表達式來簡化字符串處理,以便在數(shù)據(jù)處理方面能夠獲得與Perl語言類似的靈活性。
#includestdio.h /*引用庫函數(shù)*/
#includestdlib.h
#includectype.h
#includestring.h
typedef struct /*定義結(jié)構(gòu)體數(shù)組*/
{
char num[10]; /*學(xué)號*/
char name[20]; /*姓名*/
int score; /*成績*/
}Student;
Student stu[80]; /*結(jié)構(gòu)體數(shù)組變量*/
int menu_select() /*菜單函數(shù)*/
{
char c;
do{
system("cls"); /*運行前清屏*/
printf("\t\t****Students' Grade Management System****\n"); /*菜單選擇*/
printf("\t\t | 1. Input Records |\n");
printf("\t\t | 2. Display All Records |\n");
printf("\t\t | 3. Sort |\n");
printf("\t\t | 4. Insert a Record |\n");
printf("\t\t | 5. Delete a Record |\n");
printf("\t\t | 6. Query |\n");
printf("\t\t | 7. Statistic |\n");
printf("\t\t | 8. Add Records from a Text File|\n");
printf("\t\t | 9. Write to a Text file |\n");
printf("\t\t | 0. Quit |\n");
printf("\t\t*****************************************\n");
printf("\t\t\tGive your Choice(0-9):");
c=getchar(); /*讀入選擇*/
}while(c'0'||c'9');
return(c-'0'); /*返回選擇*/
}
int Input(Student stud[],int n) /*輸入若干條記錄*/
{int i=0;
char sign,x[10]; /*x[10]為清除多余的數(shù)據(jù)所用*/
while(sign!='n'sign!='N') /*判斷*/
{ printf("\t\t\tstudent's num:"); /*交互輸入*/
scanf("\t\t\t%s",stud[n+i].num);
printf("\t\t\tstudent's name:");
scanf("\t\t\t%s",stud[n+i].name);
printf("\t\t\tstudent's score:");
scanf("\t\t\t%d",stud[n+i].score);
gets(x); /*清除多余的輸入*/
printf("\t\t\tany more records?(Y/N)");
scanf("\t\t\t%c",sign); /*輸入判斷*/
i++;
}
return(n+i);
}
void Display(Student stud[],int n) /*顯示所有記錄*/
{
int i;
printf("\t\t\t-----------------------------------\n"); /*格式頭*/
printf("\t\t\tnumber name score\n");
printf("\t\t\t-----------------------------------\n");
for(i=1;in+1;i++) /*循環(huán)輸入*/
{
printf("\t\t\t%-16s%-15s%d\n",stud[i-1].num,stud[i-1].name,stud[i-1].score);
if(i1i%10==0) /*每十個暫停*/
{printf("\t\t\t-----------------------------------\n"); /*格式*/
printf("\t\t\t");
system("pause");
printf("\t\t\t-----------------------------------\n");
}
}
printf("\t\t\t");
system("pause");
}
void Sort_by_num(Student stud[],int n) /*按學(xué)號排序*/
{ int i,j,*p,*q,s;
char t[10];
for(i=0;in-1;i++) /*冒泡法排序*/
for(j=0;jn-1-i;j++)
if(strcmp(stud[j].num,stud[j+1].num)0)
{strcpy(t,stud[j+1].num);
strcpy(stud[j+1].num,stud[j].num);
strcpy(stud[j].num,t);
strcpy(t,stud[j+1].name);
strcpy(stud[j+1].name,stud[j].name);
strcpy(stud[j].name,t);
p=stud[j+1].score;
q=stud[j].score;
s=*p;
*p=*q;
*q=s;
}
}
int Insert_a_record(Student stud[],int n) /*插入一條記錄*/
{char x[10]; /*清除多余輸入所用*/
printf("\t\t\tstudent's num:"); /*交互式輸入*/
scanf("\t\t\t%s",stud[n].num);
printf("\t\t\tstudent's name:");
scanf("\t\t\t%s",stud[n].name);
printf("\t\t\tstudent's score:");
scanf("\t\t\t%d",stud[n].score);
gets(x);
n++;
Sort_by_num(stud,n); /*調(diào)用排序函數(shù)*/
printf("\t\t\tInsert Successed!\n"); /*返回成功信息*/
return(n);
}
int Delete_a_record(Student stud[],int n) /*按姓名查找,刪除一條記錄*/
{ char s[20];
int i=0,j;
printf("\t\t\ttell me his(her) name:"); /*交互式問尋*/
scanf("%s",s);
while(strcmp(stud[i].name,s)!=0in) i++; /*查找判斷*/
if(i==n)
{ printf("\t\t\tnot find!\n"); /*返回失敗信息*/
return(n);
}
for(j=i;jn-1;j++) /*刪除操作*/
{
strcpy(stud[j].num,stud[j+1].num);
strcpy(stud[j].name,stud[j+1].name);
stud[j].score=stud[j+1].score;
}
printf("\t\t\tDelete Successed!\n"); /*返回成功信息*/
return(n-1);
}
void Query_a_record(Student stud[],int n) /*查找并顯示一個記錄*/
{ char s[20];
int i=0;
printf("\t\t\tinput his(her) name:"); /*交互式輸入*/
scanf("\t\t\t%s",s);
while(strcmp(stud[i].name,s)!=0in) i++; /*查找判斷*/
if(i==n)
{ printf("\t\t\tnot find!\n"); /*輸入失敗信息*/
return;
}
printf("\t\t\this(her) number:%s\n",stud[i].num); /*輸出該學(xué)生信息*/
printf("\t\t\this(her) score:%d\n",stud[i].score);
}
void Statistic(Student stud[],int n) /*新增功能,輸出統(tǒng)計信息*/
{ int i,j=0,k=0,sum=0;
float aver; /*成績平均值*/
for(i=0;in;i++) /*循環(huán)輸入判斷*/
{
sum+=stud[i].score;
if(stud[j].scorestud[i].score) j=i;
if(stud[k].scorestud[i].score) k=i;
}
aver=1.0*sum/n;
printf("\t\t\tthere are %d records.\n",n); /*總共記錄數(shù)*/
printf("\t\t\tthe hignest score:\n"); /*最高分*/
printf("\t\t\tnumber:%s name:%s score:%d\n",stud[j].num,stud[j].name,stud[j].score);
printf("\t\t\tthe lowest score:\n"); /*最低分*/
printf("\t\t\tnumber:%s name:%s score:%d\n",stud[k].num,stud[k].name,stud[k].score);
printf("\t\t\tthe average score is %5.2f\n",aver); /*平均分*/
}
int AddfromText(Student stud[],int n) /*從文件中讀入數(shù)據(jù)*/
{ int i=0,num;
FILE *fp; /*定義文件指針*/
char filename[20]; /*定義文件名*/
printf("\t\t\tInput the filename:");
scanf("\t\t\t%s",filename); /*輸入文件名*/
if((fp=fopen(filename,"rb"))==NULL) /*打開文件*/
{ printf("\t\t\tcann't open the file\n"); /*打開失敗信息*/
printf("\t\t\t");
system("pause");
return(n);
}
fscanf(fp,"%d",num); /*讀入總記錄量*/
while(inum) /*循環(huán)讀入數(shù)據(jù)*/
{
fscanf(fp,"%s%s%d",stud[n+i].num,stud[n+i].name,stud[n+i].score);
i++;
}
n+=num;
fclose(fp); /*關(guān)閉文件*/
printf("\t\t\tSuccessed!\n");
printf("\t\t\t");
system("pause");
return(n);
}
void WritetoText(Student stud[],int n) /*將所有記錄寫入文件*/
{
int i=0;
FILE *fp; /*定義文件指針*/
char filename[20]; /*定義文件名*/
printf("\t\t\tWrite Records to a Text File\n"); /*輸入文件名*/
printf("\t\t\tInput the filename:");
scanf("\t\t\t%s",filename);
if((fp=fopen(filename,"w"))==NULL) /*打開文件*/
{
printf("\t\t\tcann't open the file\n");
system("pause");
return;
}
fprintf(fp,"%d\n",n); /*循環(huán)寫入數(shù)據(jù)*/
while(in)
{
fprintf(fp,"%-16s%-15s%d\n",stud[i].num,stud[i].name,stud[i].score);
i++;
}
fclose(fp); /*關(guān)閉文件*/
printf("Successed!\n"); /*返回成功信息*/
}
void main() /*主函數(shù)*/
{
int n=0;
for(;;)
{
switch(menu_select()) /*選擇判斷*/
{
case 1:
printf("\t\t\tInput Records\n"); /*輸入若干條記錄*/
n=Input(stu,n);
break;
case 2:
printf("\t\t\tDisplay All Records\n"); /*顯示所有記錄*/
Display(stu,n);
break;
case 3:
printf("\t\t\tSort\n");
Sort_by_num(stu,n); /*按學(xué)號排序*/
printf("\t\t\tSort Suceessed!\n");
printf("\t\t\t");
system("pause");
break;
case 4:
printf("\t\t\tInsert a Record\n");
n=Insert_a_record(stu,n); /*插入一條記錄*/
printf("\t\t\t");
system("pause");
break;
case 5:
printf("\t\t\tDelete a Record\n");
n=Delete_a_record(stu,n); /*按姓名查找,刪除一條記錄*/
printf("\t\t\t");
system("pause");
break;
case 6:
printf("\t\t\tQuery\n");
Query_a_record(stu,n); /*查找并顯示一個記錄*/
printf("\t\t\t");
system("pause");
break;
case 7:
printf("\t\t\tStatistic\n");
Statistic(stu,n); /*新增功能,輸出統(tǒng)計信息*/
printf("\t\t\t");
system("pause");
break;
case 8:
printf("\t\t\tAdd Records from a Text File\n");
n=AddfromText(stu,n); /*新增功能,輸出統(tǒng)計信息*/
break;
case 9:
printf("\t\t\tWrite to a Text file\n");
WritetoText(stu,n); /*循環(huán)寫入數(shù)據(jù)*/
printf("\t\t\t");
system("pause");
break;
case 0:
printf("\t\t\tHave a Good Luck,Bye-bye!\n"); /*結(jié)束程序*/
printf("\t\t\t");
system("pause");
exit(0);
}
}
}
四、函數(shù)調(diào)用關(guān)系圖
注:“→”代表調(diào)用
Input函數(shù)
打印鏈表記錄
Display函數(shù)
輸入若干條記錄
menu_select()函數(shù)
選擇菜單
Sort_by_num函數(shù)
顯示所有記錄
Delete_a_record函數(shù)
按姓名查找,刪除一條記錄
Query_a_record查找并顯示一條記錄
Statistic函數(shù)
輸出統(tǒng)計信息 (新增)
AddfromText函數(shù)
從正文中添加數(shù)據(jù)到結(jié)構(gòu)體數(shù)組中
Main函數(shù)
Insert_a_record插入一條記錄
WritetoText函數(shù) 將所有數(shù)據(jù)寫入文件中
退出程序
Reverse(head)函數(shù)
按學(xué)號排序
五、設(shè)計測試流程
1、進入界面
2、輸入選項1,回車;
按提示輸入數(shù)據(jù):
3、回到主菜單;
輸入選項7,回車;
輸入文件名:data.txt,回車;
出現(xiàn)成功提示,則讀入文件操作成功。
4、回到主菜單,輸入2,回車
每10個暫停顯示數(shù)據(jù)
5、回到主菜單,輸入3,回車
出現(xiàn)排序成功信息。
6、回到主菜單,輸入4,回車
按提示插入一組數(shù)據(jù)
7、回到主菜單,輸入5,回車
按提示輸入姓名,刪除數(shù)據(jù)
出現(xiàn)刪除成功的信息
8、回到主菜單,輸入6,回車
輸入姓名進行查詢
9、回到主菜單,輸入7,回車
出現(xiàn)統(tǒng)計信息
10、回到主菜單,輸入9,回車
輸入result.txt,回車
出現(xiàn)成功寫入文件的信息
11、回到主菜單,輸入0,回車退出系統(tǒng)
回答者:kingkey001 - 試用期 一級 7-14 22:38
修改答復(fù): kingkey001,您要修改的答復(fù)如下: 積分規(guī)則 關(guān)閉
C語言課程設(shè)計報告-------學(xué)生成績簡單管理程序
一、系統(tǒng)菜單的主要功能
(1)輸入若干條記錄
(2)顯示所有記錄
(3)按學(xué)號排序
(4)插入一條記錄
(5)按姓名查找,刪除一條記錄
(6)查找并顯示一條記錄
(7)輸出統(tǒng)計信息 (新增)
(8)從正文中添加數(shù)據(jù)到結(jié)構(gòu)體數(shù)組中
(9)將所有數(shù)據(jù)寫入文件中
(0)退出程序
二、題目分析
該題主要考察學(xué)生對結(jié)構(gòu)體,指針,文件的操作,以及C語言算法的掌握,所以完成此道題目要求較強的設(shè)計能力,尤其是要有一種大局觀的意識。如何調(diào)程序也非常重要,通過這個程序可以學(xué)習(xí)到以前調(diào)試短程序沒有的的經(jīng)驗。
菜單中的每一個選項都對應(yīng)一個子程序,子程序的算法幾乎囊獲了所有C語言學(xué)過的技巧,下面就各個子程序中的功能進行說明:
功能1和4的算法相似,輸入一條記錄到結(jié)構(gòu)體中去,其中有一部很關(guān)鍵,就是通過gets將所有的多余的字符,回車讀去,否則就會出錯。
功能2是顯示所有的記錄,通過循環(huán)輸出,格式也比較重要。
功能3為按學(xué)號排序,因為學(xué)號定義成了字符數(shù)組的形式,因此在運用冒泡法進行排序的時候,要用到strcmp,strcpy等函數(shù)。
功能5為按姓名刪除記錄,先輸入姓名,再一一比較,如果沒有則返回失敗信息,如果找到就將此記錄都向前移一位,返回n-1。
功能6的算法在5中就已經(jīng)體現(xiàn)了,輸入姓名,一一比較。
功能7為新增的功能,因為考慮到原來給出的函數(shù)中竟然沒有對學(xué)生成績的統(tǒng)計功能,因此新增此功能,可以得出所有的記錄個數(shù),最高、最低、平均分,并輸出相關(guān)的學(xué)生信息等。
功能8和9是對文件的操作,提前準備好數(shù)據(jù)。
三、程序正文部分
#includestdio.h /*引用庫函數(shù)*/
#includestdlib.h
#includectype.h
#includestring.h
typedef struct /*定義結(jié)構(gòu)體數(shù)組*/
{
char num[10]; /*學(xué)號*/
char name[20]; /*姓名*/
int score; /*成績*/
}Student;
Student stu[80]; /*結(jié)構(gòu)體數(shù)組變量*/
int menu_select() /*菜單函數(shù)*/
{
char c;
do{
system("cls"); /*運行前清屏*/
printf("\t\t****Students' Grade Management System****\n"); /*菜單選擇*/
printf("\t\t | 1. Input Records |\n");
printf("\t\t | 2. Display All Records |\n");
printf("\t\t | 3. Sort |\n");
printf("\t\t | 4. Insert a Record |\n");
printf("\t\t | 5. Delete a Record |\n");
printf("\t\t | 6. Query |\n");
printf("\t\t | 7. Statistic |\n");
printf("\t\t | 8. Add Records from a Text File|\n");
printf("\t\t | 9. Write to a Text file |\n");
printf("\t\t | 0. Quit |\n");
printf("\t\t*****************************************\n");
printf("\t\t\tGive your Choice(0-9):");
c=getchar(); /*讀入選擇*/
}while(c'0'||c'9');
return(c-'0'); /*返回選擇*/
}
int Input(Student stud[],int n) /*輸入若干條記錄*/
{int i=0;
char sign,x[10]; /*x[10]為清除多余的數(shù)據(jù)所用*/
while(sign!='n'sign!='N') /*判斷*/
{ printf("\t\t\tstudent's num:"); /*交互輸入*/
scanf("\t\t\t%s",stud[n+i].num);
printf("\t\t\tstudent's name:");
scanf("\t\t\t%s",stud[n+i].name);
printf("\t\t\tstudent's score:");
scanf("\t\t\t%d",stud[n+i].score);
gets(x); /*清除多余的輸入*/
printf("\t\t\tany more records?(Y/N)");
scanf("\t\t\t%c",sign); /*輸入判斷*/
i++;
}
return(n+i);
}
void Display(Student stud[],int n) /*顯示所有記錄*/
{
int i;
printf("\t\t\t-----------------------------------\n"); /*格式頭*/
printf("\t\t\tnumber name score\n");
printf("\t\t\t-----------------------------------\n");
for(i=1;in+1;i++) /*循環(huán)輸入*/
{
printf("\t\t\t%-16s%-15s%d\n",stud[i-1].num,stud[i-1].name,stud[i-1].score);
if(i1i%10==0) /*每十個暫停*/
{printf("\t\t\t-----------------------------------\n"); /*格式*/
printf("\t\t\t");
system("pause");
printf("\t\t\t-----------------------------------\n");
}
}
printf("\t\t\t");
system("pause");
}
void Sort_by_num(Student stud[],int n) /*按學(xué)號排序*/
{ int i,j,*p,*q,s;
char t[10];
for(i=0;in-1;i++) /*冒泡法排序*/
for(j=0;jn-1-i;j++)
if(strcmp(stud[j].num,stud[j+1].num)0)
{strcpy(t,stud[j+1].num);
strcpy(stud[j+1].num,stud[j].num);
strcpy(stud[j].num,t);
strcpy(t,stud[j+1].name);
strcpy(stud[j+1].name,stud[j].name);
strcpy(stud[j].name,t);
p=stud[j+1].score;
q=stud[j].score;
s=*p;
*p=*q;
*q=s;
}
}
int Insert_a_record(Student stud[],int n) /*插入一條記錄*/
{char x[10]; /*清除多余輸入所用*/
printf("\t\t\tstudent's num:"); /*交互式輸入*/
scanf("\t\t\t%s",stud[n].num);
printf("\t\t\tstudent's name:");
scanf("\t\t\t%s",stud[n].name);
printf("\t\t\tstudent's score:");
scanf("\t\t\t%d",stud[n].score);
gets(x);
n++;
Sort_by_num(stud,n); /*調(diào)用排序函數(shù)*/
printf("\t\t\tInsert Successed!\n"); /*返回成功信息*/
return(n);
}
int Delete_a_record(Student stud[],int n) /*按姓名查找,刪除一條記錄*/
{ char s[20];
int i=0,j;
printf("\t\t\ttell me his(her) name:"); /*交互式問尋*/
scanf("%s",s);
while(strcmp(stud[i].name,s)!=0in) i++; /*查找判斷*/
if(i==n)
{ printf("\t\t\tnot find!\n"); /*返回失敗信息*/
return(n);
}
for(j=i;jn-1;j++) /*刪除操作*/
{
strcpy(stud[j].num,stud[j+1].num);
strcpy(stud[j].name,stud[j+1].name);
stud[j].score=stud[j+1].score;
}
printf("\t\t\tDelete Successed!\n"); /*返回成功信息*/
return(n-1);
}
void Query_a_record(Student stud[],int n) /*查找并顯示一個記錄*/
{ char s[20];
int i=0;
printf("\t\t\tinput his(her) name:"); /*交互式輸入*/
scanf("\t\t\t%s",s);
while(strcmp(stud[i].name,s)!=0in) i++; /*查找判斷*/
if(i==n)
{ printf("\t\t\tnot find!\n"); /*輸入失敗信息*/
return;
}
printf("\t\t\this(her) number:%s\n",stud[i].num); /*輸出該學(xué)生信息*/
printf("\t\t\this(her) score:%d\n",stud[i].score);
}
void Statistic(Student stud[],int n) /*新增功能,輸出統(tǒng)計信息*/
{ int i,j=0,k=0,sum=0;
float aver; /*成績平均值*/
for(i=0;in;i++) /*循環(huán)輸入判斷*/
{
sum+=stud[i].score;
if(stud[j].scorestud[i].score) j=i;
if(stud[k].scorestud[i].score) k=i;
}
aver=1.0*sum/n;
printf("\t\t\tthere are %d records.\n",n); /*總共記錄數(shù)*/
printf("\t\t\tthe hignest score:\n"); /*最高分*/
printf("\t\t\tnumber:%s name:%s score:%d\n",stud[j].num,stud[j].name,stud[j].score);
printf("\t\t\tthe lowest score:\n"); /*最低分*/
printf("\t\t\tnumber:%s name:%s score:%d\n",stud[k].num,stud[k].name,stud[k].score);
printf("\t\t\tthe average score is %5.2f\n",aver); /*平均分*/
}
int AddfromText(Student stud[],int n) /*從文件中讀入數(shù)據(jù)*/
{ int i=0,num;
FILE *fp; /*定義文件指針*/
char filename[20]; /*定義文件名*/
printf("\t\t\tInput the filename:");
scanf("\t\t\t%s",filename); /*輸入文件名*/
if((fp=fopen(filename,"rb"))==NULL) /*打開文件*/
{ printf("\t\t\tcann't open the file\n"); /*打開失敗信息*/
printf("\t\t\t");
system("pause");
return(n);
}
fscanf(fp,"%d",num); /*讀入總記錄量*/
while(inum) /*循環(huán)讀入數(shù)據(jù)*/
{
fscanf(fp,"%s%s%d",stud[n+i].num,stud[n+i].name,stud[n+i].score);
i++;
}
n+=num;
fclose(fp); /*關(guān)閉文件*/
printf("\t\t\tSuccessed!\n");
printf("\t\t\t");
system("pause");
return(n);
}
void WritetoText(Student stud[],int n) /*將所有記錄寫入文件*/
{
int i=0;
FILE *fp; /*定義文件指針*/
char filename[20]; /*定義文件名*/
printf("\t\t\tWrite Records to a Text File\n"); /*輸入文件名*/
printf("\t\t\tInput the filename:");
scanf("\t\t\t%s",filename);
if((fp=fopen(filename,"w"))==NULL) /*打開文件*/
{
printf("\t\t\tcann't open the file\n");
system("pause");
return;
}
fprintf(fp,"%d\n",n); /*循環(huán)寫入數(shù)據(jù)*/
while(in)
{
fprintf(fp,"%-16s%-15s%d\n",stud[i].num,stud[i].name,stud[i].score);
i++;
}
fclose(fp); /*關(guān)閉文件*/
printf("Successed!\n"); /*返回成功信息*/
}
void main() /*主函數(shù)*/
{
int n=0;
for(;;)
{
switch(menu_select()) /*選擇判斷*/
{
case 1:
printf("\t\t\tInput Records\n"); /*輸入若干條記錄*/
n=Input(stu,n);
break;
case 2:
printf("\t\t\tDisplay All Records\n"); /*顯示所有記錄*/
Display(stu,n);
break;
case 3:
printf("\t\t\tSort\n");
Sort_by_num(stu,n); /*按學(xué)號排序*/
printf("\t\t\tSort Suceessed!\n");
printf("\t\t\t");
system("pause");
break;
case 4:
printf("\t\t\tInsert a Record\n");
n=Insert_a_record(stu,n); /*插入一條記錄*/
printf("\t\t\t");
system("pause");
break;
case 5:
printf("\t\t\tDelete a Record\n");
n=Delete_a_record(stu,n); /*按姓名查找,刪除一條記錄*/
printf("\t\t\t");
system("pause");
break;
case 6:
printf("\t\t\tQuery\n");
Query_a_record(stu,n); /*查找并顯示一個記錄*/
printf("\t\t\t");
system("pause");
break;
case 7:
printf("\t\t\tStatistic\n");
Statistic(stu,n); /*新增功能,輸出統(tǒng)計信息*/
printf("\t\t\t");
system("pause");
break;
case 8:
printf("\t\t\tAdd Records from a Text File\n");
n=AddfromText(stu,n); /*新增功能,輸出統(tǒng)計信息*/
break;
case 9:
printf("\t\t\tWrite to a Text file\n");
WritetoText(stu,n); /*循環(huán)寫入數(shù)據(jù)*/
printf("\t\t\t");
system("pause");
break;
case 0:
printf("\t\t\tHave a Good Luck,Bye-bye!\n"); /*結(jié)束程序*/
printf("\t\t\t");
system("pause");
exit(0);
}
}
}
四、函數(shù)調(diào)用關(guān)系圖
注:“→”代表調(diào)用
Input函數(shù)
打印鏈表記錄
Display函數(shù)
輸入若干條記錄
menu_select()函數(shù)
選擇菜單
Sort_by_num函數(shù)
顯示所有記錄
Delete_a_record函數(shù)
按姓名查找,刪除一條記錄
Query_a_record查找并顯示一條記錄
Statistic函數(shù)
輸出統(tǒng)計信息 (新增)
AddfromText函數(shù)
從正文中添加數(shù)據(jù)到結(jié)構(gòu)體數(shù)組中
Main函數(shù)
Insert_a_record插入一條記錄
WritetoText函數(shù) 將所有數(shù)據(jù)寫入文件中
退出程序
Reverse(head)函數(shù)
按學(xué)號排序
五、設(shè)計測試流程
1、進入界面
2、輸入選項1,回車;
按提示輸入數(shù)據(jù):
3、回到主菜單;
輸入選項7,回車;
輸入文件名:data.txt,回車;
出現(xiàn)成功提示,則讀入文件操作成功。
4、回到主菜單,輸入2,回車
每10個暫停顯示數(shù)據(jù)
5、回到主菜單,輸入3,回車
出
文章題目:c語言mensed函數(shù) c語言meset函數(shù)
分享路徑:http://www.chinadenli.net/article2/dosieic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)、定制開發(fā)、虛擬主機、網(wǎng)站內(nèi)鏈、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)