for ,while,do-while 三种不同格式的循环语句。
为什么要学习循环,怎么去理解循环? 先看一个下面的案例。

#include
using namespace std;
int main(){
//1.输出1000次我爱学习
cout<<"好好学习天天,天天向上"<<endl;
cout<<"好好学习天天,天天向上"<<endl;
cout<<"好好学习天天,天天向上"<<endl;
cout<<"好好学习天天,天天向上"<<endl;
//.....太麻烦了...?
//2.怎么有更好的办法解决问题?
return 0;
}
语法结构,关键字 for,有两种格式:
for (循环变量的初始值;循环条件;循环变量增量)
循环语句的循环体1;
循环语句的循环体2;
for(循环变量的初始值; 循环条件;循环变量的增量){
循环语句的循环体1;
循环语句的循环体2;
循环语句的循环体3;
}

3. 案例实现:
- 循环语句,好好学习,天天向上 。1000次! 循环程序设置。
#include
using namespace std;
int main(){
//1.循环语法格式推荐使用{}
//注意, 先声明 循环的初始值 int i =起始值。
for (int i=1;i<=1000;i++){
//1.1 循环语句体
cout << "好好学习天天,天天向上="<< i <<endl;
}
return 0;
}
语法循环控制流程:
for (int i=1;i<=1000;i++){
//1.1 循环语句体
cout << "好好学习天天,天天向上="<< i <<endl;
}
int i 会首先被执行, 且只会执行一次。这一步需要先声明并初始化任何循环控制变量。
接下来,会判断 i<=1000 。
在执行完 for 循环主体后,控制流会跳回上面的 i++ 增量语句。
条件再次被判断。如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。 在条件变为假时,for 循环终止。

如何输入一个数,正序输出1~n 和 倒序输出 n ~1 。
#include
#include
using namespace std;
int main(){
/**
分析: 正序和倒序,
1. 正序: 起始值 为 1 范围 i<= a, 每次循环 自增
2. 倒序: 起始值 为 a 范围 i >=1, 每次循环 自减
*/
int a;
cin >> a;
//1.正序输出1~n.
for(int i=1;i<=a;i++){
cout << i << endl;
}
//2.倒序输出 n~1.
for (int i =a;i>=1;i--){
cout << i << endl;
}
return 0;
}
对于给定的任意正整数 a,输出1到a的平方数。
#include
#include
using namespace std;
int main(){
/**
1. 分析第一步:
输入数为 5
结果应该是 1*1 2*2 3*3 4*4 5*5
分析点1:循环次数 ? a次
*/
int a;
cin >> a;
//循环次数由 a决定
for (int i =1;i<=a;i++){
//循环语句体: " "使用空格分割
cout << i*i << " ";
}
return 0;
}

在控制台中,同一行输入两个数 a 和 b,输出a和b的之间的数。
#include
using namespace std;
int main(){
/**
输入两个整数 a和b ,输出a和b之间的整数.
分析: a和b之间的数,
起始值就应该从a开始, 结尾就以b为结尾.
*/
int a,b;
cin>> a>>b;
for (int i =a;i<=b;i++){
cout << i << " ";
}
return 0;
}
输入一个数n,然后n是多少,就输入多少个整数, 并且找出 最大的数 (n为整数类型。)
注意: n为几,相当于你输入多少整数。
分析:需要比较输入的数值,然后依次比较找出最大的。

代码如下:
#include
using namespace std;
int main(){
//1.输入n,n觉定了输入整数的个数.
int n , m, max;
cin >>n;
//2.使用循环
for (int i=1;i<=n;i++){
//输入次数
cin >> m;
if (m>max){
max =m;
}
}
cout << "最大值: " <<max;
return 0;
}
//TODO 自己动手
输入一个数n,计算 1~n之间的整数的 奇数之和 和 偶数 之和。
#include
using namespace std;
int main(){
//1.输入n.
int n;
int j_sum=0,o_sum=0;
cin >>n;
//2.使用循环
for (int i=1;i<=n;i++){
//输入次数
if (i%2==0){
o_sum+=i;
}else{
j_sum+=i;
}
}
cout <<"奇数和: "<<j_sum << " " <<"偶数和: " << o_sum;
return 0;
}

