第八讲 for

        昨天留给大家的问题不知道大家有没有去考虑,我想大家应该都很清楚这是一道物理题,当然我们并没有像研究物理题那样考虑得太多了,这里我们只需要计算出小球第十次接触地面的时候小球所经过的距离之和,再加上在第十次反弹起来的高度,所以这道题和真正的物理题比起要简单得多。
我们先来分析这道题的着手点吧。小球第一次下落时所经过的路程是100M,接下来的都是一上一下,所以我们可以定义一个float变量 h用来储存每次弹起的高度,第一次下落的100M我们就另当别论,不在这一上一下之列,那么现在抛开第一次触地之外,余下来的时间上只有九次了,不过这九次都是一上一下,换句话来说,这九次所经历的路程分别都是h*2。现在却跑出了一个难题,难道我们要用9*h*2吗?答案当然不是,那么我们应该怎么来考虑呢?
为了解答上面留下的问题,我们再声明一个float的变量s来储存小球所路径的路程,当小球没经历一次上下之后便把这个路程储存在s里面,最后我们再把历经9次得来的s相加起来,得到的便是我们所要计算的总路程。
那么最后第十次弹起的高度呢?第十次弹起的高度是第九次弹起的一半,而上面已经得出了第九次弹起的高度h,所以,第十次弹起高度自然就是h/2了。
题目我们已经分析完成,那么怎么来实现呢?这就是我们今天要说的for循环了。我们现在先来看看for循环一般的用法吧:
——————————
     for(表达式1;表达式2;表达式3)
       {
                      do something;
       
}

———————————-
该形式可以这么来理解,表达式1按表达式3的方式靠近表示2,表达式1表示for循环的入口,表达式2表示for循环的出口,表示3控制了for循环的循环方式。例如:
for(int i = 0;

i<n;

i++)
该循环的第一次是i = 0,接着用i++来控制循环方式的,表示i没增加1运行一次for函数,直到i = n-1时结束循环。
上面的函数语句里面我们说到i++这个概念,这是一个新概念,我们不如趁着现在顺便把C/C++里的运算符说一下。
C/C++里面的运算符其实和数学的里面的还是差不多的,就好比+-*/表示加减乘除,不过说到除法(/),C/C++里的整形的除法和数学里的有些不一样,C/C++里需要用两个符号一起方才能够表示一个数学里完整的除法,这两个符号分别是(/)和(%),(/)得到的结果是两数相除的整数部分,(%)得到的是余数部分,如下声明:
——————————-
int   n = 64;
        int   h  = n/60,m = n%60;


        printf(“%d : %d”,h.m);


———————————
上面的函数会打印出1:4,我想大家应该一眼就可以看出来,这其实就是计算随便输入一个分钟数,然后把他用标准小时和分钟打印出来,从这个例子里大家是不是明白了C/C++里面为什么会需要两个除法了吧,这里面的取余和取整都有很多妙用,当然具体情况还得靠大家去实现。
C/C++里面同样也有()运算,还有=,不过大家要记住一点,C/C++里面的=不是数学里面的=,C/C++里面的=是个赋值运算符,简单点说就是把右值赋给左值,通常情况下右值都是一个常量,左值是一个可变的变量,当然如果大家想要使用等号,那么记得使用“==”,也就是连写两个等号,事实上,在C/C++里面“==”存在的意义几乎就是用来断定的,通常用在if和while里面。
除了上面这些常用的运算符外,C/C++里面还有两个特殊的运算符,++ 和 –,++表示自加1,–表示自减1,如果这两个运算符出现变量的左边便是先加(减)再取变量的值,如果在右边,那就是先使用后再自加(减)给下次再使用该值。
当然C/C++里面同样存在逻辑运算符,和数学里面一样,他也有或且非,我们通常用&

&

表示或,用||表示且,用!表示非:
—————————————–
1<5 &

&

1>7     (该表达式为假,布尔值为0);
1<5 || 1>7        (该表达式为真,布尔值为1);
!(1<5 &

&

1>7)  (该表达式为真,布尔值为1);
!(1<5 &

&

1>7)  (该表达式为假,布尔值为0);
——————————————
通过上面的例子大家是不是明白了逻辑预算法的用了吧,
说了这些,就是让大家对运算符有所了解,现在我们言归正传,再回到我们刚才的正题上来。如果说刚才大家不知道该如何实现,那么现在是不是一切都在掌控之中了呢?首先把需要用的头文件包含起来,这个函数比较简单,就用一个标准输出IO就好,所以我们只需要包含stdio.h就好:
#include <stdio.h>
当然为了使用system(“PAUSE”)我们在包含另一个头文件:
#include <stdlib.h>
接下来我们分别声明三个变量,分别用来储存路程和高度
float  s = 100,h = 100;
int i = 0;
现在我们用for循环来计算高度和路程,用i来控制该循环,由于我们只需要循环9次,所以可以如下声明:
for(i;

i<9;

i++)
由于每一次反弹期的高度是上一次的一半,所以我们得出:
h = h/2;
大家是不是对这句有些疑惑,为什么h/2 就等于h了呢?这不符合数学逻辑啊,是啊,这本来就是什么数学逻辑,因为这里的h是变量,=并不表示等,而是赋值,所以这里是把上次的高度除以2后把值赋给h,从而改变了h的值。
明白了这里的赋值操作之后接下来我们应该把这个高度乘以2后加上上次的路:
 s = s + h*2;
每落地一次便是循环一次,所以每循环一次便会计算出上次反弹起的高度和所历经的路程,所以到此处我们的循环又开始下一次循环,直到循环九次后退出循环,然后打印出两关的s和h/2(第十次弹起的高度当然是我们计算出来的第九次的一半),下面我们把上面的代码整理一下:
——————————-
#include <stdio.h>
#include <stdlib.h>
int main()
{
    float h = 100,s = 100;


    
int i = 0;


     for(i;

i<9;

i++)
    {
          h = h/2;


          s = s + h*2;


     
}

      printf(” 小球下落共经过:%f米           n”,s);

    
      printf(“小球第10次落地后弹起的高度: %f米n”,h/2);

 
     system(“PAUSE”);

return  0;


}
——————————————–
好吧,现在我们来看看输出吧:
第八讲 for
至于这结果对与不对,有兴趣的同学可以自行笔算来核对一下吧。
现在想必大家都对for循环和运算符有一定的理解了,为了加深些印象,现在再留一道题给大家思考一下:
用for循环打印乘法口诀表:
提示一下吧,这里顺便说一下C/C++里的转义符:
a         警报(ANSIC)
b         退格
f         走纸
n         换行
r         回车
t         水平制表符
v         垂直制表符
\         反斜杠()
‘         单引号(‘)
”         双引号(“)
?         问题(?)
�oo       八进制值(o表示一个八进制数字)
xhh       十六进制值(h表示一个十六进制数字)

发表评论