//数组收纳问题的编程套路是(设收纳到数组 a 中):
j=0;
for (循环a中所有数据)
if (某个数据符合收纳条件)
a[j++]=该数据; //符合条件的又放到了a数组中,也可以放到别的数组里
// 已收纳数据个数为:j(下一可用空间是a[j])
//数组多元素删除问题的编程套路是(设删除数组 a 中的一些元素, 数组 a 中原有 N 个元素):
j=0;
for (i=0; i<N; i++)
if (要保留a[i])
a[j++]=a[i]; //也可以放到别的数组里,这样=左侧就写别的数组名
//删除后数组a中剩余数据个数为:j(下一可用空间是a[j])
多元素删除与数组收纳 实质属同一问题;多元素删除,就是将保留元素收纳到同一数组。
数组长度均定义N
比如:#define N 10
1、对数组中的奇数保留,偶数删除,并统计奇数个数。
例:数组a中原有1,2,3,4,5,6,7,8;操作后数组共有4位奇数,数组的前4项是1,3,5,7,输出奇数和奇数个数。
【解析】套用上方公式
2、逆序:假设数组原有3,6,2,5,8,逆序后则为:8,5,2,6,3,输出初始序列和逆序后的序列。
【解析】假设有N个数要逆序,则a[0]和a[N-1]互换,a[1]和a[N-2]互换,找下互换元素的下标规律,循环次数应该是N的一半。
3、数组a中存放了N个同学的成绩,将大于平均值成绩的值存放到数组b中。
【解析】可以先把大于平均分的放到另一个数组b,套用最上方公式将低于平均分的前移,然后再把b中的数据移动回来。
4、计算数组中N个数的平均值(均为正数),将小于平均值的数放到数组前部,大于等于平均值的数放到数组后部。
例如:46 30 32 40 6 17 45 15 48 26
平均值:30.5000000
移动后:30 6 17 15 26 46 32 40 45 48
【解析】先求出平均分,再套用最上方公式。
1-4题代码:
/*1、对数组中的奇数保留,偶数删除,并统计奇数个数。
例:数组a中原有1,2,3,4,5,6,7,8;操作后数组共有4位奇数,数组的前4项是1,3,5,7,输出奇数和奇数个数。*/
#include "stdio.h"
#define N 8 //用这种方式定义数组长度
main()
{
int a[N],i,j=0;
printf("请输入%d个数据:\n",N);
for(i=0;i<N;i++)//输入数组元素
scanf("%d",&a[i]);
for(i=0;i<N;i++)
if(a[i]%2!=0)
a[j++]=a[i];
printf("奇数个数有%d个:\n",j);
for(i=0;i<j;i++)//输出数组元素
printf("%d ",a[i]);
}
/*2、逆序:假设数组原有3,6,2,5,8,逆序后则为:8,5,2,6,3,输出初始序列和逆序后的序列。
【解析】假设有N个数要逆序,则a[0]和a[N-1]互换,a[1]和a[N-2]互换,找下互换元素的下标规律,循环次数应该是N的一半。*/
#include "stdio.h"
#define N 5 //用这种方式定义数组长度
main()
{
int a[N],i,t;
printf("请输入%d个数据:\n",N);
for(i=0;i<N;i++)//输入数组元素
scanf("%d",&a[i]);
for(i=0;i<N/2;i++)
{
t=a[i];
a[i]=a[N-1-i];
a[N-1-i]=t;
}
printf("逆序后的数据是:\n");
for(i=0;i<N;i++)//输出数组元素
printf("%d ",a[i]);
}
/*3、数组a中存放了N个同学的成绩,将大于平均值成绩的值存放到数组b中。
【解析】可以先把大于平均分的放到另一个数组b,套用最上方公式将低于平均分的前移,然后再把b中的数据移动回来。*/
#include "stdio.h"
#define N 6 //用这种方式定义数组长度
main()
{
int a[N],b[N],i,j=0;
float ave,sum=0;
printf("请输入%d个数据:\n",N);
for(i=0;i<N;i++)//输入数组元素
scanf("%d",&a[i]);
for(i=0;i<N;i++) //求和
sum+=a[i];
ave=sum/N; //求平均值
for(i=0;i<N;i++) //套用公式
if(a[i]>ave)
b[j++]=a[i];
printf("大于平均值的元素有%d个:\n",j);
for(i=0;i<j;i++)//输出数组元素
printf("%d ",b[i]);
}
/*4、计算数组中N个数的平均值(均为正数),将小于平均值的数放到数组前部,大于等于平均值的数放到数组后部。
例如:46 30 32 40 6 17 45 15 48 26
平均值:30.5000000
移动后:30 6 17 15 26 46 32 40 45 48
【解析】先求出平均分,再套用最上方公式。*/
#include "stdio.h"
#define N 10 //用这种方式定义数组长度
main()
{
int a[N],b[N],i,j=0,k=0;
float ave,sum=0;
printf("请输入%d个数据:\n",N);
for(i=0;i<N;i++)//输入数组元素
scanf("%d",&a[i]);
for(i=0;i<N;i++) //求和
sum+=a[i];
ave=sum/N; //求平均值
for(i=0;i<N;i++) //套用公式,不合格的元素放到b中,合格的放到a中
{
if(a[i]<ave)
a[j++]=a[i];
else
b[k++]=a[i];
}
for(i=0;i<k;i++) //b中元素拷贝回a数组后续部分
a[j++]=b[i];
printf("小于平均值的数放到数组前部,大于等于平均值的数放到数组后部:\n");
for(i=0;i<N;i++)//输出数组元素
printf("%d ",a[i]);
}//本题也可以用小大排序,虽然跟示例结果的位置有些不同,但是不重要,题意是满足的,不过排序用了循环嵌套,算法时间复杂度比现在的大,意味着耗费时间多。
5、数组长度是N,将数组的前n位数移动到数组的后面(n<N,由键盘输入)
例如:1 2 3 4 5 6 7 8 , n=3
则结果是:4 5 6 7 8 1 2 3
【解析】可以将前n位比如1,2,3先保存到另一个数组,剩下的前移,再把123保存到原数组末尾
6、数组长度是N,将数组的前一半的数和后一半数交换,若N为奇数,则中间元素不动。
例如:1 2 3 4 5 6 7 8 9
则结果是: 6 7 8 9 1 2 3 4
【解析】:这个跟逆序还不同,但类似,比逆序多个步骤,假设长度是N的数组,那么,先找到与a[0]交换的元素,自己找下规律,循环次数也是N/2
7、将数组a中最小的值放到a[0]中,最大的值放到a[1]中,次小的放到a[2],次大的值放到a[3],类推。
例如:9、1、4、2、3、6、5、8、7
移动后:1、9、2、8、3、7、4、6、5
【解析】:最外层循环中,for(i=0;i<N-1;i+=2),每次循环i自增2,这样第一次循环a[0]a[1]分别保存最大值最小值。
循环体内容就是求出本次循环中的最大值和最小值,放到对应的位置。