循环数组右移
题目:输入9个数存入一长度为9的数组中,然后输入正整数m,使得数组元素循环右移m位,移出的元素再从左端移入#include <stdio.h>
int main ()
{
int i, m, j, t, str;
printf ("数组元素循环右移位数为: ");
scanf ("%d",&m);
printf ("please input 9 numbers :\n");
for (i = 0; i <= 8 ; i++)
scanf (" %d ",&str);
for (j = 1; j <= m; j++)
for (i = 7; i >= 0; i--)
{
t = str;
str = str;
str = t;
}
for (i = 0; i <= 8; i++)
printf("%d",str);
return 0;
}
这是我打的代码,不知道怎么的就是弄不出正确结果,而且一开始输入9个数,可我这个却输入10个数,但我觉得这个for (i = 0; i <= 8 ; i++)没错啊?? 我弄出来了,谢谢你们的指点
#include <stdio.h>
int main ()
{
int i, m, j, t, str;
printf ("数组元素循环右移位数为: ");
scanf ("%d",&m);
printf ("please input 9 numbers :\n");
for (i = 0; i < 9; i++)
scanf ("%d",&str);
for (j = 1; j <= m; j++)
{
t = str;
for (i = 7; i >= 0; i--)
{
str = str;
}
str = t;
}
for (i = 0; i < 9; i++)
{
printf (" ");
printf ("%d",str);
}
printf ("\n");
return 0;
}
输入的问题是因为你在%d前后加了多余的空格;结果不正确是因为str还没后移值就被覆盖改了。str=t;应该在内层for循环的外面,等所有元素都后移一位再将最后一个元素赋值给第一个元素。 先不说方法对错,这句话: for (j = 1; j <= m; j++)的循环体是谁? haomingzi 发表于 2016-4-27 14:18
先不说方法对错,这句话: for (j = 1; j
是后面那个for语句{:10_269:} LeoChou 发表于 2016-4-27 14:13
输入的问题是因为你在%d前后加了多余的空格;结果不正确是因为str还没后移值就被覆盖改了。str=t;应 ...
是哦,我都没考虑到这个 我现在改成这样
#include <stdio.h>
int main ()
{
int i, m, j, t, str;
printf ("数组元素循环右移位数为: ");
scanf ("%d",&m);
printf ("please input 9 numbers :\n");
for (i = 0; i < 9; i++)
scanf ("%d",&str);
t = str;
for (j = 1; j <= m; j++)
{
for (i = 7; i >= 0; i--)
{
str = str;
}
}
str = t;
for (i = 0; i < 9; i++)
printf("%d",str);
printf ("\t");
return 0;
}
但最后结果是 911234567{:10_285:} 如果输入m=1结果就正确,可是m=2就错了 本帖最后由 mingcxx 于 2016-4-27 20:08 编辑
内层for执行完,每个元素覆盖下一个。执行完后,最后一个元素被覆盖消失,所以for之前临时保存最后一个元素,for之后把它写到首元素,完成数组每个元素向后移动一位:
t = str;
for (i = 7; i >= 0; i--)
{
str = str;
}
str = t;
向后移动m位怎么办呢?外层再套一个for,再执行m-1次内层for:
for (j = 1; j <= m; j++)
{
t = str;
for (i = 7; i >= 0; i--)
{
str = str;
}
str = t;
} 本帖最后由 zxc123qwe 于 2016-4-29 11:07 编辑
zhyin 发表于 2016-4-27 19:35
如果输入m=1结果就正确,可是m=2就错了
觉得你先定义两个数组,一个作要输入的数据,一个作保护数据
看了之后又写了个代码;写的不好,主要是想探讨学习一下,那种能一键复制代码的,我不会,还望见谅,如果你会,可以留言教我一下。谢谢!
/*这个程序基本能用,输入部分我给标注掉了,可以自己加上,
大致思想是定义两个一样的数组,一个输入,一个作保护数组数据,
算法上的思想是未覆盖的作一组处理,被覆盖的用引用的数组加以赋值还原,
在偏移量上负数不纳入判定范围,偏移量>=9时,就是偏移量0-8的循环,程序没写出。
还有很多要修正的毛病可以改改,帮我完善一下*/
#include <stdio.h>
int main ()
{
int i, m, j = 0, t, str={1,2,3,4,5,6,7,8,9},a={1,2,3,4,5,6,7,8,9};
#if(0)printf ("??????哈哈哈?????: ");
printf("请输入9个数:");
for (i = 0; i < 9; i++)
{ str=a;
scanf ("%d",&str);
}
#endif
printf("输入偏移量:");//这里偏移量范围是(0-9)
scanf("%d",&m);
for (i = 0;i < m;i++)
{
if(i+m< 9)
{
str = str;
}
else
{
str=str;
}
}
for(i=m;i<9;i++,j++)
{
if(i+m<9)
{
str=a;
}
else
{
str=a;
}
}
for (i = 0,j=0; i < 9,j<9;j++, i++)
{
printf("%d",str);
printf ("\t");
}
return 0;
}
虽然我说不明白为什么,看了楼主的代码后我改了下就像楼主置顶的代码那样,是可以达到题目要求的。 桃花飞舞 发表于 2016-5-2 23:43
虽然我说不明白为什么,看了楼主的代码后我改了下就像楼主置顶的代码那样,是可以达到题目要求的。
9楼有解释 说的挺清楚的,你可以看看 {:10_282:} 是的,解释的还可以,我是想说,楼主的代码,我看到后可以修改,只是不会解释那样的,
页:
[1]