流程控制语句

一、回顾知识点

1.1 运算符

复合运算符: +=,  -=, *=, /=, %=, >>=  <<=  |=  &=  
关系运算符: == , != , >,  <, >=, <=
逻辑运算符: && , || , !
位运算符:  &, |, ^, ~,  >> 右移(除法, 2^n),  << 左移(乘法, 2^n)
三目运算符:  条件?表达式1 :表达式2
自增自减:  ++, --   【考点: a++, ++a的区别】

1.2 运算符的优先级

共15级:(1最高,  15最低)
第一级:  ( 表达式 ), [], ., ->  组合规则: 从左往右
第二级:  ++, --, ~, !, +正号,-负号, (类型)变量;   组合规则:从右往左
第三级: *, /,  %
第四级: + 加, - 减
第五级: <<, >> 
第六级: <, >, >=, <=, 
第七级: ==, !=
第八级: &  位与
第九级: ^ 异或
第十级: | 位或
第十一级: && 逻辑与
第十二级: || 逻辑或
第十三级: ? : 
第十四级: =, +=, -=,等复合赋值运算符
第十五级: ,

1.3 vscode

vscode安装

vscode安装c/c++相关的插件

vscode安装Remote-ssh插件

vscode打开工程:

​ 1) 基于samba共享文件的方式打开远程工程目录

​ 2) 基于ssh服务,打开远程Linux的工程(默认将vscode-server安装到Linux中)

二、ssh免密远程登录

2.1 本地生成公钥与私钥文件

打开 windows powershell, 输入ssh-keygen命令,默认一路回车。完成之后,在用户的目录产生.ssh\id_rsa.ssh\id_rsa.pub两个文件。其中id_rsa.pub是公钥文件,需要将此文件复制到linux系统中。

将公钥上传的scp命令:

scp .ssh/id_rsa.pub  disen@192.168.119.128:~/

在Linux中查看当前用户家目录中文件是否存在id_rsa.pub文件

2.2 在Linux中授权公钥

打开linux的终端,通过如下命令完成

cat id_rsa.pub >> ~/.ssh/authorized_keys

【注意】第一次使用,可以在家目录中不存在.ssh目录,则需要先创建。

mkdir ~/.ssh

2.3 Window测试

三、控制语句

3.1 if的选择语句

3.1.1 单分支

语法:

if(条件表达式){
   条件为真时的语句块;
}

如果条件语句块只存在一行语句时,可以不需要 { }

如 d1.cpp: 输入一个数,判断它是否为偶数,如果是偶数则输出666

#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
    cout << "请输入一个偶数:" ; 
    int n ;
    cin >> n;
    if(n % 2 == 0)
       cout << "666" << endl;
    return 0;
}

3.1.2 双分支

语法:

if (条件表达式){
    为true真的语句块;
}else {
    为false假的语句块;
}

如 d2.cpp: 输入一个数,判断它是偶数还奇数

#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
    cout << "请输入一个数:" ; 
    int n ;
    cin >> n;
    if(n % 2 == 0)
       cout << n<< "是偶数" << endl;
    else 
        cout << n<< "不是偶数" << endl;
    return 0;
}

3.1.3 多分支

语法:

if(条件表达式1){
   条件表达式1为真时的语句块;
} else if(条件表达式2){
   条件表达式2为真时的语句块;
}else if(条件表达式3){
   条件表达式3为真时的语句块;
}
....
else if(条件表达式n){
   条件表达式n为真时的语句块;
}else{
    以上条件都不满足的情况的语句块;
}

如d3.cpp: 输入两个数,都是正数时,相加,都为负数相乘,否则输出它们的差值。

#include <iostream>
#include <cmath>

using namespace std;

int main(int argc, char const *argv[])
{
    cout << "请输入2个数:" ;
    int a, b;
    cin >> a >> b;

    if(a >=0 && b >= 0){
        cout << "a+b=" << a+b << endl;
    }else if(a <0 && b<0){
         cout << "a*b=" << a*b << endl;
    }else{
        cout << "a和b差值" << abs(a-b) << endl;
        if( a-b < 0)
            cout << "a和b差值" << ( (~(a-b)+1) & 0x7fffffff) << endl;
    }
    
    return 0;
}

3.1.4 嵌套分支

在一个分支语句中存在另一个分支语句

语法:

if (条件表达式){
    if(条件表达式2){
        ...  
    }
}else {
    if(条件表达式3){
        ...
    }
}

如: d4.cpp:

