幫忙改正奇數和程式

Home Home
引用 | 編輯 csr
2010-12-06 17:47
樓主
推文 x0
剛學c/c++
偶數和
及1加到100都可以為何奇數和會弄得亂七八糟呢
大大們可否看小弟那錯了
幫忙改正一下
好嗎
拜託了

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
  int   i=1,sum=0;    
  start:
      i+=2;
      sum+=i;
      printf(&q ..

訪客只能看到部份內容,免費 加入會員



獻花 x0
引用 | 編輯 ronlain
2011-01-05 23:29
1樓
  
把sum+=i 跟 i+=2反過來就好了

int   i=1,sum=0;  
start:

    sum+=i;
    i+=2;
    printf("%d",i);

獻花 x0
引用 | 編輯 csr
2011-01-08 15:08
2樓
  
還是不行
因為它少了1但是卻多了101
所以還是錯誤
謝謝

獻花 x0
引用 | 編輯 ronlain
2011-01-08 23:43
3樓
  
你再試看看吧 應該沒少也沒多
第一次i=1 sum+=1 1不會少
最後一次 i=99 sum+=99
i+=2 i=101 這個101下一個 if (i<100) 不會成立


int   i=1,sum=0;
start:
  sum+=i;
  i+=2;
  if(i<100)

獻花 x0
引用 | 編輯 csr
2011-01-28 17:54
4樓
  
下面是引用 ronlain 於 2011-01-08 23:43 發表的 : 到引言文
你再試看看吧 應該沒少也沒多
第一次i=1 sum+=1 1不會少
最後一次 i=99 sum+=99
i+=2 i=101 這個101下一個 if (i<100) 不會成立


int   i=1,sum=0;
start:
  sum+=i;
  i+=2;
  if(i<100)

真的不行
因為1+2=3所以1不見了,它就從3開始算起,99+2=101,而99是 if(i<100)符合假設
若不相信
大大你用dev c++編譯看看
我個人是把它改成如下程式碼


#include<stdio.h>
#include<stdlib.h>
int main(void)
{
  int   i=-1,sum=0;    
  start:
      i+=2;
      sum+=i;
      printf("%d",i);
      if(i<99)
     
  {
        printf("+");
        goto start;
  }
    printf("=%d\n",sum);
  system("pause");
  return 0;
}

獻花 x0
引用 | 編輯 totsi
2011-01-31 08:56
5樓
  
原因很簡單,因為您是先加完再印,所以i=1,且i+=2時,下一行i已經等於 i = 1 +2了,所以結果當然會是3。

因此就像您改的,要先從-1開始加,才會讓第一組出來的數字為1。
除非您是先印再加。

但ronlain大大說的也沒錯,因為ronlain大大並沒有印值,而是直接算總和,所以他一開始把i=1加進來,所以總和也是會對的。

而且您也沒有說少的1是「沒加進和裡」還是「沒印出來」,我想,這ˋ樣要debug可能會有所落差嚕~~

希望對您有幫助 表情

獻花 x0
引用 | 編輯 csr
2011-01-31 11:14
6樓
  
下面是引用 totsi 於 2011-01-31 08:56 發表的 : 到引言文
原因很簡單,因為您是先加完再印,所以i=1,且i+=2時,下一行i已經等於 i = 1 +2了,所以結果當然會是3。

因此就像您改的,要先從-1開始加,才會讓第一組出來的數字為1。
除非您是先印再加。

但ronlain大大說的也沒錯,因為ronlain大大並沒有印值,而是直接算總和,所以他一開始把i=1加進來,所以總和也是會對的。

而且您也沒有說少的1是「沒加進和裡」還是「沒印出來」,我想,這ˋ樣要debug可能會有所落差嚕~~

希望對您有幫助 表情

感恩大大解說
已試過編譯
還是一樣
所以仍然有問題
謝謝

獻花 x0
引用 | 編輯 totsi
2011-01-31 12:52
7樓
  
下面是引用 csr 於 2011-01-31 11:14 發表的 : 到引言文


感恩大大解說
已試過編譯
還是一樣
所以仍然有問題
謝謝


那就好玩嚕,我用ronlain大大的方式,改用while來寫而已,結果同ronloain大大所言。
所以錯是錯在結果不對嚕?XD
複製程式
       int sum = 0, i = 1;

       while ( i <= 100 )
       {
              sum += i;
              printf("The addition value = %d\n", i);

              i+=2;
       }

       printf("The sum =%d\n", sum);

       system("pause");


獻花 x0
引用 | 編輯 csr
2011-01-31 14:53
8樓
  
下面是引用 totsi 於 2011-01-31 12:52 發表的 : 到引言文


那就好玩嚕,我用ronlain大大的方式,改用while來寫而已,結果同ronloain大大所言。
所以錯是錯在結果不對嚕?XD
[code].......

大大你好
很感謝你不辭辛勞的幫小弟找bug
但是
假如大大有dev c++編譯器的話
請用小弟的程式編譯一次就可明白
現在大大用其他方式改寫
編譯器又有差別
那結果就會不一樣
所以小弟再次編譯後仍然一樣
因此還是無解
最後再次謝謝大大
感恩不盡

獻花 x0
引用 | 編輯 totsi
2011-01-31 17:17
9樓
  
問題跟dev-c無關,會顯示上有問題就像我第一個回的,您的作法是先做再印

所以當然會印不出1,但加出來的值是對的(ronlain大大的作法)

最後會多印101也是同樣的原因。

所以會建議您把您跑的圖跟code貼在同一個回覆內,至少看的人會比較清楚知道問題。

最後,不建議用goto寫迴圈,原因我想您多玩幾次就能體會了~~

希望對您有幫助~ 表情

ps.一開始我還以為start: 是新的迴圈語法XDD

獻花 x0
引用 | 編輯 csr
2011-01-31 21:05
10樓
  
這就是我編譯的結果
請指教
謝謝




#include<stdio.h>
#include<stdlib.h>
int main(void)
{
  int   i=1,sum=0;    
  start:
      sum+=i;
      i+=2;
      printf("%d",i);
      if(i<100)
     
  {
      printf("+");
      goto start;
  }
  printf("=%d\n",sum);
  system("pause");
  return 0;
}          

以上是大大的寫法
雖然計算結果沒錯
但就是多了一個101及少了1
小弟指的就是這個
謝謝

獻花 x0
引用 | 編輯 csr
2011-01-31 21:10
11樓
  
下面是引用 csr 於 2011-01-31 21:05 發表的 : 到引言文
[attachment=727415]這就是我編譯的結果
請指教
謝謝

以下是我用另一種方式寫出來的程式
它也是另一種的奇數和

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
  int i=1,sum=0;
  printf("i   總和 \n");
  printf("\n");
  for(i;i<=100;i+=2)
  {
      sum+=i;
      printf("%d     %d\n",i,sum);
  }
  system("pause");
  return 0;
}

獻花 x0
引用 | 編輯 totsi
2011-02-01 09:50
12樓
  
複製程式
int main(void)
{
  int   i=1,sum=0;    
  start:
      sum+=i;
      printf("%d",i);

      i+=2;
      if(i<100)
     
  {
      printf("+");
      goto start;
  }
  printf("=%d\n",sum);
  system("pause");
  return 0;
}     


獻花 x1
引用 | 編輯 csr
2011-02-01 14:04
13樓
  
bug終於讓大大幫小弟改進
看了大大程式碼後
真才了解寫程式原來步驟一步都不能有疏忽
否則全盤皆墨
小弟以後一定會更全盤的去考量
希望大大這神來一筆
會讓小弟在學c語言時
會更加小心與思考
再次對大大至敬
感恩再三
謝謝
以後若小弟有不懂之處
希望大大還能適時對小弟施教

大大你好
底下這會出現兩個+
不知要如何改
謝謝
程式碼如下
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
  int   i=0,sum=0,;
  start:
      i+=1;
      if(i%2==1)
      sum+=i;
      if(i%2==1)
      printf("%d",i);
      if(i<100)  
  {
  printf("+");
  goto start;
  }
  printf("=%d\n",sum);
  system("pause");
  return 0;
}  



獻花 x0
引用 | 編輯 totsi
2011-02-03 10:59
14樓
  
原因也很簡單,問題是因為您不管是奇數還是偶數,都會走到printf("+")。

所以顯示"+"應該是有真的加值進來時,才顯示"+"才對。

所以簡單作法是
複製程式
  if(i<100 &&(i%2 == 1) )   
  {
    printf("+");
    goto start;
  }

目前手頭沒有compiler可以測,所以您可以先玩玩看。

如果不行,那就記得修改的條件是「有加入的值,才顯示"+"」但是這個要注意頭尾的問題。

個人還是建議不要用goto當迴圈使用。

希望對您有幫助~~ 表情

我比較偏好的寫法如下:
複製程式
int main(void)
{
  int   i=0,sum=0,; 
  start:
       i+=1;
      if(i%2 == 0) {
        goto start;
      }
     
      sum+=i;
      printf("%d",i);
      if(i<100 && i != 99)   
     {
        printf("+");
        goto start;
      }
      printf("=%d\n",sum);
      system("pause");
      return 0;
}   


