zoukankan      html  css  js  c++  java
  • [啃书] 第1篇

    说在前面

    一直想刷算法找不到很适合的书,后来发现考PAT很多推荐《算法笔记》,看了一下挺不错的,因为自己很久没用C了,有些细节忘了,而这本书是从基本写起应该还不错。

    • 基础部分为五章(2~6:C基础/排序/查找/递归/贪心/STL模板库)
    • 提高篇有六章(7~13:栈/队列/链表/树/图/动态规划/hash和KMP)

    先看基础篇吧,也恢复一下写C的手感。

    基础篇内容简单一些但也挺繁杂的,尽量三篇内总结完一章,保证每一篇有一定条理吧。

    最后,主要写给自己看的,方便以后查阅,毕竟不是每时每刻都抱着书的,而且书上很多东西是为了助于理解的,忘了怎么回事再回过去翻书就行了。

    本篇总结自《算法笔记》2.1-2.4

    正文

    知识点1:C中的printf/scanf 和 C++中的cout/cin

    前者较麻烦但耗时短很多,所以本书主要使用C语言来写。

    两者不要同时写,可能会出错。


    知识点2:程序结构

    • 头文件
      • #include<stdio.h>   [输入输出相关]
      • #include<math.h>   [数学函数]
      • #include<string.h>  [字符串相关]
      • C++标准中推荐使用#include<cstdio>、#include<cstring>和#include<cmath>等价写法
    • 主函数
      • int main(){
            int a,b;  //定义整数int型]
            scanf("%d%d", &a, &b); //%d是int的输入输出标识,即使把a,b作为整数输入
            printf("%d", a+b); //同上,把a+b作为整数输出
            return 0;
        }

    保存为.cpp文件,因为C++向下兼容C语言,更通用。


    知识点3:变量的定义

    变量类型 变量名;  [可以赋初值例如 int a = 1;]

    命名要求:不能是C语言标识符,首字符必须是字母或下划线,区分大小写


    知识点4:基本变量类型

    这么多数字简单看看就行了,如何快速应用才是最重要的,见下方。(重点红字部分,其它了解即可)

     1  整型(short/int/long long)%d

    短整型short一般用不到,整型int等价于long int,长整型long long等价于long long int

    整型int:占用32bit=4Byte,应用时记住绝对值在109内可以定义为int型(因为231是十位数);

    长整型long long:占用64bit=8Byte,数字太大不能用整型就用long long,赋初值大于231-1则末尾要加LL;

    补充:unsigned表示无符号型,可加在类型名前面,如unsigned int,范围变为0~232-1。

     2  浮点型(float/double)%f

    单精度float:占用32bit(1+8+23),有效精度6~7位;

    双精度double:占用64bit(1+11+52),有效精度15~16位;

    总结:无脑用double

     3  字符型(char)%c %s

    char是按ASCII码存储的:大写A=65,小写A=97,大小写差23

    char必须是单个字符,必须用单引号标注。

    char定义的是字符变量而不是字符常量。

    字符常量:比如一个字母'c',一个数字5,是无法被改变的,c就是c,5就是5。

    转义字符: 换行;空字符(不是空格)[printf(%d %d, a, b)输出一行a,一行b]

    字符串:char str1[25]="Wo ai de ren bu ai wo"; (因为没有string类型,所以用字符数组存储字符串

    关于string类型:C++有而C中没有,但C也可以%s输入输出字符串。

     4  布尔型

    C++可以直接使用,而C语言需要引入stdbool.h头文件才能使用。

    整形常量赋值给布尔型会自动转换(0变为false,非0都变为true;%d输出布尔型只有0或1)


    知识点5:强制类型转换

    (新类型名)变量名

    应用:浮点数切去小数变整数,整型变成浮点型方便做除法(整数除整数只会产生整数,不会变浮点数)

    注意:赋值给别的变量类型的变量时会自动转换,但计算过程中需要则必须要自己写强制转换。


    知识点6:符号常量和const常量

    #define 标识符 常量;      [#define pi 3.14]

    const 数据类型 变量名 = 常量值;   [const double pi = 3.14]

    补充:define可以定义任何语句或片段,如#define ADD(a,b) ((a)+(b))  【因为要直接替换所以加两层括号,避免替换后先乘除后才加减,所以除了常量尽量少用宏定义】


    知识点7:运算符

    算术运算符:+ - * / % ++ -- 

    关系运算符:< > <= >= == != 

    逻辑运算符:&& || !

    条件运算符:? : (C语言唯一的三目运算符)

    位运算符:<< >> & | ^ ~ (后两个是位异或、位取反。都是双目运算符,两者二进制对齐后运算)

    不多说,这些大部分编程语言都通用的。


    知识点8:scanf函数

    scanf("%d", &n);

    常见的数据类型变量的scanf格式符:

    int %d

    long long %lld

    float %f

    double %lf

    char %c

    char数组/字符串 %s

    取地址符:

    其中变量n在之前定义后,才能存放输入内容,且定义时计算机会为变量n分配内存地址

    &n中的&是取地址运算符,表示得到变量n的内存地址。

    [打个比方:输入时取地址相当于计算机要取到住址(内存地址)在哪,才能把快递(数据)送过来。]

    使用注意:

    除了char数组输入时不用加取地址符,因为数组名等价于数组的首地址,其它都要加。

    输入数据后程序异常退出,检查是否漏写&。

    输入格式自定义:

    scanf("%d:%d:%d", &hh, &mm, &ss);

    上面是一个时间输入格式,输入示例如13:45:20即可把时分秒分别保存到hh,mm,ss三个变量中。

    scanf("%d, %lf, %c", &a, &b, &c);

    上面是多种类型混合输入,输入示例如12, 18.23, t

    scanf("%d%d", &a, &b);

    上面是个常规输入,但对于输入两个数字中间用空格的分开的如“3 4”也可以如此,直接写两个%d不加空格。

    原因是因为scanf对于除了%c外,其他格式符(如%d)的输入是以空白符(空格/Tab)为结束判断标志的,除非使用%c把空格/Tab/换行也读入,否则正常情况下scanf是跳过空格的

    例外:字符数组使用%s读入以空格/换行为读入结束的标志(但是也忽略空格呀)

    scanf("%d%c%s", &a, &c, str);

    上面是一个用%c取空格的例子,输入示例为1 a bcd,并不会取到1和a和bcd,而是1和空格和a。


    知识点9:printf函数

    printf("%d", n);

    区别于scanf,不需要取地址符,直接变量名即可。

    常见数据类型的printf格式符:

    除了double变成了%f,其它与scanf一样。

    转义字符:

    如 可以在引号中使用表示换行,

    要输出或%等本身有意义的符号,则要写两遍,如%%或\写在引号中则输出一个百分号或斜杠。

    三种实用的输出格式

    %md:使不足m位的int型变量以m位进行右对齐输出,其中高位用空格补齐,超过m位保持原样。

    %0md:同上,不过补的不是空格,补0。

    %.mf:让浮点数保留m位小数输出(四舍六入五成双)[许多题会要求精确度,则用该格式输出,若要求四舍五入则要使用round函数,后面讲]


    知识点10:用getchar和putchar输入/输出字符

    在scanf函数使用不便的时候可以用getchar来输入字符。

    getchar会识别空格/Tab/换行符。


    知识点11:typedef

    有用的东东,给复杂的数据类型起一个别名。

    最常用的如typeddef long long LL; 之后申明long long型就可以直接写 LL a = 123456789012345


    知识点12:常用math函数(需引入math.h头文件)

    fabs(double x)  绝对值

    floor(double x)和ceil(double x)  上下取整

    pow(double r, double p)  返回rp

    sqrt(double x)  返回x的算术平方根

    log(double x)  返回x以自然对数e为底的对数 [ 若要其它数为底,则必须使用换底公式logab = logeb/logea ]

    sin(double x)、cos(double x)和tan(double x)  三角函数(参数要求是弧度)[ 弧度 = pi * 角度 / 180 ]

    asin(double x)、acos(double x)和atan(double x)  反三角函数

    round(double x)  四舍五入(也返回double型,需要强制类型转换成int)


    跳过if,switch,while/do...while,for,break/continue,都是大部分编程语言通用的。

    在C/C++需要注意的地方:

    对于C语言,for的条件中不能定义变量,而C++中可以。[所以要保存为.cpp文件,则可以在for条件中定义变量了,如for(int i = 0; i<100; i++)];

    break跳出整个循环,continue跳出本轮循环进入下一轮;

    好了,到这里第二章已经快过半啦,

    下一篇更新数组、函数、指针、结构体第二章就完结了。

    加油。

    《算法笔记》2.1-2.4

  • 相关阅读:
    系统吞吐量(TPS)、用户并发量、性能测试概念和公式
    javascript 匿名函数和闭包
    构建高可扩Web架构和分布式系统实战
    Javascript prototype 的作用
    myeclipse下载地址
    tomacat7.0配置(windows)
    IEEE802.11
    C#(多态)
    C#(泛型集合的使用)
    C#(对象引用)
  • 原文地址:https://www.cnblogs.com/cc1997/p/12943617.html
Copyright © 2011-2022 走看看