当前课程知识点:高级语言程序设计 > 循环结构程序设计 > 4.2 用while语句实现循环 > 用while语句实现循环
同学们好
今天我们一起来学习
用while语句实现循环结构
在这一节里面
我们先要介绍while语句的语法形式
然后再用while语句计算高斯求和
计算n的阶乘这两个问题
好我们先看while语句的一般形式
它的一般形式是这样的
就是while
然后后面跟着括号
括号里面是一个表达式
下面就是语句
那么在这个括号里面的表达式
圆括号的表达式
它是一个循环条件
它可以是一个任意的表达
它的值可以为真或者为假
那么下面这个语句
它是循环体
那么这个while语句
它执行的一个过程是这样的
我们进循环体的时候
首先要判断这个表达式
如果表达式为真
则执行循环语句
然后继续判断表达式
如果表达式为真
继续执行语句
这样不停的循环下去
那么直到某一次这个表达式为假
它的值为0了
它就跳出循环
好下面呢
我们用while语句
来解决高斯求和的问题
我们先看流程图
再写代码
最后和大家一起来分析
每次循环执行的这样一个状态
好 那么1+2+3加到100
要重复100次加运算
我们可以看到流程图
给每次加的这个加数
设为变量i
每次求的和
设为变量sum
那么变量i的初值为1
变量sum的初值为0
接着进循环体
这个时候我们要注意了
循环条件一定要满足
也就是i必须要小于等于100
那条件满足了
就要执行循环体的语句
把i的值赋给sum
加完之后i自身加1
这样循环的执行下去
每次大家注意
每次都要判断循环条件
条件为真
就执行循环体
那么直到这个i大于100
i不断的++
i大于100
循环条件为假
也就是i的值为101
它才跳出这个循环体
对于这样一个问题
我们的C程序是这样写的
我们编写了一个主函数
主函数里面定义了i sum变量
接着写while语句
那么循环条件i小于等于100
这个式子要放在while后面圆括号里面
作为条件表达式
那么执行的语句呢
我们要放在while下面的这个大括号里面
作为复合语句
当这个循环跳出
最后要输出的和
也就是sum变量的值
由程序我们可以了解
这个循环执行的这样一个情况
循环执行的过程中
每一次循环的这样一个状态
我们这里用一个表格画出来
帮助大家来分析
表格里我们看到有3列
分别是
执行第i次循环之前i的值
第二列是执行第i次循环之前sum的值
第三列是执行第i次循环之后sum的值
它们可以记录
每次在进循环之前的状态
和循环执行之后的这个状态
那我们一起来看一下
当i的初值为1的时候
sum的初值为0的时候
开始进循环
这个时候第一次循环
要判断i小于等于100条件为真
第1次循环结束之后
sum的值为1
接着i的值自身要加1
i的值变为2
所以表格的第2行分别是1 0 1
好 继续
再判断i小于等于100这个条件为真
再次进循环体
第2次循环结束之后
sum的值变为了3
接着i的值自身再加1
i的值也变为了3
所以表格的第3行分别是2 1 3
好 继续
i小于等于100
条件又为真
再进循环体
第3次循环结束之后
sum的值为6
接着i的值自身加1
i的值为4
所以表格的第3行分别是3 3 6
这样不停地循环下去
直到什么时候
直到当i的值为100的时候
还是可以进循环体的
那么这个时候还是可以加的
只是它做了最后一次加运算
那么这个时候的sum呢
在最后一次加之前
sum的值是4950
那么加了100之后
sum的值就变成了5050
那么i的值马上自身又要加1
i的值变成了101
还能不能做呢
很显然最后一次
还能不能做加运算
i的值变成了101
这个时候循环的条件应该为假
所以表格的最后一行显示的状态
是循环结束了
这就是我们用while循环语句
来实现高斯求和运算的这个问题
好下面我们再来举一个例子
这个例子它要求n的阶乘
当然这个n
需要从键盘输入
其实这个问题
我们也知道
它就是反复的做乘运算
我们也可以设计循环控制语句
那么这个时候
我们来设两个变量
和刚才那个问题类似的
这两个变量呢
一个是乘数
它为变量i
还要设一个变量
就是乘积S
然后对i和S两个变量设初值
i初值为1
s初值也为1
因为我们将要做乘法运算
每次进循环体
S都要乘以i
乘完之后
这个乘数i就要++
就要自身加1
那么到什么时候
做最后一次乘运算呢
直到i的值为N的时候
才进行最后一次乘运算
因为执行循环语句
一定要满足循环条件为真
保证i的值小于等于N才行
那么循环体做乘法运算
乘完之后最后的结果是多少呢
我们下面来编写程序来看一下
定义了i s n变量
i s变量赋初值
n的值呢
n的值没有初始化
它要从键盘输入
那么下面我们看while循环
下面的这个while循环的这段代码
循环条件是i小于等于n
循环体里面的复合语句
是s乘以i赋给s
然后i再加加
当循环执行完毕之后
最后输出结果
得到n的阶乘这个值
下面我们还来看一下程序运行的结果
马上我要输入n的值
我输入n的值为16
我得到一个正确的结果
接下来再一次运行程序
我输入n的值为17
大家这个时候看
我会得到一个负数
那为什么17的阶乘
这个结果会是一个负数呢
这也是大家要注意的
因为我们的循环结构
它反复地做这个运算
会导致这个运算的结果越来越大
而我们这一个循环语句
它反复的执行这个乘法运算
所以它的乘积会越来越大
大到什么程度呢
大家看一下
大到这个数据
它超出了我们定义的这个类型的
所能表示的数的这个上界
发生了溢出
所以这个时候
这个结果就出现了错误
因为C语言
它提供的各种各样的数据类型
各种类型的数据
它所占用的这个存储单元
都是有固定的大小的
比如说C语言里
规定了int类型
整型的数据它占有4个字节
它的这个取值是有范围的
它的取值范围
可能是-2147483648~2147483647
那么我们运算的这个结果
如果超出了这个类型所表示的数的上界
导致这个进位
到达了最前面的符号位
或者是更多的进位的丢失
它就发生了溢出
所以计算17的阶乘
运算的结果超出了整型所能表示的数的上界
那么这个时候怎么办呢
我们要把17的阶乘的这个结果
能够正确的运算出来
这个时候其实我们可以将s和n变量
定义为float或者double类型
因为这两个类型它表示的这个范围更大
可以确保17的阶乘的结果
能够准确的显示出来
由此可见
我们预先来估算
运算结果的可能的取值范围
采取取值范围更大的这个类型来定义变量
对于防止类型溢出是十分必要的
好今天的这一节课就到这里
谢谢大家
-1.1 计算机程序和计算机语言
-1.2 C程序的构成
--C程序的构成
-1.3 C语言编辑、编译、运行(VC++2010学习版)
-练习题
-2.1 变量的定义和使用
--变量的定义和使用
-2.2 数据类型
--数据类型简介
--整型数据
--实型数据
-2.3 格式输出和格式输入
-2.4 运算符和表达式
--运算符和表达式
-2.5 结构化程序设计入门
-练习题
-3.1 为什么要用选择结构解决问题
-3.2 如何正确表示选择结构中的条件
-3.3 用if语句及if语句嵌套实现选择结构
-3.4 用switch语句实现选择结构
-练习
-4.1 循环的引入
-4.1 循环的引入--作业
-4.2 用while语句实现循环
-4.3 用do-while语句实现循环
-4.4 用for语句实现循环
-- 用for语句实现循环
-4.4 用for语句实现循环--作业
-4.5 何时需要用循环的嵌套
-4.6 如何提前终止循环和提前结束本次循环
-习题--作业
-5.1 数组类型的引入
--数组类型的引入
-5.2 一维数组的定义和初始化
-5.3 一维数组的使用
--一维数组的使用
-5.4 二维数组的定义和初始化
-5.5 二维数组的使用
--二维数组的使用
-习题--作业
-6.1 什么是指针
--什么是指针
-6.2 指针类型及相关概念
-6.3 指针变量的定义、赋值与使用
-6.4 指针的运算
--指针的运算
-6.5 指针与一维数组
--指针与一维数组
-6.6 指针的指针
--指针的指针
-6.7 指针与二维数组
--指针与二维数组
-习题--作业
-7.1 为什么要自定义函数
-7.2 函数的定义
--函数的定义
-7.3 函数的调用
--函数的调用
-7.4 函数参数的传递
--函数参数的传递
-7.5 函数的嵌套调用和递归调用
-7.6 变量的作用域和存储类型
-习题--作业
-8.1 字符串的存储及输入输出
-8.2 系统字符串处理函数
-8.3 自定义字符串处理函数
-习题--作业
-9.1 结构体类型的定义
--结构体类型的定义
-9.2 结构体变量及指针变量的定义及使用
-9.3 结构体变量和指针变量作函数的参数
-9.4 结构体数组的定义和使用
-9.5 共用体类型和枚举类型
--共用体和枚举类型
-习题--作业
-动态内存分配--习题
-习题--作业