user-0 提问: 一个小程序,有点小错误,求指出

回复:
user: user-0
content: 引用 14 楼 bijiaoben 的回复:如果按照你代码表述的做法的话，把你的代码按照这样改： for(p=p_beg+n-m;p>a+i;p--) { *p=*(p-1); } 至于为什么这样做，你在纸上画画就清楚了，i大于1的时候你就知道结果了。 对,就是这样,终于弄出来了,太感谢了,麻烦你那么久

user: user-1
content: 如果按照你代码表述的做法的话，把你的代码按照这样改： for(p=p_beg+n-m;p>a+i;p--) { *p=*(p-1); } 至于为什么这样做，你在纸上画画就清楚了，i大于1的时候你就知道结果了。

user: user-1
content: 还是11楼的问题，楼主到底想要的是神马？yidong(6,3)和yidong(9,3）的期望输出分别是什么？请恕我理解能力不够，搞不明白这个我是没法帮到楼主的。

user: user-0
content: 引用 9 楼 bijiaoben 的回复:[quote=引用 8 楼 bijiaoben 的回复:] [quote=引用 7 楼 u013160932 的回复:] [quote=引用 5 楼 bijiaoben 的回复:]     for(i=0;i<m;i++) {     	p_beg=a+i;         temp=a[n-m+i]; printf("temp=\n",temp);     for(p=p_beg+n-m;p>a;p--) {	 *p=*(p-1); }     a[i]=temp; 楼主自己单步跟踪一下这个代码就明白了，楼主不应该从n-m+1开始往后移动，而是应该让你temp始终指向最尾端的元素。  temp=a[n-m+i]; and *p=*(p-1); and i++ 会让你的temp每次都是拿到一个固定的数。楼主把你的temp固定指向a[n-1]试试看结果呢。 那个10我忘记改过来了= = 我这个代码不是整体往后移的,而是前面n个数字往后移动,一次,会覆盖掉这n个数的后面那个数,再把后面那个数字放到前面,而移动一次,我所需要记录的那个数也会往后移动一个位置,所以我是n-m-i. 你说的那个方法我换个代码试了下,能成功,但是我用这个方法来敲代码的时候不行了,不知道是我想法错了还还是我的代码细节方面错了,很纠结啊[/quote] 你明显不够仔细，因为你都没看我在5楼说了什么。。。。[/quote] 好吧，不好意思，也许我没明白你在说什么。我这个代码不是整体往后移的,而是前面n个数字往后移动,一次,会覆盖掉这n个数的后面那个数,再把后面那个数字放到前面,这个是什么意思呢？ 如果输入了1到20，共20个数字，还用你的函数yidong(9,3)处理一下，你期望的输出结果是什么样呢？如果调用方式改为yidong(19,3)，你期望的输出又是什么样呢？楼主所说的，所以我是n-m-i，那为什么代码里面又是 temp=a[n-m+i]？[/quote] 大神,别这样说,是我不好意思才对,那么麻烦你 我现在是输入9个数字,然后前面6个数字移动到最后,然后后面3个放到前面 如   1 2 3 4 5 6 7 8 9 变成 7 8 9 1 2 3 4 5 6  是这样的, 第1次内循环, 记录temp=a[6]=7,前6个数往后移一次 变成1 1 2 3 4 5 6 8 9(7被覆盖了) 然后把记录的temp=a[6]放到a[0],变成7 1 2 3 4 5 6 8 9 第2个内循环 7后面的6个数再往后一次,记录temp=a[7]=8,7后面的6个数往后移动一次,变成 7 1 1 2 3 4 5 6 9(8被覆盖了),再把temp=a[8]放到a[1],变成7 8 1 2 3 4 5 6 9  因为每移动一次,需要记录temp总会往后移动一个单位,所以是temp=[n-m+i];

user: user-1
content: 引用 8 楼 bijiaoben 的回复:[quote=引用 7 楼 u013160932 的回复:] [quote=引用 5 楼 bijiaoben 的回复:]     for(i=0;i<m;i++) {     	p_beg=a+i;         temp=a[n-m+i]; printf("temp=\n",temp);     for(p=p_beg+n-m;p>a;p--) {	 *p=*(p-1); }     a[i]=temp; 楼主自己单步跟踪一下这个代码就明白了，楼主不应该从n-m+1开始往后移动，而是应该让你temp始终指向最尾端的元素。  temp=a[n-m+i]; and *p=*(p-1); and i++ 会让你的temp每次都是拿到一个固定的数。楼主把你的temp固定指向a[n-1]试试看结果呢。 那个10我忘记改过来了= = 我这个代码不是整体往后移的,而是前面n个数字往后移动,一次,会覆盖掉这n个数的后面那个数,再把后面那个数字放到前面,而移动一次,我所需要记录的那个数也会往后移动一个位置,所以我是n-m-i. 你说的那个方法我换个代码试了下,能成功,但是我用这个方法来敲代码的时候不行了,不知道是我想法错了还还是我的代码细节方面错了,很纠结啊[/quote] 你明显不够仔细，因为你都没看我在5楼说了什么。。。。[/quote] 好吧，不好意思，也许我没明白你在说什么。我这个代码不是整体往后移的,而是前面n个数字往后移动,一次,会覆盖掉这n个数的后面那个数,再把后面那个数字放到前面,这个是什么意思呢？ 如果输入了1到20，共20个数字，还用你的函数yidong(9,3)处理一下，你期望的输出结果是什么样呢？如果调用方式改为yidong(19,3)，你期望的输出又是什么样呢？楼主所说的，所以我是n-m-i，那为什么代码里面又是 temp=a[n-m+i]？

user: user-1
content: 引用 7 楼 u013160932 的回复:[quote=引用 5 楼 bijiaoben 的回复:]     for(i=0;i<m;i++) {     	p_beg=a+i;         temp=a[n-m+i]; printf("temp=\n",temp);     for(p=p_beg+n-m;p>a;p--) {	 *p=*(p-1); }     a[i]=temp; 楼主自己单步跟踪一下这个代码就明白了，楼主不应该从n-m+1开始往后移动，而是应该让你temp始终指向最尾端的元素。  temp=a[n-m+i]; and *p=*(p-1); and i++ 会让你的temp每次都是拿到一个固定的数。楼主把你的temp固定指向a[n-1]试试看结果呢。 那个10我忘记改过来了= = 我这个代码不是整体往后移的,而是前面n个数字往后移动,一次,会覆盖掉这n个数的后面那个数,再把后面那个数字放到前面,而移动一次,我所需要记录的那个数也会往后移动一个位置,所以我是n-m-i. 你说的那个方法我换个代码试了下,能成功,但是我用这个方法来敲代码的时候不行了,不知道是我想法错了还还是我的代码细节方面错了,很纠结啊[/quote] 你明显不够仔细，因为你都没看我在5楼说了什么。。。。

user: user-0
content: 引用 5 楼 bijiaoben 的回复:for(i=0;i<m;i++) {     	p_beg=a+i;         temp=a[n-m+i]; printf("temp=\n",temp);     for(p=p_beg+n-m;p>a;p--) {	 *p=*(p-1); }     a[i]=temp; 楼主自己单步跟踪一下这个代码就明白了，楼主不应该从n-m+1开始往后移动，而是应该让你temp始终指向最尾端的元素。  temp=a[n-m+i]; and *p=*(p-1); and i++ 会让你的temp每次都是拿到一个固定的数。楼主把你的temp固定指向a[n-1]试试看结果呢。 那个10我忘记改过来了= = 我这个代码不是整体往后移的,而是前面n个数字往后移动,一次,会覆盖掉这n个数的后面那个数,再把后面那个数字放到前面,而移动一次,我所需要记录的那个数也会往后移动一个位置,所以我是n-m-i. 你说的那个方法我换个代码试了下,能成功,但是我用这个方法来敲代码的时候不行了,不知道是我想法错了还还是我的代码细节方面错了,很纠结啊

user: user-0
content: 引用 11 楼 bijiaoben 的回复:题目是,把前面n个数向后移动m个单位,后面m个单位放到最前面 楼主，对这个题目，我的理解是这样的： 假设输入9个数字123456789,调用函数yidong(6,3)后，变成789123456。 楼主大人的做法是把n个数内部循环右移m次。所以楼主的调用方法是yidong(9,3)。如果按照题目要求，把前九个数字右移3次的话，因为右边已经没有数字了，所以应该不会有数字被挤到前面去，应该还是123456789才对啊就是789123456,但是我的结果是779123456

user: user-1
content: 题目是,把前面n个数向后移动m个单位,后面m个单位放到最前面 楼主，对这个题目，我的理解是这样的： 假设输入9个数字123456789,调用函数yidong(6,3)后，变成789123456。 楼主大人的做法是把n个数内部循环右移m次。所以楼主的调用方法是yidong(9,3)。如果按照题目要求，把前九个数字右移3次的话，因为右边已经没有数字了，所以应该不会有数字被挤到前面去，应该还是123456789才对啊

user: user-1
content: 另外，楼主的这个函数是要搞哪样？ void print(int *a) { int i; printf("shuru 10 ge shu\n"); for(i=0;i<9;i++)     scanf("%d",&a[i]); }  为什么输入10个数却只有9次循环？

user: user-1
content: for(i=0;i<m;i++) {     	p_beg=a+i;         temp=a[n-m+i]; printf("temp=\n",temp);     for(p=p_beg+n-m;p>a;p--) {	 *p=*(p-1); }     a[i]=temp; 楼主自己单步跟踪一下这个代码就明白了，楼主不应该从n-m+1开始往后移动，而是应该让你temp始终指向最尾端的元素。  temp=a[n-m+i]; and *p=*(p-1); and i++ 会让你的temp每次都是拿到一个固定的数。楼主把你的temp固定指向a[n-1]试试看结果呢。

user: user-0
content: 引用 3 楼 user-2 的回复:for(i=0;i<m;i++)貌似一步一步慢慢爬，那就不用写的那么复杂吧，先暂存最后一个元素，从尾部往前遍历把元素往后移动一位，最后把暂存的元素摆在第一个，如此循环m次完成...那你能不能帮我看下我那程序是哪出问题了

user: user-2
content: for(i=0;i<m;i++)貌似一步一步慢慢爬，那就不用写的那么复杂吧，先暂存最后一个元素，从尾部往前遍历把元素往后移动一位，最后把暂存的元素摆在第一个，如此循环m次完成...

user: user-0
content: 引用 1 楼 user-2 的回复:简单的就申请一样的数组空间，元素一次移动到定位再复制回原数组。想就地操做又不想一步步慢慢爬貌似复杂了...数组能做出来,但现在我用指针弄不出来,不知道是哪错了,我用printf来捕捉a[i]的值,发现也没错,但是一打出来就错了

user: user-2
content: 简单的就申请一样的数组空间，元素一次移动到定位再复制回原数组。想就地操做又不想一步步慢慢爬貌似复杂了...