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

0. 常量(数据类型)

  • 数据类型

数据类型.png

  • 整型常量
  • 浮点常量
    • 科学计数法
    • 科学计数法的常量是double类型
  • 字符常量
    • 存储字符实际存储的是整型常量
  • 字符串常量
    • “abc”占4个字节
  • 布尔常量
    • true被处理为1,false被处理为0
  • 符号常量
  1. #define number 100
  2. int main()
  • 常变量(只读变量):必须进行初始化
  1. const int a = 3;

1. 变量:运算,范围,异常(变量定义使用,运算符)

  • a为变量,5为a的值
  • a:名字,&a:地址,5:a的值

1.0 定义,初始化和赋值

1.1 运算

  • 整数与浮点数进行运算:整数被转换为浮点数(double)
  • 整数和浮点数的除法:/是双面的,对于浮点数和整数作用不同
    • 整数除法不同于浮点数除法,虽然用的是相同的运算符
  • 有一个运算数为float,则结果为double
  1. printf("%d\n", 5/2); ---------> 2
  2. printf("%f\n", 5.0/2); ---------> 2.5

1.2 范围

  • 整数

    • int
    • long

      1. int a = 0; //或long a = 0;
      2. while(1){
      3. a += 1;
      4. if(a+1<a)
      5. break;
      6. }
      7. cout << a << endl;
      8. //输出: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)。

  1. cout << 11111*11111 << endl;
  2. //--->123454321
  3. cout << 111111*111111 << endl;
  4. //12,345,654,321--->-539247567
  5. cout << 111111111*111111111 << endl;
  6. //1.234567898765432e+16 --->1653732529
  7. printf("%f %f %f\n", 11111.0*11111, 111111.0*111111, 111111111.0*111111111);

1.3 异常

  • nan:not a number
  • inf:infinite
  1. cout << sqrt(-10) << endl; // ---> nan not a number(无效数字)
  2. // cout << 1/0 << endl; //无输出
  3. // cout << 1.0/0 << endl; //无输出
  4. // cout << 0.0/0.0 << endl; //无输出
  5. printf("%f\n", 1.0/0); // ---> inf infinite(无穷大)
  6. printf("%f\n", 0.0/0); // ---> nan
  7. printf("%f\n", 1/0); // ---> 无输出

2. 输入输出:格式

2.1 scanf

2.1.1 输入格式:理解缓冲区,按要求输入

  • 读懂scanf的要求,然后按要求输入
  • scanf对空格不敏感(除了%c)

具体原因与缓冲区有关,所有内容先存放于缓冲区中,按enter后刷新缓冲区

  1. //要两个整数
  2. scanf("%d %d", &a, &b);
  3. //要一个整数 然后一个,和is bigger than 再要一个整数
  4. scanf("%d , is bigger than %d", &a, &b);
  5. 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. 1 2 3 ... 10 //10个输入
  3. //多种参数
  4. 1 11
  5. 2 22
  6. 3 33
  7. ...
  8. 10 1010 //10个输入

例如:

  1. //输入一个(一次,一个)
  2. scanf(input);
  3. //输入10个(一次多个 or 多次一个)
  4. for(i<10)
  5. scanf(input);
  6. //无限输入(无限次,一个)
  7. while(scanf(input)==...)
  8. //输入1次,每次10个(一次,多个)
  9. for(i<10)
  10. scanf(input);
  11. //输入5次,每次10个(多次,多个)
  12. for(i<5)
  13. for(i<10)
  14. scanf(input);
  15. //无限输入n,每次输入n组(无限次,多个)
  16. while(scanf(n)==1)
  17. for(i<n)
  18. 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>x; i—) > ix (x+1 - 1)
      • for(; i>=x; i—) > ix-1 (x - 1)
    • for的终止条件
    • 能找到,找不到的判断
      • 判断循环结束后i的值
      • 设置状态变量flag
  • 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++; } ```

  • 尽可能缩小变量定义的范围:有的变量可以直接在循环中定义
    • 循环外不使用
    • 循环内和上次的循环无关