?? 課題參考6.txt
字號:
C語言學生管理系統源碼
/*-------------1-------------*/
#i nclude<bios.h>
#i nclude<dos.h> /*頭文件*/
#i nclude<conio.h>
#i nclude<ctype.h>
#i nclude<process.h>
#i nclude<stdlib.h>
#i nclude<stdio.h>
#i nclude<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!='''') /*學號必須是數字,否則返回重新輸入*/
{ NO=(int)*p;
if(NO<48||NO>57)
{ puts("ttt非法學號!請重新輸入!n");
return 0;
}
else p++; /*指針加1*/
}
if(strlen(stu_num)!=10) /*若學號長度不為10,則返回重新輸入*/
{ puts("ttt學號長度不對!n");
return 0;
}
if(getchar()!=''n'') /*若學號后面的字符不是回車符,則學號長度大于10*/
{ printf("ttt學號長度大于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("ttt學號重復,請重新輸入!n");
printf("ttt該學生成績如下:n");
printf("ttt語文:%.1fn",stud.CJ[0]);
printf("ttt數學:%.1fn",stud.CJ[1]);
printf("ttt英語:%.1fn",stud.CJ[2]);
printf("ttt總評:%.1fn",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("ttt學號長度不對!n");
return 0;
}
while(*p!='''') /*學號必須用數字,若包含有字母,或其它字符則返回假值重新輸入*/
{ NO=(int)*p;
if(NO<48||NO>57)
{ puts("ttt非法學號!請重新輸入!n");
return 0;
}
else p++; /*指針加1*/
}
if(getchar()!=''n'') /*檢驗學號長度是否大于10,并把多余的字符去掉*/
{ printf("ttt學號長度大于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!='''') /*姓名只能用中文*/
{
PD=(int)*p;
if(PD>0)
{ puts("ttt姓名只能用中文,請重新輸入!n");
return 0;
}
else p++; /*使指針加1,指向下一漢字*/
}
if(getchar()!=''n'') /*姓名長度不得大于5個*/
{ printf("ttt姓名長度大于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("ttt輸入錯誤,成績只能在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("ttt文件打開失敗!nttt按任意鍵返回...");
getch();
return;
}
else
{ while(1)
{ stu=stu0;
do{ printf("nttt請輸入學號:"); /*輸入學號并檢驗其正確性*/
scanf("%10s",stu.NO);
}while(!JY_NO(stu.NO,fp));
if(strcmp(stu.NO,"#")==0)break;
do{ printf("nttt請輸入姓名:"); /*輸入姓名并檢驗其正確性*/
scanf("%10s",stu.XM);
}while(!JY_XM(stu.XM));
do{ printf("nttt請輸入語文成績:"); /*輸入成績并檢驗其正確性*/
scanf("%f",&stu.CJ[0]);
}while(!JY_CJ(stu.CJ[0]));
do{ printf("nttt請輸入數學成績:"); /*同上*/
scanf("%f",&stu.CJ[1]);
}while(!JY_CJ(stu.CJ[1]));
do{ printf("nttt請輸入英語成績:");
scanf("%f",&stu.CJ[2]);
}while(!JY_CJ(stu.CJ[2]));
do{ printf("nttt請輸入總評成績:");
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("ttt文件打開失敗!nttt按任意鍵返回...");
getch();
return;
}
else
{ do{ puts("nttt輸入“#”結束查詢");
do{ printf("ttt請輸入要查詢的學號:");
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("ttt該學生成績如下:");
printf("ttt學號:%sn",stud.NO);
printf("ttt姓名:%sn",stud.XM);
printf("ttt語文:%.1fn",stud.CJ[0]);
printf("ttt數學:%.1fn",stud.CJ[1]);
printf("ttt英語:%.1fn",stud.CJ[2]);
printf("ttt總評:%.1fn",stud.CJ[3]);
flag=1; /*記錄學號是否查到*/
}
}
if(flag==0)puts("ttt無此學號!");
}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("ttt文件打開失敗!nttt按任意鍵返回...");
getch();
return;
}
else
{ do{
do{ printf("ttt請輸入要查詢的學生姓名:");
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("ttt該學生姓名如下:");
printf("ttt學號:%sn",stud.NO);
printf("ttt姓名:%sn",stud.XM);
printf("ttt語文:%.1fn",stud.CJ[0]);
printf("ttt數學:%.1fn",stud.CJ[1]);
printf("ttt英語:%.1fn",stud.CJ[2]);
printf("ttt總評:%.1fn",stud.CJ[3]);
flag=1; /*記錄姓名是否被查到*/
}
}
if(flag==0)puts("nttt無此學生!");
puts("ttt是否繼續(y--繼續,其他返回)?");
}while(getch()==''y'');
}
fclose(fp);
/* puts("ttt請按任意鍵繼續...");*/
/* getch();*/
}
/*-------------9-------------*/
int ListFile(void) /*輸出文件,列出所有學生成績*/
{ FILE *fp;
int REC=0; /*記錄學生人數*/
struct stuType stu;
fp=fopen("stu.dat","rb");
if(fp==NULL)
{ printf("ttt文件打開失敗!nttt按任意鍵返回...");
getch();
return 1;
}
else{ printf("ttt學生成績如下:n");
printf("ttt學號tt姓名t語文t數學t英語t總評n");
rewind(fp);
while(fread(&stu,sizeof(struct stuType),1,fp))
{ /*每讀取一個長度的數據就輸出*/
printf("ttt%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("ttt請按任意鍵繼續...n");
getch();
}
}
}
fclose(fp); /*關閉文件*/
printf("ttt請按任意鍵繼續...");
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("ttt文件打開失敗!nttt按任意鍵返回...");
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("ttt未輸入學生記錄!按任意鍵返回...");
getch();
return;
}
else{
printf("tttt 語文t 數學t 英語t 總評n"); /*輸出統計信息*/
printf("ttt平均分: %.1ft %.1ft %.1ft %.1fn",score[0]/REC,score[1]/REC,score[2]/REC,score[3]/REC);
printf("ttt最高分: %.1ft %.1ft %.1ft %.1fn",highest[0],highest[1],highest[2],highest[3]);
printf("ttt優秀人數:%dt %dt %dt %dn",good[0],good[1],good[2],good[3]);
printf("ttt及格人數:%dt %dt %dt %dn",pass[0],pass[1],pass[2],pass[3]);
}
}
fclose(fp);
printf("nttt請按任意鍵繼續...");
getch();
}
/*-------------11-------------*/
void HelpMessage()
{ clrscr();
printf("nnnnn 此系統是應老師所布置的作業編制而成,該系統具有存貯學生數據,按學號、姓名查詢,列出學生成績和統計功能。n n 使用方法:系統輸入數據后,將在當前目錄中建立一個名為stu.dat文件,用于保存輸入的數據。學號輸入只能用數字輸入,并且學號只能是10位。姓名輸入符合中國人的姓名,只能用中文,且最長為5個漢字。n 此程序在Turbo C2.0下運行通過nn 由于是初學者,水平有限此系統還有許多不夠完整和嚴密性,敬請指正!");
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("nnnnn");
printf("ttt****************************n"); /*版本信息*/
printf("ttt 學生成績管理系統1.0 n");
printf("ttt****************************n");
printf("ttt 制作群: 404+1工作室 n");
printf("ttt 指導老師:--- n");
printf("ttt 制作時間:2004年5月 n");
printf("ttt****************************n");
printf("ttt請按任意鍵繼續...");
/*while(!kbhit());*/
getch(); /*從鍵盤讀取一個字符,但不顯示于屏幕*/
system("cls"); /*調用DOS的清屏函數,TC中可用clrscr代替*/
while(1) /*主菜單*/
{
printf("nnnnn");
printf("ttt************************************n");
printf("ttt**tF1 --幫助 **n");
printf("ttt**tF2 --輸入數據并存入文件 **n");
printf("ttt**tF3 --根據學號查詢成績 **n");
printf("ttt**tF4 --根據姓名查詢成績 **n");
printf("ttt**tF5 --輸出文件內容 **n");
printf("ttt**tF6 --統計及格和優秀人數 **n");
printf("ttt**tESC--退出系統 **n");
printf("ttt************************************n");
printf("nttt請輸入選項tt%d年%d月%d日nn",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("ttt輸入錯誤選項!");
printf("ttt按任意鍵返回...");
getch();*/
}
clrscr(); /*每執行完一項功能后,自動清屏*/
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -