北京市海淀区房屋租赁:学生学籍管理程序,请C++高手帮小弟摆平这一题,答的好,追加积分,至少50,谢谢,

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/28 16:49:11
学生学籍管理程序
每个学生的信息包括:姓名、学号、性别、已取得学分和四级英语成绩。
从键盘输入数据,建立数据文件student.dat,数据将分别反映一到四年级若干学生,然后完成如下处理:
1、对四年级学生进行查询,确定是否能毕业,是否能取得学位。显示并存入文件s1.dat(毕业条件:学分满60分能毕业;取得学位的条件:毕业且通过四级英语考试能取得学位)。
2、对所有二年级学生,按四级英语成绩高低排成链表。

把我写过的一个类似的给你,你参考一下吧.

-----------student.h-----------------------------
#define MAX 100
#define MIN 0
struct student
{
int number;
char name[10];
int g[4];
};
#define LEN sizeof(struct student)
int file_read(student* s,char* filename,int* n);
void input(student*,int* n);
void stat(student*s,int n);
void search(student* s,int* n);
void save(student* s,int n);
void print(student*,int);
int func();
void delet(student* s,int m,int* n);
void modify(student* s,int* n,int m);
int file_create(char* filename);
int file_write(student* s,char* filename,int n);
void file(student* s,int* n);
void new_sort(student* s,int n);

------------------student.cpp---------------
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include <sys\stat.h>
#include <string.h>
#include <fcntl.h>
#include <io.h>
#include "student.h"
int main()
{
int i;
char ch;
int n;
n=0;
student s[200];
while(1)
{
printf("\n\n\n");
printf("\t** 学生成绩管理模拟系统 **\n");
printf("\t* 0.从文件读入记录 *\n");
printf("\t* 1.读入学生成绩 *\n");
printf("\t* 2.成绩排序 *\n");
printf("\t* 3.查询某个学生成绩 *\n");
printf("\t* 4.成绩统计 *\n");
printf("\t* 5.保存数据 *\n");
printf("\t* 6.打印记录 *\n");
printf("\t* 7.退出 *\n");
printf("\t请选择功能:\n\n");
ch=getch();
i=ch-'0';
switch(i)
{
case 0: file(s,&n); break;
case 1: input(s,&n); break;
case 2: new_sort(s,n); break;
case 3: search(s,&n); break;
case 4: stat(s,n); break;
case 5: save(s,n); break;
case 6: printf("\n学生记录:\n"); print(s,n);break;
case 7: printf("\n欢迎使用!多多指教!\n");
printf("\n制作者:xxx\n");
printf("\n请按任意键退出!");
getchar();
exit(1);
default:printf("\n输入错误!!!请输入数字(0~7)!\n");
}
}
print(s,n);
return 0;
}
void input(student* s,int* n)
{
int temp=1;
int num,g;
int i;
while(temp==1)
{
printf("\n输入学生学号:\n");
scanf("%d",&num);
for(i=0;i<*n;i++)
{
if((s+i)->number==num)
{
printf("该学号信息已存在,主码不允许重复!!!");
break;
}
}
if(i==*n)
{
temp=0;
(s+*n)->number=num;
}
}
printf("输入学生姓名:\n");
scanf("%s",&(s+*n)->name);
printf("输入语文成绩:\n");
scanf("%d",&g);
if(g<MIN)
g=0;
if(g>MAX)
g=100;
(s+*n)->g[0]=g;
printf("输入数学成绩:\n");
scanf("%d",&g);
if(g<MIN)
g=0;
if(g>MAX)
g=100;
(s+*n)->g[1]=g;
printf("输入英语成绩:\n");
scanf("%d",&g);
if(g<MIN)
g=0;
if(g>MAX)
g=100;
(s+*n)->g[2]=g;
g=0;
for(i=0;i<=2;i++)
{
g+=(s+*n)->g[i];
}
(s+*n)->g[3]=g/3;
(*n)++;
}
void print(student* s,int n)
{
int i;
if(n==0)
{
printf("无学生记录!");
}
else
{
for(i=0;i<n;i++)
{
printf("\t%3d %-10s 语文:%3d 数学:%3d 英语:%3d 平均分:%3d\n",(s+i)->number,(s+i)->name,(s+i)->g[0],(s+i)->g[1],(s+i)->g[2],(s+i)->g[3]);
}
}
}
int func()
{
int i;
char ch;
printf("\n\n");
printf("\n\t**请选择操作:**\t");
printf("\n\t* 1.修改信息 *\t");
printf("\n\t* 2.删除记录 *\t");
printf("\n\t* 3.退出 *\t");
ch=getch();
i=ch-'0';
return i;
}
void search(student* s,int* n)
{
int temp,i,flag;
flag=1;
printf("\n请输入要查询的学生学号:");
scanf("%d",&temp);
for(i=0;i<*n;i++)
{
if((s+i)->number==temp)
{
printf("\n该学生信息:\n");
printf("\t%3d %-10s 语文:%3d 数学:%3d 英语:%3d 平均分:%3d\n",(s+i)->number,(s+i)->name,(s+i)->g[0],(s+i)->g[1],(s+i)->g[2],(s+i)->g[3]);
while(flag==1)
{
switch(func())
{
case 1: modify(s,n,i); flag=0;break;
case 2: delet(s,i,n); flag=0;break;
case 3: flag=0;break;
default: printf("输入错误!!!");break;
}
}
break;
}
}
if(i==*n)
{
printf("查无该学生!!!");
}
}

