- 抓大放小:知道如何得到正确结果而无需纠结具体原因
- 分类刷题
- 重构代码
- 从伪代码到代码
- 不可急用求成,很多事情都在于积累
0. 常量(数据类型)
- 数据类型

- 整型常量
- 浮点常量
- 科学计数法
- 科学计数法的常量是double类型
- 字符常量
- 存储字符实际存储的是整型常量
- 字符串常量
- “abc”占4个字节
- 布尔常量
- true被处理为1,false被处理为0
- 符号常量
#define number 100int main()
- 常变量(只读变量):必须进行初始化
const int a = 3;
1. 变量:运算,范围,异常(变量定义使用,运算符)
- a为变量,5为a的值
- a:名字,&a:地址,5:a的值
1.0 定义,初始化和赋值
1.1 运算
- 整数与浮点数进行运算:整数被转换为浮点数(double)
- 整数和浮点数的除法:
/是双面的,对于浮点数和整数作用不同- 整数除法不同于浮点数除法,虽然用的是相同的运算符
- 有一个运算数为float,则结果为double
printf("%d\n", 5/2); ---------> 2printf("%f\n", 5.0/2); ---------> 2.5
1.2 范围
整数
- int
long
int a = 0; //或long a = 0;while(1){a += 1;if(a+1<a)break;}cout << a << endl;//输出:2147483674
long long
printf("%lld", a);
- 浮点数
- float
- double
int和long都是用32位来存储最大值和最小值分别为2147483647(109), -2147483648; long long 是用64位来存储最大值和最小值分别为9223372036854775807(1018),-9223372036854775808; float的最大值和最小值分别为3.40282e+038(1038),1.17549e-038(10-38); double的最大值和最小值分别为1.79769e+308(10308),2.22507e-308(10-308)。
cout << 11111*11111 << endl;//--->123454321cout << 111111*111111 << endl;//12,345,654,321--->-539247567cout << 111111111*111111111 << endl;//1.234567898765432e+16 --->1653732529printf("%f %f %f\n", 11111.0*11111, 111111.0*111111, 111111111.0*111111111);
1.3 异常
nan:not a numberinf:infinite
cout << sqrt(-10) << endl; // ---> nan not a number(无效数字)// cout << 1/0 << endl; //无输出// cout << 1.0/0 << endl; //无输出// cout << 0.0/0.0 << endl; //无输出printf("%f\n", 1.0/0); // ---> inf infinite(无穷大)printf("%f\n", 0.0/0); // ---> nanprintf("%f\n", 1/0); // ---> 无输出
2. 输入输出:格式
2.1 scanf
2.1.1 输入格式:理解缓冲区,按要求输入
- 读懂
scanf的要求,然后按要求输入 scanf对空格不敏感(除了%c)
具体原因与缓冲区有关,所有内容先存放于缓冲区中,按enter后刷新缓冲区
//要两个整数scanf("%d %d", &a, &b);//要一个整数 然后一个,和is bigger than 再要一个整数scanf("%d , is bigger than %d", &a, &b);printf("%d %d", a, b);
2.2.2 输入个数:while无限读入,for多个读入,&&有条件读入
- 一个输入:
scanf("%d", &a); - [多组输入:
scanf();scanf();scanf();] - 多个输入:
for(i<读入数量) scanf("%d", &a); - 无限个输入:
while(scanf("%d", &a)==1);- 输入的种类为一个时:
也可用while(~scanf(%d, &a));
- 输入的种类为一个时:
- 若有多个种类的输入,则用scanf(“%d %d …”)得到一个输入即可
即一个输入有多种参数时,多增加一个%d即可 - while(scanf() && …):有条件输入
- 可以输入一组就得到一组结果
//一种参数1 2 3 ... 10 //10个输入//多种参数1 112 223 33...10 1010 //10个输入
例如:
//输入一个(一次,一个)scanf(input);//输入10个(一次多个 or 多次一个)for(i<10)scanf(input);//无限输入(无限次,一个)while(scanf(input)==...)//输入1次,每次10个(一次,多个)for(i<10)scanf(input);//输入5次,每次10个(多次,多个)for(i<5)for(i<10)scanf(input);//无限输入n,每次输入n组(无限次,多个)while(scanf(n)==1)for(i<n)scanf(input);
2.2.3 输入使用:输入过程中不可使用,输入后才能使用
cin >> i; cin >> a[i]!=cin >> i >> a[i]cin >> i; cin >> j;<==>cin >> i >> j
cin >> index;
cin >> a[index];
//输入:5 10
//输出:10
cin >> index >> a[index]; //error
cout << a[index];
//输入:5 10
//输出:0
2.2 printf
%.5f:保留五位小数
const double pi = acos(-1);
cout << pi << endl;
printf("%.5f", pi);
%05d:五位输出,不够补0
2.3 getchar,putchar
3. 分支循环
3.1 分支
if-else的匹配符合就近原则if(a) ==> if(a!=0)if(!a) ==> if(a==0)- a0 <> false当且仅当值为0
- a==-1 <==> true(-1也是true)
- a1 <> true
- 使用逻辑表达式
#include <iostream>
int main()
{
int a = 1;
int b = 0;
if(!a) b++;
else if(a == 0)
if(a) b+=2;
else b+=3;
printf("%d\n",b);
return 0;
}
//result: 0
/**********************************************/
if(a)if(b)x++;else y++;
if(a)
if(b)
x++;
else
y++;
//a为真,b为真,x++ a为真,b为假,y++ 否则x,y不变
3.2 循环
- for循环何时结束,结束时i的值
- for循环结束时i的值(最后一轮i会加1,下一次就不符合循环的条件了)(先考虑最后一轮i的值,再进行+1就可得到最后i的值)
- for(; i
ix (x-1 + 1) - for(; i<=x; i++) > ix+1 (x + 1)
- for(; i
- for(; i>x; i—) > ix (x+1 - 1)
- for(; i>=x; i—) > ix-1 (x - 1)
- for的终止条件
- 能找到,找不到的判断
- 判断循环结束后i的值
- 设置状态变量flag
- for循环结束时i的值(最后一轮i会加1,下一次就不符合循环的条件了)(先考虑最后一轮i的值,再进行+1就可得到最后i的值)
- for循环 && while循环
- for+if <=> while
- ```c for(; ;) if(!condition) break;
while(condition)
for(int i=0; ;i++){ int i = 0; double term = 1.0/(2i+1); double term = 1.0/(2i+1); if(i%2==0) sum += term; while(term>=1e-6){ else sum -= term; term = 1.0/(2*i+1); if(term<1e-6) break; if(i%2==0) sum += term; } else sum -= term; i++; } ```
- 尽可能缩小变量定义的范围:有的变量可以直接在循环中定义
- 循环外不使用
- 循环内和上次的循环无关
