准备文本文件 E79_data.txt, 文件中保存了不超过 50 个学生的信息,每个学生信息占一行,学生信息从左到右分别为:学
号(长度不超过 15)、姓名(长度不超过 20)、年级(整数),学生信息以空格分隔。请将文件保存至 C 盘根目录下的 cdata 文件夹,编写程序完成如下功能:
(1) 编写一个函数,读取所有学生信息。
(2) 编写一个函数,输出所有学生信息到屏幕上,要求每个学生信息占一行。
(3) 编写一个函数,对所有学生根据其学号按照从小到大排序。
(4) 编写一个函数,删除学号小于指定值 s1 的所有学生。
(5) 编写测试程序
/*========================================================================
*学号:1527403059
*作业:E79
*功能:(1) 编写一个函数,读取所有学生信息。
(2) 编写一个函数,输出所有学生信息到屏幕上,要求每个学生信息占一行。
(3) 编写一个函数,对所有学生根据其学号按照从小到大排序。
(4) 编写一个函数,删除学号小于指定值 s1 的所有学生。
(5) 编写测试程序。
*作者:陆胤任
*日期:2016.1.2
*========================================================================*/
#include<stdio.h>
#include<stdlib.h>
struct Student //定义结构体数组
{
int num;
char name[20];
}stu[50];
/*function define
*@brief:读取所有学生信息
*@param:char *FileName:文件名
struct Student *stu:结构体数组首元素的地址
int N:元素个数
*@reval:c:元素实际个数
*/
int ReadInfo(char *FileName,struct Student *stu,int N)
{
FILE *fp; //定义指向FILE类型文件的指针变量
int res,c=0;
struct Student t; //定义结构体变量
fp=fopen(FileName,"r");
if(NULL==fp) //检查是否打开文件成功
{
printf("打开文件失败!\n");
exit(0);
}
while(!feof(fp)) //如果未遇到输入文件的结束标志
{
res=fscanf(fp,"%d%s",&t.num,t.name); //格式化读取文件
if(res==-1)
{
continue;
}
stu[c]=t; //对结构体变量赋值,将文件中的数据赋值给它
c++;
if(c==N)
{
break;
}
}
fclose(fp); //关闭文件
return c;
}
/*function define
*@brief:输出所有学生信息到屏幕上,要求每个学生信息占一行。
*@param:struct Student *stu:结构体数组元素首地址
int N:元素个数
*@reval:void
*/
void DisplayInfo(struct Student *stu,int N)
{
int i;
for(i=0;i<N;i++) //循环输出结构体数组
{
printf("%10d%20s\n",stu[i].num,stu[i].name);
}
printf("\n");
}
/*function define
*@brief:对所有学生根据其学号按照从小到大排序。
*@param:struct Student *stu:结构体数组首元素地址
int N:元素个数
*@reval:void
*/
void SortStudent(struct Student *stu,int N)
{
int i,j,min;
struct Student temp;
for(i=0;i<N-1;i++) //选择排序
{
min=i;
for(j=i+1;j<N;j++)
{
if(stu[min].num>stu[j].num)
{
min=j;
}
}
if(min!=i)
{
temp=stu[min];
stu[min]=stu[i];
stu[i]=temp;
}
}
}
/*function define
*@brief:删除学号小于指定值 s1 的所有学生
*@param:struct Student *stu:结构体数组首元素地址
int N:元素个数
int Number:学号数
*@reval:int n:删除元素后的所剩元素个数
*/
int DeleteStudent(struct Student *stu,int N,int Number)
{
int i,j,n;
n=N;
for(i=0;i<n;i++)
{
if(stu[i].num<Number)
{
for(j=i+1;j<n;j++)
{
stu[j-1]=stu[j];
}
i--; //注意i--,删了一个,i要停留一次
n--;
}
}
return n;
}
int main() //定义主函数
{
struct Student stu[50];
int c,n,t;
c=ReadInfo("C:\\cdata\\E79_data.txt",stu,50);
printf("文件读取完成后的学生信息如下:\n");
DisplayInfo(stu,c);
printf("按学号从小到大排序:\n");
SortStudent(stu,c);
DisplayInfo(stu,c);
printf("请输入一个表示学号的整数:\n");
scanf("%d",&n);
printf("删除学号小于%d的学生:\n",n);
t=DeleteStudent(stu,c,n);
DisplayInfo(stu,t);
return 0;
}