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;
}
}
运行结果
难度等级:★★☆☆☆
学点啥