哪位大佬能帮看看这道c语言?

/*利用指针编写程序,定义一维整型数组a[50]和b[3],从键盘输入正整数m(m的值小于等于47),然后从键盘输入m个整数赋值给a的前m个元素,假设输入的数据是从小到大... /*利用指针编写程序,定义一维整型数组a[50]和b[3],从键盘输入正整数m(m的值小于等于47),然后从键盘输入m个整数赋值给a的前m个元素,假设输入的数据是从小到大排好序的,再输入3个整数赋值给b的元素,同样假设输入的数据是从小到大排好序的,将数组b中的元素合并到数组a中,要求合并后的结果同样是按照从小到大排好序的要求:不允许引入第3个数组;合并完成后即是排好序的,不能先随便合并,然后使用排序算法对数组a中的元素进行排序举例:输入:m: 3a: 1 3 6b: 3 4 5输出:a: 1 3 3 4 5 6*/ 展开
 我来答
自我编程
2020-04-30 · 科技优质答主
自我编程
采纳数:1481 获赞数:4279

向TA提问 私信TA
展开全部

按题意,既利用指针将b中每个元素按照升序插入到a数组对应位置。

思路:

a,b都是默认输入升序的数(题目没要求验证,我的代码也不验证,请按升序输入,如需验证升序输入,只需定义一个变量记录输入的数字,并在下次循环输入时比大小。)

所以,定义2个指针分别指向a,b最后一个输入的元素地址,嵌套循环,分别往前移动,同时比较两数组元素,每次找到对应位置就将a移位并插入b的位置。

ps:由于存在b小于a的所有元素这种特殊情况,循环外还有a数组全部后移的情况。故位移写成单独函数,符合编程习惯。

下面是代码:

#include <stdio.h>

void move1(int *bp,int a[],int len)//从bp开始往后移动1位

{

    int *ep=&a[len-1];

    if(bp>=a && bp<=ep)

        while(ep>bp)//a当前元素之后的元素向后移1位

        {

            *ep=*(ep-1);

            ep--;

        }

}

int main()

{

    int i=0,m=50,a[50],b[3],*pa=NULL,*pb=&b[2],flag;

    while(m>47) printf("请输入m值(>=47):"),scanf("%d",&m);

    printf("请给a数组输入%d个整数(确保升序排列,输入无验证!):\n",m);

    i=m;

    while(i--) scanf("%d",&a[m-i-1]);

    printf("请给b数组输入3个整数(确保升序排列,输入无验证!):\n"),scanf("%d%d%d",&b[0],&b[1],&b[2]);

    while(pb>=b)//从b最大数开始

    {

        pa=&a[m-1];//初始指向a最大数

        while(pa>=a)//从a最大数开始

        {

            flag=0;

            if(*pa<=*pb)//找到第一个a小于等于b,就把b元素插入到a元素后面(a移位)

            {

                flag=1;

                move1(pa+1,a,50);//a当前元素之后的元素向后移1位

                 *(pa+1)=*pb;

                break;

            }

            pa--;

        }

        if(!flag)//如未发生位移,说明该b元素小于所有a元素,插入再a数组开始位置,a所有元素后移1位

            move1(a,a,50),a[0]=*pb;

        pb--;

    }

    pa=a;

    printf("合并后的a数组为:\n");

    while(pa<=&a[m+3-1]) printf("%d ",*pa++);

    return 0;

}

追问
谢谢
KlarkKenter
2020-04-30 · TA获得超过1679个赞
知道小有建树答主
回答量:1540
采纳率:0%
帮助的人:348万
展开全部

简单粗暴思路:直接将b数组的数字放到a数组m到m+2位置,然后对长度m+3的a数组进行排序。

#include "stdafx.h"

#include <iostream>

using namespace std;

void swap(int*p, int*q);

int main()

{

int a[50], b[3],m;

int *p, *q;

p = a;

q = b;

cout << "m:";

cin >>m;

cout <<"a:";

for (int i = 0; i < m; i++)

cin >> *(p+i);

cout  << "b:";

for (int i = 0; i < 3; i++)

{

cin >>*(q+i);

*(p+m+i)=*(q+i);

}

for (int i = 0; i < m + 3; i++)

cout << *(p + i)<<" ";

cout << endl;

for (int i = 0; i < m + 3; i++)

{

for (int j = 0; j < m + 3 - i; j++)

if (*(p + i) > *(p + i + j))

swap(p + i, p + i + j);

}

for (int i = 0; i < m + 3; i++)

cout << *(p + i)<<" ";

cout << endl;

system("pause");

    return 0;

}

void swap(int*p, int*q)

{

int temp;

temp = *p;

*p = *q;

*q = temp;

}

追问
忘记说了……老师的作业要求上说着不能先移进去再排序,谢谢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式