matu-#147-C语言第六章实验

函数实验-学生成绩管理
通过课程进入 题 号: 147 函数实验-学生成绩管理 语言要求: C++
在第四章 数组与结构的成绩管理系统实验基础上调整,用函数实现各个功能:
具体要求如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct student
{
int id;
char name[50];
float chinese;
float math;
float english;
float sum;
}student;
/输入参数:字符串name是要打开的文件名称。输出参数:stu是读出的学生的详细信息。函数的返回值:学生人数.任何错误返回0/
int ReadStuInfoFromFile(char *name, student **stu);

/输入参数:stu是全班学生信息,n是人数。输出参数:3科平均成绩不及格人名单noPassStudent,不及格人数m.操作成功返回0,失败返回-1/
int NoPass(student stu[], int n, student **noPassStudent, int *m);

/输入参数:stu是全班学生信息,n是人数。输出参数:3科平均成绩及格人名单PassStudent,及格人数m.操作成功返回0,失败返回-1/
int Pass(student stu[], int n, student **PassStudent, int *m);

/输入参数:stu是全班学生信息,n是人数。输出参数:按照总分/平均分排序后的结果也存储在stu中.操作成功返回0,失败返回-1/
int SortStudents(student stu[], int n);

/输入参数:stu是全班学生信息,n是人数。操作成功返回0,失败返回-1。本函数在码图上不会进行检测,只是供同学们调试使用。/
int PrintStudents(student stu[], int n);

/输入参数:stu是全班学生信息,n是人数,id是待查找的学号。输出参数:rank是在班上的排名;stu是这个学生的详细信息。返回值:查找成功返回0,失败返回-1/
int SearchStudent(student stu[], int n, int id,int *rank, student *rstu);

文件名称:char name[]= “stuScores.txt”;作为测试使用,不需要提交。
注意:第一个函数要求从文件name中读取数据,文件内容:
第一个数据是学生人数n;后面的数据是n个学生的详细信息,需要用fread依次读出人数及n个人的信息数据。读出的成绩数据并没有进行累加求和,需要您自己计算。

该题目的测试只针对函数,不需要在控制台输出。请务必保证函数实现正确,后台将会提供数据文件对函数进行测试。
自己写主函数测试建议如下:
int main()
{
int n, rank, id,i,m;
char name[]= “stuScores.txt”;
student *stu=NULL,*noPassStu=NULL,*passStu=NULL,rstu;
n = ReadStuInfoFromFile(name, &stu);
if (n == 0) { printf(“error”); return -1; }
PrintStudents(stu, n);

printf("\n no pass studnt--------\n");
i = NoPass(stu, n, &noPassStu, &m);
if(i==-1)printf("no pass error");
else
PrintStudents(noPassStu, m);

printf("\n  passed studnt--------\n");
i = Pass(stu, n, &noPassStu, &m);
if (i == -1)printf(" pass error");
else
	PrintStudents(noPassStu, m);

printf("\n sort studnt--------\n");
//i = NoPass(stu, n, &noPassStu, &m);
i=SortStudents(stu, n);
if (i == -1)printf("sort error");
else
	PrintStudents(stu, n);

printf("\n search id--------\n");
//i = NoPass(stu, n, &noPassStu, &m);
scanf_s("%d", &id);
i = SearchStudent(stu, n, id, &rank, &rstu);
if (i == -1)printf("search error");
else
	PrintStudents(&rstu, 1);
   if(stu){free(stu);stu=NULL;}
   if(noPassStu){free(noPassStu);noPassStu=NULL;}
   if(PassStu){free(PassStu);PassStu=NULL;}
system("pause");
return 0;

}
提醒:注意观察main函数对各函数的调用,如果传递空指针进入函数,而实际需要指针指向空间,则应该在函数内部按需分配空间。
看网上基本没有,就自己写了。

#include<stdio.h>
#include<stdlib.h>
typedef struct student
{
	int id;
	char name[50];
	float chinese;
	float math;
	float english;
	float sum;
}student;
int ReadStuInfoFromFile(char* name, student** stu)
{
	FILE* fp = fopen(name, "r");
	if (fp == NULL || name == NULL || stu == NULL )
		return 0;
	int n;
	fread(&n, sizeof(int), 1, fp);
	if (n <= 0)
		return 0;
	*stu = (student*)malloc(sizeof(student) * n);
	for (int i = 0; i < n; i++)
	{
   		fread(*stu+i, sizeof(student), 1, fp);
		(*stu + i)->sum = (*stu + i)->english + (*stu + i)->chinese + (*stu + i)->math;
	}
	fclose(fp);
	return n;
}
int NoPass(student stu[], int n, student** noPassStudent, int* m)
{
	if (stu == NULL || n <= 0 || m == NULL || noPassStudent == NULL )
		return -1;
	int k = 0;
	int no[20] = { 0 };
	for (int i = 0; i < n; i++)
	{
		if (stu[i].sum / 3 < 60)
		{
			no[k] = i;
			k++;
		}
	}
	*noPassStudent = (student*)malloc(sizeof(student)*k);
	for(int i = 0;i < k; i++)
		((*noPassStudent)[i]) = stu[no[i]];
	*m = k;
	return 0;
}
int Pass(student stu[], int n, student** PassStudent, int* m)
{
	if (stu == NULL || n <= 0 || m == NULL || PassStudent == NULL )
		return -1;
	int k = 0;
	int no[20];
	for (int i = 0; i < n; i++)
	{
		if (stu[i].sum / 3 >= 60)
		{
			no[k] = i;
			k++;
		}
	}
	*PassStudent = (student*)malloc(sizeof(student) * k);
	for (int i = 0; i < k; i++)
		((*PassStudent)[i]) = stu[no[i]];
	*m = k;
	return 0;
}
int SortStudents(student stu[], int n)
{
	if (n <= 0 || stu == NULL)
		return -1;
	student temp;
	for (int i = 0; i < n; i++)
		for (int j = i; j < n - i - 1; j++)
		{
			if (stu[j].sum < stu[j + 1].sum)
			{
				temp = stu[j];
				stu[j] = stu[j + 1];
				stu[j + 1] = temp;
			}
		}
	return 0;
}
int SearchStudent(student stu[], int n, int id, int* rank, student* rstu)
{
	if (stu == NULL || n <= 0 || rstu == NULL)
		return -1;
	SortStudents(stu, n);
	for (int i = 0; i < n; i++)
	{
		if (stu[i].id == id)
		{
			*rank = i + 1;
			*rstu = stu[i];
			return 0;
		}
	}
	return -1;
}
  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值