第四单元 循环结构程序设计
知识点
第四单元 循环结构程序设计
知识点
一、while语句
while语句的格式:
while(表达式){
循环体
}
含义:先计算表达式(一般称为循环条件)的值,当表达式的值为真(循环条件成立)时,去执行一次循环体。
注意循环条件表达式的书写以及循环体中循环控制变量的更新,从而避免死循环。
应用举例
求1+2+3+……100的值
#include
using namespace std;
int main(){
int i=1,sum=0;
while(i<=100)sum+=i++;
cout<<sum<<endl;
return 0;
}
二、do−while语句
do−while语句的格式:
do{
循环体
}while(表达式);
含义:先执行一次循环体,然后判断表达式是否成立,如果成立,则返回继续执行循环体,直到表达式不成立,才退出循环。
应用举例
输出一行10个“@”
#include
using namespace std;
int main(){
int i=1;
do{
print(“@”);
i++;
}while(i<=10);
return 0;
}
三、for语句
for语句格式:
for(表达式1;表达式2;表达式3){
循环体
}
其中表达式1为初始化变量,表达式2为循环条件,表达式3为循环变量的变应情况
应用举例
用for语句实现输出一行10个“@”
#include
using namespace std;
int main(){
for(int i=1;i<=10;i++)
print(“@”);
print(“\n”);
return 0;
}
四、循环嵌套
循环结构与分支结构的嵌套类似,也可以在一个循环语句的循环体里出现另一个循环语句,不管是 while 语句、do-while 语句还是 for 语句。这样的循环结构称为“循环嵌套”。
应用举例
输出矩形
输入 n 和 m,输出一个 n 行 m 列的“”矩形图案。
【输入格式】
一行两个正整数 n 和 m,中间用一个空格隔开,1≤n、m≤100。
【输出格式】
输出一个 n 行 m 列的“”矩形图案。
【样例输入】
3 4
【样例输出】
【问题分析】
要输出 n 行,所以可以编写一个外层循环,穷举行。然后,在循环体里,还要输出 m 个“”,所以再嵌套一个内层循环,穷举每一行的“”个数。
#include
using namespace std;
int main(){
int n,m;
scanf ("%d %d",&n,&m);
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++) printf( “ * ” );
printf( “ \n ” );
}
return 0;
}
五、break与continue语句
break语句
作用:
在循环体中遇到break语句,就会立刻跳出循环体执行循环结构后面的语句。
应用举例
与 7 无关的数。
【问题描述】
一个正整数,如果它能被 7 整除,或者它的某一位上的数字为 7,则称其为“与 7 相关”的数。现在,请编程求出所有小于或等于 n 的“与 7 无关”的正整数个数。
【输入格式】
一行一个正整数 n,n≤10^6 。
【输出格式】
一行一个整数,表示答案。
【样例输入】
21
【样例输出】
17
【问题分析】
判断 x 中是否有数字 7 的时候,一旦出现“x % 10 == 7”,则说明 x 是与 7 相关的数,就可以用 break 语句立刻退出当前的 while 循环,这样可以提高程序的效率。
#include
using namespace std;
int main(){
int n,ans = 0;
cin >> n;
for(int i = 1; i <= n; i++){
int flag1 = 1,flag2 = 1;
if(i % 7 == 0) flag1 = 0;
int x = i;
while(x){
if(x % 10 == 7) {flag2 = 0; break;}
x = x / 10;
}
if(flag1 && flag2) ans++;
}
cout << ans << endl;
return 0;
}
continue语句
作用:在循环体中遇到continue语句,就会忽略本次循环的后续语句而去执行下一次循环。
应用举例
与 7 无关的数。
【问题描述】
一个正整数,如果它能被 7 整除,或者它的某一位上的数字为 7,则称其为“与 7 相关”的数。
请编程求出所有小于或等于 n 的“与 7 无关”的正整数个数。
【输入格式】
一行一个正整数 n,n≤10^6 。
【输出格式】
一行一个整数,表示答案。
【样例输入】
21
【样例输出】
17
【问题分析】
当 i 是 7 的倍数,即“i % 7 == 0”时,说明 i 已经是与 7 相关的数了,此时,就不再需要判断 i的某一位是否是 7 了。所以,可以用 continue 忽略本次循环的后续语句,而去执行下一次循环,判断下一个数了。这样做同样可以提高程序的效率。
#include
using namespace std;
int main(){
int n,ans = 0;
cin >> n;
for(int i = 1; i <= n; i++){
int flag = 1;
if(i % 7 == 0) continue;
int x = i;
while(x){
if(x % 10 == 7) {flag = 0; break;}
x = x / 10;
}
if(flag) ans++;
}
cout << ans << endl;
return 0;
}
break语句与continue语句的应用举例
素数的统计
【问题描述】
输入两个正整数 m 和 n,判断 m 和 n 之间(含 m 和 n)一共有多少个素数。
【输入格式】
一行两个正整数 m 和 n,2≤m≤n≤10^4 。
【输出格式】
一行一个整数,表示素数的个数。
【样例输入】
5 10
【样例输出】
2
# include
using namespace std;
int main(){
int m,n,i,j,ans = 0;
cin >> m >> n;
for(i = m; i <= n; i++){
for(j = 2; j < sqrt(i); j++)
if(i % j == 0) break;
if(j < sqrt(i)) continue;
ans++;
}
cout << ans << endl;
return 0;
}
六、程序的调试与跟踪
1.静态查错
⑴变量未赋初始值
⑵中间运算结果越界
⑶if−else语句混乱
⑷实数比较出错
2.通过添加输出语句调试程序
用增加输出语句的方法进行动态调试
应用举例
cout<<x<<“ ”<<i<<endl; //用于查看x和i的值
3.借助IDE的调试工具进行单步跟踪
七、循环结构应用举例
通过“单步执行”观察跟踪某个变量的值的变化。
例4.13 一个炊事员上街采购,用500元钱买了90只鸡,其中母鸡一只15元,公鸡一只10元,小鸡一只5元,正好把钱买完。问母鸡,公鸡,小鸡各买了多少只?
【分析】设母鸡i只,公鸡j只,则小鸡为90-i-j只,则15i+ 10 j+(90-i-j)5=500,显然一个方程求两个未知数是不能直接求解。必须组合出所有可能的i,j值,看是否满足条件。这里i的值可以是0到33,j的值可以0到50。
#include
using namespace std;
int main ()
{
int k;
for (int i=0;i<=33;++i) //枚举母鸡的数量
for (int j=0;j<=50;++j) //枚举公鸡的数量
{
k=90-i-j;
if (15i+10j+k5==500)
{
cout<<“母鸡有”<<i<<“只,”<<“公鸡有”<<j<<“只,”<<“小鸡有”<<k<<“只” <<endl;
}
}
return 0;
}
重难点
whil语句中当表达式成立时,不断重复执行循环体
do−while语句与while语句的区别是do−while语句先执行循环体,再判断表达式,所以,do−while语句至少执行一次循环体。
for语句中循环变量可以在循环语句内定义,其作用空间为循环语句,离开循环语句不起作用。
实数比较出错的解决方法是,使用两数差的绝对值与一个相对极小量进行比较。例如判断a是否小于0用if(fabs(a)<le−8)表示
通过添加输出语句调试程序,调试程序结束后一定要删除或者注解掉调试输出信息的语句。
学习感受
做题时要分清步骤明确每一步的想法做循环题时思路特别容易乱,要特别注意“死循环”!!!和做数学题时一样细心,所以在解决问题时要明确各个循环的意义、多重循环嵌套时每重循环要干什么,完成什么任务。写完编码后自己要从头到尾检查一下自己能看出来的错误,然后再用机器检查。