课程目标
- 掌握while循环的语法和使用场景
- 理解do-while循环的特点和适用情况
- 学会在不同场景下选择合适的循环结构
- 掌握循环嵌套的复杂应用
- 能够解决复杂的模式输出和计算问题
- 理解循环控制语句break和continue的用法
第一部分:while循环(50分钟)
1.1 while循环的基本概念
while循环的特点:
- 先判断条件,再执行循环体
- 适合循环次数不确定的情况
- 条件为真时继续循环,为假时退出
语法:
while(条件){// 循环体}执行流程图:
开始 ↓ 检查条件 ↓ 条件为假 → 结束循环 ↓条件为真 执行循环体 ↓ 检查条件 → ...1.2 基本的while循环示例
#include<iostream>usingnamespacestd;intmain(){intcount=1;// 初始化计数器// 输出1到5的数字while(count<=5){cout<<"当前数字: "<<count<<endl;count++;// 更新计数器}cout<<"循环结束!"<<endl;return0;}1.3 while循环与for循环的对比
相同功能的两种实现:
#include<iostream>usingnamespacestd;intmain(){// 使用for循环输出1-5cout<<"for循环: ";for(inti=1;i<=5;i++){cout<<i<<" ";}cout<<endl;// 使用while循环输出1-5cout<<"while循环: ";intj=1;// 初始化while(j<=5){// 条件cout<<j<<" ";j++;// 更新}cout<<endl;return0;}1.4 while循环的适用场景
场景1:用户输入验证
#include<iostream>usingnamespacestd;intmain(){intscore;// 要求用户输入有效的成绩(0-100)cout<<"请输入成绩(0-100): ";cin>>score;// 如果输入无效,要求重新输入while(score<0||score>100){cout<<"输入无效!请重新输入成绩(0-100): ";cin>>score;}cout<<"输入的成绩是: "<<score<<endl;return0;}场景2:游戏循环
#include<iostream>usingnamespacestd;intmain(){intplayerHealth=100;intmonsterHealth=80;intplayerAttack,monsterAttack;cout<<"=== 勇士斗恶龙 ==="<<endl;// 游戏主循环while(playerHealth>0&&monsterHealth>0){cout<<"\n你的生命值: "<<playerHealth;cout<<" | 恶龙生命值: "<<monsterHealth<<endl;// 玩家攻击cout<<"请输入你的攻击力(1-20): ";cin>>playerAttack;monsterHealth-=playerAttack;cout<<"你对恶龙造成了 "<<playerAttack<<" 点伤害!"<<endl;// 如果恶龙还活着,进行反击if(monsterHealth>0){monsterAttack=10+rand()%11;// 10-20的随机伤害playerHealth-=monsterAttack;cout<<"恶龙对你造成了 "<<monsterAttack<<" 点伤害!"<<endl;}}// 判断游戏结果if(playerHealth>0){cout<<"\n恭喜!你击败了恶龙!"<<endl;}else{cout<<"\n很遗憾,你被恶龙击败了..."<<endl;}return0;}场景3:数据统计
#include<iostream>usingnamespacestd;intmain(){intnumber;intsum=0,count=0;doubleaverage;cout<<"请输入一系列整数,输入0结束:"<<endl;// 读取第一个数字cout<<"请输入第1个数字: ";cin>>number;// 循环读取直到输入0while(number!=0){sum+=number;count++;cout<<"请输入第"<<count+1<<"个数字: ";cin>>number;}// 计算结果if(count>0){average=static_cast<double>(sum)/count;cout<<"\n=== 统计结果 ==="<<endl;cout<<"数字个数: "<<count<<endl;cout<<"总和: "<<sum<<endl;cout<<"平均值: "<<average<<endl;}else{cout<<"没有输入有效数字!"<<endl;}return0;}第二部分:do-while循环(40分钟)
2.1 do-while循环的特点
do-while循环的特点:
- 先执行循环体,再判断条件
- 循环体至少执行一次
- 适合需要至少执行一次的情况
语法:
do{// 循环体}while(条件);执行流程图:
开始 ↓ 执行循环体 ↓ 检查条件 ↓ 条件为真 → 执行循环体 ↓条件为假 结束循环2.2 do-while循环示例
#include<iostream>usingnamespacestd;intmain(){intnumber;// 使用do-while确保至少执行一次do{cout<<"请输入一个正整数: ";cin>>number;if(number<=0){cout<<"输入无效!请重新输入。"<<endl;}}while(number<=0);// 条件不满足时继续循环cout<<"你输入的正整数是: "<<number<<endl;return0;}2.3 do-while的典型应用:菜单系统
#include<iostream>usingnamespacestd;intmain(){intchoice;do{// 显示菜单cout<<"\n=== 学生管理系统 ==="<<endl;cout<<"1. 添加学生"<<endl;cout<<"2. 删除学生"<<endl;cout<<"3. 查询学生"<<endl;cout<<"4. 显示所有学生"<<endl;cout<<"0. 退出系统"<<endl;cout<<"请选择操作: ";cin>>choice;// 根据选择执行相应操作switch(choice){case1:cout<<"执行添加学生功能..."<<endl;break;case2:cout<<"执行删除学生功能..."<<endl;break;case3:cout<<"执行查询学生功能..."<<endl;break;case4:cout<<"执行显示所有学生功能..."<<endl;break;case0:cout<<"感谢使用,再见!"<<endl;break;default:cout<<"无效选择,请重新输入!"<<endl;}}while(choice!=0);// 选择0时退出return0;}2.4 while vs do-while 对比
#include<iostream>usingnamespacestd;intmain(){intnumber=10;cout<<"while循环测试:"<<endl;// 先判断条件,条件为false,不执行循环体while(number<5){cout<<"这个不会执行"<<endl;number++;}cout<<"while循环后number = "<<number<<endl;cout<<"\ndo-while循环测试:"<<endl;// 先执行循环体,再判断条件do{cout<<"这个会执行一次"<<endl;number++;}while(number<5);cout<<"do-while循环后number = "<<number<<endl;return0;}第三部分:循环控制语句(40分钟)
3.1 break语句
break的作用:立即退出当前循环
#include<iostream>usingnamespacestd;intmain(){// 查找第一个能被7整除的数for(inti=1;i<=100;i++){if(i%7==0){cout<<"找到第一个能被7整除的数: "<<i<<endl;break;// 找到后立即退出循环}cout<<"检查: "<<i<<endl;}return0;}3.2 continue语句
continue的作用:跳过本次循环的剩余代码,直接进入下一次循环
#include<iostream>usingnamespacestd;intmain(){// 输出1-10的奇数cout<<"1-10的奇数: ";for(inti=1;i<=10;i++){if(i%2==0){continue;// 如果是偶数,跳过输出}cout<<i<<" ";}cout<<endl;return0;}3.3 break和continue的综合应用
#include<iostream>usingnamespacestd;intmain(){intnumber;cout<<"请输入数字(输入负数退出):"<<endl;while(true){// 无限循环cout<<"请输入一个数字: ";cin>>number;// 输入负数时退出if(number<0){cout<<"输入负数,程序结束!"<<endl;break;}// 跳过0if(number==0){cout<<"0被跳过"<<endl;continue;}// 处理正数cout<<"你输入的是正数: "<<number<<endl;cout<<"它的平方是: "<<number*number<<endl;}return0;}第四部分:循环嵌套进阶(50分钟)
4.1 多重循环的概念
循环嵌套:在一个循环内部包含另一个循环
#include<iostream>usingnamespacestd;intmain(){// 外层循环控制行for(inti=1;i<=3;i++){cout<<"外层循环 i = "<<i<<endl;// 内层循环控制列for(intj=1;j<=2;j++){cout<<" 内层循环 j = "<<j<<endl;}cout<<"外层循环结束"<<endl;cout<<"---"<<endl;}return0;}4.2 复杂图案输出
打印菱形:
#include<iostream>usingnamespacestd;intmain(){intn;cout<<"请输入菱形大小(奇数): ";cin>>n;// 上半部分for(inti=1;i<=n;i+=2){// 打印空格for(intj=1;j<=(n-i)/2;j++){cout<<" ";}// 打印星号for(intj=1;j<=i;j++){cout<<"*";}cout<<endl;}// 下半部分for(inti=n-2;i>=1;i-=2){// 打印空格for(intj=1;j<=(n-i)/2;j++){cout<<" ";}// 打印星号for(intj=1;j<=i;j++){cout<<"*";}cout<<endl;}return0;}4.3 数学表格生成
乘法表增强版:
#include<iostream>#include<iomanip>usingnamespacestd;intmain(){intsize;cout<<"请输入乘法表大小: ";cin>>size;// 打印表头cout<<" ";for(inti=1;i<=size;i++){cout<<setw(4)<<i;}cout<<endl;// 打印分隔线cout<<" ";for(inti=1;i<=size*4;i++){cout<<"-";}cout<<endl;// 打印乘法表for(inti=1;i<=size;i++){cout<<setw(2)<<i<<" |";for(intj=1;j<=size;j++){cout<<setw(4)<<i*j;}cout<<endl;}return0;}4.4 组合数学问题
组合计数:
#include<iostream>usingnamespacestd;intmain(){intcount=0;cout<<"所有的三位数组合(各位数字不同):"<<endl;// 百位数字从1-9for(inti=1;i<=9;i++){// 十位数字从0-9,但不能与百位相同for(intj=0;j<=9;j++){if(j==i)continue;// 跳过相同的数字// 个位数字从0-9,不能与前两位相同for(intk=0;k<=9;k++){if(k==i||k==j)continue;// 跳过相同的数字intnumber=i*100+j*10+k;cout<<number<<" ";count++;// 每10个数字换行if(count%10==0){cout<<endl;}}}}cout<<"\n总共有 "<<count<<" 个满足条件的三位数"<<endl;return0;}第五部分:综合应用示例(50分钟)
5.1 猜数字游戏
#include<iostream>#include<cstdlib>#include<ctime>usingnamespacestd;intmain(){srand(time(0));// 设置随机数种子intsecretNumber=rand()%100+1;// 1-100的随机数intguess,attempts=0;constintmaxAttempts=7;cout<<"=== 猜数字游戏 ==="<<endl;cout<<"我想了一个1-100之间的数字,你有"<<maxAttempts<<"次机会猜中它!"<<endl;while(attempts<maxAttempts){attempts++;cout<<"\n第"<<attempts<<"次尝试,请输入你的猜测: ";cin>>guess;if(guess==secretNumber){cout<<"恭喜!你猜对了!"<<endl;cout<<"你用了 "<<attempts<<" 次猜中了数字 "<<secretNumber<<endl;break;}elseif(guess<secretNumber){cout<<"太小了!"<<endl;}else{cout<<"太大了!"<<endl;}// 提示剩余次数cout<<"还剩 "<<maxAttempts-attempts<<" 次机会"<<endl;// 最后一次机会的提示if(attempts==maxAttempts-1){// 给一个范围提示intlower=max(1,secretNumber-10);intupper=min(100,secretNumber+10);cout<<"提示:数字在 "<<lower<<" 到 "<<upper<<" 之间"<<endl;}}if(attempts==maxAttempts&&guess!=secretNumber){cout<<"\n很遗憾,你没有猜中。正确的数字是: "<<secretNumber<<endl;}return0;}5.2 素数筛选器
#include<iostream>#include<iomanip>usingnamespacestd;intmain(){intlimit;cout<<"请输入上限(找出该范围内的所有素数): ";cin>>limit;if(limit<2){cout<<"没有素数!"<<endl;return0;}cout<<"2到"<<limit<<"之间的素数:"<<endl;intcount=0;intperLine=10;// 每行显示10个素数// 检查每个数字是否为素数for(intnumber=2;number<=limit;number++){boolisPrime=true;// 检查从2到number-1是否有因数for(inti=2;i*i<=number;i++){// 优化:检查到平方根即可if(number%i==0){isPrime=false;break;}}// 如果是素数,输出if(isPrime){cout<<setw(6)<<number;count++;// 每行显示perLine个素数后换行if(count%perLine==0){cout<<endl;}}}cout<<"\n\n总共找到 "<<count<<" 个素数"<<endl;return0;}5.3 数字金字塔进阶
#include<iostream>usingnamespacestd;intmain(){introws;cout<<"请输入金字塔行数: ";cin>>rows;// 数字金字塔for(inti=1;i<=rows;i++){// 打印前导空格for(intj=1;j<=rows-i;j++){cout<<" ";}// 打印左半部分(递增)for(intj=1;j<=i;j++){cout<<j<<" ";}// 打印右半部分(递减)for(intj=i-1;j>=1;j--){cout<<j<<" ";}cout<<endl;}cout<<"\n字符金字塔:\n";// 字符金字塔for(inti=1;i<=rows;i++){// 打印前导空格for(intj=1;j<=rows-i;j++){cout<<" ";}// 打印字符charcurrentChar='A';for(intj=1;j<=2*i-1;j++){cout<<currentChar;if(j<i){currentChar++;}else{currentChar--;}}cout<<endl;}return0;}5.4 分数统计系统
#include<iostream>#include<iomanip>usingnamespacestd;intmain(){intstudentCount;intsubjectCount;cout<<"请输入学生人数: ";cin>>studentCount;cout<<"请输入科目数量: ";cin>>subjectCount;// 输入每个学生的每科成绩for(intstudent=1;student<=studentCount;student++){cout<<"\n=== 第"<<student<<"个学生 ==="<<endl;doubletotalScore=0;doublehighestScore=0;doublelowestScore=100;for(intsubject=1;subject<=subjectCount;subject++){doublescore;cout<<"请输入第"<<subject<<"科成绩: ";cin>>score;totalScore+=score;if(score>highestScore){highestScore=score;}if(score<lowestScore){lowestScore=score;}}doubleaverageScore=totalScore/subjectCount;// 输出学生成绩统计cout<<fixed<<setprecision(2);cout<<"总分: "<<totalScore<<endl;cout<<"平均分: "<<averageScore<<endl;cout<<"最高分: "<<highestScore<<endl;cout<<"最低分: "<<lowestScore<<endl;// 成绩评价if(averageScore>=90){cout<<"评价: 优秀"<<endl;}elseif(averageScore>=80){cout<<"评价: 良好"<<endl;}elseif(averageScore>=70){cout<<"评价: 中等"<<endl;}elseif(averageScore>=60){cout<<"评价: 及格"<<endl;}else{cout<<"评价: 不及格"<<endl;}}return0;}第六部分:循环结构选择指南(20分钟)
6.1 如何选择合适的循环结构
| 循环类型 | 适用场景 | 特点 |
|---|---|---|
| for循环 | 循环次数已知 | 初始化、条件、更新都在一行 |
| while循环 | 循环次数未知,先判断后执行 | 适合输入验证、条件控制 |
| do-while循环 | 循环次数未知,至少执行一次 | 适合菜单系统、用户交互 |
6.2 循环选择示例
#include<iostream>usingnamespacestd;intmain(){intchoice;// 场景1:已知次数 - 使用for循环cout<<"场景1:输出1-10的平方"<<endl;for(inti=1;i<=10;i++){cout<<i<<"² = "<<i*i<<endl;}// 场景2:未知次数,先判断 - 使用while循环cout<<"\n场景2:输入验证"<<endl;intage;cout<<"请输入年龄: ";cin>>age;while(age<0||age>150){cout<<"年龄无效!请重新输入: ";cin>>age;}// 场景3:至少执行一次 - 使用do-while循环cout<<"\n场景3:菜单系统"<<endl;do{cout<<"1. 开始游戏"<<endl;cout<<"2. 设置"<<endl;cout<<"3. 退出"<<endl;cout<<"请选择: ";cin>>choice;// 处理选择...}while(choice!=3);return0;}练习与作业
基础练习(必做)
练习1:数字反转
输入一个正整数,使用循环将其数字反转。
例如:输入12345,输出54321
练习2:最大公约数(GCD)
使用欧几里得算法计算两个数的最大公约数。
算法:gcd(a,b) = gcd(b, a mod b),直到b为0
练习3:简单计算器循环版
改进之前的计算器,使其可以连续进行计算,直到用户选择退出。
挑战练习(选做)
挑战1:帕斯卡三角形
输出指定行数的帕斯卡三角形(杨辉三角)。
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1挑战2:数字黑洞
实现数字黑洞6174的验证:
- 任选一个四位数(数字不能全相同)
- 数字按降序排列和升序排列,得到最大数和最小数
- 用大数减小数,得到新的四位数
- 重复上述步骤,最多7步,必然会得到6174
挑战3:生命游戏
实现康威生命游戏的简单版本,在控制台显示细胞演化过程。
实验任务
任务1:循环性能比较
对同一个问题分别用for、while、do-while实现,比较代码的可读性和适用性。
任务2:嵌套循环深度测试
测试多层嵌套循环的性能和可读性,找出合理的嵌套深度。
任务3:循环优化实验
对素数判断算法进行优化,比较优化前后的性能差异。
学习总结
今天学到了:
- ✅while循环:先判断后执行,适合次数不确定的循环
- ✅do-while循环:先执行后判断,至少执行一次
- ✅循环控制语句:break(退出循环)和continue(跳过本次)
- ✅循环嵌套进阶:复杂图案和数学问题的解决
- ✅循环结构选择:根据不同场景选择合适的循环类型
关键技能:
- 循环设计:根据问题特点选择合适的循环结构
- 条件控制:编写有效的循环条件和退出条件
- 嵌套应用:使用多重循环解决复杂问题
- 算法思维:将数学问题转化为循环解决方案
下一课预告:
下一节课我们将进行阶段性复习与测评,综合运用前面学过的所有知识,通过小测验和编程闯关游戏来巩固学习成果!