| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1373 人关注过本帖
标题:请教一个简单问题
只看楼主 加入收藏
garyxuan
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2004-8-23
收藏
 问题点数:0 回复次数:9 
请教一个简单问题

书上有这么一题:

编写一个程序采用递归方法逆序放置a数组中的元素,假定a有5个元素

#include "stdafx.h" #include "iostream.h" char a[5]; int i,n; void input(); int xf(int n,char a[]); void output(); void main(int argc, char* argv[]) { input(); xf(5,a); output(); }

void input() { cout<<"请为数组a输入5个元素:"<<endl; for(i=0;i<=4;i++) cin>>a[i]; }

int xf(int n,char a[]) { char t=a[n-1]; a[n-1]=a[5-(n-1)-1]; a[5-(n-1)-1]=t; if(n=0) return 0; else return (n-1); }

void output() { for(i=0;i<=4;i++) {cout<<a[i];} cout<<endl; }

我试过了,编译没有问题,但只能交换a[0]和a[4]

比如说,输入asdfg,应该输出gfdsa,而输出的是gsdfa,请问这怎么回事???

搜索更多相关主题的帖子: 简单问题 
2004-08-23 18:26
kuangjingbo
Rank: 1
等 级:新手上路
帖 子:312
专家分:0
注 册:2004-4-24
收藏
得分:0 

对呀,你就是这样编写的呀

看看你的函数:

int xf(int n,char a[]) { char t=a[n-1]; a[n-1]=a[5-(n-1)-1]; a[5-(n-1)-1]=t; if(n=0) return 0; else return (n-1); }

要想全部交换就要用到循环

程序中有逻辑错误,还是先画流程图吧!


永不放弃!
2004-08-23 20:12
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 

同意楼上,另外你的input和output实现的问题就是输出,不用so麻烦另外搞函数,就应该在main里面搞定就好,也不用循环,直接就cin>>a;和cout<<a;就是了。

你用来递归的函数没有实现递归,错误在这里,你自己改正吧。 else return (n-1);

2004-08-23 22:01
garyxuan
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2004-8-23
收藏
得分:0 

先谢谢上面两位,仔细检查int xf(int n,char a[])后,修正两个低级错误:

if(n=0)改为if(n<=0), return (n-1)改为 return xf(n-1) 但编译出现错误:error C2660: 'xf' : function does not take 1 parameters

若改为return xf(n-1,a) 编译没有出现错误,但不能实现交换,真是难搞,请版主再帮我看看。

2004-08-23 23:23
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
以下是引用garyxuan在2004-08-23 23:23:16的发言:

先谢谢上面两位,仔细检查int xf(int n,char a[])后,修正两个低级错误:

if(n=0)改为if(n<=0), return (n-1)改为 return xf(n-1) 但编译出现错误:error C2660: 'xf' : function does not take 1 parameters

若改为return xf(n-1,a) 编译没有出现错误,但不能实现交换,真是难搞,请版主再帮我看看。

return xf(n-1,a) 不是放入a吧,放入a[?],你想想。

2004-08-23 23:52
garyxuan
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2004-8-23
收藏
得分:0 
请问live41 应该怎么改,我已弄了很久.
2004-08-24 00:08
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 

哇不好意思,我 妈赶我睡觉,可以明天再答吗?

2004-08-24 00:21
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 

不好意思来晚了,我刚写了一个:

#include<iostream.h>

void xf(int n,char a[]); int i; //注意这里要全局变量

void main() { const int n=5; i=n/2; char a[n]; cout<<"请为数组a输入5个元素:"<<endl; cin>>a; xf(n,a); cout<<"逆序交换位置后:"<<a<<endl; }

void xf(int n,char a[]) { char temp=a[n-1]; a[n-1]=a[5-(n-1)-1]; a[5-(n-1)-1]=temp; if(n>i+1) //这里判断条件是关键 xf(n-1,a); }

为什么你的代码不行呢,因为你的条件是当n不为0时递归,而其实按你的算法,递归n/2次就已经把字符逆序排好了,再继续就又有change回来了,你由5到0倒了5次,所以你刚好的把头一个和尾一个又换了一下,于是你错觉好像代码只可以换第一个和最后一个。

PS:昨晚不好意思,我妈太凶叫我睡。

[此贴子已经被作者于2004-08-24 20:03:39编辑过]

2004-08-24 10:06
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 

靠!

#define MAX 20 //此处为数组大小,改此值即可 void fun(int *b,int *e); int main(void) { int s[MAX],i,*ptr_b,*ptr_e;

for(i=0;i<MAX;i++)s[i]=i,printf("%3d",s[i]);

printf("\n\n\n");

ptr_b=ptr_e=s; ptr_e+=MAX-1;

fun(ptr_b,ptr_e);

for(i=0;i<MAX;i++)printf("%3d",s[i]); }

void fun(int *b,int *e) { int temp;

temp=*e,*e=*b,*b=temp;

if(e>b)fun(++b,--e); }


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2004-08-24 13:59
garyxuan
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2004-8-23
收藏
得分:0 

多谢live兄,我现算是弄懂了,错就错在多交换了一遍,递归到n=3时交换已完成,我当时没有想清楚,n个元素其实只要n/2+1或n/2个进行就行,我的递归条件是每个数组元素都进行一次交换,其结果又回到原来的情况。总算弄懂了,再次多谢live兄。

至于knocker的,用了地址传递,我会好好看一下,同时也谢谢这位仁兄。

呵呵,大家有问题一起来讨论吧!

2004-08-24 15:22
快速回复:请教一个简单问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025786 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved