| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 934 人关注过本帖
标题:庆祝一下,第二次就成功,以为要求助,结果自己做成功了,呵呵
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我知道你是要强化基础,但正如我在那一帖中所指出的,那才是你要真正搞明白的基础:1.指针声明的意义;2.指针的用法,scanf()函数的功能迫使它要采取指针的形式运用参数,搞清楚为什么要这样,才能知道该给它什么指针,要恰如所用,明白这个,自己写程序设计函数时,才知道什么时候设计成指针、什么时候不要。

[ 本帖最后由 TonyDeng 于 2012-1-8 00:25 编辑 ]

授人以渔,不授人以鱼。
2012-01-08 00:24
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
具体说个例子吧,你那个程序中
int *x=&a,*y=&b,*z=&c;
这种写法,语法没错,但隐藏了很大的欺骗性,连自己也被骗了。

int *x=&a;密集处在右边,*x和&a被用=连接起来,读者包括你自己,都被误导为=号两边是同一种数据类型int,事实上这个理解是错的。这个声明时就赋值的写法,应该写成
int* x=&a;
这样,x才真正是地址指针。如果你习惯int *x;这样的声明,那么不要在这里同时赋值,分开来:
int *x;
x=&a;
这样就很清晰了。那么,到下面的scanf(),也不容易搞错。scanf()的通用格式是scanf("%d", &a);符号替换,很明显地是scanf("%d", x);用我这里推荐的两种写法,都不会犯错。

你那种三个指针连在一起声明的格式,是不推荐的,那强化了上述第一种错误理解。把它们分开三行,对程序的编译效果没有丝毫影响,但严重影响你和读者对代码的理解,那才是要命的。这些习惯不弄好,以后的程序会反复犯同类的错误,甚至连原因在哪里都没有意识到。

学程序,应该在这些方面下功夫。


[ 本帖最后由 TonyDeng 于 2012-1-8 00:44 编辑 ]

授人以渔,不授人以鱼。
2012-01-08 00:35
a271885843
Rank: 2
等 级:论坛游民
帖 子:291
专家分:58
注 册:2011-11-24
收藏
得分:0 
以下是引用TonyDeng在2012-1-8 00:35:37的发言:

具体说个例子吧,你那个程序中
int *x=&a,*y=&b,*z=&c;
这种写法,语法没错,但隐藏了很大的欺骗性,连自己也被骗了。

int *x=&a;密集处在右边,*x和&a被用=连接起来,读者包括你自己,都被误导为=号两边是同一种数据类型int,事实上这个理解是错的。这个声明时就赋值的写法,应该写成
int* x=&a;
这样,x才真正是地址指针。如果你习惯int *x;这样的声明,那么不要在这里同时赋值,分开来:
int *x;
x=&a;
这样就很清晰了。那么,到下面的scanf(),也不容易搞错。scanf()的通用格式是scanf("%d", &a);符号替换,很明显地是scanf("%d", x);用我这里推荐的两种写法,都不会犯错。

你那种三个指针连在一起声明的格式,是不推荐的,那强化了上述第一种错误理解。把它们分开三行,对程序的编译效果没有丝毫影响,但严重影响你和读者对代码的理解,那才是要命的。这些习惯不弄好,以后的程序会反复犯同类的错误,甚至连原因在哪里都没有意识到。

学程序,应该在这些方面下功夫。
嗯。感谢你讲这么多,可能自己比较小懒吧,当然自己在这方面的欠缺是比较多的,另外,这些东西确实是视频教程里没有的了,以后写的时候,注意就行了。

认为事物非黑即白是缺智慧的表现……
2012-01-08 19:55
smallmoon521
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:517
专家分:1373
注 册:2008-4-21
收藏
得分:0 
LZ,你的程序不对吧.
第一个循环判断就是头尾,一样就跳出了,返回1
里面的没机会判断~  如1456adbc1 返回是1

PS:不用两个for循环的.一个就可以,折半.
for(...)
{
   if(array[i]==array[len-i-1])
     ...
}
这样就可以了

不过LZ遇到问题,自己想办法解决,而不是不思考就提问,是值得提倡的

如果能给补点分,就更值得提倡了

为游戏狂~~!!    大家努力编哈!
2012-01-08 20:15
a271885843
Rank: 2
等 级:论坛游民
帖 子:291
专家分:58
注 册:2011-11-24
收藏
得分:0 
以下是引用smallmoon521在2012-1-8 20:15:56的发言:

LZ,你的程序不对吧.
第一个循环判断就是头尾,一样就跳出了,返回1
里面的没机会判断~  如1456adbc1 返回是1

PS:不用两个for循环的.一个就可以,折半.
for(...)
{
   if(array==array[len-i-1])
     ...
}
这样就可以了

不过LZ遇到问题,自己想办法解决,而不是不思考就提问,是值得提倡的

如果能给补点分,就更值得提倡了
嗯,谢谢楼上提示这个小bug,我改进了一下程序,在让i的值至少大于字符串长度一半以上就行了,或j的值小于字符串长度一半以上就行了,还有就是这题昨天晚上就封贴了,呵呵,不过你放心,以后多多关注我的帖子,分是大大的有

 #include"stdio.h"
#include"string.h"
    int palindrome(char *string){
     int *str,len,i,j;
     len=strlen(string);
     for(i=0,j=len;i<len;i++,j--)
      
         if(*(string+i)==*(string+j-1)&&(i>=len/2))
        {
            
          return 1;      }
         else return 0;
     
 }
 int main(){
     char string[100],a;
     printf("imput string:\n");
     gets(string);
     a=palindrome(string);
     printf("%d",a);
 }

[ 本帖最后由 a271885843 于 2012-1-8 21:35 编辑 ]

认为事物非黑即白是缺智慧的表现……
2012-01-08 21:32
smallmoon521
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:517
专家分:1373
注 册:2008-4-21
收藏
得分:0 
i+j=len
要j何用?

为游戏狂~~!!    大家努力编哈!
2012-01-08 22:59
a271885843
Rank: 2
等 级:论坛游民
帖 子:291
专家分:58
注 册:2011-11-24
收藏
得分:0 
以下是引用smallmoon521在2012-1-8 22:59:55的发言:

i+j=len
要j何用?
我明白你的意思,if(*(string+i)==*(string+len-i-1)&&(i>=len/2))就可以了。没改主要是方便理解。

认为事物非黑即白是缺智慧的表现……
2012-01-08 23:10
快速回复:庆祝一下,第二次就成功,以为要求助,结果自己做成功了,呵呵
数据加载中...
 
   



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

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