该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
#include
#include
struct Student;
typedef struct Student *PStudent;
struct Student{
char name[10];
int number;
int chinese;
int math;
int english;
PStudent link;
};
typedef struct Student *gradelist;
gradelist fileRead(char *adress); //文件读取函数
void filePrintf(gradelist file); //文件输出函数
void fileConbine(gradelist file1,gradelist file2); //文件合并函数
void failStudent(); //文件记录函数
void gradeSort(int choice); //文件排序函数
int findStudent(char name);; //文件查找函数
int main()
{
int choice1; //选择操作类型
printf("\n\t\t\t欢迎进入学生成绩管理系统\n\n");
gradelist file1=fileRead("F:/1.txt");
printf("现有成绩记录文件1:\n\n");
filePrintf(file1);
printf("============================================================================\n");
gradelist file2=fileRead("F:/2.txt");
printf("现有成绩记录文件2:\n\n");
filePrintf(file2);
printf("============================================================================\n");
printf("操作菜单: 1:文件合并 2:记录补考学生 3:文件排序 4:文件中查找学生\n");
printf("============================================================================\n");
printf("请选择您所需要的操作:");
while(scanf("%d",&choice1)==1){
if(choice1==0){
break;
}
if(choice1==1){
printf("您选择了合并两个文件,合并后的学生成绩记录文件:\n\n");
fileConbine(file1,file2);
}
else if(choice1==2){
printf("您选择了记录补考学生,补考学生信息为:\n\n");
failStudent();
}
else if(choice1==3){ //选择排序方式
printf("您选择了文件排序排序后的学生成绩记录文件:\n\n");
gradeSort(3);}
//选择查找
else if(choice1==4)
{char name; printf("您选择了按姓名查找,请输入需要查找学生的姓名: ");
while(scanf("%s",&name)==1) //while(0)退出
{ if(findStudent(name)==1)
{break;}
else if (name=='quit') continue;
else printf("没有您需要查找的学生的姓名,请重新输入姓名:");
}
}
else printf("\n选择错误,请重新选择:\n");
//如何取消查找
printf("============================================================================\n");
printf("可选择操作: 1:文件合并 2:记录不及格学生 3:文件排序 4:文件中查找学生\n");
printf("============================================================================\n");
printf("请选择您所需要的操作(输入0结束):");
}
return 0;
}
//读取文件
gradelist fileRead(char *adress)
{
FILE *fp;
if((fp=fopen(adress,"r"))==NULL){
printf("文件无法打开");
return NULL;
}else{
gradelist file=(gradelist)malloc(sizeof(struct Student));
file->link=NULL;
Student *p=file;
while(!feof(fp)){
p->link=(Student *)malloc(sizeof(struct Student));
p=p->link;
p->link=NULL;
fscanf(fp,"%s%d%d%d%d",&p->name,&p->number,&p->chinese,&p->math,&p->english);
}
if(fclose(fp)){
printf("文件无法关闭");
exit(0);
}
return file;
}
}
//显示文件内容
void filePrintf(gradelist file)
{
Student *p=file->link;
printf(" 姓名 学号 语文 数学 英语\n");
while(p->link!=NULL){
printf("%6s %3d %6d %5d %5d\n",p->name,p->number,p->chinese,p->math,p->english);
p=p->link;
}
}
//将两个文件合并
void fileConbine(gradelist file1,gradelist file2)
{
FILE *fp;
if((fp=fopen("F:/3.txt","w+"))==NULL){
printf("无法打开文件");
return;
}
Student *p=file1->link;
Student *q=file2->link;
while(p->link!=NULL){
fprintf(fp,"%6s %2d %2d %2d %2d\n",p->name,p->number,p->chinese,p->math,p->english);
p=p->link;
}
while(q->link!=NULL){
fprintf(fp,"%6s %2d %2d %2d %2d\n",q->name,q->number,q->chinese,q->math,q->english);
q=q->link;
}
if(fclose(fp)){
printf("文件无法关闭");
return;
}
gradelist file3=fileRead("F:/3.txt");
filePrintf(file3);
}
//记录不及格学生
void failStudent()
{
FILE *fp;
if((fp=fopen("F:/4.txt","w+"))==NULL)
{
printf("文件无法打开\n");
return;
}
gradelist file3=fileRead("F:/3.txt");
Student *p=file3->link;
while(p->link!=NULL)
{
if(p->math<60||p->chinese<60||p->english<60)
fprintf(fp,"%6s %2d %2d %2d %2d\n",p->name,p->number,p->chinese,p->math,p->english);
p=p->link;
}
if(fgetc(fp)==EOF){
printf("无不及格学生\n");
return;
}
if(fclose(fp)){
printf("文件无法关闭");
return;
}
gradelist file4=fileRead("F:/4.txt");
filePrintf(file4);
}
//对文件中的内容排序
void gradeSort(int choice1)
{
int n=0,i,j;
gradelist file3=fileRead("F:/3.txt");
Student *p=file3->link;
while(p->link!=NULL){
n++;
p=p->link;
}
struct Person{ //用线性表保存链表中的内容
int totalgrade;
char name[10];
int number;
int chinese;
int math;
int english;
};
Person temp;
struct SeqList{
int MAXNUM;
int n;
Person *s;
};
typedef struct SeqList *PSeqList;
PSeqList palist=(PSeqList)malloc(sizeof(struct SeqList));
if(palist!=NULL){
palist->s=(Person *)malloc(sizeof(Person)*100);
if(palist->s){
palist->MAXNUM=100;
palist->n=0;
}
}
p=file3->link;
for(i=0;ilink){
strcpy(palist->s[i].name,p->name);
palist->s[i].number=p->number;
palist->s[i].chinese=p->chinese;
palist->s[i].math=p->math;
palist->s[i].english=p->english;
palist->s[i].totalgrade=p->chinese+p->math+p->english;
}
if(choice1==3){ //选择排序法
for(i=0;i
for(j=i+1;j
if(palist->s[i].totalgrades[j].totalgrade){
temp=palist->s[i];
palist->s[i]=palist->s[j];
palist->s[j]=temp;
}
}
}
}
if(remove("F:/3.txt")){
printf("删除失败");
return;
}
FILE *fp;
if((fp=fopen("F:/3.txt","w+"))==NULL){
printf("文件无法打开");
return;
}
for(i=0;i
fprintf(fp,"%6s %2d %d %d %d\n",palist->s[i].name,palist->s[i].number,palist->s[i].chinese,palist->s[i].math,palist->s[i].english);
}
if(fclose(fp)){
printf("无法关闭文件");
return;
}
file3=fileRead("F:/3.txt");
filePrintf(file3);
}
//查找学生
int findStudent(char n)
{
gradelist file=fileRead("F:/3.txt");
Student *p=file->link;
while(p->link!=NULL){
if(p->name[0]==n){
printf("\n查找的结果为:\n");
printf(" 姓名 学号 语文 数学 英语\n");
printf(" %6s %3d %5d %5d %5d\n",p->name,p->number,p->chinese,p->math,p->english);
return 1;
}
else {p=p->link;}
}
return 0;
}