C:编程练习3:一维数组批量处理数据 11.1

mac2024-11-11  11

//数组收纳问题的编程套路是(设收纳到数组 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]分别保存最大值最小值。

循环体内容就是求出本次循环中的最大值和最小值,放到对应的位置。

最新回复(0)