您的位置:首页 > 其它

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

2017-03-15 11:16 183 查看
谭浩强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));//累计每个学生的各科
4000
成绩
//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]);
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