数组与函数的综合应用
基础回顾
1.数组基础知识回顾
int array[10]; //无初始化的数组,仅仅申请了10个整型数的内存,最好初始化:int array[10]={0};
int array2[3]={1,2,3}; //有初始化的数组,完整初始化,数组申请了三个整型数的内存,并赋值1,2,3
int array3[10]={1,2,3}; //有初始化的数组,但不完整,数组申请了100个整型的内存空间
//但只赋值三个数1 2 3,放在数组前三个位置
int n;
n=10;
int array4[n]; //实际可使用,但教材、考试中认为非法;
//数组通过下标来引用某个元素,从0开始
//数组的中括号[]只有在定时时才表示数组大小,其余任何情况,都表示用下标来访问数组
printf("array2 的第一个元素是:%d\n",array2[0]);
//通过循环遍历数组
for(int i=0;i<3;i++){
printf("array2中第%d个数:%d\n",i+1,array2[i]);
}
2.函数基础知识回顾
//自定义函数的结构
/*
函数返回类型 函数名(形参1;形参2;......形参n)
{
函数体
}
*/
常见自定义函数的几种类型
void begin() //无参数、无返回类型
{
printf("****start****\n");
}
void PingFang(int i) //有参数、无返回类型
{
printf("%d的平方为:%d\n",i,i*i);
}
//单片机软件延时函数用了以上两种方法
int add(int i,int j)
{
int sum,y;
y=2*i+j;
sum=i+j;
return i+j; //把函数执行的结果返回给调用者
}
//如果调用的函数有参数,必须传参!!
//调用的时候。传递的参数叫实际参数,对格式没有要求,对数据类型严格要求
//1.形式参数,作用域仅限于该函数
//2.形式参数,也是一个变量,局部变量,有自己的内存空间
/*
空间生存期和死亡期
何时申请了空间
当该函数被调用的时候,才申请了该内存的空间,才有了这个变量
同时空间内的数据被赋值变成实际参数的值,函数调用把实际参数的值拷贝一份给形式参数
何时释放了该空间
函数执行结束后,该空间由内部管理单元自动回收(释放)
*/
int main()
{
int i=10,j=5,sum;
sum=add(i,j);
printf("%d\n",sum);
return 0;
}
//看懂一个函数
//1.参数怎么传+参数的类型、参数的个数
//2.函数的返回值 返回值的类型
//3.功能 函数名
数组与函数综合
1.初步实现
#include<stdio.h>
void fun(int data[3])
{
int i;
for(i=0;i<3;i++){
printf("%d\n",data[i]);
}
}
int main()
{
int score[3]={90,88,93};
//数组和函数结合,数组名当做实际参数
fun(score);
}
2.问题引入与解决
问题提出1:如何计算数组中元素的个数
解:个数=数组总大小/一个类型的大小
//有何异同
int a[3]; //一个int型占用空间4个字节,三个占用空间12个字节
char b[3]; //一个char型占用空间1个字节,三个占用空间3个字节
//同:数组元素个数为3
//异:数组类型不同,数组内存大小不同
//计算所占内存大小
printf("数组a的大小:%d\n",sizeof(a));
printf("int 型所占内存大小:%d\n",sizeof(int));
//问题提出1:如何计算数组中元素的个数
//解:个数=数组总大小/一个类型的大小
printf("数组a的个数为:%d",sizeof(a)/sizeof(a[0])); //sizeof(a)/sizeof(int)
问题提出2:数组在函数中的大小
void fun(int data[3])
{
printf("in fun 数组data的个数为:%d\n",sizeof(data)/sizeof(int));
for(i=0;i<3;i++){
printf("### %d\n",data[i]);
}
}
printf("in fun data的大小为:%d\n",sizeof(data));
printf("in fun int的大小为:%d\n",sizeof(int));
小结:
形参中,虽然写的是一个数组的样子,但其中的数字是无效的!!!
不管中括号中写多少,都不能代表形参的数组有多大,甚至可以省略
void fun(int data[ ])
这里的中括号的作用仅仅用来表示,该参数是一个(地址!)
问题提出3:形参大小不变,i边界很难控制
解决方法:引入第二个参数:n(表示数组大小)
//数组传参打印通用函数
//第一个参数是数组的首地址,第二个参数是数组的个数
void fun(int data[10],int n)
{
int i;
for(i=0;i<n;i++){
printf("%d\n",data[i]);
}
}
调用:fun(score,sizeof(score)/sizeof(score[0]));
fun(&score[0],sizeof(score)/sizeof(score[0]));
综合应用典例
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//自定义函数的声明
void InitArray(int score[] , int size);
int GetMax(int score[] , int size);
int GetMin(int score[] , int size);
float GetAve(int score[] , int size);
void GetRes(int num1 , int num2 , float num3);
int main()
{
int score[5],i,max,min,total=0;
float ave;
int len=sizeof(score)/sizeof(score[0]);
//1.初始化数组
InitArray(score,len);
//找到最高分
max=GetMax(score,len);
//找到最低分
min=GetMin(score,len);
//算出平均分
ave=GetAve(score,len);
//输出结果
GetRes(max,min,ave);
system("pause");
return 0;
}
void InitArray(int score[] , int size)
{
int i;
printf("***************学生成绩分析*************\n");
printf("******成绩输入********\n");
for(i=0;i<size;i++)
{
printf("请输入第%d个学生的成绩:",i+1);
scanf("%d",&score[i]);
if(score[i]>100 || score[i]<0)
{
printf("你输的是成绩吗??!\n不给你用了\n");
system("pause");
exit(0);
}
}
printf("******成绩输出********\n");
for(i=0;i<size;i++)
printf("第%d个学生的成绩为:%d\n",i+1,score[i]);
}
int GetMax(int score[] , int size)
{
int max,i;
max=score[0];
for(i=0;i<size;i++)
{
if(score[i]>max)
max=score[i];
}
return max;
}
int GetMin(int score[] , int size)
{
int min,i;
min=score[0];
for(i=0;i<size;i++)
{
if(score[i]<min)
min=score[i];
}
return min;
}
float GetAve(int score[] , int size)
{
int total,i;
float ave;
total=0;
for(i=0;i<size;i++)
{
total+=score[i];
}
ave=(float)total/size;
return ave;
}
void GetRes(int num1 , int num2 , float num3)
{
printf("最高分:%d\n",num1);
printf("最低分:%d\n",num2);
printf("平均分:%.2f\n",num3);
}
运行环境:DEV-C++ 5.11
运行结果: