一道计算机三级的题目,在线等。

gucl79 2003-08-22 02:08:05
函数loop(s,m,n,str)对长为n的字符串str,从第s个字符开始的间隔为m的部分字符进行循环左移,即str[s]←str[s+m]←...←str[s+km]←...←str[s](k为正整数)且当字符位置s+k*m大于等于n时,要求用s+k*m-n作新的字符位置。要求编写此函数实现其功能,最后调用函数WriteDat()把结果输出到文件out.dat中。
例:loop(1,2,8,str)
位置 0 1 2 3 4 5 6 7
调用前str=A B C D E F G H
调用后str=A D C F E H G B
部分源程序已给出。
  请勿改动主函数main()和写函数WriteDat()的内容。
#include <stdio.h>
#include <string.h>

loop(int s,int m,int n,char str[])
{
//这里是要补充的函数

}

main()
{
char buf[81];
strcpy(buf,\ ABCDEFGH\ );
printf(\ 调用前=%s,\ ,buf);
loop(1,2,8,buf);
printf(\ 调用后=%s\\n\ ,buf);
writeDat();
}

writeDat()
{
FILE *in,*out;
char buf[81];
int i,s,m,n;
in=fopen(\ in.dat\ ,\ r\ );
out=fopen(\ out.dat\ ,\ w\ );
for(i=0;i<5;i++){
fscanf(in,\ %d,%d,%d,%s\ ,&s,&m,&n,buf);
loop(s,m,n,buf);
fprintf(out,\ %s\\n\ ,buf);
}
fclose(in);
fclose(out);
}

--------------------------------------------
主要偶根据题目意思不知道左移到什么样才算完成。就是循环到什么情况才算结束。

急呀。谢了。各位。

...全文
36 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
uu2pro 2003-08-23
  • 打赏
  • 举报
回复
呵呵,错了
用这个
void loop(int s,int m,int n,char str[])
{
if(s<n)
{
char temp=str[s];

for(int i=s; (i+m)<=n; i+=m ) str[i]=str[m+i];

if(i+m>n) str[i]=temp;
}
}
uu2pro 2003-08-23
  • 打赏
  • 举报
回复
用这个吧,这个是对的
void loop(int s,int m,int n,char str[])
{
char temp=str[s];

for(int i=s; (i+m)<=n; i+=m ) str[i]=str[m+i];

if(i+m>n) str[i]=temp;
}
uu2pro 2003-08-23
  • 打赏
  • 举报
回复
即str[s]←str[s+m]←...←str[s+km]←...←str[s](k为正整数)且当字符位置s+k*m大于等于n时,要求用s+k*m-n作新的字符位置。
题目有问题啊
我的答案满足 str[s]←str[s+m]←...←str[s+km]←...←str[s](k为正整数)

但是不满足 且当字符位置s+k*m大于等于n时,要求用s+k*m-n作新的字符位置。
且当字符位置s+k*m大于等于n时,要求用s+k*m-n作新的字符位置。这个要求很含糊,
当n不能被m整除的时候会有问题,(当字符位置s+k*m大于等于n时,要求用s+k*m-n作新的字符位置。)
1)那当s+k*m大于等于2n时,s+k*m-n会大于n,这时候怎么办?交换到什么条件中止?
2)这时候s+k*m-n 不等于 s,如果一直交换下去,有可能所有的字符都被交换,也有可能交换其中的一部分,这要看m和n的公约数是多少。

不知道我的想法有没有错
uu2pro 2003-08-23
  • 打赏
  • 举报
回复
只看了例子,没有仔细看题目
呵呵
mylhw 2003-08-23
  • 打赏
  • 举报
回复
谁能说说"要求用s+k*m-n作新的字符位置"是什么意思,该怎么理解?当n>17时呢?我认为wmuu(djfkasfjiv)所给出的答案适合本例!当n>17时呢?
uu2pro 2003-08-23
  • 打赏
  • 举报
回复
你的两个答案都是对的
gucl79 2003-08-22
  • 打赏
  • 举报
回复
有两个答案
答案一:
Viod Loop(int s,int m,int n,char str[])
{ int cuur,last,i=0;
char ch;
last=s;
ch=str[s];
while(++i)
{ cuur=last;
last=(s+i*m)%n;
if(last>=s&&s+i*m>n) break;
str[cuur]=str[last];
}
str[cuur]=ch;
}
答案二:
loop(int s,int m,int n,char str[])
{
int kk=s;
char ch=str[s];
while((kk+m)%n!=s)
{
str[kk]=str[(kk+m)%n];
kk=(kk+m)%n;
}
str[kk]=ch;
}

两个答案不一样,哪个是对的,或者两个都是错的。那正确的应该怎么样?



69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