某市七月份中旬温度如下:
输入样例如下:
#include
#include
using namespace std;
int main(){
double n,sum_n;
int cnt=0;
//1.通过循环依次输入10个数.
for (int i =1; i<=10; i++){
cin>>n;
//1.1 进行判断
if (n>=35) {
cout <<"------" <<n<<endl;
cnt++; //计数
}
sum_n +=n; //累计天数求和.
}
//保留2位小数
cout << fixed << setprecision(2);
cout << "高温天数: "<< cnt << endl;
cout << "平均气温: " << sum_n/10 ; //输入天气的平均气温.
return 0;
}
#include
using namespace std;
int main(){
//1.定义n
int n;
int sum_i=1; //求乘积.起始值位1
cin >> n;
//n的阶乘就是 n!= 1*2*3*n
for(int i =1;i<=n;i++){
sum_i *= i; //5!= 1*2*3*4*5
}
cout << sum_i<<endl;
return 0;
}
并且 舒张压 在 60-90之间(包含端点值 )则称之为正常, 现给出某病人若干次测量的血压值统计病人保持正常血压的小时数。
#include
using namespace std;
int main(){
int t1,t2,cnn=0,n; //t1 收缩 ,t2舒张, cnn为计数器开始为0,n为几条数据
cin >>n;
for (int i=1;i<=n;i++){
cin >>t1>>t2; //接受数据
//2.进行判断各种符合条件的范围,舒张压和收缩压
if(60<=t1&&t1<=140&&60<=t2&&t2<=90) {
//符合条件的进行计数
cnn++;
}
}
cout << "符合样式" << cnn;
return 0;
}

#include
using namespace std;
int main(){
/**
1.两种思路
如果奇数 n*3+1
如果偶数 n/2 ...直到余数为1
2.假设这个数初始值为5 ,计算过程 16,8,4,2,1.
*/
int n;
cin >>n;
while(n!=1){ //直到n=1时,退出循环.
//进行处理数据
if(n%2){
cout<<n << "*3+1= "<< n*3+1 <<endl; //输出格式
n = n*3+1;
}else{
cout<< n << "/2=" << n/2 <<endl; //输出格式
n= n/2;
}
}
cout <<"End";
return 0;
}
中断所在的循环体,跳出本层循环。
#include
using namespace std;
int main(){
for (int i = 1; i<=10 ; i++){
if (i==5){
break; //i等于3时,跳出循环.
}
cout << i <<endl; //5不输出,之后也没有
}
return 0;
}
#include
using namespace std;
int main(){
for (int i = 1; i<=10 ; i++){
if (i==5){
continue;
}
cout << i <<endl; //跳过5输出其他
}
return 0;
}
while循环与for循环都可以处理循环,那它们之间有何不同?
#include
using namespace std;
int main(){
/**
循环三要素:
1. 循环初始值
2. 循环范围
3. 控制循环增/减量
*/
int i =1; //1.循环初始值
while(i<=10){//2.循环范围
//语句体
cout << i<<endl;
//3.控制循环增量
i++;
}
return 0;
}
流程图如下:

考试结束后,老师想计算全体学生的 平均分, 不知道考试人数具体是多少,直到考试参加人数成绩都不是0分。
上述分析需要 注意 哪些点?
#include
#include
using namespace std;
int main(){
//1.定义循环的初始值
double score,sum_score=0; // 成绩和总和
int count=0; //计数器
cin >>score;
while(score!=0) {
//求和
sum_score+=score;
//计数
count++;
//控制循环的增减范围
cin >>score;
}
//保留小数
cout << fixed << setprecision(2);
cout<< "平均成绩: "<< sum_score/count ;
return 0;
}
#include
using namespace std;
int main(){
//牢记循环三要素:1.循环初始值,2.循环条件,3.控制循环的变量
int i=10; //1.循环初始值 ? 从哪开始
while(0<i){ //2. 循环范围 是正序还是倒序
cout << i<<endl;
i++; //3.控制循环的变量 变量是增加还是减少
}
return 0;
}
while循环的循环流程是什么样的 ?
条件是否成立{
我一定要做的事情
}


案例代码实现:

#include
using namespace std;
int main(){
//1.变量初始值, false 没做完, true做完
string answer="no";
while (answer!="yes"){ //2.循环范围 只要不是yes就结束.
cout <<"没做完,继续做作业...";
cin >> answer; //3.控制循环增量
}
//结束
cout << "出去玩耍";
return 0;
}
打印输出 1~100 和 100 ~1的范围。
//1.倒序.
#include
using namespace std;
int main(){
int i =100;//范围起始值
while(i>=1){ //循环范围
cout << i<<endl;
i--; // 控制循环的变量
}
return 0;
}
#include
using namespace std;
int main(){
int i = 1;//1.范围起始值
while(i<=100) { //2.循环条件
cout << i <<endl;
i++; // 3. 控制循环的变量
}
return 0;
}
#include
using namespace std;
int main(){
/**
需求:
1. 任意输入一个数,判断它是几位数.
分析:
需要使用位数分离,处理该问题
然后每处理一位,累计一次.
循环条件: ? 只要是余数为 0 就是一位数.
重复问题: ? num= num/10
*/
int num;
int count=0;//计数器
cin >>num; //输入一个数
while(num!=0){ //重点 :循环条件
num/=10; //重点: 去掉一位数
count++;//计数
}
cout << count <<endl;
return 0;
}
#include
using namespace std;
int main(){
int password=123; //预设密码
int i_password; //输入密码
int n=0; //输入次数
//不循环的条件是:
//大于三次和密码相同就不循环
while(n<3&&i_password!=password) {
//每次都累计一次
n++;
cin >> i_password;
//错误的给出提示
if(i_password!=password){
cout<< "错误" << endl;
}
}
//2.正确给出提示
if(password == i_password){
cout<< "正确" << endl;
}else if(n==3){//如果3次就需要冻结
cout <<"冻结"<< endl;
}
return 0;
}
又称为,辗转相除法,属于一个数学技巧。
分析具体做法:

#include
using namespace std;
int main(){
//1.声明两个变量
int a,b,r;
cin >> a>>b;
//2.判断余数是否为零.
//2.1如果为 0, b就是最大公约数.
r = a%b;
while(r!=0) {
//2.2 进行交换
a=b;
b=r;
r=a%b;
}
cout << b << endl; //最大公约数
return 0;
}

什么是 斐波那契数列 (兔子数列)?

如何解决上述问题。

输入一个数,到这个数之前的数,的前两个数列之和是多少?
#include
using namespace std;
int main(){
//声明变量,a,b,c,任意数 num
int a=1,b=1,c,num;
cin >> num ;
//1.如果num 为 1或者2
if (num==1 || num==2){
cout << 1;
return 0; //结束返回即可
}
//2.大于3的话
for (int i=3;i<=num;i++){
//2.1 进行交换,向后移动一位.
c = a+b;
int temp = b;
b = c;
a = temp;
}
cout << c <<endl;
return 0;
}

代码如何判断

#include
using namespace std;
int main(){
// 1.就需要使用枚举法将所有符合.
//只要循环范围在 2 和 n-1之间就可以.(1和本身)
int n;
cin >> n;
//设置一个标志标量,提示信息
bool flag = true; // true 是的意思 , false 不是质数
//2.循环的目的就是看看能不能找到.
for (int i =2;i<=n-1;i++){
//2.1 枚举判断
if (n%i==0){
flag = false; //不是质数
break; //找到就结束,增加效率
}
}
//3根据标识变量判断
if (flag == true){
cout << "是质数";
} else {
cout << "不是质数";
}
return 0;
}
#include
using namespace std;
int main(){
//1.获取区间值,定义变量
int n,m;
cin >> n >>m;
//2.循环变量
for(int i=n; i<=m;i++){
//cout << i << endl;//循环体
//2.2 设置标志变量
bool falg = true;
//模块化;核心语法: 从2开始 n-1结束.
//2.1 排除 数字 1
if (i==1) {
falg = false;
}
for (int j = 2;j<=i-1;j++){
//2.2 判断是否有因数
if(i%j==0){
falg=false;
break; //如果是跳出
}
}
if(falg == true){
cout<< i << endl;
}
}
return 0;
}
#include
using namespace std;
int main(){
//位数分离
int n,n1,g,rvs=0;
cin >> n;
n1=n;
while(n!=0){ //123
g = n%10; //获取各位
//反转
rvs = rvs*10+g;
n = n/10; //去掉一位.
}
if(n1==rvs){
cout << "yes";
} else{
cout << "no";
}
return 0;
}

