一、回顾知识点
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 Paste和Format 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;
}
1691

被折叠的 条评论
为什么被折叠?



