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

/*利用指针编写程序,定义一维整型数组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*/

按题意,既利用指针将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;

}

追问

谢谢

温馨提示:内容为网友见解,仅供参考
第1个回答  2020-04-30

简单粗暴思路:直接将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;

}

追问

忘记说了……老师的作业要求上说着不能先移进去再排序,谢谢

哪位大佬能帮看看这道c语言?
a,b都是默认输入升序的数(题目没要求验证,我的代码也不验证,请按升序输入,如需验证升序输入,只需定义一个变量记录输入的数字,并在下次循环输入时比大小。)所以,定义2个指针分别指向a,b最后一个输入的元素地址,嵌套循环,分别往前移动,同时比较两数组元素,每次找到对应位置就将a移位并插入b的...

哪位大佬能解答一下这道C语言填空,谢谢。
ge = year%10;

这道C语言怎么写?麻烦大佬了
代码没错,更严谨的话应该把sqrt(m+1)改为sqrt(m)我运行是没问题的:如上图所示,成功输出了所有的素数 所以应该是编译器的问题,可以搜索下错误提示具体看看是什么原因 实在不行就重装Visual Studio或者换其他的编译器 其实一些简单的代码在网上随便搜一个在线编译的平台都可以跑,比如python123.io ...

C语言求助,哪位大佬帮我看看这道题?一直搞不清楚
printf("%8s%6s%6s%11s\\n",a[i].xm.c_str(),a[i].xb.c_str(),a[i].nl.c_str(),a[i].dh.c_str()); cout<<"共计 "<<top<<" 人\\n"; getchar(); getchar();}void sc(){ ofstream outf; outf.open("通讯录.xls"); outf<<"姓名\\t性别\\t年龄\\t电话\\n"; for(int i=1; ...

求大佬帮我看下这道c语言题
int c[2][3];表示c有2排3列,c语言中数组下标从0记起,c[2][1]相当于c的第3排第2列,属于越界操作,使用了c后面的第2个int 按照一般的规则来说c后面的第二个int应该是j,循环过后j的值为3,打印出来的应该是3 但一些编译器生成的栈中变量的顺序、间隔以及未初始化区域的默认值都有差异...

请问一下大佬们,这道C语言编程题我为什么错,还有这些监测点的划分依据是...
这段代码的问题在于图中红色框内jc数据类型不合适,不能定义为int,需为double。解释:C语言中一般int为32位,最大只能表示12的阶乘,超过12就会产生溢出,而题目中明确说明了数据会在double范围内,就是有可能超过int所表示范围。需要改为double类型。监测点划分依据:Cmn表示从n中选m个有多少情况,...

哪位大佬帮帮忙啊,这个C语言怎么做
第一次判断,z为3,x为1,满足条件。于是z变为2、y变为4;第二次判断,z为2,x为2,满足条件。于是z变为1、y变为3;第三次判断,z为1,x为3,满足条件。于是z变为0、y变为2;第四次判断,z为0,不满足条件。z变为-1。打印输出结果,3、2、-1....

c语言问题,麻烦大佬帮忙看看
x是输出十六进制数的意思,故题目需要你进行十六进制运算,不过是把十六进制的194与十进制的18相加而已,可以统一转换进制为十六进制,然后运算,不需要进位。运算过程是:0x194+18==0x194+0x12 而 0x194+0x12==0x1A6。下面的watch框是验算

C语言题目 求大佬帮看一下
在while条件中,使用的是 K++, 而++符号在后面。3、++运算符使用有两种, 先+1在用, 和先使用在+1。而此处使用的明明是后者。4、++在后, 变量k==10时,在判断不成立后, 会在进行+1运算,所以最后结果为11。以上是我对这道题目的解析, 如果对你有帮助,请采纳一下, 谢谢。

C语言题目,求大佬解答
被2整除的数有7个,被5整除的数有1个,所以count为8.数组被赋了10个数据,所以K数组的第11个数为0,跳出循环,对应K[10],所以i为10.答案B

相似回答