本篇是学习VC驿站的《实用C++》教程时的超简化同步笔记,详细内容可参见VC驿站原帖
是在学校C++课程之外重新系统地学习一遍C++,所以很基础很基础的部分不会记录
代码块渲染有误,目前不知道怎么解决,#include< iostream>总是消失,你们自己加上就好了QAQ
如果觉得网站字体太小,可以在右下方的按钮中点击+放大哦√(比如我就觉得这个网站的字体很小)
if语句
形式
类似switch语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| int zhangsan_age = 0; cin >> zhangsan_age;
if (zhangsan_age < 1) { cout << "张三是个婴儿" << endl; } else if (zhangsan_age < 3) { cout << "张三是个幼儿" << endl; } else if (zhangsan_age < 5) { cout << "张三是个儿童" << endl; } else if (zhangsan_age < 9) { cout << "张三是个少年" << endl; } else if (zhangsan_age < 18) { cout << "张三是个青年" << endl; } else if (zhangsan_age < 40) { cout << "张三是个壮年" << endl; } else if (zhangsan_age < 55) { cout << "张三是个中年人" << endl; } else { cout << "张三是个老年人" << endl; }
|
不带{}但意外的是正确的形式
(这种情况下if-else算作一条语句,编译能通过)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| int zhangsan_age = 0, zhangsan_sex = 0; cin >> zhangsan_age >> zhangsan_sex;
if (zhangsan_age < 18) { if (zhangsan_sex == 1) { cout << "张三是个男孩" << endl; } else if (zhangsan_sex == 2) { cout << "张三是个女孩" << endl; } } else if (zhangsan_age >= 18) if (zhangsan_sex == 1) cout << "张三是个男青年" << endl; else if (zhangsan_sex == 2) cout << "张三是个女青年" << endl;
|
但是更建议使用嵌套写法(这样写好看)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| int zhangsan_age = 0, zhangsan_sex = 0; cin >> zhangsan_age >> zhangsan_sex;
if (zhangsan_age < 18) { if (zhangsan_sex == 1) { cout << "张三是个男孩" << endl; } else if (zhangsan_sex == 2) { cout << "张三是个女孩" << endl; } } else if (zhangsan_age >= 18) { if (zhangsan_sex == 1) { cout << "张三是个男青年" << endl; } else if (zhangsan_sex == 2) { cout << "张三是个女青年" << endl; } }
|
switch语句
switch vs if-else
多条件时,使用if-else:
- 代码冗余,不易阅读
- 系统要从上到下一个个算if中的表达式进行比较,效率低(switch语句是直接跳转到匹配的case语句)
格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| switch(表达式) { case 常量表达式1:语句1 break; case 常量表达式2:语句2 break; case 常量表达式3:语句3 break; ... case 常量表达式n:语句n break; default:语句n+1; break; }
|
具体说明
- switch后面括号内的表达式必须是数值类型(包括字符类型)的数据,不能使用字符串;只能是整型数据,不能是浮点型数据。
- 每个case标签的常量表达式的值必须不能相同,否则会出现错误的情况,而且vs2013的编译器来说编译也会不通过的。
- 每个case语句,包括default语句的顺序不影响结果,可以任意放置,比如把default放在上面也是一样的。
- 如果所有case都不匹配且没有default子句时,程序直接跳出switch-case。
- break和return语句都能跳出switch-case,但是return更厉害会直接跳出函数
两个特殊用法
不同的case想要执行相同的语句
1 2 3
| case 0: case 6: cout << "今天是双休日" << endl;
|
于是当x为0或6时,输出相同
想要在case中定义变量
不能直接在case/default的内嵌语句中定义局部变量,否则会报错。
两种解决方法:
变量进switch语句之前就定义好
给内嵌语句加一对大括号,限定作用域
eg.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| char ch = 'A'; switch(表达式) { case 'A':cout << "case A reach." << endl; break; case 'B': { int a = 6; ++a; } break; default: break; }
|
循环语句
循环语句没有什么特别要注意的地方
有意思的例题贴上来:
求出100~200之间的素数并打印出来:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #include using namespace std;
int main() { cout << "100~200之间的素数如下:" << endl;
int x = 0; for (x = 100; x <= 200; ++x) { int y = 2; for (y = 2; y < x / 2; ++y) { if (x % y == 0) { break; } }
if (y < x / 2) continue;
cout << x << endl; }
cout << endl; return 0; }
|
第一次学C语言的时候,素数的题是用flag标志写出来的,这里用的是条件判断+continue
分析:里面的for循环要打破有两种方式:
- x % y == 0,此时说明x不为素数
- y >= x / 2
且条件1满足时,条件2必不满足(因为只有条件2不满足条件1才有执行的机会)
条件2满足时,条件1必不满足(因为条件2执行在条件1前面)
所以当x是素数时,y < x / 2 必成立
当x不为素数时,y < x / 2 必不成立
期中的题目
期中的题大多比较简单,这里记一个初学时写的不是很好的题:
输出以下图案:
*
***
*****
*******
*****
***
*
我自己写的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| for (int x = 0; x < 4; x++) { for (int y = 0; y < 2 * x + 1; y++) { cout << "*"; } cout << endl; }
for (int x = 2; x >= 0; x--) { for (int y = 0; y < 2 * x + 1; y++) { cout << "*"; } cout << endl; }
|
老师的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| for (int idx = 1; idx <= 7; idx += 2) { for (int jdx = 0; jdx < idx; jdx++) { cout << '*'; } cout << endl; }
for (int idx = 5; idx >= 1; idx -= 2) { for (int jdx = 0; jdx < idx; jdx++) { cout << '*'; } cout << endl; }
|
两种方式本质上是都用了 行号 和 要打印的*的个数 之间的数量关系写循环代码
但是老师的会更加好一点,因为它使得行号就是要打印的*的个数,比我写的更简单直观,不用去算x和y之间的关系啥的(也就是顺序行号和要打印的*的个数之间的关系)
虽然我的也是很简单的奇数的2x+1 = ̄ω ̄=
VS零碎的基操
包含头文件:右键 -> 打开文件,可查看头文件内容(可以看到系统头文件标签页带把🔒,意思是只读)
缺少头文件时:小番茄会自己在缺少包含头文件的函数下面画小波浪,右键 -> Refactor(VA) -> Add Include,添加头文件,不用再去百度了
blog零碎的基操
用markdown写博客时,有些字符比如说*连打就会变成分割线,如果要打一串******怎么办呢?
答案:加\转义,比如打星号就是打\*