现有一个二进制文件 E83_data.bin,文件中包含了若干学生信息, 请将文件保存至 C 盘根目录下的 cdata 文件夹。其中学生信息结构如下:
struct _student
{
char ID[15]; // 学号
char name[20]; // 姓名
int grade; // 年级
int scorces[3]; // 成绩
}
编写程序完成如下功能:
(1) 编写一个函数,读取二进制文件中的所有学生信息。
(2) 编写一个函数,输出所有学生信息,要求每个学生信息占一行,输出格式要求:学号(占 20 列,左对齐),姓名(占 25 列,左对齐), 年级(占 3 列,左对齐), 成绩(每个成绩占 6 列,右对齐)。
(3) 编写一个函数,对所有学生根据学生的平均成绩按照从大到小排序。
(4) 编写一个函数,将所有学生信息输出到 C 盘根目录下的 cdata 文件夹中的文本文件 E83_result.txt,要求每行输出一个学生信息,输出格式要求如下:学号(占 20 列,左对齐),姓名(占 25 列,左对齐), 年级(占 3 列,左对齐),成绩(每个成绩占 6 列,右对齐),平均成绩(占 6 列,保留 2 为小数,右对齐)。
(5) 编写一个函数,删除所有学生中平均成绩小于 score 的学生信息,其中score 由参数传入。
(6) 编写测试程序。 其中要求删除所有平均成绩小于 40 分的学生信息,并将剩下的学生信息输出到 C 盘根目录下的 cdata 文件夹中的文本文件E83_delresult.txt,要求每行输出一个学生信息,输出格式要求如下: 学号(占20 列,左对齐),姓名(占 25 列,左对齐), 年级(占 3 列,左对齐), 成绩(每个成绩占 6 列,右对齐),平均成绩(占 6 列,保留 2 为小数,右对齐)
/*============================================================================================================================================
*学号:1527403059
*作业:E83
*功能:(1) 编写一个函数,读取二进制文件中的所有学生信息。
(2) 编写一个函数,输出所有学生信息,要求每个学生信息占一行,输出格式要求:学号(占 20 列,左对齐),姓名(占 25 列,左对齐), 年级(占 3 列,
左对齐), 成绩(每个成绩占 6 列,右对齐)。
(3) 编写一个函数,对所有学生根据学生的平均成绩按照从大到小排序。
(4) 编写一个函数,将所有学生信息输出到 C 盘根目录下的 cdata 文件夹中的文本文件 E83_result.txt,要求每行输出一个学生信息,输出格式要求如下:
学号(占 20 列,左对齐),姓名(占 25 列,左对齐), 年级(占 3 列,左对齐), 成绩(每个成绩占 6 列,右对齐),平均成绩(占 6 列,保留 2 为小数,
右对齐)。
(5) 编写一个函数,删除所有学生中平均成绩小于 score 的学生信息,其中score 由参数传入。
(6) 编写测试程序。其中要求删除所有平均成绩小于 40 分的学生信息,并将剩下的学生信息输出到 C 盘根目录下的 cdata 文件夹中的文本文件
E83_delresult.txt,要求每行输出一个学生信息,输出格式要求如下:学号(占20 列,左对齐),姓名(占 25 列,左对齐), 年级(占 3 列,左对齐),
成绩(每个成绩占 6 列,右对齐),平均成绩(占 6 列,保留 2 为小数,右对齐)。
*作者:陆胤任
*日期:2016.1.3
*===============================================================================================================================================*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct student //结构体
{
char ID[15];
char name[20];
int grade;
int scorces[3];
};
struct StudentNode //链表
{
struct student data;
double aver;
struct StudentNode *next;
};
/*function define
*@brief:读取文件中的所有信息
*@param:char *FileName:文件名
*@reval:*head:链表头节点
*/
struct StudentNode *CreateListFromFile(char *FileName)
{
FILE *fp;
struct StudentNode *head,*p,*q;
struct student t;
int res;
fp=fopen(FileName,"rb"); //检查是否打开文件失败
if(fp==NULL)
{
printf("无法打开文件!\n");
exit(0);
}
head=(struct StudentNode *)malloc(sizeof(struct StudentNode)); //开辟新空间
q=head;
while(!feof(fp)) //如果未遇到文件结束标志
{
res=fread(&t,sizeof(struct student),1,fp);
if(res==0)
{
continue;
}
p=(struct StudentNode *)malloc(sizeof(struct StudentNode));
p->data=t;
p->aver=(p->data.scorces[0]+p->data.scorces[1]+p->data.scorces[2])/3.0; //求平均分
q->next=p;
q=p;
}
p->next=NULL;
fclose(fp); //关闭文件
return head;
}
/*function define
*@brief:显示文件内容到屏幕上
*@param:struct StudentNode *Head:链表头节点
*@reval:void
*/
void DisplayList(struct StudentNode *Head)
{
struct StudentNode *p;
p=Head->next;
while(p!=NULL) //输出内容
{
printf("%-20s%-25s%-3d%6d%6d%6d%6.2lf\n",p->data.ID,p->data.name,p->data.grade,p->data.scorces[0],p->data.scorces[1],p->data.scorces[2],p->aver);
p=p->next;
}
printf("\n");
}
/*function define
*@brief:对数据进行排序
*@param:struct StudentNode *Head:链表头节点
*@reval:void
*/
void SortList(struct StudentNode *Head)
{
struct StudentNode *pi,*pj,*pmax;
struct student temp;
double aver;
pi=Head->next;
while(pi->next!=NULL) //选择排序法
{
pmax=pi;
pj=pi->next;
while(pj!=NULL)
{
if(pmax->aver<pj->aver)
{
pmax=pj;
}
pj=pj->next;
}
if(pmax!=pi)
{
temp=pmax->data;
aver=pmax->aver;
pmax->data=pi->data;
pmax->aver=pi->aver;
pi->data=temp;
pi->aver=aver;
}
pi=pi->next;
}
}
/*function define
*@brief:删除节点
*@param:struct StudentNode *Head:链表头节点
double Score:参数传递的分数
*@reval:void
*/
void DeleteNode(struct StudentNode *Head,double Score)
{
struct StudentNode *p,*q;
q=Head;
p=Head->next;
while(p!=NULL)
{
if(p->aver<=Score)
{
q->next=p->next;
free(p);
p=q->next;
}
else
{
q=p;
p=p->next;
}
}
}
/*function define
*@brief:将文件内容保存在指定文件中
*@param:char *FileName:文件名
struct StudentNode *Head:链表头节点
*@reval:void
*/
void WriteInfoToFile(char *FileName,struct StudentNode *Head)
{
FILE *fp;
struct StudentNode *p;
fp=fopen(FileName,"w");
if(fp==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
p=Head->next;
while(p!=NULL)
{
fprintf(fp,"%-20s%-25s%-3d%6d%6d%6d%6.2lf\n",p->data.ID,p->data.name,p->data.grade,p->data.scorces[0],p->data.scorces[1],p->data.scorces[2],p->aver);
p=p->next;
}
fprintf(fp,"\n"); //格式化输出换行符
fclose(fp);
}
/*function define
*@brief:释放节点
*@param:struct StudentNode *Head:链表头节点
*@reval:void
*/
void free_node(struct StudentNode *head)
{
struct StudentNode *p,*q;
p=head;
while(NULL!=p)
{
q=p;
p=p->next;
free(q);
}
}
int main() //主函数
{
struct StudentNode *head;
head=CreateListFromFile("C:\\cdata\\E83_data.bin");
printf("文件读取完成后学生信息如下:\n");
DisplayList(head);
SortList(head);
printf("排序后学生的信息如下:\n");
DisplayList(head);
WriteInfoToFile("C:\\cdata\\E83_result.txt",head);
DeleteNode(head,40.0);
WriteInfoToFile("C:\\cdata\\E83_delresult.txt",head);
free_node(head); //释放节点
return 0;
}