指针练习,查找学生成绩并输出平均成绩和排名信息 每日一练(四)

本文探讨了使用指针在C语言中处理学生成绩的方法,包括通过指针传递数组、函数声明顺序及函数调用顺序的重要性。还提到了排名计算的两种方式,一种是排序后判断相等,另一种是在排序过程中交换学号信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总结:1、注意函数调用时如果用到其他函数的变量,要进行参数传递,会写形参和实参,由指针指向;可以在前面定义一些数组,然后由指针分别指向这些数组,那么接下来这些数组和指针都能在其他函数中得到调用;

           2、C中函数如果main函数在前面的话一定要声明函数在最前面;

           3、函数从main函数执行,因此main函数中的函数调用的顺序很重要,哪个函数在前面很重要

          4、本题的排名用排序,然后去判断相等得到排名信息,也可以在sort函数交换数据的时候同时交换学号信息,但是不是很好。

 

#include<stdio.h>
//*****指针练习,n个学生,每人四门课,计算平均分,查询各科成绩,排名*****//
#define N 10
float score[N][4]={{90,99,97,98},{65,67,70,60},{80,87,90,81}};//存成绩信息,用二维指针
float aver[N];        //存平均成绩,用指针*q指导这
float array1[N];      //存排名信息,用指针*r指到这
    //每定义一个指针就要定义一个不管是空的还是非空的数组指向它,不能浮游指针。这四个数组中有三个是初始化用的,没有存东西开始
//float(*p)[4];
void search(float(*p)[4],float*q,float*r);
void average(float(*p)[4],float*q);
void sort(float*r,float*q);

int main(void)
{   	
	average(score,aver);
	sort(array1,aver);
	search(score,aver,array1);
}
 //***********求平均成绩,传递了所有人的成绩并将平均成绩存到指针*q指向的数组float aver[N]中*******************//
void average(float(*p)[4],float*q)
   {
	   int i,j;
	   for(i=0;i<N;i++)
	   {
		   float sum=0.0;
		   for(j=0;j<4;j++)
			   sum+=*(*(p+i)+j);
		   *(q+i)=sum/4;		 	   
	   }
   }
//********冒泡排序将平均成绩*********//
void sort(float*r,float*q)
	{
		//复制*q里面存的平均分
		int i,j;float temp;int b[N];
		for(i=0;i<4;i++)		  
			  *(r+i)=*(q+i);		  		
        for(j=0;j<N-1;j++)
		{
           for(i=0;i<N-1-j;i++)
          {
               if(*(r+i)<*(r+i+1))//数组元素大小按降序排列
             {
                 temp=*(r+i);
                 *(r+i)=*(r+i+1);
                 *(r+i+1)=temp;			  
			  }
	      }
	   }
		
	}
//*********查找函数找到所有分数,并且将平均成绩和排名都在此函数中输出,注意一些细节*********************////
 void search(float(*p)[4],float*q,float*r)//定义二维指针,并将二维数组首地址给它
   {   int i,m=0;
	   printf("Input zhe ID of the student:\t");
	   scanf("%d",&m);
	   printf("\nAll the score of the student:\t");
	   for(i=0;i<4;i++)
	   {
		   printf("%5.2f\t",*(*(p+m-1)+i));//要减一
	   }
	   printf("\nThe average score of the student:%5.2f\t",*(q+m-1));//要减一
	   for(i=0;i<N;i++)
	   {
		   if(*(q+m-1)==*(r+i))//要减一
	        printf("\nThe ranking of the student:%d\t",i+1);//sort函数已经排好顺序,现在只要比较就行,相等则就是它的排名,要加一
	   }	  
   }


 

