您的位置:首页 > 编程语言 > C语言/C++

C语言提高-第24/25讲: 数组名【指针】作为函数参数(成绩处理函数版)

2017-10-21 20:37 429 查看
任务和代码:

成绩处理”是该功能不用函数的实现。本项目要求输入、求最大/小值等所有功能都通过自定义函数完成。

/*
*All rights reserved
*文件名称:main.c
*作者: Osseyda
完成日期:2017.10.21
*版本号:v2.
*/
#include <stdio.h>
#include <math.h>
void input_score(int *,int);       //将小组中n名同学的成绩输入数组s
int get_max_score(int *,int);      //返回数组s中n名同学的最高成绩值
int get_min_score(int *,int);      //返回数组s中n名同学的最低成绩值
double get_avg_score(int *,int);   //返回数组s中n名同学的平均成绩值
double get_stdev_score(int *,int); //返回数组s中n名同学成绩值的标准偏差
int count(int,int *,int);          //返回在数组s中n名同学中有多少人得x分(实参给出最高/低时,可以求最高/低成绩的人数)
void output_index(int,int *,int);  //在函数中输出数组s中n名同学中得x分的学号(下标)

int main( )
{
int score[50];                 //将score设为局部变量,通过数组名作函数参数,传递数组首地址,在函数中操作数组
int num;                       //小组人数也设为局部变量,将作为函数的实际参数
int max_score,min_score;
printf("小组共有多少名同学? ");
scanf("%d",&num);
printf("请输学生成绩:\n");
input_score(score,num);       //要求成绩在0-100之间
max_score=get_max_score(score,num);
printf("最高成绩为:%d,共有 %d 人\n", max_score,count(max_score,score,num ));
min_score=get_min_score(score,num);
printf("最低成绩为:%d,共有 %d 人\n", min_score,count(min_score,score,num ));
printf("平均成绩为:%.2f\n", get_avg_score(score,num));
printf("标准偏差为:%.2f\n",get_stdev_score(score,num));
printf("获最高成绩的学生(学号)有:");
output_index(max_score,score,num);
printf("\n获最低成绩的学生(学号)有:");
output_index(min_score,score,num);
printf("\n");
return 0;
}

void input_score(int *p,int n){
int i=0;
do{
printf("请输入第 %d 位同学的成绩:",i);
scanf("%d",p+i);
if(*(p+i)<0||*(p+i)>100)
continue;

4000
i++;
}while(i<n);
printf("\n");
}

int get_max_score(int *p,int n){
int max=*p,i;
for(i=0;i<n;i++){
if(max<*(p+i))
max=*(p+i);
}
return max;
}

int get_min_score(int *p,int n){
int min=*p,i;
for(i=0;i<n;i++){
if(min>*(p+i))
min=*(p+i);
}
return min;
}

int count(int m,int *p,int n){
int i,s=0;
for(i=0;i<n;i++){
if(*(p+i)==m)
s++;
}
return s;
}

double get_avg_score(int *p,int n){
int i;
double sum=0;
for(i=0;i<n;i++)
sum+=*(p+i);
return sum/n;
}

double get_stdev_score(int *p,int n){
int i;
double sumSquare=0;
for(i=0;i<n;i++)
sumSquare+=(*(p+i)-get_avg_score(p,n))*(*(p+i)-get_avg_score(p,n));
return sqrt(sumSquare/(n-1));
}

void output_index(int m,int *p,int n){
int i;
for(i=0;i<n;i++){
if(m==*(p+i))
printf("%d ",i);
}
}


运行结果:



知识点总结:

       对前一篇理论知识的实战

心得:

       原来的第92行是:

sumSquare+=(*(p+i)-get_avg_score(*p,n))*(*(p+i)-get_avg_score(*p,n));
       系统在运行完平均成绩后发生崩溃,于是我进行了调试,并第一次遇见了调用堆栈的对话框:

      


       通过查找资料得知:崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。

       经过排查,了解到数组名作为实参的时候出了问题,正解应是数组名后没有[],相应的,指针作为函数实参时,前面也没有*

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