第五节 C++ 循环结构(算法)

news2024/11/17 16:34:02

文章目录

  • 前言介绍
  • 1. for 语句
    • 1.1 语法结构
    • 1.2 语法流程的执行过程
      • 1.2.1 案例 1:循环的正序输入和倒序输入
      • 1.2.2 案例2 : 求1~n的平方数
      • 1.2.3 案例 3: 求输入a和b,求a~b区间数.
    • 1.3 for 循环案例练习
      • 1.3.1 求最大值与最小值
      • 1.3.2 计算奇数和和偶数和
      • 1.3.3 计算平均气温与最高气温
      • 1.3.4 计算阶乘
      • 1.3.5 计算 正常血压
      • 1.3.6 角谷定理 (扩展知识)
    • 1.4 关键字 break 和 continue
      • 1.4.1 break
      • 1.4.2 continue
  • 2. while 语句
    • 2.1 语法结构
      • 2.1.1 使用案例(Noip普及试题)
      • 2.1.2 注意三要素,避免死循环产生
    • 2.2 语法流程的执行过程
      • 2.2.1 案例1: 正序和倒序 1~100的范围
      • 2.2.2 案例 2: 判断输入数,是几位数
    • 2.3 while循环案例(扩展)
      • 2.3.1 银行取款输入密码
      • 2.3.2 欧几里德算法(最大公约数)
      • 2.3.3 斐波那契数列
  • 3. 循环算法扩展
    • 3.1 质数(素数)
    • 3.2 质数统计(在3.1基础上扩展)
    • 3.3 回文数
  • 4. 嵌套循环
    • 4.1 什么是嵌套循环
    • 4.2 打印直角三角形
    • 4.3 打印等腰三角形
    • 4.4 打印99乘法表
  • 5. 知识扩展
    • 5.1 枚举法
      • 5.1.1 百钱买百鸡
      • 5.1.2 枚举应用--无重复事项

前言介绍

  1. C++中支持的三种基本的运行流程:顺序结构,选择结构,循环结构(本节课内容)
  2. 生活中经常遇到一些 重复性工作,这些反复执行多次同样的操作,将书包里的十本书,摆放到书架的指定位置上,要做的工作就是重复十次:拿起书→找位置→摆好书。每次只考虑拿一本的话,就会重复十次 ,就是循环思想。 用循环思想编写程序就是所谓的 循环结构程序。
    • 打印书籍。
    • 切黄瓜。
    • 操场跑圈。
  3. 在C++中,为了表现循环思想提供了,三种循环,for ,while,do-while 三种不同格式的循环语句。
    • 上述提到的:拿起书→找位置→摆好书。 这个重复内容,就是循环语句的循环体。

1. for 语句

1.1 语法结构

  1. 为什么要学习循环,怎么去理解循环? 先看一个下面的案例。

    • 输出 好好学习天天,天天向上。1000次! 怎么设计程序。
      在这里插入图片描述
    • 如果一次一次用手写,那可真是太秀了。
    #include <iostream>
    using namespace std;
    
    int main(){
    	//1.输出1000次我爱学习
    	
    	cout<<"好好学习天天,天天向上"<<endl; 
    	cout<<"好好学习天天,天天向上"<<endl; 
    	cout<<"好好学习天天,天天向上"<<endl; 
    	cout<<"好好学习天天,天天向上"<<endl; 
    	
    	//.....太麻烦了...?
    	//2.怎么有更好的办法解决问题? 
    	
    	return 0;
    } 
    
  2. 语法结构,关键字 for,有两种格式:

    • 格式一:省略{}花括号。
    for (循环变量的初始值;循环条件;循环变量增量)
    	循环语句的循环体1;
    	循环语句的循环体2;
    
    • 格式二 (推荐使用): 使用{}将循环语句包裹起来。
    for(循环变量的初始值; 循环条件;循环变量的增量){
    
    	循环语句的循环体1;
    	循环语句的循环体2;
    	循环语句的循环体3;
    }
    

    在这里插入图片描述
    3. 案例实现:
    - 循环语句,好好学习,天天向上 。1000次! 循环程序设置。

    #include <iostream>
    using namespace std;
    int main(){
    
    	//1.循环语法格式推荐使用{}
    	//注意, 先声明 循环的初始值 int i =起始值。 
    	for (int i=1;i<=1000;i++){
    		//1.1 循环语句体 
    		cout << "好好学习天天,天天向上="<< i <<endl; 
    	}
        return 0;
    }
    
    

