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

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

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

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值