void stat(student*s,int n)
{
int i;
int A,B,C,D;
A=B=C=D=0;
for(i=0;i<n;i++)
{
switch(s[i].g[0]/10)
{
case 10: A++;break;
case 9: A++;break;
case 8: B++;break;
case 7: B++;break;
case 6: C++;break;
default: D++;break;
}
}
printf("\n总人数:%3d\n",n);
printf("\n语文成绩在90~100的人数:%3d",A);
printf("\n语文成绩在70~89的人数:%3d",B);
printf("\n语文成绩在60~69的人数:%3d",C);
printf("\n语文不及格的人数:%3d",D);
printf("\n优秀率:%3d%%",A*100/n);
printf("\n不及格率:%3d%%%",D*100/n);
printf("\n\n");

A=B=C=D=0;
for(i=0;i<n;i++)
{
switch(s[i].g[1]/10)
{
case 10: A++;break;
case 9: A++;break;
case 8: B++;break;
case 7: B++;break;
case 6: C++;break;
default: D++;break;
}
}

printf("\n数学成绩在90~100的人数:%3d",A);
printf("\n数学成绩在70~89的人数:%3d",B);
printf("\n数学成绩在60~69的人数:%3d",C);
printf("\n数学不及格的人数:%3d",D);
printf("\n优秀率:%3d%%",A*100/n);
printf("\n不及格率:%3d%%%",D*100/n);
printf("\n\n");

A=B=C=D=0;
for(i=0;i<n;i++)
{
switch(s[i].g[2]/10)
{
case 10: A++;break;
case 9: A++;break;
case 8: B++;break;
case 7: B++;break;
case 6: C++;break;
default: D++;break;
}
}

printf("\n英语成绩在90~100的人数:%3d",A);
printf("\n英语成绩在70~89的人数:%3d",B);
printf("\n英语成绩在60~69的人数:%3d",C);
printf("\n英语不及格的人数:%3d",D);
printf("\n优秀率:%3d%%",A*100/n);
printf("\n不及格率:%3d%%%",D*100/n);

}
void delet(student* s,int m,int* n)
{
int i;
for(i=m;i<*n;i++)
{
s[i]=s[i+1];
}
(*n)--;
}
void modify(student* s,int* n,int m)
{
int temp=1;
int num,g;
int i;
while(temp==1)
{
(s+m)->number=-1;
printf("\n输入学生学号:\n");
scanf("%d",&num);
for(i=0;i<*n;i++)
{
if((s+i)->number==num)
{
printf("该学号信息已存在,主码不允许重复!!!");
break;
}
}
if(i==*n)
{
temp=0;
(s+m)->number=num;
}
}
printf("输入学生姓名:\n");
scanf("%s",&(s+m)->name);
printf("输入语文成绩:\n");
scanf("%d",&g);
if(g<MIN)
g=0;
if(g>MAX)
g=100;
(s+m)->g[0]=g;
printf("输入数学成绩:\n");
scanf("%d",&g);
if(g<MIN)
g=0;
if(g>MAX)
g=100;
(s+m)->g[1]=g;
printf("输入英语成绩:\n");
scanf("%d",&g);
if(g<MIN)
g=0;
if(g>MAX)
g=100;
(s+m)->g[2]=g;
g=0;
for(i=0;i<=2;i++)
{
g+=(s+m)->g[i];
}
(s+m)->g[3]=g/3;

}

