当前位置: 首页 > article >正文

【C++】 Flow of Control

在这里插入图片描述

《C++程序设计基础教程》——刘厚泉,李政伟,二零一三年九月版,学习笔记


文章目录

  • 1、选择结构
    • 1.1、if 语句
    • 1.2、嵌套的 if 语句
    • 1.3、条件运算符 ?:
    • 1.4、switch 语句
  • 2、循环结构
    • 2.1、while 语句
    • 2.2、do-while 语句
    • 2.3、 for 循环
    • 2.4、循环嵌套
  • 3、跳转结构
    • 3.1、break 语句
    • 3.2、continue 语句
    • 3.3、goto 语句
    • 3.4、return 语句
  • 4、应用实例

1、选择结构

ifswitch?:

1.1、if 语句

if 语句是最基本的选择结构,它用于在条件为真时执行特定的代码块。

#include <iostream>
using namespace std;

int main()
{
    int n = 10;

    if (n > 0)
    {
        cout << "Number is positive." << endl;
    }
    
    return 0;
}

output

Number is positive.

if-else 语句用于在条件为真时执行一个代码块,否则执行另一个代码块。

在这里插入图片描述

#include <iostream>
using namespace std;
 
int main() 
{
    int num = -5;
 
    if (num > 0) 
    {
        cout << "Number is positive." << endl;
    } 
    else 
    {
        cout << "Number is not positive." << endl;
    }
 
    return 0;
}

output

Number is not positive.

1.2、嵌套的 if 语句

当需要判断的条件不止一个,可以使用嵌套 if 语句来实现。

所谓嵌套 if 语句,指的是其中一个 if 语句作为另一个 if 语句或者 else 语句的内嵌语句。

C++ 规定,else 语句总是与在同一块离它最近且无 else 语句配对的 if 语句相结合。

#include <iostream>
using namespace std;
 
int main() 
{
    int num = 59;
 
    if (num > 0) 
        cout << "Number is positive." << endl;
        if (num >= 60)
            cout<< "passed." << endl;
    else 
        cout << "not passed." << endl;
    return 0;
}

output

Number is positive.
not passed.

编译器不关心程序的缩进形式

当你对嵌套 if 语句混淆不清时,可以通过添加 {} 来解决

eg

#include <iostream>
using namespace std;
 
int main() 
{
    int score;
    cin >> score;

    if (score < 0)
        cout << "error score!" << endl;
    else if (score < 60)
        cout << "Get D!" << endl;
    else if (score < 70)
        cout << "Get C!" << endl;
    else if (score < 80)
        cout << "Get B!" << endl;
    else
        cout << "Get A!" << endl;
    return 0;
}

output

75
Get B!

1.3、条件运算符 ?:

表达式1?表达式2:表达式3

条件运算符是 C++ 中唯一的 3 目运算符

如果表达式 1 为 true,执行表达式 2,否则执行表达式 3

#include <iostream>
using namespace std;
 
int main() 
{
    float a = 60.1;
    bool result = a<60?false:true;
    cout << result << endl;
    
    return 0;
}

output

1

1.4、switch 语句

switch 语句可以一次将测试值与多个值进行判定,而不是只测试一个判定条件

switch(表达式)
{
	case 整型常量表达式1:
		语句组1
	case 整型常量表达式2:
		语句组2
	...
	case 整型常量表达式n:
		语句组n
	default:
		语句组 n+1
}

每个 case 语句后必须是与表达式类型兼容的一个常量(必须为常量,不能为变量,且要求为整型或者能够转化为整型),eg 整型、字符型或枚举型表达式

default 语句并非必须

需要注意的是,每个case块的末尾通常有一个break语句,以防止程序继续执行下一个case块的代码(这称为“贯穿”)。

eg:贯穿

#include <iostream>
using namespace std;

int main() {

    char grade;
    cout<<"请输入成绩:";
    cin>>grade;

    switch(grade)
    {
        case 'A':
            cout<<"80~100\n";
        case 'B':
            cout<<"60~80\n";
        case 'C':
            cout<<"0~60\n";
        default:
            cout<<"error\n";
    }

    return 0;
}

output

请输入成绩:A
80~100
60~80
0~60
error

引入 break 以后

#include <iostream>
using namespace std;

int main() {

    char grade;
    cout<<"请输入成绩:";
    cin>>grade;

    switch(grade)
    {
        case 'A':
            cout<<"80~100\n";
            break;
        case 'B':
            cout<<"60~80\n";
            break;
        case 'C':
            cout<<"0~60\n";
            break;
        default:
            cout<<"error\n";
            break;
    }

    return 0;
}