编写一个程序,使用逻辑运算符实现以下条件:如果一个数是 3 的倍数,输出 “Fizz”;如果一个数是 5 的倍数,输出 “Buzz”;如果一个数同时是 3 和 5 的倍数,输出 “FizzBuzz”;否则输出这个数本身。

#include <iostream>
#include <cmath>

using namespace std;

int main(int argc, char const *argv[])
{
    int n;
    cout << "请输入一个整数: " ;
    cin >> n; 
    if(n % 3 == 0 || n % 5 == 0){
        // n 一定是3或5的倍数
        if(n%3 == 0)
            cout << "Fizz";
        if(n%5 == 0)
            cout << "Dizz";
        
        cout << endl;
    }else{
         cout << "原数: " << n << endl;
    }

    return 0;
}

3.2 switch分支

语法:

switch(表达式){
   case 值1: 
      表达式匹配值1的语句块;
      [break;]
   case 值2:
      ...
   case 值n:
      ...
   default:  
       表达式与以上值都不匹配的情况下,执行默认的语句块
}

switch的表达式值可以是整数类型(char, short, int , long)。

switch中的break的作用: 结束case语句,如果在一个case中没有break,则会穿透到下一个case,直到break结束。

【面试题】如果default写在第一个case之上,会出现什么情况?

1) 语法错误
2) default位置是可以放在任意的位置

如d5.cpp: 输入一个你的成绩,输出对应的标签。标签分别有A(90及以上), B(大于等于80,且小于90),C(大于等于60,且小于80),其它为D。

#include <iostream>
#include <cmath>

using namespace std;

int main(int argc, char const *argv[])
{
    int n;
    cout << "输入您的成绩:" << endl;
    cin >> n;

    switch (n)
    {  
    case 100:
       cout << "你是最优秀的 ";
    case 99:
    case 98:
    case 97:
    case 96:
    case 95:
    case 94:
    case 93:
    case 92:
    case 91:
    case 90:
        cout << "A";
        break;
    
    case 89:
    case 88:
    case 87:
    case 86:
    case 85:
    case 84:
    case 83:
    case 82:
    case 81:
    case 80:
        cout << "B";
        break;
    default:
        cout << "D";
        break;
    }
    cout << endl;
    return 0;
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如d6.cpp: 输入0,1,2三个数值,分别代表玩家的角色,0代表亚索、1代表盲僧、2代表提莫,输出“您选择的角色为 xxx”。

#include <iostream>
#include <cmath>

using namespace std;

int main(int argc, char const *argv[])
{
    short n;
    cout << "请选择角色: 0- 亚索, 1-盲僧  2-提莫";
    cin >> n;
    cout << "您选择的角色是";
    switch(n){
        default:
            cout << "选择无效";
            break;
        case 0:
           cout << "亚索";
           break;
        case 1:
            cout << "盲僧";
            break;
        case 2:
            cout << "提莫";
            break;
    }
    cout << endl;
    return 0;
}

【注意】default可以放在任意的位置,但是不使用break的情况下,也会下向穿透。

【扩展】a++表达式自增时机

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.3 循环语句

满足条件的情况下,循环执行相同的代码(程序)。

3.3.1 for循环

语法:

for (初始化 ; 循环条件表达式 ; 步进表达式 ){
   循环体语句;
   [break|continue;] 
}

如: d7.cpp, 编写一个程序,使用位运算符实现以下条件:判断一个数的二进制表示中有多少个 1。

#include <iostream>
#include <cmath>

using namespace std;

int main(int argc, char const *argv[])
{
    int n = 0;
    cout << "请输入一个正整数: " << endl;
    cin >> n;
    int count = 0; // 统计1的个数
    int tmp = 0;
    for (int i = 0; tmp < n; i++)
    {
        tmp = 1 << i;
        if ( (n & tmp) == tmp)
            count++;
    }

    cout << n << "的二进制中1个数为: " << count << endl;
    return 0;
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

【扩展】vscode代码自动格式化

ctrl+,打开vscode设置,在Text Editor区域,勾选Format On PasteFormat on Save

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如d8.cpp, 输入一个数,输出小于这个数所有偶数

#include <iostream>
#include <cmath>

using namespace std;

int main(int argc, char const *argv[])
{
    int n;
    cout << "输入一个数:";
    cin >> n;
    int i;
    // for循环的初始化表达式只会执行1次
    // for循环的条件表达式会执行多次,第一次是在初始化表达式执行之后,执行;之后是步进表达式执行完之后执行。 如是条件表达式为真,则执行循环体,反之结束for循环。
    // for循环的步进表达是在循环体执行完之后执行。
    for (i = n - 1; i > 1; i--)
    {
        if (i % 2 == 0)
            cout << i << "\t";
    }
    cout << endl;
    return 0;
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

案例1:for循环求1~100的和

#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
    int i=1,  total=0;
    for(; i<= 100; i++)
        total += i;
    
    cout << "1~100之间的和为 " << total << endl;
    return 0;
}

案例2:for循环求1~100的所有偶数和、奇数和。

#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
    int i=1,  total1=0, total2=0;
    for(; i<= 100; i++){
        if(i%2 == 0)
            total1 += i;
        else
            total2 += i;
    }
    
    cout << "1~100之间的偶数和为 " << total1 << endl;
    cout << "1~100之间的奇数和为 " << total2 << endl;
    return 0;
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.3.2 while循环

语法:

while(条件表达式){
   循环体语句;
   
   修改条件表达式中变量的值;
   [判断是否退出循环  break;]
}

如d11.cpp, 计算1~100之间的3的倍数和

#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
    int i=1, total=0;
    while( i<= 100){
        if(i % 3 == 0)
        	total += i;
        i++;
    }
    cout << "1~100之间的3的倍数的和: " << total << endl;
    return 0;
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如d12.cpp, 输入一个文件大小,输出它的人性化的大小(计算它的单位: B,K, M, G, T)

#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
    // 1024B = 1K
    // 1024K = 1M
    // 1024M = 1G
    // 1024G = 1T
    char human[] = "BKMGT";
    int i=0;
    
    float size;
    cout << "输入一个文件的大小(字节):";
    cin >> size;
    
    while(size >= 1024){
        i++;
        size /= 1024.0; // 整除
    }
    
    cout << size << human[i] << endl;  // human[0] = 'B'
	
    return 0;
}

如d13.cpp: 编写一个程序,使用逻辑运算符实现以下条件:输入一个正整数,输出它的二进制表示

#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
    char arr[32] = "";
    int len = 0;
    int n;
    cout << "输入一个正整数: ";
    cin >> n;
    while (n){
        if (n & 1){
            arr[len++] = '1';
        } else {
            arr[len++] = '0';
        }
        n >>= 1;
    }
    while (len >= 0) {
        cout << arr[len--];
    }
    cout << endl;
    return 0;
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实现2:d14.cpp

#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
    char arr[32] = "";
    int len = 0;
    int n;
    cout << "输入一个正整数: ";
    cin >> n;

    while (n)
    {
        arr[len++] = n % 2 + 48; // 将数字0或1转成 字符'0'或'1'
        n /= 2;
    }

    while (len)
        cout << arr[--len];
    cout << endl;
    return 0;
}

