谭浩强4版 8.15题 指针指向数组元素,相对位置计算

该博客主要解析谭浩强C语言第四版中的第8.15题,涉及如何使用指针操作数组来解决实际问题。内容包括计算一班四名学生五门课程的第一门课程平均分,找出多门课程不及格的学生及其信息,以及查找平均成绩超过90分或所有课程均在85分以上的学生。通过这道题目,重点在于理解指针相对于数组元素地址的变化计算。
摘要由CSDN通过智能技术生成

谭浩强4版 8.15题

一个班4个学生5门课程

1.求第一门课程的平均分;

2.找出有两门以上课程不及格的学生,输出学号和群不课程成绩及平均成绩;

3.找出平均成绩在90分以上或全部课程成绩在85分以上学生;



/***********综合考察指向数组元素的指针,要先算出元素地址变化的相对量*****/



#include<stdio.h>
int main()
{
 void avsco(float *,float *);//每个学生的平均成绩
 void avcour1(char (*)[10],float *);//课程一的平均成绩
 void fail2(char course[5][10],int num[],float *pscore,float aver[4]);//不及格
 void good(char course[5][10],int num[4],float *pscore,float aver[4]);//优秀
 int i,j,num[4],*pnum;//编号码是整型数据;
 float score[4][5],*pscore,*paver,aver[4];//分数都为float类型数据;
 char (*pcourse)[10],course[5][10];//course用于存放课程名字(字符串),定义指向包含10个元素的一维数组的指针变量pcourse
 printf("please input course:\n");
 pcourse=course;//指向包含10个元素的一维数组的指针变量pcourse赋初值(数组第一行的其实位置):第一门课程名(字符串)的第一个字母的首地址
 for(i=0;i<5;i++)
  scanf("%s",&course[i]);//输入5门课程的名字
 printf("input NO. and score:\n");
 printf("NO.");
 for(i=0;i<5;i++)
printf(",%s\t",course[i]);
 printf("\n");
 pnum=&num[0];
 pscore=&score[0][0];//指向数组元素的指针
 //pscore=score[0];
 
 for(i=0;i<4;i++)
 {
  scanf("%d",pnum+i);//这是对每一个人进行编号;只需要给四个值;所以只能放在此处;
  for(j=0;j<5;j++)
   scanf("%f",pscore+5*i+j);
  //指向数组元素的指针在输出某一个制定的数值元素时,
  //应该事先计算该元素在数组中的相对位置(即相对于数组起始位置的相对位移量,a[i][j]的相对位置:i*m+j,其中,m为列数值)
 }
 paver=&aver[0];//四个人平均分存放的地址,首地址赋给paver
 printf("\n\n");
 avsco(pscore,paver);//将分数的地址,存放平均分的地址传入函数,计算四个人的平均分
 avcour1(pcourse,pscore);//将课程名存放的地址,分数存放的地址传入函数,计算第一门课程的平均分
 printf("\n\n");
 fail2(pcourse,pnum,pscore,paver);//将课程名存放地址,编号存放地址,分数存放地址,平均分存放地址传入函数,找出有两门不及格的学生
 printf("\n\n");
 good(pcourse,pnum,pscore,paver);//将将课程名存放地址,编号存放地址,分数存放地址,平均分存放地址传入函数,找出优秀学生(每一门85+或者平均分90+)
 return 0;
}


void avsco(float *pscore,float *paver){//计算4个学生的平均成绩
int i,j;
float sum,average;
for(i=0;i<4;i++)
{
sum=0;
for(j=0;j<5;j++)
sum=sum+(*(pscore+i*5+j));//累计每个学生的各科成绩
//sum=sum+*(*(pscore+i)+j);
average=sum/5;
*(paver+i)=average;
}
}


void avcour1(char(*pcourse)[10],float *pscore){//第一门课程的平均分
int i;
float sum,average1;
sum=0.0;
for(i=0;i<4;i++)
sum=(*(pscore+i*5));//第一门课程分数的地址,累计第一门课程每个学生的成绩
//sum=sum+*(*(pscore+i));
average1=sum/4;
printf("course1:%s average score :%7.2f\n",*pcourse,average1);
}
void fail2(char course[5][10],int num[],float *pscore,float aver[4]){//两门以上课程不及格的学生

int i,j,k,label;
printf("==================Student who is fail in two couses===================/n");
printf("NO.");
for(i=0;i<5;i++)
printf("%s\t",course[i]);//因为要用course[i]输出课程名称
printf("average/n");
for(i=0;i<4;i++)
{
label=0;//每个人的不及格的course 计数;
for(j=0;j<5;j++)
if(*(pscore+5*i+j)<60) label++;//累计每个学生小于60的数量
if(label>=2)//只能在label>=2中输出每个人的成绩和平均分;
{
printf("%d",num[i]);
for(k=0;k<5;k++)
printf("%11.2f",*(pscore+5*i+k));//输出这个人的课程成绩;
printf("%11.2f",aver[i]);//平均分
}
}
}


void good(char course[5][10],int num[4],float *pscore,float aver[4])
{
int i,j,k,n;
printf("================Students whose score is good========\n");
printf("NO.");
for(i=0;i<5;i++)
printf("%s\t",course[i]);
printf("average/n");
for(i=0;i<4;i++)
{
n=0;//对每个人的成绩大于85计数;初值给0;
for(j=0;j<5;j++)
if(*(pscore+5*i+j)>85) n++;//累计每个学生成绩》85的个数
if((n==5)||(aver[i]>90))//满足两个条件之一即可
{
printf("%d",num[i]);
for(k=0;k<5;k++)
printf("%11.2f",*(pscore+5*i+k));
printf("%11.2f\n",aver[i]);
}
}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值