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

【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;

相关文章:

  • 同花顺C++面试题及参考答案
  • 【Elasticsearch】查询规则_query_rules
  • 【核心算法篇十四】《深度解密DeepSeek量子机器学习:VQE算法加速的黑科技与工程实践》
  • 【数据挖掘】
  • Leetcode - 周赛436
  • 通过监督微调提升多语言大语言模型性能
  • 使用rknn进行yolo11-pose部署
  • 曙光服务器安装centos8
  • 【Elasticsearch】Search Templates(搜索模板)
  • nginx ngx_http_module(8) 指令详解
  • 10. 软件设计架构-经典架构问题
  • Kimi K1.5 与 DeepSeek R1:AI 模型的深度对比
  • mac 关闭 sip
  • 换服务器需要做的工作(记录一下)
  • 使用 PyTorch 实现标准卷积神经网络(CNN)
  • Python 路径不存在则创建
  • jEasyUI 创建学校课程表
  • STM32GPIO
  • vue单据打印 一维码、二维码实现
  • DeepSeek、微信、硅基流动、纳米搜索、秘塔搜索……十种不同方法实现DeepSeek使用自由
  • 印巴战火LIVE丨印巴互相发动无人机袭击,巴官员称两国已在国安层面接触
  • 98年服装“厂二代”:关税压力下,我仍相信中国供应链|湃客Talk
  • 金融监管总局:做好2025年小微企业金融服务工作
  • 巴基斯坦所有主要城市宣布进入紧急状态,学校和教育机构停课
  • 申活观察|精致精准精细,城市“双面镜”照见怎样的海派活力
  • 华尔兹转岗与鲁比奥集权:特朗普政府人事震荡背后的深层危机