int file_create(char* filename)
{
int handle;
char fname_bmp[128];
sprintf(fname_bmp,"%s.dat",filename);
_fmode = O_BINARY;
handle = creat(fname_bmp, S_IREAD | S_IWRITE);
close(handle);
return 0;
}

int file_write(student* s,char* filename,int n)
{
FILE *fp;
char fname[128];
sprintf(fname,"%s.dat",filename);
if((fp = fopen(fname,"wb")) == NULL) return -1;
fwrite(&n,sizeof(int),1,fp);
fwrite(s,LEN,n,fp);
fclose(fp);
return 0;
}
int file_read(student* s,char* filename,int* n)
{
int i,j;
int m;
student *buf;
FILE *fp;
char fname[128];
sprintf(fname,"%s.dat",filename);
if((fp = fopen(fname,"rb")) == NULL) return -1;
fread(&m,sizeof(int),1,fp);
buf = (student *)malloc(m);
*n=m;
fread(buf,sizeof(student),m,fp);
fclose(fp);
for(i=0;i<m;i++)
{
printf("\t%3d %-10s 语文:%3d 数学:%3d 英语:%3d 平均分:%3d\n",(buf+i)->number,(buf+i)->name,(buf+i)->g[0],(buf+i)->g[1],(buf+i)->g[2],(buf+i)->g[3]);
}
for(i=0;i<m;i++)
{
(s+i)->number=(buf+i)->number;

for(j=0;j<10;j++)
{
(s+i)->name[j]=(buf+i)->name[j];
}
for(j=0;j<=4;j++)
{
(s+i)->g[j]=(buf+i)->g[j];
}

}
return 0;
}
void save(student* s,int n)
{
char filename[30];
printf("\n输入要保存的文件名:\n");
scanf("%s",filename);
file_create(filename);
file_write(s,filename,n);
printf("\n恭喜!文件保存成功!!!");
}
void file(student* s,int* n)
{
char filename[30];
printf("\n输入数据文件名:\n");
scanf("%s",filename);
file_read(s,filename,n);
printf("\n文件已成功读入!!!\n");
}

void new_sort(student* s,int n)
{
int i,j;
int change;
student temp;
change=0;
while(!change)
{
change=1;
for(j=n;j>0;j--)
{
for(i=0;i<j-1;i++)
{
if(s[i].g[3] < s[i+1].g[3])
{
temp=s[i+1];
s[i+1]=s[i];
s[i]=temp;
change=0;
printf("\n 目前排序结果:\n");
for(i=0;i<n;i++)
{
printf("\t%3d %-10s 语文:%3d 数学:%3d 英语:%3d 平均分:%3d\n",s[i].number,s[i].name,s[i].g[0],s[i].g[1],s[i].g[2],s[i].g[3]);
}
}
}
}
}
printf("\n 排序成功!\n");
}