啃书部分已单独做成Gitbook了,后续不再更新。详情访问个人网站ccoding.cn或ccbyte.github.io

前言

本篇总结自《算法笔记》2.8-2.10

正文

知识点1:结构体

  1. struct studentInfo {
  2.   int id;
  3.   char gender; //'F' or 'M'
  4.   char name[20];
  5.   char major[20];
  6. }Alice, Bob, stu[1000];//若不在此定义变量大括号外直接跟分号

上面申明名为studentInfo的结构体,同时定义了两个结构体变量(Alice,Bob)和一个结构体数组(stu[1000]),另一种定义方式如下

  1. studentInfo Alice;
  2. studentInfo stu[1000];

知识点2:结构体内部

不能定义自身(会造成循环定义)

可以定义自身类型的指针变量如下

  1. struct node {
  2. node n;
  3. node* next;
  4. }

知识点3:点和箭头(访问结构体内的元素)

  1. struct studentInfo{
  2. int id;
  3. char name[20];
  4. studentInfo* next;
  5. }stu, *p;
  1. stu.id
  2. stu.name
  3. stu.next
  1. p->id //(*p).id
  2. p->name //(*p).name
  3. p->next //(*p).next

这些元素在结构体外可以赋值也可以取值。


知识点4:结构体初始化

方法1 先定义一个studentInfo结构体再逐个给内部元素赋值

方法2 构造函数

  1. struct studentInfo{
      int id;
      char gender;
      studetInfo(int _id, char _gender) { //默认的构造函数是不带参数且无函数内容的
  2.   id = _id;
  3.   gender = _gender;
      }
  4. }

简化版构造函数

  1. studentInfo(int _id, char _gender): id(_id), gender(_gender) {}

用构造函数赋值

  1. studenInfo stu = studentInfo(10086, 'M');

如果自己定义了构造函数覆盖了原来的不带参数无函数内容的默认构造函数,则不能不初始化就定义结构体变量。

所以为了不初始化也可以定义,给上方代码加一行(红字部分)

  1. struct studentInfo{
  2. int id;
  3. char gender;
  4. studentInfo(){} //手动加上被覆盖的默认构造函数,这样可以不初始化就定义结构体变量
  5. studetInfo(int _id, char _gender) { //默认的构造函数是不带参数且无函数内容的
  6.   id = _id;
  7.   gender = _gender;
  8.   }
  9. }

以上代码说明可以有多个构造函数(根据参数个数不同来区分)

应用实例:

结构体存放坐标

知识点5:cin和cout(非必要情况不用[必要情况见第6章string])

属于C++,需要#include<iostream>和using namespace std;

不用指定格式

可连续输入输出(如cin >> n >> db >> c >> str; cout<< n << "hahaha" << db << str)

cout<<endl表示输出换行,也可以像C打印'\n'


知识点6:浮点数比较

现象:计算机采用有限位二进制编码,例如3.14可能存储为3.140000000001或3.139999999999

后果:这种现象导致 "==" 无法判定浮点数是否相等,

解决方法:引入一个极小数(经验表明10-8很合适)来排除误差【只要落在这个去心邻域内即相等】

  1. const double eps = 1e-8

宏定义 浮点数比较方法

  1. #define Equ(a,b) ((fabs((a)-(b))) < (eps)) //差的绝对值小于极小值,返回true

正常情况可以直接用“==”判断;但经过误差较大的运算后,精度损失就不能忽视了,必须用这种方法判断。

同样的对于浮点数之间大于/小于/大于等于/小于等于也要提供类似方法,避免精度损失造成比较异常

  1. #define More(a,b) (((a)-(b)) > (eps)) // a>b,eps理解成0+
  1. #define Less(a,b) (((a)-(b)) < (-eps)) // a<b,eps理解成0-
  1. #define MoreEqu(a,b) (((a)-(b)) > (-eps)) // a>+b,eps理解成0-
  1. #define LessEqu(a,b) (((a)-(b)) < (eps)) // a<=b,eps理解成0+

知识点7:圆周率

const double Pi = acos(-1.0);

汇总以上代码

  1. const double eps = 1e-8
  2. const double Pi = acos(-1.0);
  3.  
  4. #define Equ(a,b) (((a)-(b)) < (eps)) //差的绝对值小于极小值,返回true
  5. #define More(a,b) (((a)-(b)) > (eps)) // a>b,eps理解成0+
  6. #define Less(a,b) (((a)-(b)) < (-eps)) // a<b,eps理解成0-
  7. #define MoreEqu(a,b) (((a)-(b)) > (-eps)) // a>+b,eps理解成0-
  8. #define LessEqu(a,b) (((a)-(b)) < (eps)) // a<=b,eps理解成0+

画个x轴坐标图更便于理解


知识点8:复杂度

时间复杂度

基本运算执行的次数的所处等级【注:基本运算指的是计算机可以直接实现的运算(如加减乘除等)】

循环:2n次和n次一样,都是O(n),嵌套循环n2次,是O(n2)

高阶出现则忽视低阶:如O(3n2+n+2)=O(n2)

二分查找时间复杂度:O(logn)【对数一般不写底数】

对于OJ系统,一秒承载运算次数为107~108

所以规模为1000,复杂度为O(n2) => 运算次数106可以承受

若规模达到100000则不能承受,会返回超时。

空间复杂度

算法需要消耗的最大数据空间

二维数组:O(n2)

限制范围:不开多个超过107以上的数组如int A[10000][10000]

O(1):表示算法所需空间不随规模增大而增大

没要求的话,空间一般够用,所以常采用空间换时间的原则。

编码复杂度

算法思想冗余程度,无量化标准。

知识点9:黑盒测试

系统后台准备若干输入数据提交给程序运行,并检测输出是否符合要求(字符串意义上的比较)。

单点测试(对每组数据都单独测试,PAT采用)

代码只需执行一次,不需循环,对一组数据能完整执行即可得分。【每组都通过加起来就是满分】

多点测试(统一测试,在线测评系统采用)

代码可能要执行多次,需要循环,要求程序能一次运行所有数据,且所有结果都正确才通过

多点测试的三种输入格式

1 while···EOF型

没有给定结束条件,则循环到文件结尾为结束。(黑盒测试准备的输入数据一般都放在文件里)

  1. while(scanf("%d", &n) != EOF) {
  2. ...
  3. }

scanf返回值为其成功读入参数的个数

scanf读入失败时会返回-1也就是EOF(C语言中EOF的值就是-1)

实例:codeup1000

若在黑框框输入数据要触发EOF,则需要Ctrl+z会显示^Z,再回车即可结束输入。

补充:字符串的读入

2 while···break型

当输入的数据满足某个条件时停止输入

第一种写法:在while···EOF中判断,符合条件就break


第二种写法:退出条件直接放到while语句中(与scanf逗号分开)

3 while(T--)型

题目给出所需数据的个数/组数T,先读入个数/组数T,再循环T次读入。

多点测试的三种输出类型

一组数据一行,每组数据间不多空行。(只换行)

一组数据一行,每组数据后还要多空一行。(间隔一行)

一组数据一行,每组数据间还要多空一行,最后一组后面不用多空一行。(间隔一行,除了最后一组)

每次循环后都要重置一下数组(memset或fill),否则上一轮循环用的数据还在里面

