帮忙改正奇数和程式

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