只能在TC下运行.....
项目要求:
1. 题目:学生信息管理系统
2. 程序要求:
(1)学生信息录入功能
l 用户键盘输入每个学生的信息:学号、姓名、性别、数学、英语、政治、语文四门课成绩。
l 可插入一个或多个学生信息到当前编辑的班级数据中。
(2)文件保存功能
l 学生信息每一班存为一个数据文件,数据文件可在程序中打开、编辑和重新保存;
l 用户输入学生信息可随时保存数据文件。
(3)文件打开功能
l 序只能对当前打开的数据文件进行编辑。
(4)查询功能
l 浏览所有学生信息
l 按学号查询学生信息
l 按姓名查询学生信息
l 查询一个班总成绩和平均成绩
l 查询一个班某一门课总成绩和平均成绩
l 查询某一门课分数段(<60,60-69,70-79,80-89,>90)学生数。
(5)报表输出功能
l 按学号输出一个班学生信息:学号、姓名、性别、数学、英语、政治、语文成绩、总成绩,到屏幕和文件。
l 按总成绩输出从高到低输出学号、姓名信息。
注:以上功能以菜单形式供用户使用,有一定的容错功能。
3. 开发语言环境:Microsoft VC++6.0 或Turbo C2.0
4.数据结构:数组或链表
5. 程序源代码要求:
(1)函数名、变量名采用英文缩写;
(2)源代码的书写采用递进格式;
(3)程序行和程序段须有注释。
菜单功能详解……
1.增加班级 :输入班级名回车即可,如果班级已存在则提示是否覆盖。创建后选择班级。
2.选择班级 :进入系统首先要选择班级后才能进行操作,否则自动列出班级提示进行选择班级并列出已在在班级
3.信息保存:操作过程中可随时选择对操作班级数据进行保存(写入文件)
4.信息输入:提示输入学生的学号,性别,各科成绩。且限制输入内容,如成绩不能大于100,小于0,不能输入字符。性别只能是man/woman……
5.信息更改:输入学号ID,查找该ID学生信息,选择更改该ID号学生信息的各项内容。
6.信息删除:根据ID或名字进行删除学生信息……
7.信息查寻:根据 ID 或 名字 或 分数 进行查寻。ID:可单个或范围进行查寻。分数:可精确到各科成绩、平均分,总分 进行单个或范围查寻。名字输入名字直接进行查寻
8.报表输出:可根据信息录入时间 或 ID 或 各项分数 进行从大到小 或 从小到大列表输出学生信息
9.删除班级:删除班级数据文件
0.退出系统
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<dos.h>
#include<alloc.h>
#include<dir.h>
#define X0 10
#define scanf fflush(stdin);scanf
int change=0;
char FileName[MAXPATH];
char NewPath[MAXPATH];
char OldPath[MAXPATH];
char *str[9]={"ID","name","sex","math","english","politics","chinese","total","average"};
typedef struct NODE
{
long int ID;
char name[20];
char sex[6];
float math;
float english;
float politics;
float chinese;
float total;
float average;
struct NODE *next;
}ListNode;
typedef ListNode *LinkList;
LinkList p=NULL;
int IsYes() /* 是否按下了Y,或按下N */
{
char ch;
do
{
ch=getch();
}while(ch!='y'&&ch!='Y'&&ch!='n'&&ch!='N');
if(ch=='y'||ch=='Y')
return 1;
else
return 0;
}
int Select(int x,int y) /* 选择x~y的数,否则提示重新输入 */
{
int i;
printf("\n\nyour choice:");
scanf("%d",&i);
while(i>y||i<x)
{
printf("\nplease enter(%d~%d):",x,y);
scanf("%d",&i);
}
return i;
}
void outtextxy(int x, int y,char *str) /* 在屏幕x,y位置输出str字符串 */
{
union REGS regs;
regs.h.ah = 2;
regs.h.bh = 0;
regs.h.dh = y;
regs.h.dl = x;
int86(0x10, ®s, ®s);
printf(str);
}
void ShowInfo(LinkList q,int j) /* 显示信息 */
{
int i;
for(i=0;i<9;i++)
{
switch(i)
{
case 0:outtextxy(i*9+1,j,"");printf("%-ld",q->ID);break;
case 1:outtextxy(i*9+1,j,"");printf("%-8s",q->name);break;
case 2:outtextxy(i*9+1,j,"");printf("%-8s",q->sex);break;
case 3:outtextxy(i*9+1,j,"");printf("%-8g",q->math);break;
case 4:outtextxy(i*9+1,j,"");printf("%-8g",q->english);break;
case 5:outtextxy(i*9+1,j,"");printf("%-8g",q->politics);break;
case 6:outtextxy(i*9+1,j,"");printf("%-8g",q->chinese);break;
case 7:outtextxy(i*9+1,j,"");printf("%-8g",q->total);break;
case 8:outtextxy(i*9+1,j,"");printf("%-8g",q->average);break;
default:break;
}
}
}
LinkList NumSort(int k,char *item) /* 信息排序 */
{
LinkList q,r,s,t,u,w;
int i;
int j=0;
for(i=0;i<9;i++)
if(!strcmp(item,str[i]))
break;
if(!(i==0||i==3||i==4||i==5||i==6||i==7||i==8)||(k!=1&&k!=2))
{
clrscr();
printf("Parameter passing incorrect.");
getch();
exit(0);
}
u=(LinkList)malloc(sizeof(ListNode));
for(q=p,r=s=NULL;q!=NULL;q=q->next)
{
w=(LinkList)malloc(sizeof(ListNode));
w->next=NULL;
if(p==q)
{
s=w;
*s=*p;
s->next=NULL;
u->next=s;
}
else
{
for(r=s,t=u;r!=NULL;r=r->next,t=t->next)
{
switch(i)
{
case 0:j=k==1?(r->ID>=q->ID):(r->ID<=q->ID);break;
case 3:j=k==1?(r->math>=q->math):(r->math<=q->math);break;
case 4:j=k==1?(r->english>=q->english):(r->english<=q->english);break;
case 5:j=k==1?(r->politics>=q->politics):(r->politics<=q->politics);break;
case 6:j=k==1?(r->chinese>=q->chinese):(r->chinese<=q->chinese);break;
case 7:j=k==1?(r->total>=q->total):(r->total<=q->total);break;
case 8:j=k==1?(r->average>=q->average):(r->average<=q->average);break;
default:break;
}
if(k==1&&j)
{
*w=*q;
w->next=r;
t->next=w;
s=u->next;
break;
}
else if(k==2&&j)
{
*w=*q;
w->next=r;
t->next=w;
s=u->next;
break;
}
}
if(!j)
{
*w=*q;
t->next=w;
w->next=NULL;
}
}
}
free(u);
return s;
}
void ShowSort(char *item) /* 选择排序方式及显示排序 */
{
LinkList s,q;
int i,j;
while(1)
{
clrscr();
printf("1.small to large 2.large to small 0.back");
i=Select(0,2);
if(i==0)
break;
s=NumSort(i,item);
clrscr();
for(i=0,j=0;i<9;i++)
outtextxy(i*9+1,j,str[i]);
while(s!=NULL)
{
ShowInfo(s,++j);
q=s;
s=s->next;
free(q);
}
getch();
}
}
int ClassAdd() /* 文件创建 */
{
FILE *fp;
LinkList q;
int k=1;
clrscr();
printf("class name:");
scanf("%s",FileName);
strcpy(NewPath,OldPath);
strcat(NewPath,FileName);
if((fp=fopen(NewPath,"rb"))!=NULL)
{
clrscr();
printf("class already exit!\n\noverwrite it(Y/N)");
if(!IsYes())
k=0;
}
if(k)
{
if((fp=fopen(NewPath,"wb"))==NULL)
{
clrscr();
printf("fail add!\n\npress any key continue...");
getch();
return 0;
}
fclose(fp);
clrscr();
printf("add success!\n\npress any key continue...");
getch();
return 1;
}
return 0;
}
int ClassSelect(int OpenDirectly) /* 文件打开 */
{
FILE *fp;
int i=1,j;
long end;
LinkList q;
clrscr();
if(!OpenDirectly)
{
printf("Exist Class:\n\n");
strcpy(NewPath,"dir ");
strcat(NewPath,OldPath);
NewPath[strlen(NewPath)-1]=0;
strcat(NewPath," /o/p/w/b/a:-d");
system(NewPath);
printf("\n\nselect class name:");
scanf("%s",FileName);
}
strcpy(NewPath,OldPath);
strcat(NewPath,FileName);
if((fp=fopen(NewPath,"rb"))==NULL)
{
clrscr();
printf("\nfail select!\n\npress any key continue...");
getch();
return 0;
}
fseek(fp,0L,SEEK_END);
end=ftell(fp);
rewind(fp);
while(!feof(fp)&&(end-ftell(fp))>=sizeof(ListNode))
{
if(i)
{
p=q=(LinkList)malloc(sizeof(ListNode));
p->next=NULL;
i=0;
}
else
{
q->next=(LinkList)malloc(sizeof(ListNode));
q=q->next;
q->next=NULL;
}
fread(q,sizeof(ListNode),1,fp);
if(q==p)
{
if(q->ID<0||q->ID>0x7fffffff||19<strlen(q->name)||strcmp(q->sex,"man")&&strcmp(q->sex,"woman")||q->math>100||q->math<0||q->english>100||q->english<0||q->politics>100||q->politics<0||q->chinese>100||q->chinese<0)
{
clrscr();
printf("illegal data file!\n\npress any key continue...");
getch();
free(q);
p=NULL;
return 0;
}
}
}
clrscr();
if(!OpenDirectly)
{
printf("select success!\n\npress any key continue...");
getch();
}
fclose(fp);
return 1;
}
void ClassSave() /* 文件保存 */
{
FILE *fp;
LinkList q;
clrscr();
strcpy(NewPath,OldPath);
strcat(NewPath,FileName);
if((fp=fopen(NewPath,"wb"))==NULL)
{
printf("fail save!\n\npress any key continue...");
getch();
return;
}
rewind(fp);
while(p!=NULL)
{
fwrite(p,sizeof(ListNode),1,fp);
q=p;
p=p->next;
free(q);
}
change=0;
fclose(fp);
printf("save success!\n\npress any key continue...");
getch();
}
int IsSave() /* 判断有没有保存,是否保存*/
{
LinkList q;
clrscr();
if(change==1)
{
printf("a file opened.save it?(Y/N)");
if(IsYes())
{
ClassSave();
return 1;
}
return 0;
}
else
while(p!=NULL)
{
q=p;
p=p->next;
free(q);
}
return 0;
}
float NumLess100(char *buf) /* 判断输入的数是否是:大于0小于100且最多一位小数的浮点数*/
{
int i,j,l,k;
char str[30];
while(1)
{
scanf("%s",str);
k=0;
l=strlen(str);
j=l>4?0:1;
if(j)
{
for(i=0;i<l;i++)
{
if(str[i]!='.'&&(str[i]<48||str[i]>57))
j=0;
if(str[i]=='.')
k++;
if(k>1)
j=0;
}
}
if(j)
if(100<atof(str)||0>atof(str))
j=0;
if(j)
break;
printf("\nplease enter num(<=100 and no more than 1 fraction).\n");
printf(buf);
}
return atof(str);
}
void Input(int k,LinkList q) /* 信息输入及判断输入是否正确 */
{
int i,j,l;
char str[30];
switch(k)
{
case 0:
printf("\nID :");
while(1)
{
scanf("%s",str);
l=strlen(str);
j=l>10?0:1;
if(j)
for(i=0;i<l;i++)
if(str[i]<48||str[i]>57)
j=0;
if(j)
{
LinkList r=p;
while(r!=NULL&&p->ID!=-1)
{
if(r->ID==atol(str))
break;
r=r->next;
}
if(r!=NULL&&p->ID!=-1)
{
printf("\nID Exist!\n");
j=0;
}
}
if(j)
break;
printf("\nplease enter less than 10 num.\n\nID :");
}
q->ID=atol(str);
break;
case 1:
while(1)
{
printf("\nname :");
scanf("%s",str);
if(strlen(str)<19)
break;
printf("\n please enter name less than 20 character.\n");
}
strcpy(q->name,str);
break;
case 2:
printf("\nsex :");
while(1)
{
scanf("%s",q->sex);
if(!(strcmp(q->sex,"man")&&strcmp(q->sex,"woman")))
break;
printf("\nplease enter(man/woman).\n\nsex :");
}
break;
case 3:printf("\nmath :");q->math=NumLess100("\nmath :");break;
case 4:printf("\nenglish :");q->english=NumLess100("\nenglish :");break;
case 5:printf("\npolitics :");q->politics=NumLess100("\npolitics :");break;
case 6:printf("\nchinese :");q->chinese=NumLess100("\nchinese :");break;
case 7:q->total=q->math+q->english+q->politics+q->chinese;break;
case 8:q->average=q->total/4;break;
}
}
void InfoInput() /*信息录入 */
{
LinkList q,r,s;
int i;
char ch;
while(1)
{
q=p;
clrscr();
outtextxy(20,1,"Please enter student information.");
if(q!=NULL)
{
while(q->next!=NULL)
q=q->next;
q->next=(LinkList)malloc(sizeof(ListNode));
q=q->next;
q->next=NULL;
}
else
{
p=q=(LinkList)malloc(sizeof(ListNode));
p->next=NULL;
}
q->ID=-1;
for(i=0;i<9;i++)
{
Input(i,q);
change=1;
}
clrscr();
printf("Continue?(Y/N)");
if(!IsYes())
break;
}
}
void InfoSearch() /* 信息查询 */
{
LinkList q;
char buf[30];
int i,j;
unsigned long id;
float score;
while(1)
{
clrscr();
printf("search by: 1.ID 2.name 3.Score 0.back");
i=Select(0,3);
if(i==0)
break;
switch(i)
{
case 1:
while(1)
{
q=p;
clrscr();
printf("1.search one 2.search by rang 0.back");
i=Select(0,2);
if(i==0)
break;
else if(i==1)
{
printf("\nenter the ID:");
scanf("%ld",&id);
clrscr();
for(i=0,j=0;i<9;i++)
outtextxy(i*9+1,j,str[i]);
while(q!=NULL)
{
if(q->ID==id)
ShowInfo(q,++j);
q=q->next;
}
if(j==0)
printf("\ndidn't find!");
}
else if(i==2)
{
unsigned long x,y;
q=p;
printf("\nenter the range(like:10 32):");
while(1)
{
scanf("%ld%ld",&x,&y); ;
if(x<=y)
break;
printf("the later must be great.enter again:");
}
clrscr();
for(i=0,j=0;i<9;i++)
outtextxy(i*9+1,j,str[i]);
while(q!=NULL)
{
if(q->ID>=x&&q->ID<=y)
ShowInfo(q,++j);
q=q->next;
}
if(j==0)
printf("\ndidn't find!\n");
}
printf("\nContinue searching by ID...(Y/N)?");
if(!IsYes())
break;
}
break;
case 2:
while(1)
{
q=p;
clrscr();
printf("enter the name:");
scanf("%s",buf);
clrscr();
for(i=0,j=0;i<9;i++)
outtextxy(i*9+1,j,str[i]);
while(q!=NULL)
{
if(!strcmp(q->name,buf))
ShowInfo(q,++j);
q=q->next;
}
if(j==0)
printf("\ndidn't find!\n");
printf("\nContinue searching by name...(Y/N)?");
if(!IsYes())
break;
}
break;
case 3:
while(1)
{
int k;
float x,y;
q=p;
clrscr();
printf("1.math 2.english 3.politics 4.chinese 5.total 6.average 0.back");
k=Select(0,6);
if(k==0)
break;
k+=2;
printf("\nenter Score rangs(like 60 90):");
while(1)
{
scanf("%g%g",&x,&y); ;
if(x<=y)
break;
printf("\nthe later must be great.enter again:");
}
clrscr();
for(i=0,j=0;i<9;i++)
outtextxy(i*9+1,j,str[i]);
while(q!=NULL)
{
switch(k)
{
case 3:
if(q->math>=x&&q->math<=y)
ShowInfo(q,++j);
break;
case 4:
if(q->english>=x&&q->english<=y)
ShowInfo(q,++j);
break;
case 5:
if(q->politics>=x&&q->politics<=y)
ShowInfo(q,++j);
break;
case 6:
if(q->chinese>=x&&q->chinese<=y)
ShowInfo(q,++j);
break;
case 7:
if(q->total>=x&&q->total<=y)
ShowInfo(q,++j);
break;
case 8:
if(q->average>=x&&q->average<=y)
ShowInfo(q,++j);
break;
default:
break;
}
q=q->next;
}
if(j==0)
printf("\ndidn't find!\n");
printf("\nContinue searching by score...(Y/N)?");
if(!IsYes())
break;
}
break;
default:break;
}
}
}
void InfoModify() /* 信息更改 */
{
LinkList q;
int id,i,j;
char ch;
char item[30];
float x;
while(1)
{
clrscr();
outtextxy(0,0,"Please enter the ID to Modify:");
scanf("%ld",&id);
q=p;
while(q!=NULL)
{
if(q->ID==id)
break;
q=q->next;
}
if(q!=NULL&&q->ID==id)
{
clrscr();
for(i=0,j=0;i<9;i++)
outtextxy(i*9+1,j,str[i]);
ShowInfo(q,++j);
while(1)
{
printf("\n\nenter item(like ID):");
do
{
scanf("%s",item);
for(i=0;i<7;i++)
if(!strcmp(item,str[i]))
break;
if(i==7)
printf("\nItem not exit!enter again:");
}while(i>6);
Input(i,q);
if(i>2&&i<7)
{
q->total=q->math+q->english+q->politics+q->chinese;
q->average=q->total/4;
}
change=1;
printf("\nContinue modify the same item?(Y/N)");
if(!IsYes())
break;
}
}
clrscr();
if(q==NULL)
printf("The ID you enter not exit!\n\n");
printf("Continue modify others?(Y/N)");
if(!IsYes())
break;
}
}
void InfoDelete() /* 信息删除 */
{
LinkList q,r;
int i,j;
while(1)
{
clrscr();
printf("delete by: 1.ID 2.name 0.back");
i=Select(0,2);
if(i==0)
break;
else if(i==1)
{
while(1)
{
unsigned long int id;
q=r=p;
clrscr();
printf("\n\nenter delete ID:");
scanf("%ld",&id);
while(q!=NULL)
{
if(q->ID==id)
break;
r=q;
q=q->next;
}
clrscr();
for(i=0,j=0;i<9;i++)
outtextxy(i*9+1,j,str[i]);
if(q!=NULL)
{
ShowInfo(q,++j);
printf("\n\ndelete?(Y/N)");
if(IsYes())
{
if(r->ID==id)
{
if(r->next==NULL)
{
free(q);
r=p=q=NULL;
}
else
{
p=p->next;
free(q);
q=r=p;
}
}
else
{
r->next=q->next;
free(q);
}
printf("\n\ndeleted!");
change=1;
}
}
else
printf("\n\nnot exit!");
printf("\n\ndelete by ID continue?(Y/N)");
if(!IsYes())
break;
}
}
else if(i==2)
{
while(1)
{
char buf[30];
int k=0;
q=r=p;
clrscr();
printf("\n\nenter delete name:");
scanf("%s",&buf);
while(q!=NULL)
{
if(!strcmp(q->name,buf))
{
clrscr();
k++;
if(k>1)
{
printf("\n\ncontine to delete name(%s)?(Y/N)",buf);
if(!IsYes())
break;
}
clrscr();
for(i=0,j=0;i<9;i++)
outtextxy(i*9+1,j,str[i]);
ShowInfo(q,++j);
printf("\n\ndelete?(Y/N)");
if(IsYes())
{
if(!strcmp(r->name,buf))
{
if(p->next==NULL)
{
free(p);
r=p=q=NULL;
}
else
{
p=p->next;
free(q);
q=p;
}
}
else
{
r->next=q->next;
free(q);
q=r;
}
change=1;
printf("\n\ndeleted... ");
}
}
r=q;
q=q->next;
}
if(j!=0&&k<=1)
{
clrscr();
for(i=0,j=0;i<9;i++)
outtextxy(i*9+1,j,str[i]);
printf("\n\ndidn't find.");
}
printf("\n\ncontine delete by name?(Y/N)");
if(!IsYes())
break;
}
}
}
}
void ReportOutput() /* 报表输出 */
{
LinkList q,s;
int i,j,k=0;
while(1)
{
clrscr();
printf("sort by: 1.time 2.ID 3.score 0.back");
i=Select(0,3);
switch(i)
{
case 1:
clrscr();
q=p;
for(i=0,j=0;i<9;i++)
outtextxy(i*9+1,j,str[i]);
while(q!=NULL)
{
ShowInfo(q,++j);
q=q->next;
}
getch();
break;
case 2:
ShowSort("ID");
break;
case 3:
while(1)
{
clrscr();
printf("sort by: 1. math 2.english 3.politics 4.chinese 5.total 6.average 0.back");
i=Select(0,6);
if(i==0)
break;
switch(i)
{
case 1:ShowSort("math");break;
case 2:ShowSort("english");break;
case 3:ShowSort("politics");break;
case 4:ShowSort("chinese");break;
case 5:ShowSort("total");break;
case 6:ShowSort("average");break;
default:break;
}
}
break;
case 0:
k=1;
break;
default:clrscr();printf("error!");getch();break;
}
if(k)
break;
}
}
void ClassDelete() /* 班级文件删除 */
{
clrscr();
printf("Exist Class:\n\n");
strcpy(NewPath,"dir ");
strcat(NewPath,OldPath);
NewPath[strlen(NewPath)-1]=0;
strcat(NewPath," /b/o/p/w/a:-d");
system(NewPath);
printf("\n\nselect class name:");
scanf("%s",FileName);
strcpy(NewPath,"del /p ");
strcat(NewPath,OldPath);
strcat(NewPath,FileName);
system(NewPath);
getch();
}
void AuthorInfo() /* 作者信息 */
{
int i;
char *str[8]={"System Name:","Student management system",
"Author :","zhaopeng",
"Student ID :","200900008071",
"Class :","0902"};
clrscr();
for(i=0;i<4;i++)
{
outtextxy(20,i*2+4,str[i*2]);
outtextxy(40,i*2+4,str[i*2+1]);
}
printf("\n\n\n\t\t Press any key to continue...");
getch();
}
int TF(int IsSelect,void(*visit)(void)) /* 一个函数调用的模型,用于减少代码量 */
{
if(IsSelect)
visit();
else
{
IsSelect=ClassSelect(0);
if(IsSelect==1)
visit();
}
return IsSelect;
}
void StudentSystem() /* 学生管理系统开始菜单 */
{
int i;
int IsSelect=0;
int choice;
char *str[10]={"1.Class Add",
"2.Class Select",
"3.Information Save",
"4.Information Input",
"5.Information Modify",
"6.Information Delete",
"7.Information Search",
"8.Report Output",
"9.Class Delete",
"0.Exit The System"};
mkdir("classdata");
getcwd(OldPath,MAXPATH);
if(OldPath[strlen(OldPath)-1]=='\\')
strcat(OldPath,"classdata\\");
else
strcat(OldPath,"\\classdata\\");
while(1)
{
clrscr();
printf("\n -----------------welcome to student management system-----------------");
for(i=0;i<10;i++)
outtextxy(30,i*2+3,str[i]);
printf("\n\n\t\t Please input your choice");
if(IsSelect)
printf("(class selected):");
else
printf("(class unselect):");
choice=23;
scanf("%d",&choice);
clrscr();
switch(choice)
{
case 1:
if(IsSelect)
IsSave();
IsSelect=0;
ClassAdd();
IsSelect=ClassSelect(1);
break;
case 2:
if(IsSelect)
IsSave();
IsSelect=0;
IsSelect=ClassSelect(0);
break;
case 3:
if(IsSelect)
{
ClassSave();
IsSelect=ClassSelect(1);
}
else
{
printf("no class select!\n\npress any key continue...");
getch();
}
break;
case 4:IsSelect=TF(IsSelect,InfoInput);break;
case 5:IsSelect=TF(IsSelect,InfoModify);break;
case 6:IsSelect=TF(IsSelect,InfoDelete);break;
case 7:IsSelect=TF(IsSelect,InfoSearch);break;
case 8:IsSelect=TF(IsSelect,ReportOutput);break;
case 9:if(IsSelect){IsSave();IsSelect=0;}ClassDelete();break;
default:
break;
}
if(choice==0)
break;
}
if(change)
IsSave();
}
void main()
{
AuthorInfo();
StudentSystem();
}