output

请输入成绩:A
80~100

output

请输入成绩:a
error

再来个例子

#include <iostream>
using namespace std;

int main() {
    int day;
    cout << "请输入星期几 (1-7): ";
    cin >> day;

    switch (day)
     {
        case 1:
            cout << "星期一" << endl;
            break;
        case 2:
            cout << "星期二" << endl;
            break;
        case 3:
            cout << "星期三" << endl;
            break;
        case 4:
            cout << "星期四" << endl;
            break;
        case 5:
            cout << "星期五" << endl;
            break;
        case 6:
            cout << "星期六" << endl;
            break;
        case 7:
            cout << "星期日" << endl;
            break;
        default:
            cout << "输入无效" << endl;
    }

    return 0;
}

output

请输入星期几 (1-7): 7
星期日

2、循环结构

2.1、while 语句

while 循环在循环条件为真时一直执行。

while (循环条件) {
    // 循环体
}

在这里插入图片描述

eg:计算 1 到 100 的和

#include <iostream>
using namespace std;

int main() 
{
    int i = 0, sum = 0;

    while (i<101)
    {
        sum += i;
        i++;
    }

    cout << sum << endl;

    return 0;
}

output

5050

2.2、do-while 语句

do-while 循环与 while 循环类似,但不同之处在于它至少执行一次循环体,即使在第一次迭代时循环条件为假。

do {
    // 循环体
} while (循环条件);

在这里插入图片描述

计算 1到100 的和

#include <iostream>
using namespace std;

int main() 
{

    int i = 0, sum = 0;

    do
    {
        sum += i;
        i++;
    }while(i<101);

    cout << sum << endl;

    return 0;
}

output

5050

2.3、 for 循环

for 循环通常用于已知执行次数的循环

for (初始化表达式; 循环条件; 步进表达式) {
    // 循环体
}

eg,计算 1-100 的和

#include<iostream>
using namespace std;

int main(){

	int sum = 0;

	for (int i = 0; i <= 100; i++)
	{
		sum += i;
	}
	cout << sum << endl;
	return 0;
}

output

5050

注意,初始化表达式、循环条件、步进表达式都可以省略,循环体不能省略

#include<iostream>
using namespace std;

int main(){

	int sum = 0, i = 0;

	for (;;)
	{
		if (i <= 100)
			sum += i++;
		else
			break;
	}
	cout << sum << endl;
	return 0;
}

output

5050

允许两个或者两个以上的变量控制循环

#include<iostream>
using namespace std;

int main(){

	int i1 = 1, i2 = 10;

	for (i1, i2; i1<i2; i1++, i2--)
		cout << i1 << " " << i2 << endl;
	return 0;
}

output

1 10
2 9
3 8
4 7
5 6

2.4、循环嵌套

循环结构可以嵌套使用,即一个循环内部包含另一个循环。

#include<iostream>
using namespace std;

int main()
{
	for (int i = 1; i <= 10; i++)
	{
		for (int j = i; j <= 10; j++)
			cout << "*";
		cout << endl;
	}
	return 0;
}

output

**********
*********
********
*******
******
*****
****
***
**
*

再来个例子

#include<iostream>
using namespace std;

int main()
{
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			cout << "i = " << i << ", j = " << j << endl;
		}
	}
	return 0;
}

output

i = 0, j = 0
i = 0, j = 1
i = 0, j = 2
i = 1, j = 0
i = 1, j = 1
i = 1, j = 2
i = 2, j = 0
i = 2, j = 1
i = 2, j = 2

while、do-while、for 循环均可以相互嵌套

3、跳转结构

break、continue、goto、return 4 种

3.1、break 语句

用于立即退出循环或switch语句。

一个 break 只能跳出所在的最内层循环

#include<iostream>
using namespace std;

int main()
{
	int num;
	for (int i = 0; i < 2; i++)
	{
		num = 1;
		while (1)
		{
			cout << num << endl;
			num++;
			if (num > 4)
				break;
		}
	}
	return 0;
}

output

1
2
3
4
1
2
3
4

3.2、continue 语句

用于跳过循环中剩余的代码,并立即开始下一次迭代。

不能用在 switch 中

#include<iostream>
using namespace std;

int main()
{
	int sum = 0;

	for (int i = 0; i <= 100; i++)
	{
		if (i % 10 != 0)
			continue;
		sum += i;
	}
	cout << sum << endl;
	return 0;
}