1.2 语法流程的执行过程

  1. 语法循环控制流程:

    	for (int i=1;i<=1000;i++){
    		//1.1 循环语句体 
    		cout << "好好学习天天,天天向上="<< i <<endl; 
    	}
    
  • int i 会首先被执行, 且只会执行一次。这一步需要先声明并初始化任何循环控制变量

    • 也可以不在这里写任何语句,只要有一个分号出现即可 (不推荐)。
  • 接下来,会判断 i<=1000

    • 如果为真,则执行循环主体。
    • 如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。
  • 在执行完 for 循环主体后,控制流会跳回上面的 i++ 增量语句。

    • 更新循环控制变量。
    • 该语句可以留空,只要在条件后有一个分号出现即可 (不推荐)。
  • 条件再次被判断。如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。 在条件变为假时,for 循环终止。

    • 循环流程图如下:
      在这里插入图片描述

1.2.1 案例 1:循环的正序输入和倒序输入

  1. 如何输入一个数,正序输出1~n倒序输出 n ~1

    • 问题分析:
      • 声明一个循环变量并赋值为 ?
      • 循环变量最大值会不会超过?
      • 循环变量每次如何变化?
    #include <iostream>
    #include <iomanip> 
    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; 
    } 
    

1.2.2 案例2 : 求1~n的平方数

  1. 对于给定的任意正整数 a,输出1到a的平方数。

    • 平方数就是:表示一个数乘以它自身而得到的结果,例如 2乘以2 得到的是4, 4就是2的平方数。
    • 输入10 ,结果就应该是1~10 每一个数的平方数。
    #include <iostream>
    #include <iomanip> 
    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; 
    } 
    

    在这里插入图片描述

1.2.3 案例 3: 求输入a和b,求a~b区间数.

  1. 在控制台中,同一行输入两个数 a 和 b,输出a和b的之间的数。

    • 例如: 3 9 , 输入 3 4 5 6 7 8 9
    #include <iostream>
    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; 
    } 
    

1.3 for 循环案例练习

1.3.1 求最大值与最小值

  1. 输入一个数n,然后n是多少,就输入多少个整数, 并且找出 最大的数 (n为整数类型。)

    • 注意: n为几,相当于你输入多少整数。

    • 分析:需要比较输入的数值,然后依次比较找出最大的。
      在这里插入图片描述

    • 代码如下:

    #include <iostream>
    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 自己动手
    
    

1.3.2 计算奇数和和偶数和

  1. 输入一个数n,计算 1~n之间的整数的 奇数之和 和 偶数 之和

    • 输入 10 , 计算 1~10之间的和。
    • 输入 100, 就计算 1 ~ 100之间的和 。
    #include <iostream>
    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; 
    } 
    

    在这里插入图片描述

1.3.3 计算平均气温与最高气温

  1. 某市七月份中旬温度如下:

    • 36.3,37.0,34.8,35.0,36.1,34.4,33.9,34.8,35.5,35.7。 要求计算中旬的平均气温和高温天数(大于等于35度为高温天)。请设计程序,输入十天温度,输出平均气温(保留2位小数)和高温天数。
    • 要求:第一行输入10个数字;
    • 输出:两个数字,第一个数字为高温天数,第二个数字是平均气温。
  2. 输入样例如下:

    • 36.3,37.0,34.8,35.0,36.1,34.4,33.9,34.8,35.5,35.7。
    • 输出样例: 6 35.35。
    #include <iostream> 
    #include <iomanip> 
    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; 
    } 
    