[啃书] 第3篇 - 结构体及其操作/浮点数&圆周率/复杂度/测试的更多相关文章

  1. [啃书] 第1篇 - 输入输出/变量类型/math函数

    啃书部分已单独做成Gitbook了,后续不再更新.详情访问个人网站ccoding.cn或ccbyte.github.io 说在前面 一直想刷算法找不到很适合的书,后来发现考PAT很多推荐<算法笔 ...

  2. Swift入门篇-结构体

    前面主要是介绍swift语言中基本类型的用法,今天给大家介绍的是swift的结构体的用法,swift中结构体的用法和其他语言的用法,还有不太一样,不过您多敲几遍,就可以理解结构体,结构体在ios开发中 ...

  3. iOS开发——C篇&结构体与枚举

    一:结构体与枚举的介绍: 结构体与枚举:是一种存储复杂的数据结构体:是用户自定义的一种类型,不同类型的集合,而数组是相同类型变量的集合. 二:结构体的创建 struct user {     char ...

  4. go语言之进阶篇结构体指针类型匿名字段

    1.结构体指针类型匿名字段 示例: package main import "fmt" type Person struct { name string //名字 sex byte ...

  5. C语言结构体篇 结构体

    在描述一个物体的属性的时候,单一的变量类型是无法完全描述完全的.所以有了灵活的结构体变量. 结构体变量从意义上来讲是不同数据类型的组合,从内存上来讲是在一个空间内进行不同的大小划分. 1.1 结构体类 ...

  6. Runtime机制之结构体及操作函数

    一.动态语言 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:具有灵活性,比如:消息转发,方法交换等.它有一个运行时系统Ob ...

  7. C++线性表通过结构体实现操作和结构体字符串快速排序和shell排序结合

    #include<iostream> #include<string> #define ml 10 using namespace std; typedef struct{// ...

  8. 嵌入式-C语言:通过结构体指针操作结构体内容

    #include<stdio.h> #include<string.h> struct Student { char name[32]; int age; int height ...

  9. C语言结构体的强制类型转换

    陈浩师兄03年的一篇博客<用C写有面向对象特点的程序>描述了用C语言来实现类似C++类继承的方法,这样方法的核心要点就是结构体的强制类型转换,让我来简单分析分析C语言中的结构体强制类型转换 ...

随机推荐

  1. 关于panic ,主协程的recover 是无法获取 子协程的panic 的

    一.子协程的panic,只能在子协程中处理 下面的代码,main 函数 无法获取panic package main import ( "fmt" "time" ...

  2. CF1375F-Integer Game【交互】

    正题 题目链接:https://www.luogu.com.cn/problem/CF1375F 题目大意 给出\(a,b,c\).先手每次指定一个数\(k\),然后后手指定一个数字加上\(k\),若 ...

  3. WPF进阶技巧和实战03-控件(5-列表、树、网格01)

    列表控件 ItemsControl为列表项控件定义了基本功能,下图是ItemsControl的继承关系: 在继承自ItemsControl类的层次结构中,还显示了项封装器(MenuItem.TreeV ...

  4. 深入浅出WPF-03.XAML语法

    2 XAML语法 树形结构,我们将整个XAML的结构想象成一棵树,我们从树的顶部向下看,形成俯视图.最上面的叶子节点会覆盖父节点,同级的子节点,后面的(也就是树的最上面)会覆盖前面的.覆盖包含了形状( ...

  5. Spring,IOC源码分析

    有错勿喷 1.首先是Spring,IOC的基本概念 IOC是一个容器 容器启动的时候创建所有单实例对象 我们可以直接从容器中获取到这个对象 2.调试流程 ioc容器的启动过程?启动期间都做了什么(什么 ...

  6. 自然语言处理标注工具——Brat(安装、测试、使用)

    一.Brat标注工具安装 1.安装条件: (1)运行于Linux系统(window系统下虚拟机内linux系统安装也可以) (2)目前brat最新版本(v1.3p1)仅支持python2版本运行使用( ...

  7. Python简单爬取图书信息及入库

    课堂上老师布置了一个作业,如下图所示: 就是简单写一个借书系统. 大概想了一下流程,登录-->验证登录信息-->登录成功跳转借书界面-->可查看自己的借阅书籍以及数量... 登录可以 ...

  8. L1-023 输出GPLT (20 分) java题解 GPLT天梯赛防坑技巧

    上题目先 给定一个长度不超过10000的.仅由英文字母构成的字符串.请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符.当然,四种字符(不区分大小写)的个数不一定是一样多的 ...

  9. Java(44)JDK新特性之函数式接口

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201667.html 博客主页:https://www.cnblogs.com/testero ...

  10. PHP伪协议与文件包含漏洞1

    PHP文件包含漏洞花样繁多,需配合代码审计. 看能否使用这类漏洞时,主要看: (1)代码中是否有include(),且参数可控: 如: (2)php.ini设置:确保 allow_url_fopen= ...