鱼C论坛

 找回密码
 立即注册
查看: 2515|回复: 12

循环数组右移

[复制链接]
发表于 2016-4-27 13:32:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目:输入9个数存入一长度为9的数组中,然后输入正整数m,使得数组元素循环右移m位,移出的元素再从左端移入
#include <stdio.h>
int main ()
{
        int i, m, j, t, str[9];
        printf ("数组元素循环右移位数为: ");
        scanf ("%d",&m);
        printf ("please input 9 numbers :\n");
        for (i = 0; i <= 8 ; i++)
                scanf (" %d ",&str[i]);
        for (j = 1; j <= m; j++)
                for (i = 7; i >= 0; i--)
                {
                        t = str[8];
                        str[i+1] = str[i];
                        str[0] = t;
                }
                for (i = 0; i <= 8; i++)
                        printf("%d",str[i]);
                return 0;
                
}
这是我打的代码,不知道怎么的就是弄不出正确结果,而且一开始输入9个数,可我这个却输入10个数,但我觉得这个for (i = 0; i <= 8 ; i++)没错啊??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-4-27 19:45:29 | 显示全部楼层
我弄出来了,谢谢你们的指点
#include <stdio.h>
int main ()
{
        int i, m, j, t, str[9];
        printf ("数组元素循环右移位数为: ");
        scanf ("%d",&m);
        printf ("please input 9 numbers :\n");
        for (i = 0; i < 9; i++)
                scanf ("%d",&str[i]);
        
        for (j = 1; j <= m; j++)
        {
                t = str[8];
                for (i = 7; i >= 0; i--)
                {   
                        str[i+1] = str[i];
                }
      str[0] = t;
        }
                
                for (i = 0; i < 9; i++)
                {
                        printf (" ");
                        printf ("%d",str[i]);
                }
                printf ("\n");
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-27 14:13:02 | 显示全部楼层
输入的问题是因为你在%d前后加了多余的空格;结果不正确是因为str[0]还没后移值就被覆盖改了。str[0]=t;应该在内层for循环的外面,等所有元素都后移一位再将最后一个元素赋值给第一个元素。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-27 14:18:12 | 显示全部楼层
先不说方法对错,这句话: for (j = 1; j <= m; j++)的循环体是谁?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-27 19:17:34 | 显示全部楼层
haomingzi 发表于 2016-4-27 14:18
先不说方法对错,这句话: for (j = 1; j

是后面那个for语句
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-27 19:18:12 | 显示全部楼层
LeoChou 发表于 2016-4-27 14:13
输入的问题是因为你在%d前后加了多余的空格;结果不正确是因为str[0]还没后移值就被覆盖改了。str[0]=t;应 ...

是哦,我都没考虑到这个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-27 19:29:39 | 显示全部楼层
我现在改成这样
#include <stdio.h>
int main ()
{
        int i, m, j, t, str[9];
        printf ("数组元素循环右移位数为: ");
        scanf ("%d",&m);
        printf ("please input 9 numbers :\n");
        for (i = 0; i < 9; i++)
                scanf ("%d",&str[i]);
        t = str[8];
        for (j = 1; j <= m; j++)
        {
                for (i = 7; i >= 0; i--)
                {
                        str[i+1] = str[i];
                }
        }
                str[0] = t;
                for (i = 0; i < 9; i++)
                        printf("%d",str[i]);
                printf ("\t");
        return 0;
}
但最后结果是 911234567
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-27 19:35:09 | 显示全部楼层
如果输入m=1结果就正确,可是m=2就错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-27 20:06:11 | 显示全部楼层
本帖最后由 mingcxx 于 2016-4-27 20:08 编辑

内层for执行完,每个元素覆盖下一个。执行完后,最后一个元素被覆盖消失,所以for之前临时保存最后一个元素,for之后把它写到首元素,完成数组每个元素向后移动一位:
t = str[8];
for (i = 7; i >= 0; i--)
{
        str[i + 1] = str[i];
}
str[0] = t;
向后移动m位怎么办呢?外层再套一个for,再执行m-1次内层for:
for (j = 1; j <= m; j++)
{
        t = str[8];
        for (i = 7; i >= 0; i--)
        {
                str[i + 1] = str[i];
        }
        str[0] = t;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2016-4-28 20:51:27 | 显示全部楼层
本帖最后由 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[9]={1,2,3,4,5,6,7,8,9},a[9]={1,2,3,4,5,6,7,8,9};
#if(0)  printf ("??????哈哈哈?????: ");
        printf("请输入9个数:");
      
        for (i = 0; i < 9; i++)
  { str[i+2*m-9]=a[j];
   scanf ("%d",&str[i]);
  }
#endif
  printf("输入偏移量:");//这里偏移量范围是(0-9)
  scanf("%d",&m);
        for (i = 0;i < m;i++)
        {
   if(i+m< 9)
   {   
   
    str[i+m] = str[i];
   }
   else
   {
    str[i+m-9]=str[i];
   }
        }
  for(i=m;i<9;i++,j++)
  {
   if(i+m<9)
   {
    str[i+m]=a[m+j];
   }
   else
   {
    str[i+m-9]=a[m+j];
   }
  }
         
        for (i = 0,j=0; i < 9,j<9;j++, i++)
  {
   printf("%d",str[i]);
            printf ("\t");
  }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-5-2 23:43:36 | 显示全部楼层
虽然我说不明白为什么,看了楼主的代码后我改了下就像楼主置顶的代码那样,是可以达到题目要求的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-4 11:38:12 | 显示全部楼层
桃花飞舞 发表于 2016-5-2 23:43
虽然我说不明白为什么,看了楼主的代码后我改了下就像楼主置顶的代码那样,是可以达到题目要求的。

9楼有解释 说的挺清楚的,你可以看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-5-4 13:03:18 | 显示全部楼层
是的,解释的还可以,我是想说,楼主的代码,我看到后可以修改,只是不会解释那样的,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 00:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表