# include & ltbios.h & gt
# include & ltdos.h & gt/*頭文件*/
# include & ltconio.h & gt
# include & ltctype.h & gt
# include & ltprocess.h & gt
# include & ltstdlib.h & gt
# include & ltstdio.h & gt
# include & ltstring.h & gt
#定義NULL 0
#define ESC 0x001b /* Exit */
# define f1x3b00/*查看幫助信息並調用HelpMassage()函數*/
# define20x3c00/*輸入學生成績*/
# define30x3d00/*按學號搜索*/
# define40x3E00/*按姓名搜索*/
#define F5 0x3f00 /*列出所有學生的成績*/
#定義F6 0x4000 /*統計*/
Struct stuType /*定義結構變量*/
{
字符編號[11];/*學號是10*/
char XM[10];
char AGE[2];/*年齡長度為2*/
float CJ[4];/*包括4個等級*/
};
/* - 2 - */
Intjy _ no (char * stu _ num,file * FP)/*檢查學號的正確性*/
{ struct stuType stud
int號;
char * p = stu _ num
if(strcmp(stu_num," # " = = 0)返回1;/*如果輸入“#”並返回true值,則不會輸入*/
while(*p!='\0') /*學生ID必須是數字,否則返回並重新輸入*/
{ NO =(int)* p;
如果(否& lt48 | |否& gt57)
{ puts(" \ t \ t未定義的序列號!請重新輸入!\ n ");/*非法學號!請重新輸入!*/
返回0;
}
else p++;/*指針加1*/
}
if(strlen(stu_num)!=10) /*如果學號長度不是10,返回並重新輸入*/
{ puts(" \ t \ t序列號長度錯誤!\ n ");/*學號長度錯誤*/
返回0;
}
if(getchar()!='\n') /*如果學號後面的字符不是回車符,則學號的長度超過10*/
{ printf(" \ t \ t序列號的長度應該大於10!請重新輸入!\ n ");/*學號長度大於10,請重新輸入*/
do{}while(getchar()!= ' \ n ');/*用getchar接收額外的字符*/
返回0;
}
其他
{
倒帶(FP);/*將文件指針指向文件頭*/
而(!Feof(fp)) /*如果文件指針沒有到達末尾,繼續執行下面的循環,Feof遇到文件終止符會返回非零值,否則返回0*/
{弗雷德(& ampstud,sizeof(struct stuType),1,FP);/*讀取壹定長度的數據*/
If (strcmp (stu _ num,stud.no) = = 0)/*學號的唯壹性*/
{ printf("\t\t重復序號,請重新輸入!\ n ");/*重復的學號!請重新輸入*/
printf(" \ t \ t該學生的記錄:\ n ");/*該學生的成績如下*/
printf(" \ t \ t中文:%.1f\n ",stud。CJ[0]);/*語言*/
printf("\t\tMath:%.1f\n ",stud。CJ[1]);/*數學*/
printf(" \ t \ t英語:%.1f\n ",stud。CJ[2]);/*英語*/
printf(" \ t \ t總計:%.1f\n ",stud。CJ[3]);/*壹般性意見*/
返回0;
}
}
}
返回1;
}
/* - 3 - */
Int JY_NO2(char *stu_num) /*檢驗編號*/
{ int NO
char * p = stu _ num
if(strcmp(stu_num," # " = = 0)返回1;/*如果輸入了“#”,則結束返回真值*/
if(strlen(stu_num)!=10) /*學號長度不是10*/
{ puts(" \ t \ t序列號長度錯誤!\ n ");/*學號長度錯誤*/
返回0;
}
while(*p!='\0') /*學生ID必須是數字。如果它包含字母或其他字符,它將返回壹個false值並重新輸入*/
{ NO =(int)* p;
如果(否& lt48 | |否& gt57)
{ puts(" \ t \ t未定義的序列號!請重新輸入!\ n ");/*非法學號!請重新輸入*/
返回0;
}
else p++;/*指針加1*/
}
if(getchar()!='\n') /*檢查學號的長度是否大於10,去掉多余的字符*/
{ printf(" \ t \ t序列號的長度應該大於10!請重新輸入!\ n ");/*學號長度大於10,請重新輸入*/
do{}while(getchar()!= ' \ n ');
返回0;
}
返回1;
}
/* - 4 - */
Int JY_XM(char *stu_XM) /*檢驗名稱*/
{ int PD
char * p;
p = stu _ XM
while(*p!='\0') /*名稱只能是英文*/
{
PD =(int)* p;
if(PD & lt;0)
{ puts(" \ t \ t名稱應該使用英文,請重新輸入!\ n ");/*姓名只能是英文。請重新輸入*/
返回0;
}
else p++;/*指針加1指向下壹個漢字*/
}
if(getchar()!='\n') /*名稱的長度不得超過5 */
{ printf(" \ t \ t名稱長度超過5,請重新輸入!\ n ");/*名稱超過5個。請重新輸入*/
do{}while(getchar()!= ' \ n ');
返回0;
}
返回1;/*字符串都是中文字符,返回true */
}
/* - 5 - */
Int JY_AGE(float stu_AGE) /*年齡只能在0~100之間*/
{
if(stu _ AGE & lt;0 | | stu _ AGE & gt100)
{ printf(" \ t \ t輸入錯誤!記錄應該在0~100之間!\ n ");/*輸入錯誤,分數只能在0~100之間*/
返回0;
}
返回1;
}
/* - 6 - */
Int JY_CJ(float stu_CJ) /*學生成績只能在0~100之間*/
{
if(stu _ CJ & lt;0 | | stu _ CJ & gt100)
{ printf(" \ t \ t輸入錯誤!記錄應該在0~100之間!\ n ");/*輸入錯誤,分數只能在0~100之間*/
返回0;
}
返回1;
}
/* - 7 - */
Void CreatFile() /*輸入文件*/
{ FILE * fp
struct stuType stu,stu0={ ""," ",};/*沒錯,stu0xianfuzhi*/
fp=fopen("stu.dat "," w b+ ");/*打開或創建二進制文件,打開時刪除原始內容*/
if(fp==NULL)
{ printf(" \ t \ t文件打開錯誤!\ n \ t \ t \按任意鍵返回...");/*文件打開失敗,按任意鍵返回*/
getch();
返回;
}
其他
{ while(1)
{ stu = stu0
do { printf(" \ n \ t \ t請輸入序列號:");/*輸入學號並檢查其正確性*/
scanf("%10s ",stu。否);
}while(!JY不(斯圖。沒有,FP));
if(strcmp(stu。否,“#”= = 0)斷;
do { printf(" \ n \ t \ t請輸入名稱:");/*輸入名稱並檢查其正確性*/
scanf("%10s ",stu。XM);
}while(!JY_XM(斯圖。XM));
do { printf(" \ n \ t \ t請輸入年齡:");/*輸入您的年齡記錄並檢查其正確性*/
scanf("%f ",& amp斯圖。年齡);
}while(!JY時代(斯圖。年齡[0]));
do { printf(" \ n \ t \ t請輸入中文記錄:");/*輸入等級並檢查其正確性*/
scanf("%f ",& amp斯圖。CJ[0]);
}while(!JY CJ(斯圖。CJ[0]));
do { printf(" \ n \ t \ t請輸入數學記錄:");/*同上*/
scanf("%f ",& amp斯圖。CJ[1]);
}while(!JY CJ(斯圖。CJ[1]);
do { printf(" \ n \ t \ t請輸入英文記錄:");
scanf("%f ",& amp斯圖。CJ[2]);
}while(!JY CJ(斯圖。CJ[2]));
do { printf(" \ n \ t \ t請輸入總計記錄:");
scanf("%f ",& amp斯圖。CJ[3]);
}while(!JY CJ(斯圖。CJ[3]));
fwrite(& amp;stu,sizeof(struct stuType),1,FP);/*寫文件*/
}
}
fclose(FP);/*關閉文件*/
}
/* - 8 - */
Void Search_Xuehao() /*按學號查詢*/
{ FILE * fp
int標誌;
struct stuType stu,stud
fp=fopen("stu.dat "," Rb ");
If(fp==NULL) /*如果文件無法打開,則輸出以下信息*/
{ printf(" \ t \ t文件打開錯誤!\ n \ t \ t \按任意鍵返回...");
getch();
返回;
}
其他
{ do { puts(" \ n \ t \ t按\"#\ "或search ");
do { printf(" \ t \ t請輸入您想要的序列號:");
scanf("%10s ",stu。否);
}while(!JY 2號(斯圖。否));
if(strcmp(stu。否,“#”= = 0)斷;/*如果輸入了“#”,則循環結束*/
flag = 0;
倒帶(FP);
while(fread(& amp;Stud,sizeof (struct stutype),1,FP))/*檢查文件結束指針*/
{if (strcmp (stu.no,stud.no) = = 0)/*比較學號*/
{ puts(" \ t \ t該學生的記錄:");
printf("\t\tSN:%s\n ",stud。否);
printf("\t\tName:%s\n ",stud。XM);
printf("\t\tAGE:%.1f\n ",stud。年齡[0]);
printf(" \ t \ t中文:%.1f\n ",stud。CJ[0]);
printf("\t\tMath:%.1f\n ",stud。CJ[1]);
printf(" \ t \ t英語:%.1f\n ",stud。CJ[2]);
printf(" \ t \ t總計:%.1f\n ",stud。CJ[3]);
flag = 1;/*記錄是否找到學號*/
}
}
if(flag = = 0)puts(" \ t \ t未定義的序列號");
}while(strcmp(stu。不,“#”!=0);
}
fclose(FP);/*關閉文件*/
}
/* - 9 - */
Voidsearch _ xing ()/*按名稱搜索*/
{ FILE * fp
int flag = 0;
struct stuType stu,stud
fp=fopen("stu.dat "," Rb ");
if(fp==NULL)
{ printf(" \ t \ t文件打開錯誤!\ n \ t \按任意鍵返回...");
getch();
返回;
}
其他
做{
do { printf(" \ t \ t請輸入您想要的學生姓名:");
scanf("%10s ",stu。XM);
}while(!JY_XM(斯圖。XM));
倒帶(FP);/*文件指針指向文件頭*/
while(fread(& amp;stud,sizeof(struct stuType),1,fp))
{if (strcmp (stu.xm,stud.xm) = = 0)/*比較名稱是否相同*/
{ puts(" \ t \ t該學生的姓名是:");
printf("\t\tSN:%s\n ",stud。否);
printf("\t\tName:%s\n ",stud。XM);
printf("\t\tAGE:%.1f\n ",stud。年齡[0]);
printf(" \ t \ t中文:%.1f\n ",stud。CJ[0]);
printf("\t\tMath:%.1f\n ",stud。CJ[1]);
printf(" \ t \ t英語:%.1f\n ",stud。CJ[2]);
printf(" \ t \ t總計:%.1f\n ",stud。CJ[3]);
flag = 1;/*記錄是否已找到該名稱*/
}
}
if(flag = = 0)puts(" \ n \ t \ t未定義的名稱!");
puts(" \ t \ t繼續嗎?(y - yes,Else鍵返回)?”);
} while(getch()= = ' y ');
}
fclose(FP);
/* puts(" \ t \ t按任意鍵繼續...");*/
/* getch();*/
}
/* - 10 - */
Int ListFile(void) /*輸出文件,列出所有學生的成績*/
{ FILE * fp
int REC = 0;/*記錄學生人數*/
struct stuType stu
fp=fopen("stu.dat "," Rb ");
if(fp==NULL)
{ printf(" \ t \ t文件打開錯誤!\ n \ t \按任意鍵返回...");
getch();
返回1;
}
else { printf(" \ t \ t學生記錄:\ n ");
printf(" \ t \ tSN \ t \ tName \ t Chinese \ t math \ t English \ t total \ n ");
倒帶(FP);
while(fread(& amp;stu,sizeof(struct stuType),1,fp))
{/*輸出*/
printf("\t\t%s ",stu。否);
printf("\t%s ",stu。XM);
printf("\t%.1f ",stu。年齡);
printf("\t%.1f ",stu。CJ[0]);
printf("\t%.1f ",stu。CJ[1]);
printf("\t%.1f ",stu。CJ[2]);
printf("\t%.1f ",stu。CJ[3]);
printf(" \ n ");
rec++;
If(REC%20==0) /*20學生成績,stop */
{ printf(" \ t \ t按任意鍵繼續...\ n ");
getch();
}
}
}
fclose(FP);/*關閉文件*/
printf(" \ t \ t繼續...");
getch();
}
/* - 11 - */
Void Statistics() /*統計合格且優秀的人數*/
{ FILE * fp
int REC=0,unpass[4]={0},good[4]= { 0 };/* rec-記錄數,即人數,unpass -重建人數,good -優秀人數*/
浮動最高[4]={0},得分[4]= { 0 };/*最高-最高分,得分-總分*/
struct stuType stu
fp=fopen("stu.dat "," Rb ");
if(fp==NULL)
{ printf(" \ t \ t文件打開錯誤!\ n \ t \按任意鍵返回...");
getch();
返回;
}
else { rewind(FP);
while(fread(& amp;stu,sizeof(struct stuType),1,fp))
{ rec++;
分數[0]=分數[0]+stu。CJ[0];/*語言*/
如果(斯圖。CJ[0]& lt;= 60)un pass[0]++;
如果(斯圖。CJ[0]& gt;=80)好[0]++;
if(最高[0]& lt;斯圖。CJ[0])最高[0]=stu。CJ[0];
分數[1]=分數[1]+stu。CJ[1];/*數學*/
如果(斯圖。CJ[1]& lt;= 60)un pass[1]++;
如果(斯圖。CJ[1]>=80)好[1]++;
if(最高[1]& lt;斯圖。CJ[1])最高[1]=stu。CJ[1];
分數[2]=分數[2]+stu。CJ[2];/*英語*/
如果(斯圖。CJ[2]& lt;= 60)un pass[2]++;
如果(斯圖。CJ[2]& gt;=80)好[2]++;
if(最高[2]& lt;斯圖。CJ[2])最高[2]=stu。CJ[2];
分數[3]=分數[3]+stu。CJ[3];/*壹般性意見*/
如果(斯圖。CJ[3]& lt;= 60)un pass[3]++;
如果(斯圖。CJ[3]& lt;=80)好[3]++;
if(最高[3]& lt;斯圖。CJ[3])最高[3]=stu。CJ[3];
}
If(REC==0) /*可以防止錄制為0 */時由於REC的劃分而導致的錯誤
{ printf(" \ t \ t沒有輸入名稱!按任意鍵返回...");
getch();
返回;
}
否則{
printf("\t中文\t數學\t英文\t總\ n ");/*輸出統計*/
printf(" % . 1f \ t % . 1f \ t % . 1f \ t \ t % . 1f \ n ",score[0]/REC,score[1]/REC,score[2]/REC,score[3]/REC);
printf(" . 1f \ t % . 1f \ t % . 1f \ t % . \ t % . 1f \ n ",最高[0],最高[1],最高[2],最高[3]);
printf(" \ t好學生數:%d\t\t %d\t %d\t\t %d\n ",好[0],好[1],好[2],好[3]);
printf(" \ t未通過的學生人數:%d\t\t %d\t %d\t\t %d\n ",unpass[0],unpass[1],unpass[2],un pass[3]);
}
}
fclose(FP);
printf(" \ n \ t \ t \ t按任意鍵繼續...");
getch();
}
/* - 12 - */
void HelpMessage()
{ clr SCR();
printf("\n\n\n\n\n遲佟氏老實人所左燁邊知爾成,蓋希同聚友存初學生書居,安學浩,興明查勛,列初學生何佟公能。\n \n石永芳發:西通書路書局侯,江仔黨前木路忠監利壹格stu.dat,永裕寶村書路德書局.薛浩書路智能勇書子書路切薛浩智能師10魏.興明書路福和中國人德興明,智能勇品英,切醉長威5格。\n馳陳旭在Turbo C2.0xia運行郭彤\ n \ n ");
getch();
}
/* - 13 - */
Int GetKey(void) /*這個函數返回壹個鍵的值*/
{ int key
key = BIOS key(0);/*bioskey是調用BIOS的鍵盤接口*/
if(key & lt;& lt8) /*位移*/
{
鑰匙=鑰匙& amp0x 00 ff;
}
回車鍵;/*後退按鈕*/
}
/* - 14 - */
void main()
{ int key
結構日期d;/*定義時間結構*/
getdate(& amp;d);/*讀取系統日期並將其放入結構D */
clr SCR();/*清空屏幕*/
printf(" \ n \ n \ n \ n ");
printf(" \ t = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = n ");/*版本信息*/
printf(" \ n ");
printf("\t\t學生檔案管理系統1.0 \ n ");
printf(" \ n ");
printf(" \ n ");
printf(" \ t \ t Builder:XG 042-WZM YS HYF WQ \ n ");
printf("\t\t教師:宋袁哲\ n ");
printf(" \ t \ t Time:2005 \ \ 7 \ \ 5 \ n ");
printf(" \ n ");
printf(" \ t = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = n ");
printf(" \ t \ t \ t按任意鍵繼續...");
/*while(!kb hit());*/
getch();/*從鍵盤讀取字符,但不要在屏幕上顯示*/
系統(“cls”);/*調用DOS的清屏函數,可以用clrscr代替*/
While(1) /*主菜單*/
{
printf(" \ n \ n \ n \ n ");
printf(" \ t * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");
printf(" \ t * * \ t * * \ n ");
printf(" \ t * * \ TF 1-Help * * \ n ");
printf(" \ t * * \ t * * \ n ");
printf("\t **\tF2 -數據輸入& amp保存* * \ n ");
printf(" \ t * * \ t * * \ n ");
printf("\t **\tF3 -按序號搜索* * \ n ");
printf(" \ t * * \ t * * \ n ");
printf("\t **\tF4 -按名稱搜索* * \ n ");
printf(" \ t * * \ t * * \ n ");
printf("\t **\tF5 -內容輸入* * \ n ");
printf(" \ t * * \ t * * \ n ");
printf("\t **\tF6 -統計學生人數(通過& amp好)* * \ n ");
printf(" \ t * * \ t * * \ n ");
printf("\t **\tESC -退出系統* * \ n ");
printf(" \ t * * \ t * * \ n ");
printf(" \ t * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");
printf("\n\t請選擇...\t\t%d\\%d\\%d\n\n ",d.da_year,d.da_mon,d . da _ day);/*提示信息並顯示當前系統日期*/
key = GetKey();/*調用自定義函數並讀取密鑰*/
開關(鑰匙)
{
case f 1:help message();打破;
案例F2:creat file();打破;
案例F3:Search _ Xuehao();打破;
案例F4:Search _ Xingming();打破;
案例F5:ListFile();打破;
案例F6:統計();打破;
案例ESC:退出(1);打破;
/* default:puts(" \ t \ t \ t錯誤的序列號輸入!");
printf(" \ t \ t \ t按任意鍵返回...");
getch();*/
}
clr SCR();/*執行每個功能後自動清空屏幕*/
}
}