zoukankan      html  css  js  c++  java
  • 菜鸡学C语言之知识点简单整理

    1. 整型注意范围,浮点型注意精度。

    • 注意int的数据范围,做题时有个大致的估计,int满足不了时用long long

       int类型数据范围 (-2^31)~(2^31-1),即-21474 83648-21474 83647,

       10^9数量级;12!<int最大值<13

    • 注意double的精度,通常情况下涉及到浮点数的题我们定义double比定义float更准确,因为浮点数精度更高。另外注意,浮点数在计算机中的存储通常不是准确的,会用或多或少的误差。因此,判断浮点数是否相等时,通常用fabs(a-b)<eps,即两个数的大小不超过某个范围即可认为相等,eps是人为给定的一个精度,通常设置为1e-6或1e-8均可

    2. scanf读入。

    scanf的用法不熟的同学好好看书,非常基础!

    • 读入整数,scanf(“%d”, &a);
    • 读入两个整数,scanf(“%d%d”, &a, &b);两个%d之间没有加任何东西会跳过中间的空白字符,在控制台输入时通过空格或者回车分隔均可。当然,这个地方你写作scanf(“%d %d”, &a, &b),即在两个%d之间加空格,控制台输入时也会跳过中间所有的空白符。一般我们正常写作scanf(“%d%d”, &a, &b)即可。
    • 读入中间用某个特定符号分割的字符,以“:”为例

       scanf(“%d:%d”, &h, &m);我们在控制台输入时只能通过“:”分割,即英文冒号。此时不能通过空格分隔

    • 多组数据输入。

       写作while(scanf(“”) != EOF)或者while(~scanf(“”))都是可以的。

       多组数据输入的题,我们只需要在每次输入时输出对应的答案就可以了,不要存到最后一起输出,费力不讨好。

    3. 字符(串)读入。

    • getchar和scanf(“%c”, &c)是一致的,都是读入某个字符,注意他会读入所有字符,包括空格回车等等。getchar同学们可能用不好,所以在能通过scanf(“%s”)读入字符串时不需要使用getchar用法。
    • scanf(“%s”, s)读入字符串,但不能读入包含空格的字符串,即遇到空格时读入会停下来,空格不会被读入字符串中。
    • gets(s)用于读入一行字符串,它可以读入包含空格的字符串。

    4. 与输入相对的是输出。

    最常用的输出是printf。应该在我们的考试中涉及到的输出printf足够了,所以先简单介绍下另外两种,不需要掌握。

    • 与gets相对应的为puts,即输出一行;
    • 与getchar相对应的是putchar,即输出一个字符。

    printf涉及到许多输出格式,要求熟练掌握。

    • 输出整数的八进制形式:printf(“%o”, num);
    • 输出整数的十六进制形式:printf(“%x”, num);或者printf(“%X”, num)。其中X代表10-15用大写字母A-F表示,x代表10-15用小写字母a-f表示。
    • 输出整数的二进制形式,这个需要自己写嘻嘻嘻
    • 实际上,我们上面说的printf的输出格式在scanf输入格式中同样适用。比如通过scanf(“%o”, &num)读入一个八进制整数,通过scanf(“%x”, &num)可以读入16进制整数,这个在之前大家没有注意到的话也注意下。
    • 私以为,scanf掌握基本的读入方式足够了,但printf需要多掌握些(其实scanf和printf可以对比着来,他们用法类似),接下来多说些printf用法。

      printf的输出格式

    %[flags][width][.prec][l]type

    • 中括号中的内容可以没有,即必须要有的是%和type
    • type代表了输出类型,上面已经提到。
    1. d,整数
    2. u,正整数
    3. o,八进制数
    4. x或者X,16进制数
    5. f,浮点数
    6. e或者E,科学计算法表示形式
    7. c,字符
    8. s,字符串
    9. %,输出百分号(即%%)
    • flags控制符的含义。
    1. -,数值左对齐,缺省的话默认右对齐
    2. +,在数值前加正好或者负号,即把这个数的符号输出出来
    3. 空格或其他字符,不足位数补此字符。
    • width控制符的含义。
    1. 一个数字,代表输出字段长度。不足默认补空格,超过则正常输出
    • prec控制符的含义。
    1. 一个数字,代表输出的浮点数的小数位数。
    2. 一个数字,代表输出字符串时截取的字符串的宽度
    • l控制符的含义。
    1. 有l则代表这是一个长整数类型
    • *是指通过参数来输出对应的位宽数据。

       e.g. int width = 10; printf(“%*d”, width, result);即以10个字符的宽度输出result数据

    结合示例理解下上面,考试不会这么难,大家可以自己课下尝试,示例:输出字符串”hello, world”(共12个字符),两个冒号间为输出的数据。

    • “%10s”                  :hello, world:
    • “%-10s”                 :hello, world:
    • “%20s”                  :         hello, world:
    • “%-20s”                 :hello, world        :
    • “%20.10s”              :           hello, wor:
    • “%-20.10s”            :hello, wor           :
    • “%.10s”                  :hello, wor:

    5. define的易错点

    巧用define可以增强代码的可读性,但要注意define是无条件替换,只是单纯的代入!

    e.g.

    • #define fun(a) a*a,那么程序中fun(1+2)等于5而不是9。

      原因:fun(1+2) = 1 + 2 * 1 + 2 = 5,替换后程序不会自己为你加入括号

    • #define fun(a) (a)*(a),那么此时fun(1+2)就等于9了。

      原因:fun(1+2) = (1 + 2) * ( 1 + 2) = 9

    • 当然,上面举例的define定义完全可以换成一个自定义函数,即
    int fun(a) { return a * a;}

    这时就不会出现上面我们说的define定义出现的问题了。

    6. 快排的写法。

    首先说明,快排并不是最快的排序方法,也不是说所有一般排序如冒泡排序超时的题换为快排一定能通过,它也有极限情况会使得效率降到很低。但通常情况下,快排写法并不难而且效率可以让人满意。

    1. 引入头文件#include <stdlib.h>
    2. 定义比较函数
    int cmp(const void *a, const void *b) {
            return *(int *) a - *(int *b);
    }
    int cmp(const void *a, const void *b) {
             if (*(int *)a > *(int *)b) return 1;
             if (*(int *)b > *(int *)a) return -1;
             return 0;
    }

      上面的函数能起到比较的作用,但在int边界值会有问题,这个可以思考下。所以,我们建议下面这种写法。另外,将上述1和-1的位置交换即可起到从大到小和从小到大两种排序效果。

      3. 程序中引用。

      qsort(a, n, sizeof(a[0]), cmp);

      第一个参数为函数名(地址), 第二个参数为要排序的数组元素个数,第三个参数为一个数组元素的大小,第四个参数为我们上面定义的比较函数的函数名。

    上面三个步骤即可完成整数数组的排序。那么下面介绍浮点数的快排写法,其实很简单,只需要更改我们自己定义的函数。

    int cmp(const void *a, const void *b) {
           if (*(double *)a > *(double *)b)   return 1;
           if (*(double *)a < *(double *)b)   return -1;
           return 0;
    }

    7. 一些基础知识。

    • 全局变量会默认初始化为0,局部变量一定要记得赋初值,否则甚至可能出现无可复现的bug。
    • 数组大小一定要开够,而且必须直接声明定长数组,不能声明变长数组,即在声明时指定数组大小。(malloc函数可以对数组大小进行扩容,但我们现在应该用不到)
    • 注意运算符的优先级。当优先级不确定时加括号就好了,不要自己找麻烦。
    • 字符串结束标识为’’,即通过scanf(“%s”, s)读入时最后一位是’’。因此,需要注意字符数组定义时数组的大小,如char s[5] = “hello”是错误的,会数组越界。另外,’’作为字符串结束标志,当我们通过char s[5]; s[0]= 1; s[1] = ‘’;手动加入’’后,s数组即可认为存储一个字符串,即我们可以通过printf(“%s”, s)的方式输出。
    • 不要犯些多加分号、少加分号或取地址符之类的低级错误。
    • 善于使用printf分步调试(滑稽)找出自己程序的bug。

    写在最后:

    • 大家要对自己有信心,考试时不要慌张,这几天抓紧备考。看课件和课本巩固基础知识,写代码培养手感。(不会还不理解的抄在书上,反正考试可以带书)
    • 不懂的知识不要等,百度!!!不懂就问,不懂就查!
    • 周三时考试,不是上机,以拿分为主要目的,不要一直被一道题卡住,一道题拿到90分后一个点过不去也不要太过于纠结,想不出来就下一道题好了!
    • 祝大家取得好成绩!
  • 相关阅读:
    Help-IntelliJIDEA-2019.3.4-基础设置:6. 开启自动编译
    Help-IntelliJIDEA-2019.3.4-基础设置:5.Tomcat Server
    Help-IntelliJIDEA-2019.3.4-基础设置:4.自动导包和智能移除 (默认配置)
    Help-IntelliJIDEA-2019.3.4-基础设置:3. 版本控制Git
    Help-IntelliJIDEA-2019.3.4-基础设置:2. 全局Maven(默认配置)
    Help-IntelliJIDEA-2019.3.4-基础设置:1. 全局JDK(默认配置)
    Help-IntelliJIDEA-2019.3.4:IntelliJ IDEA 使用教程
    汉语-词语:笃行
    去除某个元素的属性
    select选中
  • 原文地址:https://www.cnblogs.com/flying-rabbit/p/10880195.html
Copyright © 2011-2022 走看看