獻花 x0
引用 | 編輯 星辰雪
2011-02-03 11:52
15樓
  
原來還有這一招
可以使用 goto
跳回去 start
真不錯
可以學習一下
我好像比較少
使用到 goto

獻花 x0
引用 | 編輯 csr
2011-02-04 08:57
16樓
  
下面是引用 totsi 於 2011-02-03 10:59 發表的 : 到引言文
原因也很簡單,問題是因為您不管是奇數還是偶數,都會走到printf("+")。
所以顯示"+"應該是有真的加值進來時,才顯示"+"才對。
所以簡單作法是
[code] if(i<100 &&(i%2 == 1) )  
.......

大大
不可以耶
編譯出來如下



另外大大寫的就ok
真是佩服
小弟要多努力邏輯思考一下
謝謝

獻花 x0
引用 | 編輯 totsi
2011-02-08 10:27
17樓
  
不好意思,我忘記您的作法會出現只有跑一次的問題XDDD

如使用您的方式,可以用的code如下:
複製程式
  if(i<100)   
  {
    if(i%2 == 1 && i != 99)
    {
       printf("+");
    }
    goto start;
  }

還有,最後還是老生常談,迴圈非必要時,少用goto來玩。
不然會很常在除錯XDD。
for...do while的反而會比較好抓XDD

獻花 x1
引用 | 編輯 csr
2011-02-09 20:49
18樓
  
下面是引用 totsi 於 2011-02-08 10:27 發表的 : 到引言文
不好意思,我忘記您的作法會出現只有跑一次的問題XDDD

如使用您的方式,可以用的code如下:
複製程式
  if(i<100)   
  {
    if(i%2 == 1 && i != 99)
    {
       printf("+");
    }
    goto start;
  }

還有,最後還是老生常談,迴圈非必要時,少用goto來玩。
不然會很常在除錯XDD。
for...do while的反而會比較好抓XDD

測試後一切OK
大大可真是高手
小弟佩服的五體投地
看來
小弟對於語言邏輯慨念要好好多加強囉
不過
是否可請教大大一個問題
那就是書本上的範例大約五六成都看的懂
但是題目一來那就一頭霧水不知如何了
像這樣
是不是該加強那方面的學習
才能如大大這樣手到擒來不費吹灰之力
謝謝

獻花 x0
引用 | 編輯 totsi
2011-02-11 08:52
19樓
  
高手不敢稱~目前也才等ˋ級3而已XDDD

其實沒什麼別的方法,就多看、多聽、多問、多做,最重要的是多想

想不通,找管道問,問題寫的清楚,就有人願意幫忙嚕^^m

想完後再問,比較會知道自己思路上少考慮哪些部分

這只是自己短短3年的學習心得~~

共勉之~~

希望對您有幫助XDDD

PS.書上範例不一定都能用,所以拿到手的時候,建議先想想看他為何要這樣寫,那這樣寫能不能用。不確定的話就用編輯器來debug,邊debug就知道他哪裡的邏輯錯了。

獻花 x1
引用 | 編輯 csr
2011-02-11 20:56
20樓
  
下面是引用 totsi 於 2011-02-11 08:52 發表的 : 到引言文
高手不敢稱~目前也才等ˋ級3而已XDDD

其實沒什麼別的方法,就多看、多聽、多問、多做,最重要的是多想

想不通,找管道問,問題寫的清楚,就有人願意幫忙嚕^^m

想完後再問,比較會知道自己思路上少考慮哪些部分

這只是自己短短3年的學習心得~~

共勉之~~

希望對您有幫助XDDD

PS.書上範例不一定都能用,所以拿到手的時候,建議先想想看他為何要這樣寫,那這樣寫能不能用。不確定的話就用編輯器來debug,邊debug就知道他哪裡的邏輯錯了。

感謝大大不吝指導
小弟我才剛學六,七個月
看過C,C++,Visual C++,資料結構等不下十多本書(大部份有看沒懂)
但是因為是自學
所以也沒老師可問
到網路上查資料也都無法完全釐清心中疑點
現今只在本論壇遇到大大您這位老師肯如此跟小弟這樣反覆討論
否則也不會為如何學起而浪費許多時日
如今大大這一席話小弟將謹記在心
好事多磨
就讓今天過後
因為大大而讓我走上學習的正徒上
謝謝再謝謝
感恩再感恩
就因為有你

獻花 x0
引用 | 編輯 tonylucy321
2012-12-13 19:00
21樓
  
很復雜 看不憧
但我會研宄
謝謝大大 表情

獻花 x0