数组与函数的综合应用

本文详细介绍了C语言中数组和函数的基础知识,包括数组的初始化、引用以及函数的定义和调用。通过实例展示了如何在函数中使用数组,探讨了数组作为函数参数时的大小问题,并提供了计算数组元素个数的方法。此外,还提供了一个完整的学生成绩分析程序,包括初始化数组、获取最大值、最小值和平均分的功能。
摘要由CSDN通过智能技术生成

基础回顾

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
运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会编程的小江江

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值