1.功能需求 某班有最多不超过30人(具体人数由键盘输人)参加期末考试,最多不超过6门(具体门数由键盘输入)。请使用结构体数组、排序查找算法以及模块化程序设计方法编程实现如下菜单驱动的学生成绩管理系统: (1)输入每个学生的学号、姓名若干门课程考试成绩(2)计算每门课程的总分平均分; (3)计算每个学生的总分平均分; (4)按每个学生的总分由高到低排出名次表; (5)按每个学生的总分由低到高排出名次表; (6)按学号由小到大排出成绩表; (7)按姓名的字典顺序排出成绩表; (8)按学号查询学生排名及其考试成绩(9)按姓名查询学生排名及其考试成绩(10)按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比; (11)输出每个学生的学号、姓名、各科考试成绩,以及总分平均分; (12)将每个学生记录信息写入文件; (13)从文件中读出每个学生记录信息显示; 以下为选做功能: (14)向文件中追加1条记录(15)删除文件中指定学号的记录(16)修改文件中的某个学生的某门功课的成绩。 2.数据需求 每条记录包含学号(长整型)、姓名(字符串)、多门课程的成绩(浮点型)、总成绩(浮点型)、平均成绩(浮点型)。 数据存储于文件StudentRecord.txt中,格式为每行一条记录;文件的第一行数据为学生人数课程门数。 3.性能需求 系统响应快速,支持至少100条记录的高效处理。 界面友好,操作直观,提供菜单驱动交互。 三、系统设计 1.总体设计 模块划分: 系统采用模块化设计:每个功能模块封装为独立函数;全局数据通过结构体数组统一管理。 主菜单模块:提供功能入口,循环调用各子模块。 具体菜单要求如下: 1.Input record 2.Calculate total and average score of every course 3.Calculate total and average scored of every student 4.Sort in descending order by total score of every student 5.Sort in ascending order by total score of every student 6.Sort in ascending order by number 7.Sort in dictionary order by name 8.Search by number 9.Search by name 10.Statistic analysis for every course 11.List record 12.Write to a file 13.Read from a file 0.Exit Please enter your choice: 数据输入模块:实现学生信息由键盘录入与验证。 数据处理模块:对结构体数组stu进行按条件查询、排序。 文件操作模块:实现对文件中的数据进行读写、增删改等操作。2.数据结构设计 定义结构体Student: typedef struct Student { long num; // 学号 char name[MAX_LEN]; // 姓名 float score[COURSE_NUM]; // 多门课程的成绩 float sum; //每个学生的总分 float aver; // 平均成绩 }STU; 3.算法设计 排序算法:选择排序实现按平均分排序。 查询算法:线性查找实现按学号/姓名查询。 、系统实现 1.主函数流程 int main(void) { char ch; int n = 0,m = 0; STU stu[STU_NUM]; printf("Input student number(n<%d):",STU_NUM); scanf("%d",&n); printf("Input course number(m<=%d):",COURSE_NUM); scanf("%d",&m); while(1) { ch = Menu(); //显示菜单,读取用户输入 switch(ch) { case 1 : ReadScore(stu,n,m); break; case 2: AverSumofEveryCourse(stu,n,m); break; case 3: AverSumofEveryStudent(stu,n,m); break; case 4: SortbyScore(stu,n,m,Descending); printf("\nSort in descending order by score:\n"); PrintScore(stu,n,m); break; case 5: SortbyScore(stu,n,m, Ascending); printf("\nSort in ascending order by score:\n"); PrintScore(stu,n,m); break; case 6: AsSortbyNum(stu,n,m); printf("\nsort in ascending order by number:\n"); PrintScore(stu,n,m); break; case 7: SortbyName(stu,n,m); printf("\nSort in dictionary order by name:\n"); PrintScore(stu,n,m); break; case 8: SearchbyNum(stu,n,m); break; case 9: SearchbyName(stu,n,m); break; case 10:StatisticAnalysis(stu,n,m); break; case 11:PrintScore(stu,n,m); break; case 12:WritetoFile(stu,n,m); break; case 13:ReadfromFile(stu,&n,&m); break; case 0:printf("End of program!"); exit(0); default:printf("Input error!"); } } return 0; } 2.各功能函数实现 (1)输入每个学生的学号、姓名若干门课程考试成绩(2)计算每门课程的总分平均分; (3)计算每个学生的总分平均分; (4)按每个学生的总分由高到低排出名次表; //按选择法将结构体数组stu的元素按总分升()序排序 void SortbyScore(STU stu[],int n,int m,int (*compare)(float a,float b)) { int i,j,k,t; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) { if((*compare)(stu[j].sum,stu[k].sum)) k=j; } if(k!=i) { //说明:可整体交换两个结构体数组元素,也可以数组元素各成员逐一交换 } } } //使数据按升序排序 int Ascending(float a,float b) { return a<b; //这样比较决定了按升序排序,如果a<b, 则交换 } //使数据按降序排序 int Descending(float a,float b) { return a>b; //这样比较决定了按降序排序,如果a>b、则交换 } (5)按每个学生的总分由低到高排出名次表; (6)按学号由小到大排出成绩表; (7)按姓名的字典顺序排出成绩表; (8)按学号查询学生排名及其考试成绩(9)按姓名查询学生排名及其考试成绩(10)按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比; (11)输出每个学生的学号、姓名、各科考试成绩,以及总分平均分; (12)将每个学生记录信息写入文件; (13)从文件中读出每个学生记录信息显示; 五、测试与调试 1.测试用例 正常输入:输入有效学号、姓名及成绩,验证排序与查询功能。 异常输入:输入非数字成绩,验证错误提示机制。 说明: 1)可以使用多张测试用例表,对不同的功能模块进行测试。在测试用例表中给出正常与异常的测试数据进行功能测试。 2)也可以给出正常或异常测试的运行结果截图 2.调试问题 文件读写错误:文件路径错误→统一使用相对路径检查权限。
最新发布
06-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值