文件、结构体综合操作01(C)

准备文本文件 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;
}

猜你喜欢

转载自blog.csdn.net/ukco_well/article/details/82218858