#906. C++基础语法I
C++基础语法I
No testdata at current.
No submission language available for this problem.
一,语法基础主要包括
- 代码框架
#include <iostream> // 头文件,表示包含输入输出流命令:cin cout
using namespace std; // 表示使用 std 这个名字空间,因为 cin cout 在 std 这个命名空间里
int main() {
return 0;
}
该框架称为主函数,主要执行的代码(命令)应写在 int main 和 return 0 之间
- 数据类型与变量
主要的基础类型是:整数,浮点数,字符
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. 不能直接使用系统保留的关键字
- 输入输出
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); // 严格格式输入,少变量
根据习惯,题目自行选择输入方法即可。
- 基础运算符
特别运算符: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 那一行最后的 ; 试试。并思考 ; 的作用。
Related
In following homework: