| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2018 人关注过本帖
标题:(2)C语言问题之同一串代码在VC和codeblocks编译运行产生了不同的结果
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
17、18楼是连着的,你仔细看。

授人以渔,不授人以鱼。
2015-10-18 21:23
武伟
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:506
专家分:2638
注 册:2015-7-23
收藏
得分:0 
T版大人,您好,我觉得在回答您的问题之前,还是有必要向您请教请教的。
首先,我今年大一,普通的二本吧,专业软件工程。一个半月的学习下来,我就发现了很多问题:

1.我们每周只有1节C语言的专业课,每节课95分钟吧,老师讲的内容虽说比较繁琐但“自我感觉”还能消化掉,不知道是不是刚入门的原因,老师每节课讲的例子的代码,基本上不超过10行,所以感觉一周就这样一节“水课”,收获好像不大(当然也不排除我有好高骛远,基础没打牢的嫌疑)。问题就来了:其余的时间该怎么继续对这门语言进行深入学习?也是需要自学吗?

2.幸好我们学院还算比较重视ACM的比赛吧,据说最好的名次是华东赛区一等奖,学校里有个社团(ACM训练营)是参赛的主力,社团每周会对成员进行集训,然后进行相应的题目竞赛。集训的内容是我们上C课进度的好几倍,举个例子来说,这周是第三周集训,内容是数组&字符串;第一周集训的内容主要是while(EOF!=scanf())循环(话说我到现在也只会用,不知道为啥能一直循环下去)——重要的问题就又来了:一个半月过去了,我们的C语言专业课还没讲到第一周的集训内容……

3.学校有自己的OJ,可以在上面刷题(前面提到还有题目竞赛),这么说吧,现在我相对于我班的其他非社团成员现在在写代码的能力上要高一些的原因都可以归功于OJ上的刷题。老实说,即使是一些社团成员,也有懒散的,不刷题的,甚至夸张点说,如果跟着老师的步子走,估计现在输出“Helllo world!”都不是那么“行云流水”……但是刷题也刷出问题来了:前面不是说ACM的进度很快么,还有比赛,这就导致我现在感觉知识断层很严重,左一块,右一块的,有种是为了做题而做题的感觉……

总的来说,差不多就是如何在课外,利用好身边的资源(如ACM训练营)真正地提高自己的编程能力呢?可以看一些什么样的书籍呢?或者对于我现在的情况您有没有什么好的建议?不想做一个堕落的大学生。

希望可以得到一些指点
2015-10-18 21:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
不需要用math頭,自己寫一個pow()函數取代,如下:
程序代码:
int powi(int x, unsigned int n)
{
    unsigned int i;
    int result;

    result = 1;
    for (i = 1; i <= n; ++i)
    {
        result *= x;
    }

    return result;
}


math頭中的pow()函數,由於指數n允許用負數和小數,它的機制很複雜,具體與庫的實現有關(亦即你們說的編譯器和版本差異)。對你的應用而言,處理數據均是整數,在邏輯上就不應調用浮點類型的函數,庫沒有,就自己寫,用int也好,long也好,都不用浮點數。所謂的“邏輯”,就是你的處理對象本是整型,就按對象本身性質來選擇整型的數據和處理機制,而不是用浮點類型來替換,後者屬於技巧。庫的pow()函數不是你自己寫的,你也不知道把參數强制爲int之後它如何實現,是否仍用原來複雜的計算法,抑或是有針對性算法。但無論如何,用浮點仿真整型,都導致運行效率低下,這是違反邏輯自找的後果。

《C++編程規範》中有一個説法:如果你發現自己的代碼有太多的强制類型轉換情況,那麽極大可能是你的設計出錯。愛用强制類型轉換,是這個論壇很多人的偏好,他們以爲這種“轉換”真的有效。C程序員的確很愛用强制類型轉換,但C++程序員卻是力戒這種動作的,那正是C++設計專用的、較爲難寫的類型轉換語法(static_cast等)的原因,它的意思是給程序員製造麻煩以至你不用,是故意的設計。不過很多從C轉過來的程序員,都愛沿用C的思維,使用括號轉換法做類型轉換。

根據上面大家的測試結果,完全可以證明你所使用版本gcc浮點庫的實現有毛病,它顯然在指數是正整數的情況下仍使用涵蓋一切的浮點運算法,把簡單問題複雜化,導致計算出錯。

[此贴子已经被作者于2015-10-19 11:53编辑过]


授人以渔,不授人以鱼。
2015-10-19 11:44
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
ACM是競賽。與其他的競賽,如奧數,性質一樣,都是學有餘力之人玩的。學得好的人,競賽勝出,但並非反過來,競賽勝出,就是學得好,那也可能是考試能手罷了。而且在我看來,像奧數那樣的東西,大部分是走火入魔的,偏難怪居多,專走偏門,基礎並不踏實。ACM也不過類似。現實工作的編程,實際上並沒有那麽緊的時間限制,在短時間内解決一兩個小問題,也不表明在工作中能夠周詳考慮整體問題,恰恰編程是講整體的。ACM解題,本質上與做數學應用題差不多,關鍵是你能否理解題目,而不是如何解決。很多題目,不是你不會解,而是連題意都沒讀明白,因爲那些情景是你不熟悉的(正如求定積分,本來是非常簡單的纍加求和,但你不熟悉這專業,就是栽了)。奧賽和ACM等差不多,平時接觸過、訓練過的,就會,沒有的,就不會,永遠都考不完,也總能考倒你,但現實工作並不是以難倒你爲主,而是有整個團隊在支撐去給你最大的幫助,有專業培訓,不會每年變個花樣,沒有那麽多未知領域,反而長期做枯燥的重複事情(維護是常態),當然,你總跳槽是另一回事。

