[啃书] 第3篇 - 结构体及其操作/浮点数&圆周率/复杂度/测试
啃书部分已单独做成Gitbook了,后续不再更新。详情访问个人网站ccoding.cn或ccbyte.github.io
前言
本篇总结自《算法笔记》2.8-2.10
正文
知识点1:结构体
struct studentInfo {
int id;
char gender; //'F' or 'M'
char name[20];
char major[20];
}Alice, Bob, stu[1000];//若不在此定义变量大括号外直接跟分号
上面申明名为studentInfo的结构体,同时定义了两个结构体变量(Alice,Bob)和一个结构体数组(stu[1000]),另一种定义方式如下
studentInfo Alice;
studentInfo stu[1000];
知识点2:结构体内部
不能定义自身(会造成循环定义)
可以定义自身类型的指针变量如下
struct node {
node n;
node* next;
}
知识点3:点和箭头(访问结构体内的元素)
struct studentInfo{
int id;
char name[20];
studentInfo* next;
}stu, *p;
stu.id
stu.name
stu.next
p->id //(*p).id
p->name //(*p).name
p->next //(*p).next
这些元素在结构体外可以赋值也可以取值。
知识点4:结构体初始化
方法1 先定义一个studentInfo结构体再逐个给内部元素赋值
方法2 构造函数
struct studentInfo{
int id;
char gender;
studetInfo(int _id, char _gender) { //默认的构造函数是不带参数且无函数内容的
id = _id;
gender = _gender;
}
}
简化版构造函数
studentInfo(int _id, char _gender): id(_id), gender(_gender) {}
用构造函数赋值
studenInfo stu = studentInfo(10086, 'M');
如果自己定义了构造函数覆盖了原来的不带参数无函数内容的默认构造函数,则不能不初始化就定义结构体变量。
所以为了不初始化也可以定义,给上方代码加一行(红字部分)
struct studentInfo{
int id;
char gender;
studentInfo(){} //手动加上被覆盖的默认构造函数,这样可以不初始化就定义结构体变量
studetInfo(int _id, char _gender) { //默认的构造函数是不带参数且无函数内容的
id = _id;
gender = _gender;
}
}
以上代码说明可以有多个构造函数(根据参数个数不同来区分)
应用实例:
知识点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很合适)来排除误差【只要落在这个去心邻域内即相等】
const double eps = 1e-8
宏定义 浮点数比较方法
#define Equ(a,b) ((fabs((a)-(b))) < (eps)) //差的绝对值小于极小值,返回true
正常情况可以直接用“==”判断;但经过误差较大的运算后,精度损失就不能忽视了,必须用这种方法判断。
同样的对于浮点数之间大于/小于/大于等于/小于等于也要提供类似方法,避免精度损失造成比较异常
#define More(a,b) (((a)-(b)) > (eps)) // a>b,eps理解成0+
#define Less(a,b) (((a)-(b)) < (-eps)) // a<b,eps理解成0-
#define MoreEqu(a,b) (((a)-(b)) > (-eps)) // a>+b,eps理解成0-
#define LessEqu(a,b) (((a)-(b)) < (eps)) // a<=b,eps理解成0+
知识点7:圆周率
const double Pi = acos(-1.0);
汇总以上代码
const double eps = 1e-8
const double Pi = acos(-1.0); #define Equ(a,b) (((a)-(b)) < (eps)) //差的绝对值小于极小值,返回true
#define More(a,b) (((a)-(b)) > (eps)) // a>b,eps理解成0+
#define Less(a,b) (((a)-(b)) < (-eps)) // a<b,eps理解成0-
#define MoreEqu(a,b) (((a)-(b)) > (-eps)) // a>+b,eps理解成0-
#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型
没有给定结束条件,则循环到文件结尾为结束。(黑盒测试准备的输入数据一般都放在文件里)
while(scanf("%d", &n) != EOF) {
...
}
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篇 - 输入输出/变量类型/math函数
啃书部分已单独做成Gitbook了,后续不再更新.详情访问个人网站ccoding.cn或ccbyte.github.io 说在前面 一直想刷算法找不到很适合的书,后来发现考PAT很多推荐<算法笔 ...
- Swift入门篇-结构体
前面主要是介绍swift语言中基本类型的用法,今天给大家介绍的是swift的结构体的用法,swift中结构体的用法和其他语言的用法,还有不太一样,不过您多敲几遍,就可以理解结构体,结构体在ios开发中 ...
- iOS开发——C篇&结构体与枚举
一:结构体与枚举的介绍: 结构体与枚举:是一种存储复杂的数据结构体:是用户自定义的一种类型,不同类型的集合,而数组是相同类型变量的集合. 二:结构体的创建 struct user { char ...
- go语言之进阶篇结构体指针类型匿名字段
1.结构体指针类型匿名字段 示例: package main import "fmt" type Person struct { name string //名字 sex byte ...
- C语言结构体篇 结构体
在描述一个物体的属性的时候,单一的变量类型是无法完全描述完全的.所以有了灵活的结构体变量. 结构体变量从意义上来讲是不同数据类型的组合,从内存上来讲是在一个空间内进行不同的大小划分. 1.1 结构体类 ...
- Runtime机制之结构体及操作函数
一.动态语言 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:具有灵活性,比如:消息转发,方法交换等.它有一个运行时系统Ob ...
- C++线性表通过结构体实现操作和结构体字符串快速排序和shell排序结合
#include<iostream> #include<string> #define ml 10 using namespace std; typedef struct{// ...
- 嵌入式-C语言:通过结构体指针操作结构体内容
#include<stdio.h> #include<string.h> struct Student { char name[32]; int age; int height ...
- C语言结构体的强制类型转换
陈浩师兄03年的一篇博客<用C写有面向对象特点的程序>描述了用C语言来实现类似C++类继承的方法,这样方法的核心要点就是结构体的强制类型转换,让我来简单分析分析C语言中的结构体强制类型转换 ...
随机推荐
- 三款超实用,好用的Python开发IDE推荐,看完总会有一款合适你的
@ 目录 前言 IDE介绍 Sublime Pycharm(推荐使用社区版免费版) visualstudio 倒底怎么选择 前言 一款好的代码编辑工具,让你学习事半功能,那今天就来看看我们学Pytho ...
- 一篇文章告诉你Python接口自动化测试中读取Text,Excel,Yaml文件的方法
前言 不管是做Ui自动化和接口自动,代码和数据要分离,会用到Text,Excel,Yaml.今天讲讲如何读取文件数据 Python也可以读取ini文件,传送门 记住一点:测试的数据是不能写死在代码里面 ...
- Cnblogs 主题设置
https://www.cnblogs.com/enjoy233/p/cnblogs-markdown-code-display-opt.html 复制: 右上角添加复制按钮:https://www. ...
- Qt和JavaScript使用QWebChannel交互一——和Qt内嵌网页交互
Qt和JavaScript使用QWebChannel交互一--和Qt内嵌网页交互 目录 Qt和JavaScript使用QWebChannel交互一--和Qt内嵌网页交互 前言 一.效果 二.实现过程 ...
- kubelet源码分析——监控Pod变更
前言 前文介绍Pod无论是启动时还是关闭时,处理是由kubelet的主循环syncLoop开始执行逻辑,而syncLoop的入参是一条传递变更Pod的通道,显然syncLoop往后的逻辑属于消费者一方 ...
- Docker里面没有你期望的命令、甚至没有yum怎么办?
分享小知识点 跟大家分享一个实用的小知识点 有时候在docker容器里面不仅没有你期望的那些常用的命令,甚至没有yum命令让你去安装那些常用的命令 怎么办呢?不要慌! 没有yum命令说明这个容器的系统 ...
- docker - compose 部署 Nginx
主要介绍 docker 中 Nginx 的部署及项目目录挂载券的方法.docker 中部署一个服务,有三种方法,分别是 docker run.Dockerfile.docker-compose . 下 ...
- 11.4.1 LVS-DR
Virtual Server via Direct Routing(VS-DR): 用直接路由技术实现虚拟服务器。当参与集群的计算机和作为控制管理的计算机在同一个网段时可以用此方法,控制管理的计算机接 ...
- 题解 CF736D Permutations
link Description 现在,你有一个二分图,点数为 \(2n\). 已知这个二分图的完备匹配的个数是奇数. 现在你要知道,删除每条边后,完备匹配个数是奇数还是偶数. \(1\le n\le ...
- CAD_DWG图Web可视化一站式解决方案-唯杰地图-vjmap
背景 DWG图是AutoCAD是私有格式,只能在CAD软件上编辑查看,如何发布至Web上做数据展示,GIS分析应用开发,一直是业内头疼的事情. 传统的办法采用的解析AutoCAD图形绘制,并封装成Ac ...