1.3.4 计算阶乘

  1. 利用for循环计算n!的值。
    • 百科解释: 一个正整数的阶乘是所有小于及等于该数的正整数的积,并且0的阶乘为1,自然数n的阶乘写作n!
    • 记住 0的阶乘就是1.
    #include <iostream> 
    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; 
    } 
    

1.3.5 计算 正常血压

  1. 问题描述: 监护室每小时测量一次病人的血压,若收缩压90-140 之间 并且 舒张压 在 60-90之间(包含端点值 )则称之为正常, 现给出某病人若干次测量的血压值统计病人保持正常血压的小时数。
    在这里插入图片描述
  • 考虑分析, 需要几个变量, t1 为收缩,t2为舒张, cnn为正常。
    #include <iostream> 
    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; 
    } 
    

1.3.6 角谷定理 (扩展知识)

在这里插入图片描述

#include <iostream> 
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; 
} 

1.4 关键字 break 和 continue

1.4.1 break

  1. 中断所在的循环体,跳出本层循环。

    • 注意: 跳出最近的一层循环,并不能跳出所有循环。
    #include <iostream>
    using namespace std;
    
    int main(){
    	for (int i = 1; i<=10 ; i++){
    		if (i==5){
    			break; //i等于3时,跳出循环. 
    		} 
    		cout << i <<endl;   //5不输出,之后也没有 
    	} 
    	return 0;
    }
    
    

1.4.2 continue

  1. 跳出当前循环,执行下一次循环。
    • 注意: 同break,一样,只能跳出最近的循环。
    #include <iostream>
    using namespace std;
    
    int main(){
    	
    	for (int i = 1; i<=10 ; i++){
    		if (i==5){
    			continue;  
    		} 
    		cout << i <<endl;   //跳过5输出其他 
    	} 
    	return 0;
    }
    
    

2. while 语句

2.1 语法结构

  1. while循环与for循环都可以处理循环,那它们之间有何不同?

    • 循环初始值
    • 循环范围(循环条件
    • 控制循环的增量与减量
    #include <iostream> 
    using namespace std;
    int main(){
       /**
       		循环三要素:
    		   	1. 循环初始值
    			2. 循环范围 
    			3. 控制循环增/减量 
       */
       int i =1; //1.循环初始值
       
       while(i<=10){//2.循环范围 
       		//语句体 
       		cout << i<<endl; 
       		//3.控制循环增量 
    		i++; 
       } 
    	return 0; 
    } 
    
  2. 流程图如下:
    在这里插入图片描述

2.1.1 使用案例(Noip普及试题)

  1. 考试结束后,老师想计算全体学生的 平均分, 不知道考试人数具体是多少,直到考试参加人数成绩都不是0分。

    • 提供若干个考试成绩,输入0分的就结束,计算平均值。
    • 并且 保留2位小数
  2. 上述分析需要 注意 哪些点?

    • 重复做的事情: 录入成绩。
    • 成绩不为零: 循环条件。
    #include <iostream> 
    #include <iomanip> 
    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;
    }
    

2.1.2 注意三要素,避免死循环产生

  1. 什么是无限循环 ?什么情况下会产生无限循环?
    • 举一个例子: 操场跑10圈,观察下,下面代码有什么问题?
    #include <iostream>
    using namespace std;
    
    int main(){
    	//牢记循环三要素:1.循环初始值,2.循环条件,3.控制循环的变量 
    	int i=10; //1.循环初始值 ? 从哪开始 
    	while(0<i){  //2. 循环范围  是正序还是倒序 
    		cout << i<<endl;
    		i++; //3.控制循环的变量 变量是增加还是减少 
    	} 
    	return 0;
    }
    

2.2 语法流程的执行过程

  1. while循环的循环流程是什么样的 ?

    • 可以对比for循环流程学习。
    • 我们拿写作业这件事举例子。
    	条件是否成立{
    		我一定要做的事情
    	}
    

    在这里插入图片描述

    在这里插入图片描述

  2. 案例代码实现:

    • 根据流程执行过程,需要根据循环条件决定。
    • 重复的事情: 做作业。
    • 循环条件: 是否完成作业。
      在这里插入图片描述
    #include <iostream>
    using namespace std;
    int main(){
    	//1.变量初始值, false 没做完, true做完 
    	string answer="no"; 
    	while (answer!="yes"){ //2.循环范围 只要不是yes就结束. 
    		cout <<"没做完,继续做作业...";
    		cin  >> answer; //3.控制循环增量 
    	} 
    	//结束 
    	cout << "出去玩耍"; 
    	return 0;
    } 
    

2.2.1 案例1: 正序和倒序 1~100的范围

  1. 打印输出 1~100 和 100 ~1的范围。

    • 使用 while 的形式循环 。
    • 倒序 100 ~ 1
    //1.倒序.
    #include <iostream>
    using namespace std;
    
    int main(){
    	int i =100;//范围起始值
    	while(i>=1){ //循环范围
    		cout << i<<endl;
    		i--; // 控制循环的变量
    	} 
    	return 0; 
    } 
    
    • 正序 1 ~ 100
    #include <iostream>
    using namespace std;
    
    int main(){
    	
    	int i = 1;//1.范围起始值 
    	while(i<=100) { //2.循环条件 
    		cout << i <<endl;
    		i++; // 3. 控制循环的变量 
    	}
    	return 0;
    }
    

2.2.2 案例 2: 判断输入数,是几位数

  1. 需求:任意输入一个数字,输出这个数字是一个几位数。
    • 例如: 输入 12345 输出 5位数。
    #include <iostream>
    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;
    }
    
    

2.3 while循环案例(扩展)

2.3.1 银行取款输入密码

  1. 在银行取款时,需要输入密码(密码三位数),密码正确才可以进行取款操作;如果连续三次输入密码错误,就会提示错误信息,并且冻结账户。
    • 给出错误提示信息, 正确,错误,冻结。
  2. 分析思路:
    • 首先需要预设密码,然后在输入密码,和 输入次数。
    • 重复做的事,是什么? 循环条件是什么?
    #include <iostream>
    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;
    }
    
    

2.3.2 欧几里德算法(最大公约数)

  1. 又称为,辗转相除法,属于一个数学技巧。

    • 对于任意两个自然数 a 和 b ,求他们的最大公约数。
  2. 分析具体做法:

    • 分析两个数,需要两个数。
    • 案例如下:
      在这里插入图片描述
    #include <iostream>
    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;
    }
    

在这里插入图片描述

2.3.3 斐波那契数列

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

    • 斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89…
    • 这个 数列从第3项开始,每一项都等于前两项之和。
    • 思考下面的枚举方式是否可行?为什么?在这里插入图片描述
  2. 如何解决上述问题。

    • 需要第三方变量存储c到b过渡的值。
      在这里插入图片描述
  3. 输入一个数,到这个数之前的数,的前两个数列之和是多少?

    #include <iostream>
    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;
    }
    
    

3. 循环算法扩展

3.1 质数(素数)

  1. 需求: 输入一个数,判断该数是否为质数,是输出 “yes” ,不是输出 “no”
    • 分析: 什么是质数 ? 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。又称为素数,
    • 注意:1不属于质数。

在这里插入图片描述

  1. 代码如何判断

    • 思路分析: 换句话说,只要在 2 到 n-1之间 有除数就不是一个质数。
      在这里插入图片描述
    • 当找到了其他因数就跳出程序, 关键字,break的使用。
     #include <iostream>
    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;
    }
    
    

3.2 质数统计(在3.1基础上扩展)

  1. 输入两个整数 n 和 m 请输出[n,m] 内所有的素数。
    • 例如,输入 1 和 20 , 其中需要列出1~20之间所有质数。
  2. 如何分析:
    • 首先:通过循环输出区间值。
    • 其次:模块化 质数。
    • 最后:标志变量,判断输出。
    #include <iostream>
    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;
    } 
    

3.3 回文数

  1. 什么是回文数? 首先理解回文,指正着读,倒着读,都能通的句子,在数学中也一样。
    • 12321,12344321,999。
    #include <iostream>
    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;
    }
    
    

4. 嵌套循环

4.1 什么是嵌套循环

  1. 在一个循环语句中包含另一个循环结构,这样的结构称之为嵌套循环,以下为核心语法:
    • 外层循环控制行数。
    • 内存循环控制列数。
  2. 案例如下:
    在这里插入图片描述
#include <iostream>
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;
}

  • 总结:外层循环循环一次,内层循环全部。

4.2 打印直角三角形

  1. 使用星号打印出直角三角形,如下图:

    *
    **
    ***
    ****
    *****
    
  2. 认真思考,分析上述:

    • 打印几行?
    • 每行打印几次?
    • 行和列存在什么关系?
    #include <iostream>
    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;
    }
    

4.3 打印等腰三角形

  1. 使用星号打印等腰三角形,如下图:

    • 输入 5,打印下图
    	*
       ***
      *****
     *******
    *********
    
  2. 认真思考,分析上述:

    • 打印几行?
    • 每行打印几次?怎么组合内循环。
    • 行和列存在什么关系?
    • 需要几个循环?
    #include <iostream>
    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;
    }
    
    
    

4.4 打印99乘法表

  1. 数学启蒙阶段都学了这样一道题,学习99乘法表,在编程中如何实现打印99乘法表。
    • 提示:参考4.2 案例,打印直角三角形。

在这里插入图片描述

#include <iostream>
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;
}

5. 知识扩展

5.1 枚举法

  1. 什么是枚举法 ?
    在这里插入图片描述

5.1.1 百钱买百鸡

  1. 需求如下图:

在这里插入图片描述

  1. 认真思考,分析上述:
    • 首先,确定枚举对象。
    • 其次,确定枚举范围。
    • 最后,分析判断条件。
#include <iostream>
using namespace std;

