?? 學籍管理.c
字號:
/*-------------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 /* 查看幫助信息,調(diào)用HelpMassage()函數(shù) */
#define F2 0x3c00 /*輸入學生成績*/
#define F3 0x3d00 /*按學號查找*/
#define F4 0x3e00 /*按姓名查找*/
#define F5 0x3f00 /*列出所有學生成績*/
#define F6 0x4000 /*統(tǒng)計*/
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; /*若輸入"#"返回真值,不再循環(huán)輸入*/
while(*p!='\0') /*學號必須是數(shù)字,否則返回重新輸入*/
{ 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)) /*若文件指針未到結尾,就繼續(xù)執(zhí)行下面的循環(huán),feof遇到文件結束符返回非零值,否則返回0*/
{ fread(&stud,sizeof(struct stuType),1,fp); /*讀取一定長度的數(shù)據(jù)*/
if(strcmp(stu_num,stud.NO)==0) /*學號的唯一性*/
{ printf("\t\t\t學號重復,請重新輸入!\n");
printf("\t\t\t該學生成績?nèi)缦拢篭n");
printf("\t\t\t語文:%.1f\n",stud.CJ[0]);
printf("\t\t\t數(shù)學:%.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!='\0') /*學號必須用數(shù)字,若包含有字母,或其它字符則返回假值重新輸入*/
{ 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!='\0') /*姓名只能用中文*/
{
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+"); /*打開或創(chuàng)建一個二進制文件,打開時將原來的內(nèi)容刪除*/
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請輸入數(shù)學成績:"); /*同上*/
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; /*若輸入“#”則結束循環(huán)*/
flag=0;
rewind(fp);
while(fread(&stud,sizeof(struct stuType),1,fp)) /*檢查文件指針結束*/
{ if(strcmp(stu.NO,stud.NO)==0) /*比較學號*/
{ puts("\t\t\t該學生成績?nèi)缦拢?quot;);
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數(shù)學:%.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數(shù)學:%.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是否繼續(xù)(y--繼續(xù),其他返回)?");
}while(getch()=='y');
}
fclose(fp);
/* puts("\t\t\t請按任意鍵繼續(xù)...");*/
/* getch();*/
}
/*-------------9-------------*/
int ListFile(void) /*輸出文件,列出所有學生成績*/
{ FILE *fp;
int REC=0; /*記錄學生人數(shù)*/
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èi)缦拢篭n");
printf("\t\t\t學號\t\t姓名\t語文\t數(shù)學\t英語\t總評\n");
rewind(fp);
while(fread(&stu,sizeof(struct stuType),1,fp))
{ /*每讀取一個長度的數(shù)據(jù)就輸出*/
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請按任意鍵繼續(xù)...\n");
getch();
}
}
}
fclose(fp); /*關閉文件*/
printf("\t\t\t請按任意鍵繼續(xù)...");
getch();
}
/*-------------10-------------*/
void Statistics() /*統(tǒng)計及格和優(yōu)秀人數(shù)*/
{ FILE *fp;
int REC=0,pass[4]={0},good[4]={0}; /*REC--記錄個數(shù),即人數(shù),pass--及格人數(shù),good--優(yōu)秀人數(shù)*/
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]; /*數(shù)學*/
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作除數(shù)而造成的錯誤*/
{ printf("\t\t\t未輸入學生記錄!按任意鍵返回...");
getch();
return;
}
else{
printf("\t\t\t\t 語文\t 數(shù)學\t 英語\t 總評\n"); /*輸出統(tǒng)計信息*/
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優(yōu)秀人數(shù):%d\t %d\t %d\t %d\n",good[0],good[1],good[2],good[3]);
printf("\t\t\t及格人數(shù):%d\t %d\t %d\t %d\n",pass[0],pass[1],pass[2],pass[3]);
}
}
fclose(fp);
printf("\n\t\t\t請按任意鍵繼續(xù)...");
getch();
}
/*-------------11-------------*/
void HelpMessage()
{ clrscr();
printf("\n\n\n\n\n 此系統(tǒng)是應老師所布置的作業(yè)編制而成,該系統(tǒng)具有存貯學生數(shù)據(jù),按學號、姓名查詢,列出學生成績和統(tǒng)計功能。\n \n 使用方法:系統(tǒng)輸入數(shù)據(jù)后,將在當前目錄中建立一個名為stu.dat文件,用于保存輸入的數(shù)據(jù)。學號輸入只能用數(shù)字輸入,并且學號只能是10位。姓名輸入符合中國人的姓名,只能用中文,且最長為5個漢字。\n 此程序在Turbo C2.0下運行通過\n\n 由于是初學者,水平有限此系統(tǒng)還有許多不夠完整和嚴密性,敬請指正!");
getch();
}
/*-------------12-------------*/
int GetKey(void) /*此函數(shù)返回一個按鍵的數(shù)值*/
{ int key;
key=bioskey(0); /*bioskey為調(diào)用BIOS鍵盤接口*/
if(key<<8) /*位移*/
{
key=key&0x00ff;
}
return key; /*返回按鍵*/
}
/*-------------13-------------*/
void main()
{ int key;
struct date d; /*定義時間結構體*/
getdate(&d); /*讀取系統(tǒng)日期并把它放到結構體d中*/
clrscr(); /*清除屏幕*/
printf("\n\n\n\n\n");
printf("\t\t\t****************************\n"); /*版本信息*/
printf("\t\t\t 學生成績管理系統(tǒng)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請按任意鍵繼續(xù)...");
/*while(!kbhit());*/
getch(); /*從鍵盤讀取一個字符,但不顯示于屏幕*/
system("cls"); /*調(diào)用DOS的清屏函數(shù),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 --輸入數(shù)據(jù)并存入文件 **\n");
printf("\t\t\t**\tF3 --根據(jù)學號查詢成績 **\n");
printf("\t\t\t**\tF4 --根據(jù)姓名查詢成績 **\n");
printf("\t\t\t**\tF5 --輸出文件內(nèi)容 **\n");
printf("\t\t\t**\tF6 --統(tǒng)計及格和優(yōu)秀人數(shù) **\n");
printf("\t\t\t**\tESC--退出系統(tǒng) **\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); /*提示信息,并顯示當前系統(tǒng)日期*/
key=GetKey(); /*調(diào)用自定義函數(shù),讀取一個鍵*/
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(); /*每執(zhí)行完一項功能后,自動清屏*/
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -