#906. C++基础语法I

C++基础语法I

No testdata at current.

No submission language available for this problem.

一,语法基础主要包括

  1. 代码框架
#include <iostream>    // 头文件,表示包含输入输出流命令:cin cout
using namespace std;   // 表示使用 std 这个名字空间,因为 cin cout 在 std 这个命名空间里
int main() {


	return 0;
}

该框架称为主函数,主要执行的代码(命令)应写在 int mainreturn 0 之间

  1. 数据类型与变量

主要的基础类型是:整数,浮点数,字符

B 表示字节,bit 表示二进制的位
1B 有 8bit,表示 1 字节由 8 位二进制构成

整数包含:
	名称		字节	二进制位	底层二进制形式
	short		2B		16bit		00000000 00000000
	int			4B		32bit		00000000 00000000 00000000 00000000
	long		在 PC 端可以认为与 int 一致
	long long	8B		64bit		00000000 0000...000 [64 位]

	需要注意,二进制的最高位作为符号位,因此真正作为大小的是除了最高位后的二进制位。
	若对二进制与十六进制转换有所了解,可很快获得例如 int 类型的最大值: int imax = 0x7fffffff;
	unsigned 的含义表示将符号位也作为值来计算,表示`无符号` 的意思
	例如:unsigned int 表示无符号 int 类型
	可尝试下列代码观察结果:
	int a = 0x7fffffff;
	unsigned int b = 0x7fffffff;
	cout << a << " " << a + 1 << endl;
	cout << b << " " << b + 1 << endl;

	解题过程中,要时刻牢记当下的数据类型。

浮点数包含:
	单精度浮点数:float		4B		32bit		略
	双精度浮点数:double		8B		64bit		略

	由于浮点数底层二进制不要求掌握,因此笔记中不进行介绍。
	当前浮点数使用原则:只要遇到小数问题,优选 double

字符类型:
	char	1B	8bit	00000000

	1 字符 1 字节,因此可以认为字符是最基础的数据类型,所有的输入皆可作为字符输入
	可回顾例题 《倒序五位数整数》,通过字符顺序输入,逆序输出即可。

	由于字符底层结构构建与整数一致,并每一个字符都对应一个 ASCII 整数,因此在使用,运用时,可以将字符认为是单字节整型。

	关键字符与 ASCII 码
	'0' 48,'A' 65, 'a' 97


    变量的命名规则:
        1. 只能实用数字,字母或下划线
        2. 数字不能开头
        3. 不能直接使用系统保留的关键字

  1. 输入输出
c++ 风格		c 风格 (格式化(format)输入输出)
输入	cin				scanf()
输出	cout			printf()

c 风格输入输出,最好包含头文件 cstdio 或 stdio.h , 即开头增加一行 #include <cstdio>

        
对比输出:
	1)单纯输出字符串:
		cout << "hello" << endl;
		printf("hello\n");

	2)单纯输出变量
		int a = 10;
		cout << a << endl;
		printf("%d\n", a);
	
		%d 是整数 int 类型的占位符,不同的类型需要使用不同的占位符。
	
		类型				占位符
		short int long		%d
		long long			%lld
		unsigned int		%u
		unsigned long long	%llu
		float				%f
		double				%lf
		char				%c

		数据不进行格式化输出时,cout 比 printf 方便很多很多
		需要进行格式化输出例如保留小数位,整数占位输出时,printf 将会方便一些
		2.1 保留小数
			例如保留 2 位小数:printf("%.2lf", 3.1415926);
			例如保留 3 位小数:printf("%.3lf", 3.1415926);
			可默认为是四舍五入。但有极小概率发生问题,暂不展开。
	
		2.2 整数占位
			例如占 2 个字符位,不足位补空格输出:printf("%2d", 1);
			例如占 2 个字符位,不足位补'0'输出: printf("%02d", 1);
		
			题外话:试试 printf("%c", 48); 思考输出结果的原因。

	3)混合型输出
		int a = 10;
		cout << "a 变量值为:" << a << endl;
		printf("a 变量值为:%d\n", a);
	
		混合型输出是往往与格式化有关,一般情况下,printf 相对比 cout 更容易构建
		例如 输出 a + b = c 计算式
		cout << a << '+' << b << '=' << a+b << endl;
		printf("%d+%d=%d\n", a, b, a+b);

对比输入:
	int a;
	cin >> a;			方便

	scanf("%d", &a);	相对复杂,变量前需要 & 取址,千万不能忘。

	单纯数据输入,使用 cin 比较方便;倘若遇到格式化输入时,例如 1:2:3 时,scanf 将有妙处
	例如输入 1:2:3
	c++ 风格:
		int a, b, c;
		char ch1, ch2;
		cin >> a >> ch1 >> b >> ch2 >> c; // 清晰,多变量,长

	c 风格:
		int a, b, c;
		scanf("%d:%d:%d", &a, &b, &c); // 严格格式输入,少变量

	根据习惯,题目自行选择输入方法即可。

  1. 基础运算符
特别运算符:sizeof() 用于计算 ( ) 内数据或类型的占字节大小
		问:常量 1 整数和 1.1 浮点数,默认类型是什么?

	算术运算符
		+ - * / % ++ --
	
		针对 / 需要注意,整数除法是向下取整,例如 5/2 是 2,不是 2.5 。这在解题中若忽视了将是致命的错误。
		【因为这个,相信部分同学对某题深恶痛绝】
	
		若需要得到 2.5 这个结果,则需要 5.0/2 , 令浮点数参与计算。由此需要清晰地认知计算原则:
			1)浮点数与其它类型进行计算,结果为浮点数;
			2)double 类型与 float 类型计算,结果为 double
			3)类型计算等级从高到底为: 浮点数 > long long > long > int > short > char
		谨记:字符 char 类型数据参与运算,使用 ASCII 码 (例题:挖矿II)
	
		% 为求余符号。
			例:a ÷ b = c ... d
			根据整数除法向下取整,因此:
				a/b = c
			而
				a%b = d
		
			% 的使用,在于数学中它能怎么用,编程中几乎就怎么用。
			例表示整除,即 d 为 0,即判 a%b == 0
			例判断奇偶,即是否能被 2 整除,即判 d 是否为 0,判 a%2 == 0
			例取个位数,如取 123 中的 3 ,可将 123 拆为 12 和 3 。考虑到 123 ÷ 10 = 12 ... 3 
				因此,通过 /10 和 %10 可以拆整数为 个位部分 和 非个位部分
			例 (a+b)%c 实际上化简为 (a%c + b%c)%c , (a*b)%c 化简为 (a%c*b%c)%c 
		
			% 能起多大用,取决于数学中对余数的认知深度。
	
		++ -- 自增1 与自减1
	
			主要能够区分 ++a 与 a++ 即可:
				符号在变量之前,先进行自增或自减,再使用变量;
				符号在变量之后,先使用变量,再进行自增或自减。
		
	

	关系运算符
		>    >=    <     <= 
		==  判断是否相等,相等为真,否则为假
		!=  判断是否不等,不相等为真,否则为假

	逻辑运算符
				名称:方式1	方式2
		并且,逻辑与: and	 &&
		或者,逻辑或:  or	 ||
		否非,逻辑非: not	 !

	EXMAPLE:
		判断闰年: 			(y%4==0 && y%100!=0) || y%400==0
		判断数字符号范围: 	'0'<=ch && ch<='9'
		判断 a 是 b 倍数: 	a%b == 0
		判断 a 是偶数: 		a%2 == 0

二,程序化解决问题的三大结构

1)顺序结构

程序命令行的执行顺序从上到下,一步步执行。

2)分支结构

判断选择结构
	判断分支:if 
	选择分支:switch

	if 标准格式:

		单分支:
			if (...) {
				...
			}

		双分支:
			if (...) {
				...
			} else {
				...
			}

		多分支:
			if (条件1) {
				执行1
			} else if (条件2) {
				执行2
			} else if ...
		
			} else if (条件n) {
				执行n
			} else {
				条件1 到 条件n 都为假,则执行该处
			}

		当 if 的 执行 语句只有一行一个命令一个 ; 时,可以省略 { }
		如:
			if (ok == 1) 
				cout << "hello ok" << endl;
			
		但初学阶段!!强烈建议!!将结构写完整,否则可能会遇到难以察觉的细节问题。
		
			一个好的习惯,能免去很多弯弯绕绕的小错误。
			想要编写更加便捷,高效,整洁的代码,是需要以编码熟练度和良好的代码格式为前提
	
	switch 标准格式:
	
		switch(整型数据) {
			case 整型常量1: {
				执行内容1
				break;
			}
			case 整型常量2: {
				执行内容2
				break;
			}
			case ... 
		
			}
			case 整型常量n: {
				执行内容n
				break;
			}
			default: {
				当 整型数据 与 所有整型常量失配,则执行该处。
			}
		}
	
		由于 case 任务执行的特殊性,需要用 break 退出 switch 结构,因此有 break 和无 break 的执行顺序是不同的。
		并且在大部分情况下,case 的 { } 可省略,只有当在 case 内定义新变量的时候,{ } 不能省略
	
		尝试阅读, 执行下列代码:
		代码1:
			switch (1) {
				case 1:
					int a;
				case 2:
					int a;
			}
	
		代码2:
			switch (1) {
				case 1: {
					int a;
				}
				case 2: {
					int a;
				}
			}
	
		代码3:
			switch (1) {
				case 1: cout << "a"; break;
				case 2: cout << "b"; break;
				case 3: cout << "c"; break;
				default: cout << " over";
			}
	
		代码4:
			switch (1) {
				case 1: cout << "a"; 
				case 2: cout << "b"; 
				case 3: cout << "c"; 
				default: cout << " over";
			}

		代码5:
			switch (1) {
				case 1: cout << "a"; 
				case 2: cout << "b"; break;
				case 3: cout << "c"; 
				default: cout << " over";
			}

3)循环结构

循环的本质:控制重复执行的次数。
因此,只要能够用某种方式控制好循环的次数即可。若同时还能知道这是第几次循环就更好了。
所以:
for (int i=1; i<=n; i++) {

}
n 次循环,i 的每一次的值,表示这是第 i 次循环。

要慢慢学会辨认变量在问题中的含义。

通过几个样例,来再看看 for 和 while 的语法和用法
样例1:输出 1~100 和 100~1
for:
	for (int i=1; i<=100; i++) {
		cout << i << ' ';
	}
	cout << endl;
	for (int i=100; i>=1; i--) {
		cout << i << ' ';
	}

while:
	int i = 1;
	while (i<=100) {
		cout << i << ' ';
		i++;
	}
	cout << endl;
	i = 100;
	while (i>=1) {
		cout << i << ' ';
		i--;
	}

样例2:输入 n 个整数,并累加它们

for:
	int sum = 0;
	for (int i=1; i<=n; i++) {
		int t;
		cin >> t;
		sum = sum + t; // 用 sum += t; 等价
	}

while:
	int sum = 0, i = 1;
	while (i<=n) {
		int t;
		cin >> t;
		sum += t; // 用 sum = sum + t; 等价
		i++;      // 容易被遗漏,千万注意
	}

样例3:输入多个整数,并累加它们,直到 0 停止
while:
	int sum = 0;
	while (1) { // 死循环,无限循环
		int t;
		cin >> t;
		if (t == 0){ // 退出的条件
			break;
		}
		sum = sum + t;
	}

for:
	int sum = 0, t;
	for ( ; ; ) { // 死循环,无限循环
		int t;
		cin >> t;
		if (t == 0) break; // 一行一个命令一个 ; 号,可省略 { }
		sum += t;
	}

	或

	int sum, t;
	for ( sum = 0; cin >> t && t != 0; sum += t);
	cout << sum << endl;

	!!! 注意,该写法只做了解,它的使用,需要对 for 命令,cin 语法等有充分的理解。
	比如,删掉 for 那一行最后的 ; 试试。并思考 ; 的作用。