output

550

3.3、goto 语句

用于无条件跳转到同一函数内的标签位置。

适用于从多层循环中直接跳出,如果用 break 的话,需要多个

#include<iostream>
using namespace std;

int main()
{
	int num = 10;
	if (num > 0) {
		goto positive;  // 跳转到标签 positive
	}
	cout << "Number is negative or zero.\n";
	goto end;  // 跳转到标签 end

positive:
	cout << "Number is positive.\n";
end:
	return 0;
}

output

Number is positive.

3.4、return 语句

用于从函数返回一个值(如果函数有返回值类型)或无条件退出函数。

4、应用实例

eg 3-10 判断正整数是否为素数

#include <iostream>
#include<math.h>
using namespace std;

int main() 
{
    int x,i,b;
    int num = 5;

    while(num)
    {
        cin >> x;
        b = sqrt(x);
        num--;
        if (x <= 1)
        {
            cout << "False\n";
            continue;
        }
        
        for (i=2; i<=b; i++)
        {
            if (x % i == 0)
                    break;
        } 

        if (i>=b+1)
            cout << "True\n";
        else
            cout << "False\n";
    }
    return 0;
}

output

0
False
1
False
2
True
3
True
9
False

设置了可以输入 5 次,for 循环的判断边界为 sqrt(x)可以提高计算效率,最后判断是否为素数的条件 i>=b+1 也很巧妙,注意算法的边界测试,if (x <= 1) 就是来弥补边界漏洞的


eg 3-11 使用循环语句求解 300 -400 范围内的所有素数

#include <iostream>
#include<math.h>
using namespace std;

int main() 
{
    int i,b;

    for (int x=301; x<401; x+=2)
    {
        b = sqrt(x);
        for (i=2; i<=b; i++)
        {
            if (x % i == 0)
                    break;
        } 
        if (i>=b+1)
            cout << x << " ";
    }
    return 0;
}

output

307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 

可以看到 for 循环中的自增项采用的是 x+=2,进一步优化了计算速度,因为偶数肯定可以除以2余0,不是素数,我们遍历所有奇数即可


eg 3-12 用公式 π 4 = 1 − 1 3 + 1 5 − 1 7 + . . . \frac{\pi}{4} = 1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+... 4π=131+5171+... 求圆周率 π 的近似值,直到最后一项的绝对值小于 1 0 − 8 10^{-8} 108 为止

注意审题,最后一项的绝对值,而不是整个式子的绝对值

#include <iostream>
#include<math.h>
#include<iomanip>
using namespace std;

int main() 
{

    double i = 3.0;
    double x=1.0, result=1.0;
    int sign = 1;

    while(fabs(x)>=1e-8)
    {
        sign *= -1;
        x = sign / i;
        i+=2;
        result += x;
        cout << x <<endl;
    }
    //cout << result * 4;
	cout << setiosflags(ios::fixed) << setprecision(8) << result * 4; // 输出小数点后八位
    return 0;
}

output

3.14159267

程序会运行很久

abs 函数通常用于整数类型(如 int、long 等)。

fabs 函数专门用于浮点数类型(如 float、double 等)。

这里正负符号的转变很巧妙 sign *= -1;


http://www.kler.cn/a/554166.html

相关文章:

  • vscode通过ssh连接服务器实现免密登录+删除
  • (leetcode42 前缀后缀最值)接雨水
  • MySQL数据库(4)—— 数据类型
  • JavaScript系列(75)--代理模式专题
  • 深入解析NoSQL数据库:从文档存储到图数据库的全场景实践
  • 六、线程间的协作原理场景剖析
  • 基于SpringBoot的“食物营养分析与推荐网站”的设计与实现(源码+数据库+文档+PPT)
  • vxe-grid 通过配置式给单元格字段格式化树结构数据,转换树结构节点
  • Jenkins插件管理切换国内源地址
  • 前端开发岗模拟面试题套卷A答案及解析(一)技术面部分
  • LeetCode--236. 二叉树的最近公共祖先
  • NPM环境搭建指南
  • [笔记.AI]如何判断模型是否通过剪枝、量化、蒸馏生成?
  • 透明DNS策略
  • 【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑲】
  • vue 解决image-conversion图片处理插件压缩后图片底色变黑问题
  • 23种设计模式 - 访问者模式
  • < OS 有关 > Ubuntu 24 SSH 服务器更换端口 in jp/us VPSs
  • 【JavaEE进阶】Spring Boot日志
  • 爬虫抓取数据后如何存储?