| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 873 人关注过本帖
标题:请教一个c语言问题
只看楼主 加入收藏
liulanghan
Rank: 1
等 级:禁止访问
帖 子:104
专家分:0
注 册:2007-5-5
收藏
得分:0 
回复:(hellozj)请教一个c语言问题

for(j=i+1;j<n;j++)这里应该是小于n-1的吧?虽然在这里影响不大,但越界访问总是很危险的吧!用你的算法把最后一个数后面不用“,”还是比较难的呢?为什么不先把所有的偶数找出来再排序呢?然后八最后一个偶数单独输出

2007-05-05 10:17
我是菜鸟哦
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:921
专家分:209
注 册:2007-5-4
收藏
得分:0 

就按你的先排顺序再找偶数

#include <stdio.h>
main()
{
int n,a[100],i,j,k;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}

for(i=0;i<n-1;i++)/*第n-1次不比较*/
for(j=i+1;j<n;j++)
{
if(a[j]<a[i])
{
k=a[i];
a[i]=a[j];
a[j]=k;
}
}
for(i=0;i<n;i++)
{
if(a[i]%2==0)
printf("%d,",a[i]);
}
}
告诉你个问题,就是1.scanf输入非字符时遇空格结束,所以你爱怎么样就怎么样,打空格结束可以,但最后要打回车;
2.看见那个大括号没?,不加就会再来一次scanf的,最后一次判断返回流程图上边,不加就会遇到scanf的,这个是scanf的隐蔽性问题,自己去领悟吧.加那个大括号就是先遇到"{",然后就判断是语句的开段,就跳出,但是你直接来个scanf就先碰到这个家伙,然后由于他的粘带性就把你拉了进去,不干也得干啊,真是跳进黄河也洗不清.....郁闷吧.



以上个人观点若有问题望高手们斧正.......!
-------------------------------------------------
我是菜鸟我怕谁?


偶是菜鸟鸟偶惧WHO?!!!!
2007-05-05 13:37
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
以下是引用我是菜鸟哦在2007-5-5 13:37:46的发言:

就按你的先排顺序再找偶数

#include <stdio.h>
main()
{
int n,a[100],i,j,k;
scanf("%d",&n);
for(i=0;i<n;i++)
{ //加不加没有区别,单语句不需要的.但为了代码格式,最好写上.
scanf("%d",&a[i]);
}

for(i=0;i<n-1;i++)/*第n-1次不比较*/
for(j=i+1;j<n;j++)
{
if(a[j]<a[i])
{
k=a[i];
a[i]=a[j];
a[j]=k;
}
}
for(i=0;i<n;i++)
{
if(a[i]%2==0)
printf("%d,",a[i]);
}
}
告诉你个问题,就是1.scanf输入非字符时遇空格结束,所以你爱怎么样就怎么样,打空格结束可以,但最后要打回车;
2.看见那个大括号没?,不加就会再来一次scanf的,最后一次判断返回流程图上边,不加就会遇到scanf的,这个是scanf的隐蔽性问题,自己去领悟吧.加那个大括号就是先遇到"{",然后就判断是语句的开段,就跳出,但是你直接来个scanf就先碰到这个家伙,然后由于他的粘带性就把你拉了进去,不干也得干啊,真是跳进黄河也洗不清.....郁闷吧.



以上个人观点若有问题望高手们斧正.......!
-------------------------------------------------
我是菜鸟我怕谁?




倚天照海花无数,流水高山心自知。
2007-05-05 15:08
我是菜鸟哦
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:921
专家分:209
注 册:2007-5-4
收藏
得分:0 

谢谢楼上,确实是的,刚才我怎么运行错了??????????????????


偶是菜鸟鸟偶惧WHO?!!!!
2007-05-05 15:56
lanrui
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2007-5-5
收藏
得分:0 
这样做也行,也许思路会更好,只是for多点

程序代码如下:
#include <stdio.h>
main()
{
int n,a[100],i,j,k;
printf("please input the number n:","/n");
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n-1;i++)/*第n-1次不比较*/
for(j=i+1;j<n;j++)
{
if(a[j]>a[i])
{
k=a[i];
a[i]=a[j];
a[j]=k;
}
}
for(i=0;i<n;i++)
{
if(a[i]%2==0)
printf("%d ",a[i]);
}
getch();
}

前面有位仁兄说的
"1.scanf输入非字符时遇空格结束,所以你爱怎么样就怎么样,打空格结束可以,但最后要打回车;
2.看见那个大括号没?,不加就会再来一次scanf的,最后一次判断返回流程图上边,不加就会遇到scanf的,这个是scanf的隐蔽性问题,自己去领悟吧.加那个大括号就是先遇到"{",然后就判断是语句的开段,就跳出,但是你直接来个scanf就先碰到这个家伙,然后由于他的粘带性就把你拉了进去,不干也得干啊,真是跳进黄河也洗不清.....郁闷吧."
我觉得不是问题,只是我们在区分逗号与空格上出了问题,

下面再介绍一种方法,这种方法土了点,可还是有用,思路还清晰点.
#include <stdio.h>
main()
{
int n,a[100],b[100],i,j,data,cnt=0;
printf("please input the number n:");
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
if(a[i]%2==0)
b[cnt++]=a[i];
for(i=0;i<cnt-1;i++)/*第n-1次不比较*/
for(j=i+1;j<cnt;j++)
{ if(b[j]>b[i])
{ data=b[i];
b[i]=b[j];
b[j]=data;
}
}
for(i=0;i<cnt;i++)
printf("%d ",b[i]);
getch();
}

注:我用的是wintc,要用getch()函数暂停屏幕!

2007-05-05 17:32
我是菜鸟哦
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:921
专家分:209
注 册:2007-5-4
收藏
得分:0 
哦,说的都是最后怎么老打getchar()啊,用WINTC
我查了下---------
scanf的一般结束标志(输入字符时是特例)
1.遇空格,回车,制表符号(tab).
2.遇宽度.
3.遇非法输入.(所以在输入整形时打逗号也代表输入完毕)

对于字符我只是知一二,这里说一下大家一起来讨论:
1.形式要对应
输入scanf("%d,%d",&a,&b) 就得按a,b的形式输入,否者输出时,第一个是你输入的第一个数;但应第二个要求输入","而输入其它的话,就会出现一个随机的值, 非正解.
2,以回车或空格(非法字符同理)结束的话,表面上是输入完毕,但如不及时处理,给后边的输入就带来了麻烦.
如:for(i=0;i<=2;i++)
scanf("%c",&a[i]);
若一下输入"a回车b回车c回车"则你只能输入到b然后就结束了.所一每次打完回车或空格最好个getchar()
 这里有个输入缓冲流的问题,(另外还有字符串的输入...)我学的一般不精通,所以不敢再多讲,望高人来指点迷津.........

偶是菜鸟鸟偶惧WHO?!!!!
2007-05-05 20:21
快速回复:请教一个c语言问题
数据加载中...
 
   



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

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