?? 學生成績管理系統.txt
字號:
學生成績管理系統
/*-------------1-------------*/
#include<bios.h>
#include<dos.h> /*頭文件*/
#include<conio.h>
#include<ctype.h>
#include<process.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define NULL 0
#define ESC 0x001b /* 退出 */
#define F1 0x3b00 /* 查看幫助信息,調用HelpMassage()函數 */
#define F2 0x3c00 /*輸入學生成績*/
#define F3 0x3d00 /*按學號查找*/
#define F4 0x3e00 /*按姓名查找*/
#define F5 0x3f00 /*列出所有學生成績*/
#define F6 0x4000 /*統計*/
struct stuType /*定義結構體變量*/
{
char NO[11]; /*學號長度為10*/
char XM[10];
float CJ[4]; /*包含4門成績*/
};
/*-------------2-------------*/
int JY_NO(char *stu_num,FILE *fp) /*檢驗學號的正確性*/
{ struct stuType stud;
int NO;
char *p=stu_num;
if(strcmp(stu_num,"#")==0) return 1; /*若輸入"#"返回真值,不再循環輸入*/
while(*p!='{ARTICLE_CONTENT}') /*學號必須是數字,否則返回重新輸入*/
{ NO=(int)*p;
if(NO<48||NO>57)
{ puts("\t\t\t非法學號!請重新輸入!\n");
return 0;
}
else p++; /*指針加1*/
}
if(strlen(stu_num)!=10) /*若學號長度不為10,則返回重新輸入*/
{ puts("\t\t\t學號長度不對!\n");
return 0;
}
if(getchar()!='\n') /*若學號后面的字符不是回車符,則學號長度大于10*/
{ printf("\t\t\t學號長度大于10個!請重新輸入!\n");
do{}while(getchar()!='\n'); /*用getchar接收多余的字符*/
return 0;
}
else
{
rewind(fp); /*使文件指針指向頭*/
while(!feof(fp)) /*若文件指針未到結尾,就繼續執行下面的循環,feof遇到文件結束符返回非零值,否則返回0*/
{ fread(&stud,sizeof(struct stuType),1,fp); /*讀取一定長度的數據*/
if(strcmp(stu_num,stud.NO)==0) /*學號的唯一性*/
{ printf("\t\t\t學號重復,請重新輸入!\n");
printf("\t\t\t該學生成績如下:\n");
printf("\t\t\t語文:%.1f\n",stud.CJ[0]);
printf("\t\t\t數學:%.1f\n",stud.CJ[1]);
printf("\t\t\t英語:%.1f\n",stud.CJ[2]);
printf("\t\t\t總評:%.1f\n",stud.CJ[3]);
return 0;
}
}
}
return 1;
}
/*-------------3-------------*/
int JY_NO2(char *stu_num) /*檢驗學號*/
{ int NO;
char *p=stu_num;
if(strcmp(stu_num,"#")==0)return 1; /*若輸入“#”,則返回真值結束*/
if(strlen(stu_num)!=10) /*學號長度為10*/
{ puts("\t\t\t學號長度不對!\n");
return 0;
}
while(*p!='{ARTICLE_CONTENT}') /*學號必須用數字,若包含有字母,或其它字符則返回假值重新輸入*/
{ NO=(int)*p;
if(NO<48||NO>57)
{ puts("\t\t\t非法學號!請重新輸入!\n");
return 0;
}
else p++; /*指針加1*/
}
if(getchar()!='\n') /*檢驗學號長度是否大于10,并把多余的字符去掉*/
{ printf("\t\t\t學號長度大于10個!請重新輸入!\n");
do{}while(getchar()!='\n');
return 0;
}
return 1;
}
/*-------------4-------------*/
int JY_XM(char *stu_XM) /*檢驗姓名*/
{ int PD;
char *p;
p=stu_XM;
while(*p!='{ARTICLE_CONTENT}') /*姓名只能用中文*/
{
PD=(int)*p;
if(PD>0)
{ puts("\t\t\t姓名只能用中文,請重新輸入!\n");
return 0;
}
else p++; /*使指針加1,指向下一漢字*/
}
if(getchar()!='\n') /*姓名長度不得大于5個*/
{ printf("\t\t\t姓名長度大于5個!請重新輸入!\n");
do{}while(getchar()!='\n');
return 0;
}
return 1; /*字符串全為漢字返回真*/
}
/*-------------5-------------*/
int JY_CJ(float stu_CJ) /*學生成績只能在0~100之間*/
{
if(stu_CJ<0||stu_CJ>100)
{ printf("\t\t\t輸入錯誤,成績只能在0~100之間!\n");
return 0;
}
return 1;
}
/*-------------6-------------*/
void CreatFile() /*輸入文件*/
{ FILE *fp;
struct stuType stu,stu0={"","",}; /*對stu0先賦值*/
fp=fopen("stu.dat","wb+"); /*打開或創建一個二進制文件,打開時將原來的內容刪除*/
if(fp==NULL)
{ printf("\t\t\t文件打開失敗!\n\t\t\t按任意鍵返回...");
getch();
return;
}
else
{ while(1)
{ stu=stu0;
do{ printf("\n\t\t\t請輸入學號:"); /*輸入學號并檢驗其正確性*/
scanf("%10s",stu.NO);
}while(!JY_NO(stu.NO,fp));
if(strcmp(stu.NO,"#")==0)break;
do{ printf("\n\t\t\t請輸入姓名:"); /*輸入姓名并檢驗其正確性*/
scanf("%10s",stu.XM);
}while(!JY_XM(stu.XM));
do{ printf("\n\t\t\t請輸入語文成績:"); /*輸入成績并檢驗其正確性*/
scanf("%f",&stu.CJ[0]);
}while(!JY_CJ(stu.CJ[0]));
do{ printf("\n\t\t\t請輸入數學成績:"); /*同上*/
scanf("%f",&stu.CJ[1]);
}while(!JY_CJ(stu.CJ[1]));
do{ printf("\n\t\t\t請輸入英語成績:");
scanf("%f",&stu.CJ[2]);
}while(!JY_CJ(stu.CJ[2]));
do{ printf("\n\t\t\t請輸入總評成績:");
scanf("%f",&stu.CJ[3]);
}while(!JY_CJ(stu.CJ[3]));
fwrite(&stu,sizeof(struct stuType),1,fp); /*寫文件*/
}
}
fclose(fp); /*關閉文件*/
}
/*-------------7-------------*/
void Search_Xuehao() /*按學號查詢*/
{ FILE *fp;
int flag;
struct stuType stu,stud;
fp=fopen("stu.dat","rb");
if(fp==NULL) /*若文件打不開則輸出下面的信息*/
{ printf("\t\t\t文件打開失敗!\n\t\t\t按任意鍵返回...");
getch();
return;
}
else
{ do{ puts("\n\t\t\t輸入“#”結束查詢");
do{ printf("\t\t\t請輸入要查詢的學號:");
scanf("%10s",stu.NO);
}while(!JY_NO2(stu.NO));
if(strcmp(stu.NO,"#")==0)break; /*若輸入“#”則結束循環*/
flag=0;
rewind(fp);
while(fread(&stud,sizeof(struct stuType),1,fp)) /*檢查文件指針結束*/
{ if(strcmp(stu.NO,stud.NO)==0) /*比較學號*/
{ puts("\t\t\t該學生成績如下:");
printf("\t\t\t學號:%s\n",stud.NO);
printf("\t\t\t姓名:%s\n",stud.XM);
printf("\t\t\t語文:%.1f\n",stud.CJ[0]);
printf("\t\t\t數學:%.1f\n",stud.CJ[1]);
printf("\t\t\t英語:%.1f\n",stud.CJ[2]);
printf("\t\t\t總評:%.1f\n",stud.CJ[3]);
flag=1; /*記錄學號是否查到*/
}
}
if(flag==0)puts("\t\t\t無此學號!");
}while(strcmp(stu.NO,"#")!=0);
}
fclose(fp); /*關閉文件*/
}
/*-------------8-------------*/
void Search_Xingming() /*按姓名查找*/
{ FILE *fp;
int flag=0;
struct stuType stu,stud;
fp=fopen("stu.dat","rb");
if(fp==NULL)
{ printf("\t\t\t文件打開失敗!\n\t\t\t按任意鍵返回...");
getch();
return;
}
else
{ do{
do{ printf("\t\t\t請輸入要查詢的學生姓名:");
scanf("%10s",stu.XM);
}while(!JY_XM(stu.XM));
rewind(fp); /*文件指針指向頭*/
while(fread(&stud,sizeof(struct stuType),1,fp))
{ if(strcmp(stu.XM,stud.XM)==0) /*比較姓名是否相同*/
{ puts("\t\t\t該學生姓名如下:");
printf("\t\t\t學號:%s\n",stud.NO);
printf("\t\t\t姓名:%s\n",stud.XM);
printf("\t\t\t語文:%.1f\n",stud.CJ[0]);
printf("\t\t\t數學:%.1f\n",stud.CJ[1]);
printf("\t\t\t英語:%.1f\n",stud.CJ[2]);
printf("\t\t\t總評:%.1f\n",stud.CJ[3]);
flag=1; /*記錄姓名是否被查到*/
}
}
if(flag==0)puts("\n\t\t\t無此學生!");
puts("\t\t\t是否繼續(y--繼續,其他返回)?");
}while(getch()=='y');
}
fclose(fp);
/* puts("\t\t\t請按任意鍵繼續...");*/
/* getch();*/
}
/*-------------9-------------*/
int ListFile(void) /*輸出文件,列出所有學生成績*/
{ FILE *fp;
int REC=0; /*記錄學生人數*/
struct stuType stu;
fp=fopen("stu.dat","rb");
if(fp==NULL)
{ printf("\t\t\t文件打開失敗!\n\t\t\t按任意鍵返回...");
getch();
return 1;
}
else{ printf("\t\t\t學生成績如下:\n");
printf("\t\t\t學號\t\t姓名\t語文\t數學\t英語\t總評\n");
rewind(fp);
while(fread(&stu,sizeof(struct stuType),1,fp))
{ /*每讀取一個長度的數據就輸出*/
printf("\t\t\t%s",stu.NO);
printf("\t%s",stu.XM);
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個學生成績,停一下*/
{ printf("\t\t\t請按任意鍵繼續...\n");
getch();
}
}
}
fclose(fp); /*關閉文件*/
printf("\t\t\t請按任意鍵繼續...");
getch();
}
/*-------------10-------------*/
void Statistics() /*統計及格和優秀人數*/
{ FILE *fp;
int REC=0,pass[4]={0},good[4]={0}; /*REC--記錄個數,即人數,pass--及格人數,good--優秀人數*/
float highest[4]={0},score[4]={0}; /*highest--最高分,score--總分*/
struct stuType stu;
fp=fopen("stu.dat","rb");
if(fp==NULL)
{ printf("\t\t\t文件打開失敗!\n\t\t\t按任意鍵返回...");
getch();
return;
}
else { rewind(fp);
while(fread(&stu,sizeof(struct stuType),1,fp))
{ REC++;
score[0]=score[0]+stu.CJ[0]; /*語文*/
if(stu.CJ[0]>=60)pass[0]++;
if(stu.CJ[0]>=80)good[0]++;
if(highest[0]<stu.CJ[0])highest[0]=stu.CJ[0];
score[1]=score[1]+stu.CJ[1]; /*數學*/
if(stu.CJ[1]>=60)pass[1]++;
if(stu.CJ[1]>=80)good[1]++;
if(highest[1]<stu.CJ[1])highest[1]=stu.CJ[1];
score[2]=score[2]+stu.CJ[2]; /*英語*/
if(stu.CJ[2]>=60)pass[2]++;
if(stu.CJ[2]>=80)good[2]++;
if(highest[2]<stu.CJ[2])highest[2]=stu.CJ[2];
score[3]=score[3]+stu.CJ[3]; /*總評*/
if(stu.CJ[3]>=60)pass[3]++;
if(stu.CJ[3]>=80)good[3]++;
if(highest[3]<stu.CJ[3])highest[3]=stu.CJ[3];
}
if(REC==0) /*可以防止記錄為0是REC作除數而造成的錯誤*/
{ printf("\t\t\t未輸入學生記錄!按任意鍵返回...");
getch();
return;
}
else{
printf("\t\t\t\t 語文\t 數學\t 英語\t 總評\n"); /*輸出統計信息*/
printf("\t\t\t平均分: %.1f\t %.1f\t %.1f\t %.1f\n",score[0]/REC,score[1]/REC,score[2]/REC,score[3]/REC);
printf("\t\t\t最高分: %.1f\t %.1f\t %.1f\t %.1f\n",highest[0],highest[1],highest[2],highest[3]);
printf("\t\t\t優秀人數:%d\t %d\t %d\t %d\n",good[0],good[1],good[2],good[3]);
printf("\t\t\t及格人數:%d\t %d\t %d\t %d\n",pass[0],pass[1],pass[2],pass[3]);
}
}
fclose(fp);
printf("\n\t\t\t請按任意鍵繼續...");
getch();
}
/*-------------11-------------*/
void HelpMessage()
{ clrscr();
printf("\n\n\n\n\n 此系統是應老師所布置的作業編制而成,該系統具有存貯學生數據,按學號、姓名查詢,列出學生成績和統計功能。\n \n 使用方法:系統輸入數據后,將在當前目錄中建立一個名為stu.dat文件,用于保存輸入的數據。學號輸入只能用數字輸入,并且學號只能是10位。姓名輸入符合中國人的姓名,只能用中文,且最長為5個漢字。\n 此程序在Turbo C2.0下運行通過\n\n 由于是初學者,水平有限此系統還有許多不夠完整和嚴密性,敬請指正!");
getch();
}
/*-------------12-------------*/
int GetKey(void) /*此函數返回一個按鍵的數值*/
{ int key;
key=bioskey(0); /*bioskey為調用BIOS鍵盤接口*/
if(key<<8) /*位移*/
{
key=key&0x00ff;
}
return key; /*返回按鍵*/
}
/*-------------13-------------*/
void main()
{ int key;
struct date d; /*定義時間結構體*/
getdate(&d); /*讀取系統日期并把它放到結構體d中*/
clrscr(); /*清除屏幕*/
printf("\n\n\n\n\n");
printf("\t\t\t****************************\n"); /*版本信息*/
printf("\t\t\t 學生成績管理系統1.0 \n");
printf("\t\t\t****************************\n");
printf("\t\t\t 制作群: 404+1工作室 \n");
printf("\t\t\t 指導老師:--- \n");
printf("\t\t\t 制作時間:2004年5月 \n");
printf("\t\t\t****************************\n");
printf("\t\t\t請按任意鍵繼續...");
/*while(!kbhit());*/
getch(); /*從鍵盤讀取一個字符,但不顯示于屏幕*/
system("cls"); /*調用DOS的清屏函數,TC中可用clrscr代替*/
while(1) /*主菜單*/
{
printf("\n\n\n\n\n");
printf("\t\t\t************************************\n");
printf("\t\t\t**\tF1 --幫助 **\n");
printf("\t\t\t**\tF2 --輸入數據并存入文件 **\n");
printf("\t\t\t**\tF3 --根據學號查詢成績 **\n");
printf("\t\t\t**\tF4 --根據姓名查詢成績 **\n");
printf("\t\t\t**\tF5 --輸出文件內容 **\n");
printf("\t\t\t**\tF6 --統計及格和優秀人數 **\n");
printf("\t\t\t**\tESC--退出系統 **\n");
printf("\t\t\t************************************\n");
printf("\n\t\t\t請輸入選項\t\t%d年%d月%d日\n\n",d.da_year,d.da_mon,d.da_day); /*提示信息,并顯示當前系統日期*/
key=GetKey(); /*調用自定義函數,讀取一個鍵*/
switch(key)
{
case F1: HelpMessage(); break;
case F2: CreatFile(); break;
case F3: Search_Xuehao(); break;
case F4: Search_Xingming();break;
case F5: ListFile(); break;
case F6: Statistics(); break;
case ESC:exit(1); break;
/*default: puts("\t\t\t輸入錯誤選項!");
printf("\t\t\t按任意鍵返回...");
getch();*/
}
clrscr(); /*每執行完一項功能后,自動清屏*/
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -