昨天我么们初步地学习了数组(一维数组)的基本概念,那么我们今天继续学习昨天的内容,那么今天要求大家需要达到的学习目标为:
- 求数组的和、平均值
- 求数组元素的最大值、最小值
- 求数组元素的最大值下标、最小值下标
- 进行数组元素的逆置
- 数组元素迁移、变换、求百分比等等
话不多说我们直接开始今天的学,那么我们今天的第一个学习就从下面这个例子开始。
- 数组元素的求和、求平均
例:定义一个长度为5的整形数组,输入5个元素,输出5个元素,求所有元素之和,求平均值。
分析:
1、我们在这以前先复习一下昨天的内容,数组是一个可以存储多个数据的容器,
接着我们对容器内的数据进行累加如下所示:
2、常规表示:sum=a[0]+a[1]….+a[5]; 值得注意的是累加是一个循环的过程,可以进行循环操作 (注意要从[ ]内应该是从0开始)
3、循环表示:for(i=0;i<5;i++){ sum+=a[i] };而这里的i也是从0开始,到5结束刚好是5个数据。
4、用求出的数据来求平均值。
- 求数组元素的最大值、最小值
例:定义一个长度为5的整形数组,存储5个不同数据,求出其中值最高的数据和最低的数据
分析:
1、首先我们根据我们之前学习C语言入门的时候我们有过类似的求最大最小值(不了解或者忘记的的可以先看前面的复习一下),我们需要设置一个最大值max用来存储最大的那个值
2、假设数组中的第一个元素为最大值,max=a[0] (最小值同理min=a[0])
3、进行逐一比较 if(max<a[i]){ max=a[i] ;}(需要在循环内完成该过程)(最小值同理” if(a[min]>a[i]){ min=a[i] } ”)
- 求数组元素的最大值下标、最小值下标
例:定义一个长度为10的整形数组,输入元素、输出元素、输出最大值和最小值下标
分析:
- 与求最大值和最小值比较相似,我们先设置只一个最大值下标的变量为max,用于存储最大值的下标
- 假设数组中第一个下标对应值为最大值,max=0
- 最后进行逐一比较 if(a[max]<a[i]){ max=i; } (需要再循环内完成该过程)
- 数组的逆置
数组的逆置是第一个元素和最后一个元素交换,第二个元素和倒数第二个元素交换……如下图所示:
分析:
- 交换过程是循环的过程,n个数交换次数就是n/2
- 循环的三要素如下(1、初始值 i=0 2、条件 i<n/2 步长值 i++)
- 循环体( t=a[i]; a[i]=a[n-1-i]; a[n-1-i]=t; ) (长度为n最大值的下标就是n-1,两下标相加和为最大下标n-1)
- 数组元素迁移、变换、求百分比
这些我在之前的文章讲解比较深,这里不做过多了解,我给大家整理归类了一下,可以自行参考:
1、输出
①正序输出
for(i=0; i<n; i++)
{
printf("%d " , a[i]);
}
②逆序输出
for(i=n-1; i>=0; i--)
{
printf("%d " , a[i]);
}
③从第p个位置到第q个位置输出
for(i=p-1; i<q; i++)
{
printf("%d " , a[i]);
}
④输出第p个和第q个元素之和
printf("第%d个和第%d个元素之和是%d" , p , q , a[p-1]+a[q-1]);
2、求和
①所有元素
int sum=0;
for(i=0; i<n; i++)
{
sum = sum + a[i];
}
②满足条件的元素求和
for(i=0; i<n; i++)
{
if(条件)
{
sum = sum + a[i];
}
}
3、平均值
①所有元素平均值
float sum=0 , avg;
for(i=0; i<n; i++)
{
sum = sum + a[i];
}
avg = sum / n;
②满足条件的元素求平均值
for(i=0; i<n; i++)
{
if(条件)
{
sum = sum + a[i];
count++;
}
}
avg = sum / count;
5、最值 及 位置
①所有元素的最值及位置
max=min=a[0];
maxxb=minxb=0;
for(i=0; i<n; i++)
{
if(max<a[i])
{
max=a[i];
maxxb=i;
}
if(min>a[i])
{
min=a[i];
minxb=i;
}
}
②【满足条件】的元素最值及位置 【先判断条件,满足则max=min=a[i]】
for(i=0; i<n; i++)
{
if(条件)
{
count++;
if(count==1)
{
max=min=a[i];
maxxb=minxb=i;
}
if(max<a[i])
{
max=a[i];
maxxb=i;
}
if(min>a[i])
{
min=a[i];
minxb=i;
}
}
}
6、逆置——第一个和最后一个元素交换、第二个和倒数第二个交换……
①投机取巧(直接逆序输出) 【原数组不变】
for(i=n-1; i>=0; i--)
{
printf("%d ",a[i]);
}
②首尾交换 【真正的逆置,原数组变了】
n个元素,下标从0到n-1
a[0] 和 a[n-1]
a[1] 和 a[n-2]
a[2] 和 a[n-3]
a[i] 和 a[n-1-i]
for(i=0; i<n/2; i++)
{
t = a[i];
a[i] = a[n-1-i];
a[n-1-i] = t;
}
7、数组变换
变换的是数组元素,所以一定要对数组元素进行赋值
for(i=0; i<n; i++)
{
if(a[i]%2==0)
{
a[i] = a[i]+1;
}
else
{
a[i] = a[i]*2;
}
}
//变换规则:每个元素都等于 数组长度 减去 对应下标
for(i=0; i<n; i++)
{
a[i] = n - i;
}
8、迁移新数组
int b[100] , k=0; //k是新数组b的长度 也是下标 要初始化为0
for(i=0; i<n; i++)
{
if(条件)
{
b[k] = a[i];
k++;
}
}
那么到这里我们也就完成今天的学习了希望各位朋友可以自己好好理解一下,我还是会和往常一样将思维导图放在下边,大家可以自行参考,谢谢!