实现3:

#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
	int n;
    cout << "输入一个正整数: ";
    cin >> n;
    int isStartShow = 0;
	for(int i=31; i>=0; i--){
        if((n >> i) & 1) isStartShow=1;
        if(isStartShow)
        	cout << ((n >> i) & 1);
    }
    cout << endl;
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.3.3 break和continue关键字

break是停止或结束循环。

continue是中断本次循环,进入下一次循环。

如d16.cpp, 输入用户名和口令,验证它们是否为disen和666,如果连续错了3次,则直接退出登录,在3次以内只要成功验证,则输出“登录成功”。

#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
    string name, pwd;
    int i = 0;
    while (1)
    {
        cout << "输入用户名和口令: ";
        cin >> name >> pwd;

        if (name == "disen" && pwd == "666")
        {
            cout << name << "," << pwd << "登录成功!" << endl;
            break;
        }
        i++;
        // 允许3次错误
        if (i >= 3)
        {
            cout << "错误次数已过3次,正在退出登录..." << endl;
            break;
        }
    }

    return 0;
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如d17.cpp, 计算100以内除了5的倍数之外的所有数的和

#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
    int total = 0;
    for(int i=1; i<= 100; i++){
        if(i % 5 == 0) 
            continue; // 语句执行在此处,下面的语句则不会被执行,跳到步进表达式
        total += i;
    }
    cout << "100以内除5的倍之外的所有数的和: " << total << endl;
    return 0;
}

3.3.3 goto语句 [了解]

goto 位置名称; 跳到指定位置名称的地方执行语句。

用法:

位置名称:
    语句块;

goto 位置;
#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
    int total = 0;
    int i = 0;
abc:
    if (i == 100)
        goto show;
    i++;
    if (i % 5 == 0)
        goto abc;

    total += i;
    if (i < 100)
        goto abc;
show:
    cout << "100以内除5的倍之外的所有数的和: " << total << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值