C\C++知识回顾,浮点比较、数组、指针、结构体以及多点测试输入没有给定结束条件

浮点数的比较,可能是个坑,因为存在误差的存在,可以下列方式解决

  • const double Pi = acos(-1.0) // 顺带提一下圆周率pi的定义
    const double eps = 1e-8;
    #define Equ(a, b) (fabs((a) - (b)) < (eps)) // ab相等返回true
    #define More(a, b) (((a) - (b)) > (eps)) // a大于b返回true
    #define Less(a, b) (((a) - (b)) < (-eps)) // a小于b返回true
    #define MoreEqu(a, b) (((a) - (b)) > (-eps)) // a大于等于b返回true
    #define LessEqu(a, b) (((a) - (b)) < (eps)) // a小于等于b返回true

数组

  • 数组作为函数参数时,对数组中的元素进行修改就等同于对原数组进行了修改
    void fun(int a[], int b[][5]) {}; 作为参数时,一维数组第一维不需要填写长度(二维数组第二维不用填写长度)
    数组不能做返回类型

指针

  • 指针定义:int *p1, *p2, *p3 = &a;
    int *p = &a; p = &a; // p是a的地址,*p是a的内容
    所以在传值的时候,可以将变量的地址传过去(如下):
    定义:void fun(int *a){}; 使用:fun(&b) 这样就将b地址传过去了,或者下面这样
    定义:void fun(int &a){}; 使用:fun(b) 这样叫引用(这里的&是引用、取别名,不是取地址),给变量b起一个别名a,但他们的地址是相同的
    int a = 1; a是常量还是变量? a的地址(&a)是常量、不变的,a的内容是变量、是可以赋值的;所以a是变量

结构体

  • struct studentInfo {
    int id; // 内部除了自己(studentInfo A;)其余的数据类型都可以定义
    studentInfo *next; // 如:这里定义自身类型的指针变量
    }A, B, stu[10]; // 可以在定义结构体的时候,直接定义表示这个结构体的变量或指针,和放在其他地方没区别
    studentInfo A, B, stu[10]; // 这里就是在其他地方定义,没有区别

  • 结构体的访问一般有两种方式,普通变量用’.’,指针变量用’->’
    studentInfo a, *p; (访问方式:a.next, p->next)

  • 结构体初始化,可以定义结构体变量之后,逐一对内部成员赋值,此外还可以在结构体内写构造函数
    struct studentInfo {

    studentInfo(){} // 默认的构造函数
    studentInfo(int a){} // 可以自定义多个构造函数
    studentInfo(int a, int b){}
    };

多点测试,数据输入问题

  • 没有给定结束条件,默认读到文件尾:
    对scanf来说如果读入2个数据,会返回2,没有读到数据返回-1,C语言中用EOF来代表-1
    while(scanf("%d", &n) != EOF) {}
    如果读入的是字符串,可以这么写:
    while(scanf("%s", str) != EOF) {}
    while(gets(str) != NULL) {}

参考:《算法笔记》

发布了107 篇原创文章 · 获赞 61 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/y_dd6011/article/details/104630152
今日推荐