/*利用指针编写程序,定义一维整型数组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;
}
追问谢谢
简单粗暴思路:直接将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