幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
12
返回列表 发新帖
楼主: august

[通用编程] 程序C

[复制链接]

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
 楼主| 发表于 2007-10-5 23:09:00 | 显示全部楼层
果然是好复杂 [s:5]
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-10-5 23:09:26 | 显示全部楼层
引用第9楼rednaxela于2007-10-05 22:25发表的  :

LZ想要输出的不就是年龄最大的那个entry么...? 至少代码上是这么写的,结果也是对的

不,并不是FX所说的结果,因为这里迭代使用的是p++而p的变动是需要通过判断进行的,于是假设就是选择年龄最大的一个:

根据代码所示,一旦出现一个比后面一个大的元素,整个结果就立即敲定了,所以这里肯定是另外一种错误,就是if的处理句子,应该是把if的下面两句话对调:

if(m<p->age)
m=q->age;
q=p++;

反例也很容易举:
person[N]={"zhang",20,"li",18,"wang",19,"sun",22};
结果是:
zhang,20
代码就算是短貌似也有内在的问题,所以BUG难调试ToT:
Style-C
回复 支持 反对

使用道具 举报

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
 楼主| 发表于 2007-10-5 23:11:19 | 显示全部楼层
那要写出完全正确的,应该怎么写呢?
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-10-5 23:14:13 | 显示全部楼层
ToT。LZ请把每个人的意见综合一下就可以了^^

当然程序的本意还得你自己决定,我们只是就事论事,想到说到罢了= =
Style-C
回复 支持 反对

使用道具 举报

8

主题

215

帖子

2223

积分

⑥精研

积分
2223
发表于 2007-10-6 00:04:19 | 显示全部楼层
恩我眼花没看到p++受判断影响.值得吐槽的地方果然是太多了.
就按照LZ原本的写法:
  1. #include <stdio.h>
  2. #define N 4
  3. struct man
  4. {
  5.     char name[20];
  6.     int age;
  7. } person[N] = { "li", 18,
  8.                 "wang", 21,
  9.                 "zhang", 20,
  10.                 "sun", 22 };
  11. void main(void)
  12. {
  13.     int i;
  14.     int m = 0;
  15.     struct man* ptr = person;
  16.     struct man* res;
  17.    
  18.     for (i = 0; i < N; i++, ptr++)
  19.     {
  20.         if(m < ptr->age)
  21.         {
  22.             m = ptr->age;
  23.             res = ptr;
  24.         }
  25.     }
  26.    
  27.     printf("%s,%d",(*res).name,(*res).age);
  28. }
复制代码


-or-

  1. #include <stdio.h>
  2. #define N 4
  3. struct man
  4. {
  5.     char name[20];
  6.     int age;
  7. } person[N] = { "li", 18,
  8.                 "wang", 21,
  9.                 "zhang", 20,
  10.                 "sun", 22 };
  11. void main(void)
  12. {
  13.     int i;
  14.     int m = 0;
  15.     int resOfs;
  16.     struct man* ptr = person;
  17.    
  18.     for (i = 0; i < N; i++, ptr++)
  19.     {
  20.         if(m < ptr->age)
  21.         {
  22.             m = ptr->age;
  23.             resOfs = i;
  24.         }
  25.     }
  26.    
  27.     printf("%s,%d",person[resOfs].name,person[resOfs].age);
  28. }
复制代码


...

方法实在是太多了.
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-10-6 08:14:31 | 显示全部楼层
如果这是什么思考题这类的话,那就比较囧了……

PS: 为啥那个可爱的STATIC被删掉了啊- -
[s:6]  [s:6]  [s:6]
Style-C
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2007-10-6 09:31:42 | 显示全部楼层
引用第5楼rednaxela于2007-10-05 19:53发表的  :
shawind没把警告级别全打开...我那是用了/Wall的
  1. C:\\>dmc -w t.c
  2. link t,,,user32+kernel32/noi;
  3. C:\\>t
  4. sun,22
复制代码
开了警告也这德性...dmc和lc到底是不一样啊。dmc默认是有警告的,只是级别低点。
真要说起来,把lc的警告级别开到最大,然后把所有的警告当作错误,真不知道还能有多少程序能正常编译。
ps.那个著名的ogg的vorbis库里,居然还有把double隐式转成float的警告。这玩意只有想不到的,没有做不到的...
え~え~お!!!
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-10-6 09:59:38 | 显示全部楼层
偶以前一般在使用VC71或者VC8的时候开W4,至于ALL……还没用过
不过貌似/W4会被取消??
[s:5]
Style-C
回复 支持 反对

使用道具 举报

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
 楼主| 发表于 2007-10-6 13:27:23 | 显示全部楼层
[s:5] 请问那个警告级别在哪里开?
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复 支持 反对

使用道具 举报

8

主题

215

帖子

2223

积分

⑥精研

积分
2223
发表于 2007-10-6 15:50:07 | 显示全部楼层
通过命令行编译的话,可以用/W开关
通过IDE编译的话,可以找build的选项.一般在project settings之类的地方(看是什么IDE了)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-5-2 07:19 , Processed in 0.019330 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表