从零开始学编程---第一步-C语言(十一)

时间:2014-03-05 11:31    点击:

题目
用for语句计算s=1+2+3+...+99+100

如何开始?
首先定义一变量s,用来装数与数相加的和
再定义一变量a 用来装1,2,3,...99,100的数字

初始化s=0;
s=s+a       a=1    s=0+1    此时s=1 再a++    
s=s+a      a=2    s=1+2    a++
s=s+a      a=3    s=(1+2)+3 a++
s=s+a      a=4    s=(1+2+3)+4 a++
.............

由此可见,我们只要让a从1循环到100就可以了
for(a=1;a<=100;a++)

程序为
#include <stdio.h>
main()
{
     int a,s=0;             //这里s初始化为0
     for(a=1;a<=100;a++) //这里a是初始化为1
     s=s+a;
     printf("s=%d\n",s);

}

结果是5050

注意s=s+a可以省略为s=+a

s=s+a     可能有人不明白 其实跟a=a+1一个道理
这样理解: 新S的值(未知)=旧S的值+a       跟数学完全不是一个道理

这个程序你可以看到s=1+2+3+...+99+100的运算过程
#include <stdio.h>
main()
{
     int a,s=0;
     for(a=1;a<=100;a++)
     {
         s+=a;
         printf("s=%d+%d\n",s,a);
     }
}

运行后你会发现第一句是s=1+1,而不是s=0+1
我来解释一下,当循环第一次
s+=a;      s=0+1 这里的s已经为1
printf("s=%d+%d\n",s,a);    所以这里打印的S是1
所以一开始就是打印s=1+1

我们需要修改一下,
printf("s=%d+%d\n",s,a);
s+=a;
调换个顺序就不会出现此现象

最终程序
#include <stdio.h>
main()
{
      int a,s=0;
     for(a=1;a<=100;a++)
     {
         printf("s=%d+%d\n",s,a);
         s+=a;
     }

   
}


还有一种方法打印1+2+3+...+99+100的运算过程

看程序
#include <stdio.h>
main()
{
      int a,b,s1,s=0;
      for(a=1,b=1;a<=100,b<=100;a++,b++)
      {    
           s+=a;
           s1=(b-1)*(b/2);
    
      printf("%d=%d+%d\n",s,s1,a);
      }
}

这个大概大家很难看懂
首先a的变量是做什么用的大家应该都知道
那么b,s1变量是做什么的
其实程序不要b,s1也能完成程序结果
b,s1这里的作用是显示运算过程,b为循环变量(控制循环),s1为旧s值的变量
变量

s=s+a    理解为:新S的值=旧s的值+a       这里旧s变量就是s1的变量
也就是s=s1+a 这里s1只是字面量(显示用的),并不在程序里运算,真正运算的其实还是变量s和变量a

s1怎么来的?
经过我们推算前几个表达式
1=0+1
3=1+2
6=2+3
10=6+4
15=8+5
21=15+6
。。。。。     (后面不需要你在推算拉)

中间数字(也就是s1)从第1个表达式到第100个表达式的数字是
0,1,2,6,8,15..........
要依次打印这些数字,可要动点脑筋了,这就需要高中数学所学的数列知识了
我们可以根据这组数字的规律,推出这组数字数列公式为(n-1)*(n/2);也就是可以推出第N个的数字是几
既然总共只有100个算术表达式,那这组数列也就是100个数字
这时我们就需要循环了
s1=(n-1)*(n/2);我们要从第一个数字开始依次打印s1的值,直到第100个数字
所以需要一个循环变量来控制循环
for(b=1;b<=100:b++)
s1=(b-1)*(b/2);         这里要把b看成n

当然你完全可以用a代替b,因为a的循环控制和b的循环控制一样
如下
#include <stdio.h>
main()
{
      int a,s1,s=0;
      for(a=1;a<=100;a++)
      {    
           s+=a;
           s1=(a-1)*(a/2);
    
      printf("%d=%d+%d\n",s,s1,a);
      }
}

这样很简洁,很清晰,之所以加个变量b是为了让你们更好的理解s1那层循环

这个程序可见还是要有一定数学功底才能做的出,数列知识也许大家都忘了

提示:我这个程序可能讲解的不详细,如果让你越看越晕,那你最好别再看下去了这个程序,不然会陷在里面,编程的算法很多,有很多方法来解决,现在不明白这个不代表以后不明白,这个包含了一定的数学知识,现在如果实在不明白,你可以忽略,并不影响你接下来的学习,

另外,说个死循环的例子
for(b=1;b<=100;b++)
      {
       b=(b-1)*(b/2);
         printf("s=%d\n",b);
      }
这种是死循环,你能看出来吗?
当第一次循环 b=1 b=(b-1)*(b/2); b=0 打印 然后返回for再b++ b又等于1
如此反复,b一直从0和1跳,没有结束循环的条件,则死循环

用了一会for语句,你应该发现了for有强大的控制功能
比如
    for(a=1,b=1;a<=100,b<=100;a++,b++)

你就可以看到for括号里可以包含多个赋值语句,控制语句,以及表达式