#include
using namespace std;
int main(){
//1.嵌套循环结构.
for (int i =1;i<=10;i++){ //外层循环,控制行.
for (int j = 1; j<=10;j++){//内层循环,控制列.
cout << "*";
}
//换行
cout<< endl;
}
return 0;
}
使用星号打印出直角三角形,如下图:
*
**
***
****
*****
认真思考,分析上述:
#include
using namespace std;
int main(){
//1.思考外层循环和内层循环建立联系
for (int i =1;i<=5;i++){ //外层循环打印5行
for (int j = 1; j<=i;j++){
cout << "*";
}
//换行
cout<< endl;
}
return 0;
}
使用星号打印等腰三角形,如下图:
*
***
*****
*******
*********
认真思考,分析上述:
#include
using namespace std;
int main(){
int n;
cin >>n;
for (int i =1;i<=n;i++){//外层循环控制行数
//1.第一行相当于倒着输出 n=5时, 第一行为 n-i
for (int j = 1; j<=n-i;j++){ //注意范围时 n-i
cout << " ";
}
//2. *打印的是 1 3 5 7 9 2*i-1(奇数)
for(int z =1; z<=2*i-1; z++){
cout<<"*";
}
//每打印一行 就需要换行
cout<<endl;
}
return 0;
}

#include
using namespace std;
int main(){
//外层循打印行,打印9行
for(int i = 1;i<=9;i++){
//内层循环打印列数,需要外层循环保持一致
for(int j =1;j<=i;j++){
//拼接循环体
cout << i<<"*"<<j<<"="<<i*j<<" ";
}
//换行
cout<<endl;
}
return 0;
}


#include
using namespace std;
int main(){
//1.使用枚举法解决问题
//1.1 公鸡的数量 100元 0-20只 5元一只
for (int i=0;i<=20;i++){
//cout <
//1.2 母鸡100元 0-33只 3元一只
for (int j =0;j<=33;j++){
//1.3 小鸡100元 , 0-300只. 1元3只,只能3只3只买
for (int z = 0;z<=300;z=z+3){//间隔3,6,9
//2.进行判断
if(i+j+z==100&&5*i+3*j+z/3==100){
cout<< i <<" " <<j <<" "<< z <<endl;
}
}
}
}
return 0;
}
#include
using namespace std;
int main(){
//1.使用枚举法解决问题
//1.1 公鸡的数量 100元 0-20只 5元一只
for (int i=0;i<=20;i++){
//cout <
//1.2 母鸡100元 0-33只 3元一只
for (int j =0;j<=33;j++){
//1.3 小鸡100元 , 0-300只. 1元3只,只能3只3只买
int z = 100-i-j;
if(5*i+3*j+z/3==100&&z%3==0){
cout<< i <<" " <<j <<" "<< z <<endl;
}
}
}
return 0;
}
0,1,2, 3,这四个数字组合成 “无重复” 的三位数 问有多少组合方式。
#include
using namespace std;
int main(){
/**
0 1 2 3
分析: 组成一个三位数.
0 不能开头 循环范围 1 2 3 for(int i=1; i<=3;i++)
第二位可以是 0 1 2 3 for(int j =0; j<=3; j++)
第三位可以是 0 1 2 3 for(int j =0; j<=3; j++)
最后判断范围
if("")判断
*/
for(int i =1; i<=3;i++){ //第一位 只能是 1, 2, 3
//第二位,可以是 0 1 2 3
for (int j =0;j<=3;j++){
//第三位可以是 0 1 2 3
for (int z = 0 ; z<=3;z++){
//进行判断,不能重复,所以需要判断.
if(i!=j&&j!=z&&i!=z)
cout << i << j << z << " ";
}
}
}
return 0;
}
102 103 120 123 130 132 201 203 210 213 230 231 301 302 310 312 320 321