#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define M 100
struct student {
int num;
char name[10];
char sex;
int age;
int major;
int cla;
float chinese;
float math;
float english;
float ave;
};
int OpenData(struct student **p)
{
FILE *fp;
int n=0;
fp=fopen("student.dat", "rb" );
if(!fp) return 0;
fseek(fp,0,SEEK_END);
n=ftell(fp)/sizeof(struct student);
fseek(fp,0,SEEK_SET);
*p=(struct student *)malloc(n*sizeof(struct student));
if(*p==NULL) return 0;
fread(*p,sizeof(struct student),n,fp);
fclose(fp);
return n;
}
int SaveData(struct student *p,int n)
{
FILE *fp;
fp=fopen("student.dat", "wb+" );
if(!fp) return 0;
fwrite(p,sizeof(struct student),n,fp);
fclose(fp);
return 1;
}
int Menu(int n,char *ti,char p[][13])
{
int i,ii;
lm:
system("cls");
printf("\t%s\n",ti);
printf("------------------------------\n");
for(i=0;i<n;i++)
printf("\t%d %s\n",i+1,p[i]);
printf("\t0 退出选择\n");
printf("------------------------------\n");
printf("\t您的选择是(0~%d):",n);
scanf("%d",&ii);
if(ii<0||ii>n) {
printf("输入有错,请重新输入!\n");
system("pause");
goto lm;
}
return ii;
}
int SelCode(int m)
{
int i;
if(m==0) return -1;
else if(m==1) {
printf("\n请输入专业代码:");
scanf("%d",&m);
}
else if(m==2) {
printf("\n请输入班级代码:");
scanf("%d",&m);
}
return m;
}
void GetCode(char *s)
{
char ch;
int i;
for(i=0;(ch=getch())!=13;) {
if(ch==8) {
printf("\b");
putchar(' ');
printf("\b");
if(i>0) i--;
}
else {
s[i]=ch;
printf("*");
i++;
}
}
s[i]='\0';
}
int Identity()
{
FILE *fp;
char p[20],c[20],ch;
int i,n;
fp=fopen("password.txt", "r");
fgets(p,20,fp);
fclose(fp);
printf("请输入密码:");
for(n=0;n<3;n++) {
GetCode(c);
if(strcmp(c,p)==0) {
system("cls");
printf("\n登录成功!\n");
system("pause");
break;
}
else {
system("cls");
printf("\n密码错误!\n请重新输入\n");
}
}
return(n);
}
void Alter()
{
FILE *fp;
char p[20],c[20],ch;
int i;
fp=fopen("password.txt", "r");
fgets(p,20,fp);
fclose(fp);
printf("请输入原密码\n");
GetCode(c);
if(strcmp(c,p)!=0) {
printf("\n密码错误!");
return;
}
printf("\n请输入新密码:\n");
GetCode(c);
printf("\n确认新密码:\n");
GetCode(p);
if(strcmp(c,p)==0) {
fp=fopen("password.txt", "w");
fputs(p,fp);
fclose(fp);
printf("\n修改成功!");
}
}
void Print(struct student *p,int n)
{
int i;
printf("\n%6s%10s%6s%6s%6s%6s%7s%7s%7s%7s\n","编号","姓名","性别","年龄","专业","班级","语文","数学","英语","平均");
for(i=0;i<n;i++)
printf("%6d%10s%6c%6d%6d%6d%7.1f%7.1f%7.1f%7.1f\n",p[i].num,p[i].name,p[i].sex,p[i].age,p[i].major,p[i].cla,p[i].chinese,p[i].math,p[i].english,p[i].ave);
}
void PrintNumber(struct student *p,int n,int k)
{
int i;
if(k<1&&k>n) {
printf("\n序号有错!");
return;
}
printf("\n%6s%10s%6s%6s%6s%6s%7s%7s%7s%7s\n","编号","姓名","性别","年龄","专业","班级","语文","数学","英语","平均");
printf("%6d%10s%6c%6d%6d%6d%7.1f%7.1f%7.1f%7.1f\n",p[k].num,p[k].name,p[k].sex,p[k].age,p[k].major,p[k].cla,p[k].chinese,p[k].math,p[k].english,p[k].ave);
}
void InputData(struct student *p,int i)
{
if(i==0) printf("\n请输入学生信息!\n");
else printf("\n请输入学生%d的信息\n",i);
printf("学号:");
scanf("%d",&(p->num));
printf("姓名:");
scanf("%s",p->name);
printf("性别:");
fflush(stdin);
scanf("%c",&(p->sex));
printf("年龄:");
scanf("%d",&(p->age));
printf("专业:");
fflush(stdin);
scanf("%d",&(p->major));
printf("班级:");
scanf("%d",&(p->cla));
printf("中文:");
scanf("%f",&(p->chinese));
printf("数学:");
scanf("%f",&(p->math));
printf("英语:");
scanf("%f",&(p->english));
p->ave=(p->chinese+p->math+p->english)/3;
}
int CreateClass(struct student **p)
{
int i,m;
ll: printf("\n请输入班级人数:");
scanf("%d",&m);
if(m<1||m>M) {
printf("\n数据有错!请重新输入\n");
goto ll;
}
*p=(struct student *)malloc(m*sizeof(struct student));
if(!p) return 0;
printf("\n学生信息登入!");
for(i=0;i<m;i++) {
InputData(*p+i,i+1);
}
return m;
}
struct student *AddScore(struct student *p,int n)
{
int i;
struct student *q;
q=(struct student *)malloc((n+1)*sizeof(struct student));
if(!q) return NULL;
for(i=0;i<n;i++) q[i]=p[i];
InputData(q+n,0);
free(p);
Print(q,n+1);
return q;
}
struct student *InsertScore(struct student *p,int n,int k)
{
int i;
struct student *q;
q=(struct student *)malloc((n+1)*sizeof(struct student));
if(!q) return NULL;
for(i=0;i<n;i++) q[i]=p[i];
free(p);
for(i=n-1;i>=k-1;i--) q[i+1]=q[i];
InputData(q+k-1,0);
Print(q,n+1);
return q;
}
struct student *DeleteScore(struct student *p,int n,int k)
{
int i=0,j=0;
struct student *q;
while(p[j].num!=k&&j<n) j++;
if(j>=n) return NULL;
for(i=j;i<n-1;i++) p[i]=p[i+1];
q=(struct student *)malloc((n-1)*sizeof(struct student));
if(!q) return NULL;
for(i=0;i<n-1;i++) q[i]=p[i];
free(p);
return q;
}
void UpdateScore(struct student *p,int n,int k)
{
int i=0;
while(p[i].num!=k&&i<n) i++;
if(i>=n) return;
printf("\n输入新的成绩!\n");
InputData(&p[i],0);
}
/*
k: 专业、班级,全部
m: 最高、最低、平均
f: 数学、英语、文学、平均、学号
c: 学号
d: 专业或班级代码
*/
int Score(struct student *p,int n,int k,int m,int f,int c,int d)
{
int i=0,j=0,cc=0,dd=0;
float mc,me,mm,ma;
float xc,xe,xm,xa;
float sc,se,sm,sa;
if(f==5) {
while(j<n)
if((k==1&&p[j].major==d||k==2&&p[j].cla==d||k==3)&&p[j].num==c) break;
else j++;
if(j>=n) printf("\n学号有错!");
else PrintNumber(p,n,j);
return 0;
}
while(i<n)
if(k==1&&p[i].major==d||k==2&&p[i].cla==d||k==3) break;
else i++;
if(i>=n) {
printf("\n查找失败!\n");
return 0;
}
sm=se=sc=sa=0;
xa=ma=p[i].ave;
xe=me=p[i].english;
xc=mc=p[i].chinese;
xm=mm=p[i].math;
while(++i<n){
if(k==1&&p[i].major==d||k==2&&p[i].cla==d||k==3){
if(p[i].chinese>mc) mc=p[i].chinese;
if(p[i].math>mm) mm=p[i].math;
if(p[i].english>me) me=p[i].english;
if(p[i].ave>ma) ma=p[i].ave;
if(p[i].chinese<xc) xc=p[i].chinese;
if(p[i].math<xm) xm=p[i].math;
if(p[i].english<xe) xe=p[i].english;
if(p[i].ave<xa) xa=p[i].ave;
sm=sm+p[i].math;
sc=sc+p[i].chinese;
se=se+p[i].english;
sa=sa+p[i].ave;
cc++;
}
}
sa=sa/cc;
sc=sc/cc;
sm=sm/cc;
se=se/cc;
if(m==1&&f==1)return mc;
else if(m==1&&f==2) return mm;
else if(m==1&&f==3) return me;
else if(m==1&&f==4) return ma;
else if(m==2&&f==1) return xc;
else if(m==2&&f==2) return xm;
else if(m==2&&f==3) return xe;
else if(m==2&&f==4) return xa;
else if(m==3&&f==1) return sc;
else if(m==3&&f==2) return sm;
else if(m==3&&f==3) return se;
else if(m==3&&f==4) return sa;
else return 0;
}
void Sort(struct student *p,int n,int k,int d,int f)
{
int i,j,m=0;
struct student *q,t;
q=(struct student *)malloc(n*sizeof(struct student));
if(!q) return;
for(i=0;i<n;i++)
if(k==1&&p[i].major==d||k==2&&p[i].cla==d||k==3) q[m++]=p[i];
for(i=0;i<m;i++) {
for(j=0;j<m-i-1;j++){
if(f==5) {
if(q[j].num<q[j+1].num){
t=q[j];
q[j]=q[j+1];
q[j+1]=t;
}
}
else if(f==1){
if(q[j].chinese<q[j+1].chinese){
t=q[j];
q[j]=q[j+1];
q[j+1]=t;
}
}
else if(f==2){
if(q[j].math<q[j+1].math){
t=q[j];
q[j]=q[j+1];
q[j+1]=t;
}
}
else if(f==3){
if(q[j].english<q[j+1].english){
t=q[j];
q[j]=q[j+1];
q[j+1]=t;
}
}
else if(f==4){
if(q[j].ave<q[j+1].ave){
t=q[j];
q[j]=q[j+1];
q[j+1]=t;
}
}
}
}
Print(q,m);
free(q);
}
int main()
{
char s1[]="选择功能菜单";
char p1[][13]={"数据显示","数据插入","数据查询","数据排序","数据登录","数据删除","数据更改","数据保存","密码修改"};
char s2[]="选择查询范围";
char p2[][13]={"按专业查询","按班级查询","所有学生查询"};
char s3[]="选择查询内容";
char p3[][13]={"最高分","最低分","平均分"};
char s4[]="选择排序范围";
char p4[][13]={"按专业排","按班级排序","所有学生排序"};
char s5[]="选择栏目";
char p5[][13]={"语文","数学","英语","平均","学号"};
int n=0,i,j,k,l,m,sel;
float x;
struct student *stu;
printf("\n\t\t学生信息管理系统!\n");
if(Identity()==3) {
printf("\n抱歉密码不对,系统关闭!\n");
system("pause");
return -1;
}
if(!(n=OpenData(&stu))) n=CreateClass(&stu);
system("cls");
do {
sel=Menu(9,s1,p1);
switch(sel) {
case 1:
printf("\n学生信息列表!");
Print(stu,n);
break;
case 2:
printf("\n学生信息登录!");
printf("\n输入插入的位置(%d和%d之间的值):",0,n);
scanf("%d",&l);
if(l<0||l>n) {
printf("\n位置值有错!\n");
break;
}
stu=InsertScore(stu,n,l);
if(stu) n++;
break;
case 3:
i=Menu(3,s2,p2);
m=SelCode(i);
if(m==-1) break;
k=Menu(5,s5,p5);
if(k==0) break;
if(k!=5) {
j=Menu(3,s3,p3);
if(j==0) break;
}
else {
printf("请输入学号:");
scanf("%d",&l);
}
x=Score(stu,n,i,j,k,l,m);
if(x) printf("\n结果为%f\n",x);
break;
case 4:
i=Menu(3,s4,p4);
m=SelCode(i);
if(m==-1) break;
j=Menu(5,s5,p5);
if(j==0) break;
Sort(stu,n,i,m,j);
break;
case 5:
if(stu=AddScore(stu,n)) {
printf("\n学生成绩已增加!\n");
n++;
Print(stu,n);
}
break;
case 6:
if(!n){
printf("\n无数据可删除!");
break;
}
printf("\n请输入学生的学号:");
scanf("%d",&i);
stu=DeleteScore(stu,n,i);
n--;
printf("\n学生%d的成绩已经删除\n",i);
Print(stu,n);
break;
case 7:
printf("\n请输入学生的学号:");
scanf("%d",&i);
UpdateScore(stu,n,i);
Print(stu,n);
printf("\n学生信息已更新!\n");
break;
case 8:
printf("\n保存数据!");
SaveData(stu,n);
printf("\n数据已经保存!\n");
break;
case 9:
printf("\n修改密码\n");
Alter();
break;
case 0:
break;
default:
printf("\n输入错误!\n");
}
system("pause");
} while(sel!=0);
printf("\n谢谢您的使用,再见!\n");
system("pause");
if(stu) free(stu);
return 0;
}
登录密码:123456