for(a=1;a<=100;a++) 相当于for(a=1;a<=100;a=a+1)
这种只是我们最基本用的,你必须掌握这种

以后还有多种形式,我们会渐渐接触到


补充一句:for(a=1;a<=100;a++) 和for(a=1;a<=100;++a) 一样的

再来一题:输入一个数,从0开始,输出n个连续的偶数和奇数
例如我输入9 它就打印
0 2 4 6 8
1 3 5 7 9

这题怎么入手?首先先弄清偶数列和奇数列的规律,这就需要我们的数学所学过的数列知识了,也许大家不记得了
偶数列从0开始的数列公式为 2(n-1)    从2开始就是2n
奇数从1开始的数列公式为 2n-1
现在关键是怎么循环
定义变量a存储偶数和奇数,变量n为我们输入的数
先循环偶数 初始化a=0 这样我就可以用2n公式
for(a=0;a<=n;a++)
printf("%d ",2*n );
这样子可以了吗?
错,你会发现如果n=2 它就会输入 0 2 4 这不是我们想要的,我们要它输入的是0,2
所以我们得控制一下n的值 让它变小 我们让程序每循环一次就n--
for(a=0;a<=n;a++,n--)
printf("%d ",2*n );
输入2 n=2
当a=0时 a<=2满足条件 打印0 返回for 接着a++ n--     此时a=1;n=1
当a=1时 a<=1满足条件 打印2 返回for 接着a++ n--     此时a=2;n=0
当a=2    a<=0条件不满足 退出循环

打印出来的就是0,2

奇数循环也是这样控制
但先初始化a=1
for(a=1;a<=n;a++,n--)
printf("%d ",2*n-1);

但是这样会得不到我们能想要的结果
为什么?因为上面偶数循环中n早已我们n--变成了0,此时n=0,不是我们所输入的n=2
那么n怎么回归成我们一开始输入的数?
很简单,定义一个变量t,在我们输入后,就把n的值先存放到t里面
然后
for(a=1,n=t;a<=n;a++,n--)
n就回归到我们之前输入的值了

程序如下
#include <stdio.h>
main()
{
      int a,n,s=0,t;
      puts("请输入一个数");
      scanf("%d",&n);
      t=n;
      printf("偶数列:");
      for(a=0;a<=n;a++,n--)  
      {    
           printf("%d ",2*a);
         
      }
      putchar('\n');
      printf("奇数列:");
      for(a=1,n=t;a<=n;a++,n--)
      {
          printf("%d ",2*a-1);
      }
      putchar('\n');
    
    
}

注意是先t=n 后n=t 等号的含义你知道的

提醒一下 程序里不能2n和2n-1这样写 挨在一起并不是相乘,这个和数学不一样
必须2*n和2*n-1

另外还有一种简单的方法,你们也更容易理解

我们知道能被2整除的是偶数,不能被2整除的就是奇数
程序如下
#include <stdio.h>
main()
{
      int a,n,s=0,t;
      puts("请输入一个数");
      scanf("%d",&n);
      t=n;
      printf("偶数列:");
      for(a=0;a<=n;a++)  
      {    
          if(a%2==0)
          printf("%d ",a);
        
      }
      putchar('\n');
      printf("奇数列:");
      for(a=1,n=t;a<=n;a++)
      {
          if(a%2!=0)
          printf("%d ",a);
      }
      putchar('\n');
    
    
}

知道%的意思吧,这个程序不需要n--控制循环条件,程序更容易理解
我为什么不把偶数奇数写在同一循环里,那是因为打印的时候不能按你想象的去打印,它循环一次会同时打印偶数和奇数


我们还可以不仅打印n连续奇数和偶数,而且计算偶数项所有的和和奇数项所有的和
这个你们应该能做出来吧
程序如下
#include <stdio.h>
main()
{
      int a,n,s=0,t;
      puts("请输入一个数");
      scanf("%d",&n);
      t=n;
      printf("偶数列:");
      for(a=0;a<=n;a++)  
      {    
          if(a%2==0)
          {printf("%d ",a);
           s+=a;
          }
      }
      printf("\n偶数项的和:%d",s);
      s=0;
      putchar('\n');
      printf("奇数列:");
      for(a=1,n=t;a<=n;a++)
      {
          if(a%2!=0)
          {printf("%d ",a);
           s+=a;
          }
      }
      putchar('\n');
      printf("奇数项的和:%d\n",s);
    
    
}

我再用while完成相同的功能
#include <stdio.h>
main()
{
      int a,n,s=0,oushu=0,jishu=0;
      puts("请输入一个数");
      scanf("%d",&n);
      a=1;
      while(a<=n)
      {
          s+=a;
        
          if(a%2==0)
              oushu+=a;
          else
              jishu+=a;
        
          a++;
            
      }
      printf("%d个数相加为%d,偶数和为%d,奇数和为%d\n",n,s,oushu,jishu);

 }

来源:幻想编程//所属分类:站长原创/更新时间:2014-03-05 11:31
顶一下
(14)
93.3%
踩一下
(1)
6.7%
上一篇:从零开始学编程---第一步-C语言(十)
下一篇:从零开始学编程---第一步-C语言(十二)
相关内容