数字贪吃蛇-数组平移问题

C9.把1~m个字符,平移到字符串的最后(循环移动)

在这里插入图片描述

#include <stdio.h>
#include <string.h>
#define   N    80
void fun (char  *w,int  m)
{
	int i, j;
	char temp;
	for (i = 1; i <= m; i++)
	{
		temp = w[0];
		for (j = 1; w[j] != '\0'; j++)
		{
			w[j - 1] = w[j];
		}
		w[j - 1] = temp;	
	}
}
void main()
{
  FILE *wf;
  char  a[N]= "ABCDEFGHIJK",b[N]= "ABCDEFGHIJK";
  int  m;
  printf("The origina string :\n");
  puts(a);
  printf("\n\nEnter  m: ");
  scanf("%d",&m);
  fun(a,m);
  printf("\nThe string after moving :\n");
  puts(a);
  printf("\n\n");
/******************************/
  wf=fopen("out.dat","w");
  fun(b,3);
  fprintf(wf,"%s",b);
  fclose(wf);
/*****************************/
}

学点啥
经典的循环左移算法,多层嵌套用于控制移动的字符个数,也即需要进行循环的次数;
内层循环将第2个字符(含)以后的每个字符向前移动一个位置,然后将第一各字符放置到最后一个字符中。
换一种写法

#include <stdio.h>
#include <string.h>
#define   N    80
void fun (char  *w,int  m)
{
	int i, j;
	char temp;
	for (i = 0; i < m; i++)
	{
		temp = w[0];
		for (j = 0; w[j] != '\0'; j++)
		{
			w[j] = w[j+1];
		}
		w[j] = temp;//代码错误行	,修改前
	}
}
void main()
{
  FILE *wf;
  char  a[N]= "ABCDEFGHIJK",b[N]= "ABCDEFGHIJK";
  int  m;
  printf("The origina string :\n");
  puts(a);
  printf("\n\nEnter  m: ");
  scanf("%d",&m);
  fun(a,m);
  printf("\nThe string after moving :\n");
  puts(a);
  printf("\n\n");
/******************************/
  wf=fopen("out.dat","w");
  fun(b,3);
  fprintf(wf,"%s",b);
  fclose(wf);
/*****************************/
}

输出结果(有误 )
应为DEFGHIJKABC,但输出是为DEFGHIJK

在这里插入图片描述
错误原因

w[j] = temp;//代码错误行 ,修改前表示将temp置于w[5],且并未显示。
在这里插入图片描述

#include <stdio.h>
#include <string.h>
#define   N    80
void fun (char  *w,int  m)
{
	int i, j;
	char temp;
	for (i = 0; i < m; i++)
	{
		temp = w[0];
		for (j = 0; w[j] != '\0'; j++)
		{
			w[j] = w[j+1];
		}
		w[j-1] = temp;	//代码错误行,修改后
	}
}
void main()
{
  FILE *wf;
  char  a[N]= "ABCDEFGHIJK",b[N]= "ABCDEFGHIJK";
  int  m;
  printf("The origina string :\n");
  puts(a);
  printf("\n\nEnter  m: ");
  scanf("%d",&m);
  fun(a,m);
  printf("\nThe string after moving :\n");
  puts(a);
  printf("\n\n");
/******************************/
  wf=fopen("out.dat","w");
  fun(b,3);
  fprintf(wf,"%s",b);
  fclose(wf);
/*****************************/
}

运行结果
在这里插入图片描述

C45. 数组元素平移到数组的最后

在这里插入图片描述
雕虫小技

在这里插入图片描述

在这里插入图片描述
正儿八经

思路1:
在这里插入图片描述
调试1:

void  fun(int  *w, int  p, int  n)
{
	int i, j, k;
	char *f;
	f = w;

	for (i = 0, j = p+1; j < n; i++,j++)
		*(w + i) = 11;//*(f + j);
	
	for (k = 0; k <= p; k++, i++)
		*(w + i) = 12;//*(f + k);
	*(w + i) = '\0';
}

在这里插入图片描述
结论:移动的位数正确

调试2:

void  fun(int  *w, int  p, int  n)
{
	int i, j, k;
	char *f;
	f = w;

	for (i = 0, j = p+1; j < n;i++,j++ )
		*(w + i) = *(f + j);
		
	for (k = 0; k <= p; k++, i++)
		*(w + i) = 12;//*(f + k);
	*(w + i) = '\0';
}

在这里插入图片描述
输出结果非理想的4 5 6 7 8 9 10 11 12 13 14 15 12 12 12
原因分析:

调试3

void  fun(int  *w, int  p, int  n)
{
	int i, j, k;
	char *f;
	f = w;

	for (i = 0, j = p+1; j < n;i++, j++)
	{
		*(w + i) = *(f + 1);
	}
	for (k = 0; k <= p; k++, i++)
		*(w + i) = 12;//*(f + k);
	*(w + i) = '\0';
}

在这里插入图片描述
原因分析:
*(f+1)正常应为2,但输出是1?

思路2 :
循环左移,将第一个数字w[0]置于temp,其余数字(w[1]~w[n-1])依次左移,也即左移w[i-1]=w[i];完成后,将temp置于最后也即w[n-1]
要将0~p移动到最后,只需重复循环p+1次即可。
在这里插入图片描述

void  fun(int  *w, int  p, int  n)
{
	int i, j, temp;
	for (i = 0; i < p; i++)
	{
		temp = w[0];
		for (j = 1; j < n; j++)
			w[j - 1] = w[j];
		w[n - 1] = temp;
	}
}

或者

void  fun(int  *w, int  p, int  n)
{
	int i, j, temp;
	for (i = 0; i < p; i++)
	{
		temp = *w;
		for (j = 1; j < n; j++)
			*(w+j-1) = *(w+j);
		*(w+n-1) = temp;
	}
}

运行结果
在这里插入图片描述
难度等级:★★☆☆☆
学点啥

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值