2012-03-12 34 views
0

我是一個相對的初學者與C我寫了我認爲是一個相當簡單的 C程序迭代變量'賽季'內兩-loops。代碼編譯 並運行,但'季節'未被正確跟蹤。我希望有人可能會 願意提供有關如何更正代碼的建議。C:迭代for循環,一個ceil語句和odd vs even語句

下面我提供了我想要的結果,當前C代碼以及代碼爲 的結果。

我想下面的結果:

cohort = 1, class = 1, season = 1 
cohort = 1, class = 2, season = 1 
cohort = 1, class = 3, season = 2 
cohort = 1, class = 4, season = 2 
cohort = 1, class = 5, season = 3 
cohort = 1, class = 6, season = 3 

cohort = 2, class = 1, season = 1 
cohort = 2, class = 2, season = 2 
cohort = 2, class = 3, season = 2 
cohort = 2, class = 4, season = 3 
cohort = 2, class = 5, season = 3 

cohort = 3, class = 1, season = 2 
cohort = 3, class = 2, season = 2 
cohort = 3, class = 3, season = 3 
cohort = 3, class = 4, season = 3 

cohort = 4, class = 1, season = 2 
cohort = 4, class = 2, season = 3 
cohort = 4, class = 3, season = 3 

cohort = 5, class = 1, season = 3 
cohort = 5, class = 2, season = 3 

cohort = 6, class = 1, season = 3 

我的C代碼如下正下方之後,我提出了 結果被返回代碼:

#include <stdio.h> 
#include <math.h> 
char quit; 

main() 
{ 

int mcoht, mclass, season, nmcohts ; 
double season2, cohort2, class2 ; 

nmcohts = 6 ; 

// cohort loop 

for (mcoht=1; mcoht <= nmcohts; mcoht++) { 

    season = ceil(mcoht/2) ; 

    // class loop 

    for (mclass=1; mclass <= (nmcohts-(mcoht-1)); mclass++) { 

    season2 = season ; 
    cohort2 = mcoht ; 
    class2 = mclass ; 

    printf("cohort is: %10.10lf\n", cohort2); 
    printf("class is: %10.10lf\n", class2); 
    printf("season is: %10.10lf\n", season2); 

    // update season (mclass&1) = 0 if mclass even, 1 if mclass is odd 

    if(((mcoht&1) + (mclass&1)) == 1) season = season + 1; 

    } // close class loop 

} // close cohort loop 

    printf("To close type 'quit' and hit the return key\n"); 
    printf("    \n"); 
    scanf("%d", &quit); 

return 0; 

} 

以下是通過返回的結果代碼。除非我犯了一個錯誤 在下面輸入下面的句子,看起來'季節'對於偶數隊列 是正確的,但是對於奇數號 隊列,它看起來像是需要的。

感謝您提出任何有關如何更正代碼或如何改進此帖子的建議 。

cohort = 1, class = 1, season = 0 
cohort = 1, class = 2, season = 0 
cohort = 1, class = 3, season = 1 
cohort = 1, class = 4, season = 1 
cohort = 1, class = 5, season = 2 
cohort = 1, class = 6, season = 2 

cohort = 2, class = 1, season = 1 
cohort = 2, class = 2, season = 2 
cohort = 2, class = 3, season = 2 
cohort = 2, class = 4, season = 3 
cohort = 2, class = 5, season = 3 

cohort = 3, class = 1, season = 1 
cohort = 3, class = 2, season = 1 
cohort = 3, class = 3, season = 2 
cohort = 3, class = 4, season = 2 

cohort = 4, class = 1, season = 2 
cohort = 4, class = 2, season = 3 
cohort = 4, class = 3, season = 3 

cohort = 5, class = 1, season = 2 
cohort = 5, class = 2, season = 2 

cohort = 6, class = 1, season = 3 

我將結果中的代碼示例引號僅作爲列顯示。我不需要如圖所示格式化輸出。我只需要'季節'來正確計算。

+0

我是一個自學成才的newby。請隨時提出改進建議。 – 2012-03-12 06:42:32

+0

謝謝大家。這非常有幫助和教育。我也會研究可能獲得的'The C Programming Language'。 – 2012-03-12 07:50:17

回答

1

我很驚訝這還沒有在半小時內得到答覆......

你與ceil()功能遇到的問題是,你正在使用整數操作數爲師。 C用除了整數運算數的方式進行分割的方式是它會產生一個整數結果,截去任何小數部分。

因此,1/2給出0的結果,而不是0.5

如果你想要一個浮點結果,你需要強制至少一個操作數爲浮點。因此,而不是:

ceil(mcoht/2) 

嘗試

ceil(mcoht/2.0) 
+0

謝謝,真誠。這非常有幫助。 – 2012-03-12 07:29:23

+0

仍然不能修復使用浮點數學不必要的整數 – technosaurus 2012-03-12 07:56:18

1

而且一些事情除了ceil功能:

  1. 聲明season2 = season;是多餘的,因爲season已經在內部範圍for循環。
  2. 你不需要double s。
  3. 按照C99標準,您不應該忽略該函數的返回類型(您的情況爲main)。雖然你可以省略main的參數,你最好把void放在那裏。
  4. 在操作員周圍增加一些空間也會有幫助。
+0

好評。在這種情況下,ceil()可以用'mcoht/2 + 1'替代。 – Lundin 2012-03-12 07:32:46

+0

謝謝。我會盡力實施你的建議。對於我來說,在這裏發佈一個關於最好的C參考書的建議,對於自己學習語言的人來說是否合適? – 2012-03-12 07:33:24

+0

@MarkMiller,有人會說你應該選[The C Programming Language](http://en.wikipedia.org/wiki/The_C_Programming_Language)...如果你認爲你會用一本新書更好:(1 )按年過濾書籍(至少從1999/2000開始,以便它們考慮到C99標準),(2)檢查評論。 – Blaz 2012-03-12 07:40:46

1

您應該完全避免撥打ceil,不需要將事物轉換爲雙倍,進行函數調用並轉換回來。如果我看到這個正確的整數算術(mcoht+1)/2將是完全足夠的。

+0

謝謝,真誠。 – 2012-03-12 07:52:31

1

變量名對我來說沒有任何意義,所以我只是將它們更改爲b和(而不需要c),並在while循環中使用(只是個人偏好)。看起來這個課程的目標是使用mod和/或div來找到模式(第3列是列a +列b div 2)

#include <stdio.h> 

int main(){ 
int a=0, b, num=6; 
while (a++<=num) { b=0; 
    while (b++ <= (num-a)) 
     printf("cohort is: %d class is: %d season is: %d\n", a, b,(a+b)/2); 
} 
return 0; 
} 
+0

謝謝,真誠。 – 2012-03-12 07:50:51