int main(){
	//1.使用枚举法解决问题  
	//1.1 公鸡的数量 100元  0-20只  5元一只
	for (int i=0;i<=20;i++){
		//cout <<i<<endl;   //0~20只公鸡
		//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;
}

  1. 上述问题,可以优化么? 存在什么漏洞?
    • 可能存在超时,所以需要优化。
#include <iostream>
using namespace std;

int main(){
	//1.使用枚举法解决问题  
	//1.1 公鸡的数量 100元  0-20只  5元一只
	for (int i=0;i<=20;i++){
		//cout <<i<<endl;   //0~20只公鸡
		//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;
}

5.1.2 枚举应用–无重复事项

  1. 使用 : 利用 0,1,2, 3,这四个数字组合成 “无重复” 的三位数 问有多少组合方式。
    • 无重复。
    #include <iostream>
    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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1083048.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day03_if_循环

今日内容 1.if.elseif 2.循环 3.控制关键词 复习 一 运算符算术,赋值,关系,逻辑,三目!,非,取反的作用boolean r !true; //falseboolean r2 !(1 > 0);// false 二 键盘录入1) 导包 import java.util.Scanner;2) 创建扫描器 Scanner scanner new Scanner(System.in);3) 调…

3.5 高速以太网

思维导图&#xff1a; 3.5.1 100BASE-T以太网 **3.5 高速以太网** 随着技术进步&#xff0c;以太网的传输速度不断增加。从早期的10 Mbit/s的速度&#xff0c;增长到了1 Gbit/s甚至更快。以下是一些关于高速以太网技术的简介。 **3.5.1 100BASE-T以太网** - **定义**&#…

信息系统项目管理师第四版学习笔记——项目沟通管理

管理基础 沟通模型的关键要素包括&#xff1a;编码、信息和反馈信息、媒介、噪声、解码。 在编制书面或口头信息的时候&#xff0c;应使用书面沟通的5C原则&#xff0c;以减轻理解错误&#xff1a;正确的语法和拼写(Correctness)、简洁的表述(Concise)、清晰的目的和表述(Cla…

传统工厂如何搭建蒸汽流量远程无线抄表系统?

一、应用背景 2021年国务院政府工作报告中指出&#xff0c;扎实做好碳达峰、碳中和各项工作&#xff0c;制定2030年前碳排放达峰行动方案&#xff0c;优化产业结构和能源结构&#xff0c;特别是近期煤炭价格上涨导致蒸汽价格大幅上涨&#xff0c;节能减排显得更加重要&#xf…

深度学习之微调

在现代深度学习领域&#xff0c;精细调整&#xff08;Fine-tune&#xff09;已经成为一种非常重要的技术手段。 预训练模型 在介绍finetune之前&#xff0c;先了解一下什么是预训练模型。在搭建一个网络模型来完成一个特定的图像分类的任务时&#xff0c;首先&#xff0c;需要…

ad5665r STM32 GD32 IIC驱动设计

本文涉及文档工程代码&#xff0c;下载地址如下 ad5665rSTM32GD32IIC驱动设计,驱动程序在AD公司提供例程上修改得到,IO模拟的方式进行IIC通信资源-CSDN文库 硬件设计 MCU采用STM32或者GD32,GD32基本上和STM32一样,针对ad566r的IIC时序操作是完全相同的. 原理图设计如下 与MC…

【C++ 】面向对象三大特性之封装和继承 详解

目录 0 引言1 封装1.1 封装是什么&#xff1f;1.2 封装的优缺点 2 继承2.1 继承的定义2.2 继承方式2.3 继承时名字遮蔽2.6 遮蔽、函数重写、函数重载的区别2.5 继承时的对象模型2.6 派生类与基类互相赋值原则2.6 继承时的构造函数和析构函数 &#x1f64b;‍♂️ 作者&#xff…

LeetCode二叉树OJ

目录 剑指 Offer 55 - I. 二叉树的深度 - 力扣&#xff08;LeetCode&#xff09; 965. 单值二叉树 - 力扣&#xff08;LeetCode&#xff09; 100. 相同的树 - 力扣&#xff08;LeetCode&#xff09; 101. 对称二叉树 - 力扣&#xff08;LeetCode&#xff09; 二叉树遍历_牛客题…

【网络编程】套接字编程——TCP通信

文章目录 一、简单的TCP网络程序1. 单进程版2. 多进程版3. 多线程版 二、线程池版TCP网络程序三、日志与守护进程1. 日志2. 守护进程进程组和会话的引出守护进程的创建 一、简单的TCP网络程序 1. 单进程版 &#x1f495; tcpServer.hpp #pragma once #include "err.hpp…

iPhone手机记笔记工具选择用哪个

iPhone手机大家应该都比较熟悉&#xff0c;其使用性能是比较流畅的&#xff0c;在iPhone手机上记录笔记可以帮助大家快速地进行总结工作、记录工作内容等&#xff0c;在iPhone手机上记笔记工具选择用哪个呢&#xff1f; 可以在iPhone手机上使用的笔记工具是比较多的&#xff0…

OPC UA客户端工具Softing OPC Client使用图文教程

简介 Softing OPC Client 是一个用于与 OPC (OLE for Process Control) 服务器进行通信的工具。下面是一个详细的图文教程&#xff0c;以帮助您使用 Softing OPC Client 进行 OPC 通信。 1. 下载和安装 Softing OPC Client 首先&#xff0c;您需要从 Softing 官方网站下载 S…

csgo饰品市场会崩盘吗?如何评价现在的csgo饰品市场?

如何评价现在的csgo市场&#xff1f; csgo饰品市场会崩盘吗&#xff1f;如何评价现在的csgo饰品市场&#xff1f; 如何来评价现在CSGO市场&#xff1f;哈喽&#xff0c;大家好&#xff0c;我是童话姐姐&#xff0c;那么从长远来看&#xff0c;我觉得这个CSGO市场它一定是呈现一…

渗透测试KAILI系统的安装环境(第八课)

KAILI系统的安装环境(第八课) Kaili是一款基于PHP7的高性能微服务框架&#xff0c;其核心思想是面向服务的架构&#xff08;SOA&#xff09;&#xff0c;支持http、websocket、tcp等多种通信协议&#xff0c;同时还提供了RPC、Service Mesh、OAuth2等功能。Kaili框架非常适合构…

c语言练习85:通讯录的实现(基于顺序表实现)

通讯录的实现(基于顺序表实现&#xff09; 基于动态顺序表实现通讯录 C语⾔基础要求&#xff1a;结构体、动态内存管理、顺序表、⽂件操作 1、功能要求 1&#xff09;⾄少能够存储100个⼈的通讯信息 2&#xff09;能够保存⽤⼾信息&#xff1a;名字、性别、年龄、电话、地址…

Android性能优化,可以从那些方面解决?方案一览

说到Android性能优化大家都很熟悉&#xff0c;这是一个老生畅谈的话题与技术。本篇讲讲Android性能优化需要学习那些&#xff0c;让这些技术做到极致。虽然老生常谈但是一直是一个合格的Android开发人员需要掌握的重点。要想进入大厂也是重要的敲门砖。 Android性能优化重要性…

【FreeRTOS】【STM32】02 FreeRTOS 移植

基于 [野火]《FreeRTOS%20内核实现与应用开发实战—基于STM32》 正点原子《STM32F429FreeRTOS开发手册_V1.2》 准备 基础工程&#xff0c;例如点灯 FreeRTOS 系统源码 FreeRTOS 移植 上一章节已经说明了Free RTOS的源码文件在移植时所需要的&#xff0c;FreeRTOS 为我们提供…

leetcode:1967. 作为子字符串出现在单词中的字符串数目(python3解法)

难度&#xff1a;简单 给你一个字符串数组 patterns 和一个字符串 word &#xff0c;统计 patterns 中有多少个字符串是 word 的子字符串。返回字符串数目。 子字符串 是字符串中的一个连续字符序列。 示例 1&#xff1a; 输入&#xff1a;patterns ["a","abc&…

AlGaN/GaN结构的氧基数字蚀刻

引言 宽带隙GaN基高电子迁移率晶体管(HEMTs)和场效应晶体管(fet)能够提供比传统Si基高功率器件更高的击穿电压和电子迁移率。常关GaN非常需要HEMT来降低功率并简化电路和系统架构&#xff0c;这是GaN HEMT技术的主要挑战之一。凹进的AlGaN/GaN结构是实现常关操作的有用选择之一…

使用IDEA自带功能将WSDL转java

好像IDEA2018版本之后不再支持webservice转java&#xff0c;可以下载2018.3.6版本的IDEA&#xff08;直接IDEA官网下载即可&#xff09;&#xff0c;然后打开一个项目&#xff0c;在根目录处单击右键 选择Generate Java Code From Wsdl...&#xff0c; 选择OK&#xff0c;即可…

二、DMSP/OLS夜光数据校正之饱和校正

一、前言 首先需要将DMSP/OLS夜光数据下载,那么这里方便大家,可以直接私信我获得DMPS/OLS和NPP/VIIRS夜光原始数据,以百度云网盘形式分享给大家。 当把34期DMSP/OLS夜光数数据下载至电脑之后,解压后可以看到如下图的数据。 选择稳定平均灯光数据作为我们研究数据,也就是F…