做程序,除了效率,還有很多指標,如可讀性和可維護性等,那些都是ACM不考的,如果不重視別的,專弄那些,屬於偏科,卻因不斷的被刷題AC誤導,以爲這樣就學好了,那禍害更大。事實上,在這裏也能看到,很多ACM不錯的,到最後總暴露出基礎不扎實的毛病,連平時最常用的東西都不會,衹會那些百年一遇的東西,靠那些,哪個老闆養這種閑人?

授人以渔,不授人以鱼。
2015-10-19 12:42
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
讀大學,以自學爲主,老師講課屬於帶進門和解答疑難,修行在個人,很像星宿派。入門階段,先什麽書都讀一下,有個印象,接觸,讀多了,自然會篩選。別人推薦的,未必適合你個人,每個人的基礎不一樣,他讀得懂、覺得好,不等於你也讀得懂、覺得好。別人和大衆推薦,可以先去圖書館瀏覽一下,能讀進去了,就買回來細讀,讀不進的,就不用讀了,過一段時間,再嘗試看能不能讀下去。

授人以渔,不授人以鱼。
2015-10-19 12:59
蓝色风暴cl
Rank: 8Rank: 8
来 自:新疆
等 级:蝙蝠侠
威 望:3
帖 子:163
专家分:704
注 册:2015-9-6
收藏
得分:0 
繁体字看着好别扭,但是还是学习了。赞一个。

欢迎大家加好友哦,多找我聊聊吧!
2015-10-19 13:19
武伟
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:506
专家分:2638
注 册:2015-7-23
收藏
得分:0 
T版,首先要跟你说声抱歉的是,你写的这个很简单的pow()函數我其实并不是能完全看懂,但我会保存下来,等学习到相关知识的时候再回过头来进行反思。

其实通过这两天跟你的对话,给我的启发在C中重要的还是基础逻辑思维。首先说基础,扪心而问,这一个月下来,经过协会的几次集训,因为心里一直想在题目竞赛上取得好名次,所以脑海中只有一个念头:把题做出来!把题做出来!!把题做出来!!!且不说代码代码合理与否,光是代码的排版自己也看得不顺心,只要求做题的速度与结果——AC,做完题进行反思&总结也是了了完事。这就导致了现在都不能把数据类型有些啥说个大概,总之感觉基础真的渣。

再就是逻辑思维,就拿我这题来说:“處理數據均是整數,在邏輯上就不應調用浮點類型的函数”。我们集训的时候只说了pow()可用于高次运算,也没提到它的使用对象为浮点类型的数据,这也可以反映出基础问题和急功近利的心态。我们现在用的专业书《C语言程序设计》(第二版)里有这样一段话:强转(强制转化类型)与指针,犹如传说中的倚天剑和屠龙刀,可并称为C语言的两大神器,用好了可以呼风唤雨,用坏了则损兵折将。因此,必须恰当使用。我觉得其中所含的一些道理与你说的“逻辑优先,不要靠技巧!”基本一致。

[此贴子已经被作者于2015-10-19 20:17编辑过]

2015-10-19 20:15
武伟
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:506
专家分:2638
注 册:2015-7-23
收藏
得分:0 
毕竟是大学刚开学,初次接触C语言,我应该端正心态,夯实基础!夯实基础!!夯实基础!!!不能被眼前的一些蝇头小利(竞赛名次)蒙住双眼,集训固然对自身提高起着一定作用,但重要的还是平时自己对C的理解与感悟。

T版大人,谢谢啦!你还让我了解ACM比赛的性质和以后工作的些许情况以及它们二者之间的区别。第一次有种“听君一席话,胜读十年书”的感觉——不是拍你的马屁哦~~~
2015-10-19 20:17
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用武伟在2015-10-19 20:15:02的发言:

T版,首先要跟你说声抱歉的是,你写的这个很简单的pow()函數我其实并不是能完全看懂,但我会保存下来,等学习到相关知识的时候再回过头来进行反思。


你寫3個x連乘也比調用浮點函數強!

授人以渔,不授人以鱼。
2015-10-20 04:20
武伟
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:506
专家分:2638
注 册:2015-7-23
收藏
得分:0 
以下是引用TonyDeng在2015-10-20 04:20:12的发言:



你寫3個x連乘也比調用浮點函數強!

嗯,的确是。
2015-10-20 15:07
快速回复:(2)C语言问题之同一串代码在VC和codeblocks编译运行产生了不同的结果 ...
数据加载中...
 
   



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

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