-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
399 lines (212 loc) · 181 KB
/
atom.xml
File metadata and controls
399 lines (212 loc) · 181 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>青岛科技大学信息学院科技创新协会</title>
<link href="http://qustkx.com/atom.xml" rel="self"/>
<link href="http://qustkx.com/"/>
<updated>2020-08-16T04:01:01.811Z</updated>
<id>http://qustkx.com/</id>
<author>
<name>QUST-Coder</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>第二届“科协之星”软件设计大赛比赛赛题</title>
<link href="http://qustkx.com/2020/08/16/kxstar/"/>
<id>http://qustkx.com/2020/08/16/kxstar/</id>
<published>2020-08-16T02:52:51.000Z</published>
<updated>2020-08-16T04:01:01.811Z</updated>
<content type="html"><![CDATA[<h1 id="“科协之星”软件设计大赛-赛题"><a href="#“科协之星”软件设计大赛-赛题" class="headerlink" title="“科协之星”软件设计大赛 赛题"></a>“科协之星”软件设计大赛 赛题</h1><h2 id="一、整体说明"><a href="#一、整体说明" class="headerlink" title="一、整体说明"></a>一、整体说明</h2><h3 id="1-题目介绍"><a href="#1-题目介绍" class="headerlink" title="1.题目介绍"></a>1.题目介绍</h3><p>  为了照顾不同年级的学生,本次竞赛选取了三个当下热点软件工程题目。赛题 A 鼓励 学生使用自己所学的Web技术编写、搭建自己的博客;赛题 B 从选课的角度入手让学生理 解高并发场景的后端开发及部署考量;赛题 C 鼓励学生尝试将精力投入基础软件工程,了解数据库相关基础知识,动手实现拥有一定并发考量的键/值数据存储。<br>  三个赛题难度依次增加,我们期望高年级学生尝试后两个赛题。值得注意的是,选取难度高的赛题更有可能有更少的竞争对手和更高的分数,但也会面临更大的挑战。<br>  每个赛题都对基本需求、加分项及附加规则做了详细说明。基本需求被视为必须完成的部分,若选手的项目不满足基本需求将可能导致无法通过初赛;加分项是复赛评定的关键,选手可以酌情选择其中的一项到几项完成,以提高项目价值;附加规则可能指出了选手不应违反的条目,不满足规则的选手可能将被取消参赛资格</p><h3 id="2-基本要求"><a href="#2-基本要求" class="headerlink" title="2.基本要求"></a>2.基本要求</h3><p>  任何被发现抄袭或未加说明地直接使用开源代码的选手将被取消评奖资格。我们希望选手明确地指出自己的项目使用了哪些依赖项及开源代码。我们将酌情采用查重技术以反作弊。当然,我们也希望选手能够借助现有的开源框架、技术完成自己的项目。<br>  我们希望参赛选手能够重视对于版本控制系统的使用,能够使用版本控制系统(Git)正常的进行团队协作,并利用代码托管服务(Gitea)的项目管理功能将是一项重要的要求以及 团队协作方面的加分点。<br>  赛题均不限制语言、框架、技术架构,但应充分考虑计算资源与用户使用体验。禁止任何参赛选手以大赛名义对其他生产环境系统实行非法操作。 </p><h3 id="3-评定规则"><a href="#3-评定规则" class="headerlink" title="3.评定规则"></a>3.评定规则</h3><p>  我们邀请了当前在业界大厂、高校读研及大四的众多学长学姐参与平定,每个赛题都给出了特定的评定分项及占比,选手可以参考。<br>  我们希望参赛选手能够主动将项目的完成度及亮点在项目说明中表述出来,以方便评定。当然,评定人员将会实际审查、测试被列举出的亮点</p><h2 id="二、赛题-A:个人博客"><a href="#二、赛题-A:个人博客" class="headerlink" title="二、赛题 A:个人博客"></a>二、赛题 A:个人博客</h2><h3 id="1-赛题背景"><a href="#1-赛题背景" class="headerlink" title="1. 赛题背景"></a>1. 赛题背景</h3><p>  个人博客能够把自己的想法和知识公开在互联网上分享给他人,比起微博、微信朋友圈等平台,博客能够更整体化、专业化地表述自己的观点。程序员尤其喜欢编写一个自己的博客平台以分享编程知识,传播灵感。所以,你是程序员吗?</p><h3 id="2-基本需求"><a href="#2-基本需求" class="headerlink" title="2. 基本需求"></a>2. 基本需求</h3><ol><li>文章展示:前端能够展示文章,游客能够评论文章</li><li>后台管理:提供登录功能,登录后能够管理文章,如增加、编辑、删除文章</li></ol><h3 id="3-加分项"><a href="#3-加分项" class="headerlink" title="3. 加分项"></a>3. 加分项</h3><ol><li>更好的后台:能够管理游客的评论,如删除评论、禁止再次评论等;在编辑文章时能够给出更好的环境,如拥有可视化编辑器,或是支持 markdown 格式的文章;能够提供用户注册功能,并提供对注册用户的权限分配</li><li>更好的前端:在前台给出搜索功能,能够根据文章的内容搜索文章;或是提供对文章进行分类查看的功能。</li><li>安全:保障网站不容易被攻击,如不能被 sql 注入等</li><li>并发:有一定的并发能力,可以同时接受多个游客的访问</li><li>恶意用户:能够防止恶意注册请求;能够防止恶意评论,如不断刷评论等</li><li>现代化前端:能够使用现代化的前端框架,如React/Vue进行前端设计</li><li>前后端分离:能够分离前后端的逻辑</li></ol><h3 id="4-评分规则"><a href="#4-评分规则" class="headerlink" title="4. 评分规则"></a>4. 评分规则</h3><p>  项目完成度、可用性 30%<br>  代码规范性、开发流程规范性 20%<br>  功能丰富度与实现难度、亮点 30%<br>  前端整体观感及易用性 10%<br>  其他能体现技术价值的内容 10%</p><h2 id="三、赛题B:选课系统"><a href="#三、赛题B:选课系统" class="headerlink" title="三、赛题B:选课系统"></a>三、赛题B:选课系统</h2><h3 id="1-赛题背景-1"><a href="#1-赛题背景-1" class="headerlink" title="1. 赛题背景"></a>1. 赛题背景</h3><p>  你是否遇到过线上选课系统卡顿,请求失败或种种原因无法正常参与的情况?是否想亲手设计并编写一套选课系统来体会一下高并发的险恶?是否原意看到自己亲手写的系统能扛住大量的并发请求?来吧,给你时间和资源,和你的队友一起亲手创造一个奇迹。</p><h3 id="2-基本需求-1"><a href="#2-基本需求-1" class="headerlink" title="2. 基本需求"></a>2. 基本需求</h3><ol><li>用户管理:能够提供用户注册、登录等功能,并酌情提供用户级别划分</li><li>选课逻辑:学生用户能够选课、退课、查看可选课程及课程详情等;管理员能够添加、删除课程、编辑课程详情等</li><li>并发能力:在多个用户在同一时间段参与选课时,系统能够正常处理</li><li>规则校验:例如学生用户选课个数限制,分专业限制门类,总学分限制,管理员能够限制课程总可选人数等</li></ol><h3 id="3-加分项-1"><a href="#3-加分项-1" class="headerlink" title="3. 加分项"></a>3. 加分项</h3><ol><li>优秀的反作弊,反恶意请求方案</li><li>优秀的降级、限流、熔断方案</li><li>优秀的风控方案</li><li>恰当的缓存使用</li><li>其他缓解系统压力的方案</li></ol><h3 id="4-附加规定"><a href="#4-附加规定" class="headerlink" title="4. 附加规定"></a>4. 附加规定</h3><p>  本赛题将限制基础计算资源环境,计算资源要求如下,建议团队自主测试阶段使用如下要求:</p><blockquote><p>实例名称:阿里云ECS抢占式/按量计费/包年包月实例<br>实例规格:ecs.g5.large<br>vCPU:2vCPU<br>内存:8GiB<br>处理器主频/睿聘:2.5 GHz/2.7 GHz<br>内网带宽:1Gbps<br>内网收发包:30 万PPS<br>处理器型号:Intel Xeon(Skylake) Platinum 8163 / Intel Xeon(Cascade Lake) Platinum 8269CY</p></blockquote><h3 id="5-评分规则"><a href="#5-评分规则" class="headerlink" title="5. 评分规则"></a>5. 评分规则</h3><p>  项目完成度、可用性 30%<br>  代码规范性、开发流程规范性 20%<br>  压力测试结果 15%<br>  功能丰富度与实现难度,亮点 30%<br>  其他能体现技术价值的内容 5%</p><h2 id="四、赛题C:键-值数据存储"><a href="#四、赛题C:键-值数据存储" class="headerlink" title="四、赛题C:键/值数据存储"></a>四、赛题C:键/值数据存储</h2><h3 id="1-赛题背景-2"><a href="#1-赛题背景-2" class="headerlink" title="1. 赛题背景"></a>1. 赛题背景</h3><p>  数据库可能是最复杂的应用程序之一。实现一个数据库过程中,几乎需要用到我们大学期间所学的所有知识点。虽然听起来非常恐怖,但实际上,要实现一个简单的demo并不复杂。从招聘的角度来讲,面试官也更喜欢有动手实现一些复杂项目经历的同学。<br>  现在,让我们整合一下头脑中的知识,来实现一个基于内存的简单Key-Value存储系统。</p><h3 id="2-基本需求-2"><a href="#2-基本需求-2" class="headerlink" title="2. 基本需求"></a>2. 基本需求</h3><p>实现一个缓存服务,具有以下能力:</p><ol><li>提供基本的key-value存储能力</li><li>实现get/set/del接口,提供对数据进行查找/赋值/删除的基本能力</li><li>具有良好的并发能力,可以正确地同时处理多个请求</li></ol><h3 id="3-加分项-2"><a href="#3-加分项-2" class="headerlink" title="3. 加分项"></a>3. 加分项</h3><ol><li>实现find接口,提供对key按前缀进行搜索的能力</li><li>支持储存除字符串外的更复杂的数据结构</li><li>支持数据写入时配置超时时间,cache可自动清理超时数据</li><li>支持数据淘汰能力,当数据总量超过配置的数量时,可按LRU规则进行淘汰</li><li>支持数据落地,落地方案自选,建议通过MySQL/文件进行落地</li><li>支持热备份能力,主备机数据同步,故障时主备支持热切换</li><li>支持分布式部署,节点数量可动态调整</li><li>其他能够体现技术能力的内容</li></ol><h3 id="4-附加规定-1"><a href="#4-附加规定-1" class="headerlink" title="4. 附加规定"></a>4. 附加规定</h3><ol><li>为降低实现难度,附加题中各功能均不要求实时落盘和强一致性,仅要求保证最终一致性。</li><li>本题目中所要求实现的的所有接口,以及附加功能,均要求提供HTTP协议封装,以符合附录中要求的形式进行暴露,供标准测试工具调用。</li></ol><h3 id="5-评分规则-1"><a href="#5-评分规则-1" class="headerlink" title="5. 评分规则"></a>5. 评分规则</h3><p>  项目完成度、可用性 30%<br>  代码规范性、开发流程规范性 20%<br>  压力测试结果[1] 15%<br>  功能丰富度与实现难度,亮点 30%<br>  其他能体现技术价值的内容 5%</p><p>[1] 压力测试结果:评委会提供标准测试程序以及标准例程一份,以标准例程性能为基准<br>● 在标准配置(1C1G)下,性能达到标准例程80%以上的,得满分;<br>● 80%以下,但高于基准性能的,按(分数/标准分数)×满分的公式进行计算,结果取整;<br>● 无法达到基准性能的,得0分</p><h3 id="6-附录"><a href="#6-附录" class="headerlink" title="6. 附录"></a>6. 附录</h3><ol><li>接口文档要求</li><li>标准程序</li><li>跑分程序</li></ol><h2 id="比赛官方群"><a href="#比赛官方群" class="headerlink" title="比赛官方群"></a>比赛官方群</h2> <img src="https://i.loli.net/2020/08/16/Eb3OJ4l6SpDYrIK.png " width="50%" alt="QQ群" style=" width:50% ,algin = center"> ]]></content>
<summary type="html">竞赛</summary>
<category term="-public" scheme="http://qustkx.com/tags/public/"/>
</entry>
<entry>
<title>科协之星决赛结果公示</title>
<link href="http://qustkx.com/2019/11/30/publicty/"/>
<id>http://qustkx.com/2019/11/30/publicty/</id>
<published>2019-11-30T12:52:51.000Z</published>
<updated>2019-11-30T13:24:49.816Z</updated>
<content type="html"><![CDATA[<p>科协之星于十一月30日下午在科协举办决赛。历时一下午,经过六支队伍激烈的答辩,各个评委的评审,现将获奖作品和名单公示。<br>各位的作品都非常的优秀,硬是评出高低其实是对选手们的一种残忍。最后经过组委会的商议,将二等奖提升为四名,并为各位队伍增加了奖品,你们的努力终将得到回报。</p><table><thead><tr><th align="center">队伍名</th><th align="center">年级</th><th align="center">队员</th><th align="center">奖项</th></tr></thead><tbody><tr><td align="center">death soul队</td><td align="center">18级</td><td align="center">田甜,范成文,王建树</td><td align="center">一等奖(奖金600+三个树莓派)</td></tr><tr><td align="center">不愿透露姓名队</td><td align="center">17级</td><td align="center">饶珂</td><td align="center">二等奖(奖金300+一个树莓派)</td></tr><tr><td align="center">CLAWBZZ队</td><td align="center">17级</td><td align="center">张弛,张傲,刘文彬</td><td align="center">二等奖(奖金300+一个树莓派)</td></tr><tr><td align="center">擅长划水爱好摸鱼队</td><td align="center">17级</td><td align="center">王璐</td><td align="center">二等奖(奖金300+一个树莓派)</td></tr><tr><td align="center">IMS队</td><td align="center">18级</td><td align="center">宁洪鹏,孙丰泽</td><td align="center">二等奖(奖金300+一个树莓派)</td></tr><tr><td align="center">爬出一片天队</td><td align="center">18级</td><td align="center">徐金凯,郑磊,刘金龙</td><td align="center">三等奖(三个树莓派)</td></tr></tbody></table><p>科协之星第一届比赛成功举办离不开各位的热情,希望这次比赛可以让大家获得更多的项目开发经验,完善自己的项目。往后科协还会陆续举办比赛的,欢迎大家再次参与!</p>]]></content>
<summary type="html">竞赛</summary>
<category term="-public" scheme="http://qustkx.com/tags/public/"/>
</entry>
<entry>
<title>科协之星答辩队伍公示</title>
<link href="http://qustkx.com/2019/11/25/end/"/>
<id>http://qustkx.com/2019/11/25/end/</id>
<published>2019-11-25T02:52:51.000Z</published>
<updated>2019-11-25T14:27:22.173Z</updated>
<content type="html"><![CDATA[<p>经过科协之星评委组的评审后,组委会决定参加第一届科协之星软件设计大赛决赛的队伍有</p><h3 id="赛题一"><a href="#赛题一" class="headerlink" title="赛题一"></a>赛题一</h3><table><thead><tr><th>队伍名</th><th align="right">年级</th><th align="center">队员</th></tr></thead><tbody><tr><td>不愿透露姓名队</td><td align="right">17级</td><td align="center">饶珂</td></tr><tr><td>CLAWBZZ队</td><td align="right">17级</td><td align="center">张弛,张傲,刘文彬</td></tr><tr><td>death soul队</td><td align="right">18级</td><td align="center">田甜,范成文,王建树</td></tr><tr><td>IMS队</td><td align="right">18级</td><td align="center">宁洪鹏,孙丰泽</td></tr></tbody></table><h3 id="赛题二"><a href="#赛题二" class="headerlink" title="赛题二"></a>赛题二</h3><table><thead><tr><th>队伍名</th><th align="right">年级</th><th align="center">队员</th></tr></thead><tbody><tr><td>爬出一片天队</td><td align="right">18级</td><td align="center">徐金凯,郑磊,刘金龙</td></tr><tr><td>擅长划水爱好摸鱼队</td><td align="right">17级</td><td align="center">王璐</td></tr></tbody></table><p>决赛定于11月30日(周六)下午两点举行,具体地点,答辩流程会在群里通知,希望进入决赛的队伍认真准备。<br>没有进入决赛的队伍也不要灰心,参加比赛是督促自己的一种方式,是检测学习的一个办法,科协之星比赛会定期举办,欢迎大家下次参与!</p>]]></content>
<summary type="html">竞赛</summary>
<category term="-public" scheme="http://qustkx.com/tags/public/"/>
</entry>
<entry>
<title>科协之星竞赛开始评审</title>
<link href="http://qustkx.com/2019/11/18/star_Competition/"/>
<id>http://qustkx.com/2019/11/18/star_Competition/</id>
<published>2019-11-18T02:52:51.000Z</published>
<updated>2019-11-18T13:09:33.019Z</updated>
<content type="html"><![CDATA[<p>科协之星比赛进入评审阶段。大赛组委会决定将评委分组构成评委团,每组评委团皆有两名及以上评委组成,评委们将依据下几点对作品进行点评</p><blockquote><ol><li>项目的完成度 20%</li><li>项目的可用性 20%</li><li>代码的规范性 20%</li><li>开发流程的规范性 10%</li><li>功能的丰富度 10%</li><li>功能实现的难度 10%</li><li>其他能够表现项目技术价值和工作量的维度 10%</li></ol></blockquote><p>点评结束后,评审结果将生成PDF并通过邮件发送给队长,并将在官网上公示进入决赛的队伍,以及最后的答辩时间</p><p>以下是整理出来有有效代码的队伍,如有遗漏请联系qq:2358451740</p><h3 id="赛题一"><a href="#赛题一" class="headerlink" title="赛题一"></a>赛题一</h3><table><thead><tr><th>队伍名</th><th align="right">年级</th><th align="center">队员</th></tr></thead><tbody><tr><td>不愿透露姓名队</td><td align="right">17级</td><td align="center">饶珂</td></tr><tr><td>CLAWBZZ队</td><td align="right">17级</td><td align="center">张弛,张傲,刘文彬</td></tr><tr><td>death soul队</td><td align="right">18级</td><td align="center">田甜,范成文,王建树</td></tr><tr><td>梦之队</td><td align="right">18级</td><td align="center">张进</td></tr><tr><td>IMS队</td><td align="right">18级</td><td align="center">宁洪鹏,孙丰泽</td></tr><tr><td>MyJourney队</td><td align="right">18级</td><td align="center">张永政</td></tr></tbody></table><h3 id="赛题二"><a href="#赛题二" class="headerlink" title="赛题二"></a>赛题二</h3><table><thead><tr><th>队伍名</th><th align="right">年级</th><th align="center">队员</th></tr></thead><tbody><tr><td>扛大旗队</td><td align="right">17级</td><td align="center">刘金生,孟浩然</td></tr><tr><td>擅长划水爱好摸鱼队</td><td align="right">17级</td><td align="center">王璐</td></tr><tr><td>窝窝头队</td><td align="right">18级</td><td align="center">杨宇燊,孟科宇,蓝修倩</td></tr><tr><td>爱的供养队</td><td align="right">18级</td><td align="center">舒延昊,胡珊珊,王小为</td></tr><tr><td>爬出一片天队</td><td align="right">18级</td><td align="center">徐金凯,郑磊,刘金龙</td></tr><tr><td>CZ队</td><td align="right">19级</td><td align="center">李锡成,史瑶</td></tr><tr><td>AmorphophalmsKonjac队</td><td align="right">19级</td><td align="center">王宇豪,王志杨</td></tr></tbody></table>]]></content>
<summary type="html">竞赛</summary>
<category term="-public" scheme="http://qustkx.com/tags/public/"/>
</entry>
<entry>
<title>第一届科协之星比赛队伍公示</title>
<link href="http://qustkx.com/2019/10/20/team_publicity/"/>
<id>http://qustkx.com/2019/10/20/team_publicity/</id>
<published>2019-10-20T02:52:51.000Z</published>
<updated>2019-10-20T01:43:40.144Z</updated>
<content type="html"><![CDATA[<h1 id="第一届科协之星比赛队伍公示"><a href="#第一届科协之星比赛队伍公示" class="headerlink" title="第一届科协之星比赛队伍公示"></a>第一届科协之星比赛队伍公示</h1><h3 id="赛题一"><a href="#赛题一" class="headerlink" title="赛题一"></a>赛题一</h3><table><thead><tr><th>队伍名</th><th align="right">年级</th><th align="center">队员</th></tr></thead><tbody><tr><td>不愿透露姓名队</td><td align="right">17级</td><td align="center">饶珂</td></tr><tr><td>CLAWBZZ队</td><td align="right">17级</td><td align="center">张弛,张傲,刘文彬</td></tr><tr><td>death soul队</td><td align="right">18级</td><td align="center">田甜,范成文,王建树</td></tr><tr><td>梦之队</td><td align="right">18级</td><td align="center">张进</td></tr><tr><td>IMS队</td><td align="right">18级</td><td align="center">宁洪鹏,孙丰泽</td></tr><tr><td>MyJourney队</td><td align="right">18级</td><td align="center">张永政</td></tr><tr><td>少先队</td><td align="right">19级</td><td align="center">陈钰琦,王潇涵,张效瑞</td></tr></tbody></table><h3 id="赛题二"><a href="#赛题二" class="headerlink" title="赛题二"></a>赛题二</h3><table><thead><tr><th>队伍名</th><th align="right">年级</th><th align="center">队员</th></tr></thead><tbody><tr><td>扛大旗队</td><td align="right">17级</td><td align="center">刘金生,孟浩然</td></tr><tr><td>擅长划水爱好摸鱼队</td><td align="right">17级</td><td align="center">王璐</td></tr><tr><td>窝窝头队</td><td align="right">18级</td><td align="center">杨宇燊,孟科宇,蓝修倩</td></tr><tr><td>爱的供养队</td><td align="right">18级</td><td align="center">舒延昊,胡珊珊,王小为</td></tr><tr><td>爬出一片天队</td><td align="right">18级</td><td align="center">徐金凯,郑磊,刘金龙</td></tr><tr><td>AAA队</td><td align="right">19级</td><td align="center">董雨洲</td></tr><tr><td>XS队</td><td align="right">19级</td><td align="center">黄溢</td></tr><tr><td>CZ队</td><td align="right">19级</td><td align="center">李锡成,史瑶</td></tr><tr><td>xS队</td><td align="right">19级</td><td align="center">吕佳峻,陈家聪,邱伊帆</td></tr><tr><td>现科研队</td><td align="right">19级</td><td align="center">苏晋宁</td></tr><tr><td>AmorphophalmsKonjac队</td><td align="right">19级</td><td align="center">王宇豪,王志杨</td></tr><tr><td>c++队</td><td align="right">19级</td><td align="center">李媛媛,高晗,张涯云</td></tr></tbody></table>]]></content>
<summary type="html">竞赛</summary>
<category term="-public" scheme="http://qustkx.com/tags/public/"/>
</entry>
<entry>
<title>首届“科协之星”软件设计大赛比赛方案</title>
<link href="http://qustkx.com/2019/10/04/star/"/>
<id>http://qustkx.com/2019/10/04/star/</id>
<published>2019-10-04T02:52:51.000Z</published>
<updated>2019-10-10T13:54:26.760Z</updated>
<content type="html"><![CDATA[<h1 id="首届“科协之星”软件设计大赛比赛方案"><a href="#首届“科协之星”软件设计大赛比赛方案" class="headerlink" title="首届“科协之星”软件设计大赛比赛方案"></a>首届“科协之星”软件设计大赛比赛方案</h1><h4 id="主办单位:青岛科技大学信息学院科技创新协会"><a href="#主办单位:青岛科技大学信息学院科技创新协会" class="headerlink" title="主办单位:青岛科技大学信息学院科技创新协会"></a>主办单位:青岛科技大学信息学院科技创新协会</h4><h4 id="承办单位:青岛科技大学信息学院科技创新协会软件小组"><a href="#承办单位:青岛科技大学信息学院科技创新协会软件小组" class="headerlink" title="承办单位:青岛科技大学信息学院科技创新协会软件小组"></a>承办单位:青岛科技大学信息学院科技创新协会软件小组</h4><h3 id="比赛宗旨"><a href="#比赛宗旨" class="headerlink" title="比赛宗旨"></a>比赛宗旨</h3><p>首届“科协之星”软件设计大赛比赛以激发大学生的热情与创意,培养科技创新人才为宗旨。坚持 “明德、笃学、弘毅、拓新”的理念,提升在校大学生的创新精神和实践能力,并为在校学生的学习和就业提供方向。<br>对于在竞赛中表现突出并希望继续深入提高工程能力的队伍和个人,大赛组委会将提供科技创新协会实验室工位,为同学们今后的交流学习提供方便,更好地面向各类竞赛与求职。</p><h3 id="比赛内容"><a href="#比赛内容" class="headerlink" title="比赛内容"></a>比赛内容</h3><p>为锻炼学生们的实践能力和创新精神,此次比赛的赛题均为工程类赛题,主要考察同学们能否在有限的时间内协同小组成员设计并实现一个工程,以及是否具有对网络通讯、数据爬取等知识自主探究的能力。<br>各位同学可以从以下两个赛题中选择一个参加比赛</p><ol><li>即时聊天工具<blockquote><p>(一)赛题介绍<br>近几十年来,通讯技术借助现代网络科技正在飞速发展,对各行各业的发展产生了重要影响。随之而产生的即时通讯工具在网络营销和生活社交中扮演着重要角色。即时通讯工具成了企业与用户之间,还有人与人之间的沟通桥梁,并广泛地应用于网络中。<br>(二)赛题业务场景<br> 1、MSN、QQ等即时通讯软件<br> 2、社交媒体如Facebook,twitter、新浪微博所提供的网页即时通信平台<br> 3、淘宝网、京东等电商平台中的可支持交易双方即时通讯的插件<br>(三)基本功能<br>1、可实现用户间远程通讯,具备最基本的文本传输功能。(基础需求)<br>(四)扩展功能<br>1、实现图像、视频、音频等多媒体传输的功能。<br>2、运用较为通用的保密技术保证即时通讯平台信息传输过程中的不被中间人攻击。<br>3、其他能够体现参赛者技术水平或产品设计水平的功能</p></blockquote></li></ol><ol start="2"><li>网络爬虫<blockquote><p>(一)赛题介绍<br>随着互联网的发展,有数百万级的网页生成,这些网页包含大量不同的形式的数据,其中包括文本、图像、视频和音频。互联网变成了一个开放的数据源。<br>这导致了数据资源变得非常丰富且容易搜索,人们发现从网页上找到他们想要的信息是一件非常简单的事情,他们通常分布在大量的网站上。但另一个问题出现了,当他们想要数据的时候,并非每个网站都提供下载按钮,如果进行手动复制显然是非常低效且乏味的。<br>并且我们总是想要更多的数据。我们收集数据,处理数据,并把数据转换成各种各样的成品,比如研究,洞察分析,信息,故事,资产等等。而爬虫可以让我们更方便的收集处理数据。<br>(二)赛题业务场景<br>1、搜索引擎公司,如百度谷歌等搜索引擎<br>2、舆情分析与数据挖掘,如微博热搜<br>3、数据查询类的公司,如企查查,超级课程表<br>4、导购,价格监测助手,如携程机票查询<br>(三) 基本功能<br>爬虫数据分析<br>青岛二手房价信息+可视化数据分析(各个区域的二手房平均价,二手房平均数量)<br>网站 <a href="https://qd.anjuke.com/" target="_blank" rel="noopener">https://qd.anjuke.com/</a><br>青岛到北京飞机票价格+可视化数据分析(20天内每天各个航空公司的飞机票的价格变化,以四个小时为时间段,各个时间段的飞机数量)<br>网站 <a href="https://flight.qunar.com/" target="_blank" rel="noopener">https://flight.qunar.com/</a><br>1、 网站访问频率控制,防止被网站封禁ip,避免导致网站瘫痪(硬性需求)<br>(四) 扩展功能<br>1、 抓取的优先级调整,抓取队列总是满的,周而复始,但在抓取的时候会出现,重要的,紧急的,不重要的,不紧急的内容,如何处理好排队的关系尤为重要,是单独开辟绿色通道,还是将其排队号前提都是需要细心打磨的。<br>2、 抓取深度控制,链接展开的深度控制,避免出现单个站点过分抓取,而使得其他站点持续饥饿<br>3、 多爬虫的协作,爬虫间的通行量要尽可能少,爬虫出现故障后的自动恢复,抓取主机的异地化等等<br>4、 网页下载的存储,网页下载后的本地存储,链接提取,锚文本,链接关系的存储等等<br>5、 死链、跳转的识别和处理,在抓取网页失败后,判断是死链还是宕机,错误下载的网址再次抓取的时间间隔的控制,redirect的网页收集等等</p></blockquote></li></ol><h3 id="比赛要求"><a href="#比赛要求" class="headerlink" title="比赛要求"></a>比赛要求</h3><ul><li>项目源码实时在内部git上托管,并添加权限给主办方账号;</li></ul><ul><li>项目搭建需要写开发文档和部署方案;</li></ul><ul><li>最终验收为现场演示发布版的程序以及源码</li></ul><ul><li>对进入决赛的同学,需要把主要内容制作成PPT,并进行答辩</li></ul><h3 id="比赛流程"><a href="#比赛流程" class="headerlink" title="比赛流程"></a>比赛流程</h3><p>整体流程:报名、提交作品、评审、答辩、颁奖。</p><p>(1) 报名</p><blockquote><p>报名时间:10月10号~10月18 号<br>参赛对象:青岛科技大学所有在校学生均可参加<br>报名方法:</p><ol><li>组队 全日制在校大学生均可以个人或团队形式参加比赛。 若为团队参赛,则每个参赛队不超过 3名队员 </li><li>git报名。在git平台(<a href="http://git.iqust.top/" target="_blank" rel="noopener">http://git.iqust.top/</a>)注册账号,并在readme.md文件里面填写好队伍名称,参赛队员以及联系方式(电话号码及qq)</li></ol></blockquote><p>(2)提交作品</p><blockquote><p>日期:11月12号之前<br>提交方式:网上提交(利用git平台<a href="http://git.iqust.top/" target="_blank" rel="noopener">http://git.iqust.top/</a>。请创建private repositories,并在readme.md中写上自己的队伍名字)<br>提交内容:项目源码,项目开发文档</p></blockquote><p> (3)评审</p><blockquote><p>评审委员会成员均为大厂工作的已毕业学长<br>两个赛题将会放在一起评审<br>作品评审主要从以下几个方面进行:</p><ol><li>项目的完成度 20%</li><li>项目的可用性 20%</li><li>代码的规范性 20%</li><li>开发流程的规范性 10%</li><li>功能的丰富度 10%</li><li>功能实现的难度 10%</li><li>其他能够表现项目技术价值和工作量的维度 10%</li></ol></blockquote><p>评审时不会过度侧重商业价值,因此请同学们不受拘束<br>尽情发挥。<br>评审结束将提出答辩的候选名单,提交大赛组委会审核,然后在网上公布最终的答辩名单。</p><p> (4)答辩</p><blockquote><p>日期:暂定11.24下午两点<br>地点:明德楼<br>所有参赛队伍均在今天答辩,需要各位答辩的选手准备好ppt,现场对项目的开发过程,以及项目实现方法进行阐述、</p></blockquote><p>(5) 颁奖</p><blockquote><p>答辩结束后评委提出一二三等奖的候选名单,提交大赛组委会审核。<br>后在网上公布最终的获奖者名单,并在线下颁发对应的奖金和证书。<br>一等奖:一支队伍,奖金600元,并颁发证书。<br>二等奖:两支队伍,每队奖金300元,并颁发证书。<br>三等奖:三支队伍,每队树莓派一个,并颁发证书。<br>优胜奖:未获得一二三等奖的团队,按照得分高低排名,前50%获得优胜奖并颁发证书。</p></blockquote><h3 id="对参赛学生的建议"><a href="#对参赛学生的建议" class="headerlink" title="对参赛学生的建议"></a>对参赛学生的建议</h3><p>及时查看大赛网站地公告<a href="http://www.qustkx.com/" target="_blank" rel="noopener">http://www.qustkx.com/</a>,主动了解大赛的进展;<br>加入QQ群(581109091),与更多的同学交流、学习;<br>以比赛带动学习,积极准备,主动请教。</p><h3 id="其他事项"><a href="#其他事项" class="headerlink" title="其他事项"></a>其他事项</h3><p>其他未尽事项,将综合商议后另行通知。</p>]]></content>
<summary type="html">竞赛</summary>
<category term="-public" scheme="http://qustkx.com/tags/public/"/>
</entry>
<entry>
<title>新生见面会直播地址</title>
<link href="http://qustkx.com/2019/09/20/zhibo/"/>
<id>http://qustkx.com/2019/09/20/zhibo/</id>
<published>2019-09-20T11:24:51.000Z</published>
<updated>2019-09-20T10:43:23.627Z</updated>
<content type="html"><![CDATA[<h2 id="青岛科技大学信息学院科技创新协会2019年新生见面会直播地址:"><a href="#青岛科技大学信息学院科技创新协会2019年新生见面会直播地址:" class="headerlink" title="青岛科技大学信息学院科技创新协会2019年新生见面会直播地址:"></a>青岛科技大学信息学院科技创新协会2019年新生见面会直播地址:</h2><p><a href="http://video.iqust.top/caster/7d9359b9fe6d459bb1ef6a5ae3f62918.m3u8" target="_blank" rel="noopener">2019年新生见面会</a></p>]]></content>
<summary type="html">直播</summary>
<category term="-直播" scheme="http://qustkx.com/tags/直播/"/>
</entry>
<entry>
<title>科技创新协会2019新生见面会</title>
<link href="http://qustkx.com/2019/09/16/freshman/"/>
<id>http://qustkx.com/2019/09/16/freshman/</id>
<published>2019-09-16T02:52:51.000Z</published>
<updated>2019-09-18T06:46:38.782Z</updated>
<content type="html"><![CDATA[<h1 id="点击获取你的专属邀请函"><a href="#点击获取你的专属邀请函" class="headerlink" title="点击获取你的专属邀请函"></a><a href="http://www.iqust.top/invitation/" target="_blank" rel="noopener">点击获取你的专属邀请函</a></h1><p><img src="https://i.loli.net/2019/09/17/2WSBHJ1fklAcVr4.jpg" alt><br>小萌新们刚过军训的“美黑”,又经历了学生会面试,很多小萌新已经找到了大学的小目标,也意识到了大学生活与高中生活的不同,我们就是学校的主人,我们就是自己的主人,很多课余时间,我们可以参加社团,可以去参与学生会工作提升自己,也可以从现在就开始去上自习,为了读研读博。现在重头戏来了——<br><img src="https://i.loli.net/2019/09/17/vVPcbpsCNxkAhQa.png" alt></p><blockquote><p>破烂键盘,直接扔掉?为何不拿它做个物理外挂,驰骋战场。<br>辣鸡手机,拿去换盆?为何不进行二次开发,随心而动。<br>想买设备,囊中羞涩?为何不用嵌入式技术自制,个性满满。</p></blockquote><p>你心动了吗?心动了就来看看我们的嵌入式小组吧!</p><blockquote><p>网络信息很丰富,啥都想要,却很多付费,买与不买是否让你纠结?<br>软件直接要权限,如果不给就闪退,你,是否也想这样义正言辞的要信息?<br>别人家的网站很酷炫,界面整齐功能多,有时你是否也曾心动?</p></blockquote><p>软件小组, 给你扣开互联网的大门!</p><blockquote><p>破解Wi-Fi,秘密搭讪隔壁小姐姐。你!想学吗?<br>软件注册码不合理,骚操作一顿绕过。你!期待吗?<br>游戏体验感奇差,写点辅助秒变峡谷大神。你!激动吗?<br>人肉搜索,QQ被盗,是否激起了你的正义之心?你!还在等什么?</p></blockquote><p>敬请加入我们——一个新生的白帽子团队,信安小组。</p><p>如今,科协如约而至,在这里我们会向大家展示我们科协小组的一些作品,在这里我们会和大家交流大学的各色竞赛,在这里,我们会让大家知道,科协各个小组的具体方向,让大家找到自己的兴趣方向,并为之努力着。课余时间我们可以尝试搭建自己的网站,制作自己平时可以用的小工具,也可以与一些站点管理员斗智斗勇……<br>2019年9月20日晚上7点,南苑大活,信息学院科技创新协会,带你去看不一样的大学风景!咱们不见不散!</p><h1 id="点击获取你的专属邀请函-1"><a href="#点击获取你的专属邀请函-1" class="headerlink" title="点击获取你的专属邀请函"></a><a href="http://www.iqust.top/invitation/" target="_blank" rel="noopener">点击获取你的专属邀请函</a></h1>]]></content>
<summary type="html">通知公告</summary>
<category term="-public" scheme="http://qustkx.com/tags/public/"/>
</entry>
<entry>
<title>新生答疑会主要问题汇总</title>
<link href="http://qustkx.com/2019/09/07/qa/"/>
<id>http://qustkx.com/2019/09/07/qa/</id>
<published>2019-09-07T06:24:51.000Z</published>
<updated>2019-09-08T04:07:47.934Z</updated>
<content type="html"><![CDATA[<p>九月六号晚七点到十一点在科技创新协会的答疑会上,学弟学妹们对科技创新协会拥有强烈的好奇心,在这里我们统一回答一下学弟学妹们常问的问题<br>1.零基础可不可以加入科技创新协会?</p><blockquote><p>零基础可以参与,刚到大一,大多数人都是零基础的,这时候更需要的是学习的热情</p></blockquote><p>2平时协会有什么活动?</p><blockquote><p>平时会组织打比赛,十月到十一月还有公开课,节日时会组织聚餐活动</p></blockquote><p>3.各小组收人专业有没有限制?</p><blockquote><p>各小组对收人专业并没有任何要求,专业只是高考后的选择,现在,我们是大学生了</p></blockquote><p>4.可不可以加入多个小组?</p><blockquote><p>精力够就可以</p></blockquote><p>5.可不可以即加入学生会又加入科协?</p><blockquote><p>科协并不强制性的要求同学们在各个部门之间做选择,只要精力够,可以即加入学生会又加入科协</p></blockquote><p>6.如何加入科技创新协会实验室?</p><blockquote><p>群里面有场地申请的样表,填写场地申请样表发送给邮箱<a href="mailto:qustkx@163.com" target="_blank" rel="noopener">qustkx@163.com</a>即可,通过后会邮箱给予回复</p></blockquote><p>7.加入科协实验室的好处?</p><blockquote><p>实验室内部会提供专门的工位(配套桌椅); 24小时不断电不断网;进行经验分享;探讨研究;不定时聚餐、活动。</p></blockquote>]]></content>
<summary type="html">经验分享</summary>
<category term="-public" scheme="http://qustkx.com/tags/public/"/>
</entry>
<entry>
<title>ubuntu下openpose本地环境搭建</title>
<link href="http://qustkx.com/2019/08/21/openpose/"/>
<id>http://qustkx.com/2019/08/21/openpose/</id>
<published>2019-08-21T12:24:51.000Z</published>
<updated>2019-08-29T22:07:41.840Z</updated>
<content type="html"><![CDATA[<p>ubuntu下openpose本地环境搭建</p><p>因为装得是ubuntu18.04的系统,所以很多坑都得自己慢慢来踩,从中也是学习到了不少,下面依次来介绍边缘端的环境搭配在这里先放出我最终搭建好的环境,nvidia driver:418.74,CUDA version:10.1 cudnn10.1</p><p><img src="https://img-blog.csdnimg.cn/20190616162159313.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMDkz,size_16,color_FFFFFF,t_70" alt></p><h1 id="一.CUDA10-1的安装"><a href="#一.CUDA10-1的安装" class="headerlink" title="一.CUDA10.1的安装"></a>一.CUDA10.1的安装</h1><p>首先是最基本的显卡驱动安装<br>关于显卡驱动安装,网上有很多种方法,其中最简单的应该就是添加官方ppa源,然后直接用apt-git安装了</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ sudo add-apt-repository ppa:graphics-drivers/ppa</span><br></pre></td></tr></table></figure><p>需要输入密码并按enter键确认。<br>之后刷新软件库并安装最新驱动。 </p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ sudo apt-get update </span><br><span class="line">$ sudo apt-get install nvidia-367nvidia-settings nvidia-prime</span><br></pre></td></tr></table></figure><p> 安装完成后通过下面命令查看是否安装成功。<br> <figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ nvidia-settings</span><br></pre></td></tr></table></figure></p><p> 但是你会发现,比较新的显卡驱动在官方ppa源里面是没有的,这时候就要去官网找自己的GPU的相应驱动程序了<br><a href="https://www.geforce.cn/drivers" target="_blank" rel="noopener">https://www.geforce.cn/drivers</a><br><img src="https://img-blog.csdnimg.cn/20190616162402254.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMDkz,size_16,color_FFFFFF,t_70" alt><br><img src="https://img-blog.csdnimg.cn/20190616162500806.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMDkz,size_16,color_FFFFFF,t_70" alt><br>搜索后得到观看CUDA10.1的官方文档可知CUDA10.1仅支持显卡驱动版本大于418.39机器,所以挑一个版本号大于418.39非beta版的进行下载</p><p><img src="https://img-blog.csdnimg.cn/20190616162533406.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMDkz,size_16,color_FFFFFF,t_70" alt><br>下载完成后我们开始准备工作卸载可能存在的旧版本 nvidia 驱动(对没有安装过 nvidia 驱动的主机,这步可以省略,但推荐执行,无害)</p><p>安装驱动可能需要的依赖(可选)</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$sudo</span> apt-get update </span><br><span class="line"><span class="variable">$sudo</span> apt-get install dkms build-essential linux-headers-generic </span><br><span class="line">把 nouveau 驱动加入黑名单</span><br><span class="line"><span class="variable">$sudo</span> vim /etc/modprobe.d/blacklist-nouveau.conf</span><br></pre></td></tr></table></figure><p>在文件 blacklist-nouveau.conf 中加入如下内容: </p><blockquote><p>blacklist nouveau<br>blacklist lbm-nouveau<br>options nouveau modeset=0<br>alias nouveau off<br>alias lbm-nouveau off </p></blockquote><p>禁用 nouveau 内核模块</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$echo</span> options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf </span><br><span class="line"><span class="variable">$sudo</span> update-initramfs -u</span><br></pre></td></tr></table></figure><p>然后按ctrl+alt+f5进入字符终端界面,这里必须注意,只有进入字符终端才能进行安装,否则会安装失败报错<br>更改安装文件的权限(否则会报错无此命令)</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$sudo</span> chmod u+x NVIDIA-Linux-x86_64-418.74.run</span><br></pre></td></tr></table></figure><p>最后安装</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$sudo</span> ./NVIDIA-Linux-x86_64-418.74.run</span><br></pre></td></tr></table></figure><p>安装一开始可能会提示脚本运行失败,继续就可以了</p><p>至此,显卡驱动已经安装成功,现在开始CUDA10.1的安装<br>首先去CUDA官网寻找安装包<br><a href="https://developer.nvidia.com/cuda-downloads" target="_blank" rel="noopener">https://developer.nvidia.com/cuda-downloads</a><br><img src="https://img-blog.csdnimg.cn/20190616162602355.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMDkz,size_16,color_FFFFFF,t_70" alt><br>下载完成后,运行</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo sh cuda_10.1.168_418.67_linux.run</span><br></pre></td></tr></table></figure><p>即可进入安装界面<br>如果安装失败可以尝试减少安装选项</p><h1 id="二.cuDNN的安装"><a href="#二.cuDNN的安装" class="headerlink" title="二.cuDNN的安装"></a>二.cuDNN的安装</h1><p>安装cudnn需要在nvidia官网注册账号<br><a href="https://developer.nvidia.com/rdp/cudnn-download#a-collapse731-10" target="_blank" rel="noopener">https://developer.nvidia.com/rdp/cudnn-download#a-collapse731-10</a><br><img src="https://img-blog.csdnimg.cn/20190616162630715.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMDkz,size_16,color_FFFFFF,t_70" alt><br>cudnn其实是一些加速CUDA性能的库,首先按照解压放到CUDA的相应路径中<br>然后把其中的lib64关联到环境变量当中</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo gedit .bashrc</span><br></pre></td></tr></table></figure><p>在弹出的gedit文档编辑器(.bashrc中)中最后一行加入:<br>export LD_LIBRARY_PATH=/your/path/to/cuda/lib64:$LD_LIBRARY_PATH<br>重启环境变量</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> .bashrc</span><br></pre></td></tr></table></figure><h1 id="三.Pytorch1-0的安装"><a href="#三.Pytorch1-0的安装" class="headerlink" title="三.Pytorch1.0的安装"></a>三.Pytorch1.0的安装</h1><p>安装好cuda环境后我们开始安装pytorch1.0环境<br>1.python环境的安装<br>首先要装python环境,这里我选择的是直接安装anaconda,里面不仅有python,还有大量的科学包,会省去很多麻烦,(因为贸易战的原因,所以清华镜像站并不能下载,只能去官网耐心下载)<br>下载完成后运行.sh文件</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bash Anaconda3-2019.03-Linux-x86_64.sh</span><br></pre></td></tr></table></figure><p>进入注册信息页面,输入yes;<br>阅读注册信息,然后输入yes;查看文件即将安装的位置,按enter,即可安装;<br>系统是自带python2.7的,可以修改环境变量使其启动的 python 为 anaconda</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sudo gedit ~/.bashrc </span><br><span class="line"><span class="built_in">export</span> PATH=<span class="string">"/home/xupp/anaconda3/bin:<span class="variable">$PATH</span>"</span></span><br><span class="line">顺带提一下pip的 安装方法</span><br><span class="line">sudo apt-get install python3-pip</span><br></pre></td></tr></table></figure><p>2.pytorch的安装<br>这时我们就可以安装pytorch1.0了,直接去pytorch的官网<br><a href="https://pytorch.org/" target="_blank" rel="noopener">https://pytorch.org/</a><br>选择自己系统的配置(官网上并没有CUDA10.1,选择10.0即可)<br><img src="https://img-blog.csdnimg.cn/20190616162656690.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMDkz,size_16,color_FFFFFF,t_70" alt><br>然后在终端中输入</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda install pytorch torchvision cudatoolkit=10.0 -c pytorch</span><br></pre></td></tr></table></figure><p>即可安装pytorch1.0</p><h1 id="四.Caffe的安装"><a href="#四.Caffe的安装" class="headerlink" title="四.Caffe的安装"></a>四.Caffe的安装</h1><p>然后到了安装caffe的环节了<br>在caffe环节,如果按照CSDN上的大多数教程来安装会有很多的坑,因为他们都是下载caffe的源码,然后用cmake进行编译,对于ubuntu18.04来说,makefile里面实在需要改太多路径了,而且有一些函数库已经被代替或者淘汰,有人说源码编译是为了对caffe框架进行微调,在这里,我感觉他是得不偿失,因为微调框架这种需求对于我们这种不作特殊研究的人来说其实是很鸡肋的,所以我选择了caffe官网提供的第二种安装方式<br>对于Ubuntu(> = 17.04)<br>安装预编译的Caffe<br>包括caffe本身在内的所有产品都包装在17.04及更高版本中。要安装预编译的Caffe包,只需执行此操作即可</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt install caffe-cuda</span><br><span class="line">sudo apt build-dep caffe-cuda <span class="comment"># dependencies for CUDA version</span></span><br></pre></td></tr></table></figure><p>第二条命令需要你修改sources.list</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vim /etc/apt/sources.list</span><br></pre></td></tr></table></figure><p>然后把里面的deb-src的注释掉<br>然后最难办caffe环境就装好了,可以进入python,import caffe 如果没有报错,证明,caffe环境配置成功</p><h1 id="五.Opencv3-4的安装"><a href="#五.Opencv3-4的安装" class="headerlink" title="五.Opencv3.4的安装"></a>五.Opencv3.4的安装</h1><p>为了编译openpose的源码以及opencv3.4.6,我们需要安装cmake</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get install cmake-qt-gui</span><br></pre></td></tr></table></figure><p>安装完成后直接用命令cmake-gui 就可以使用cmake了<br>首先我们必须编译好opencv3.4.6<br>在opencv官网<br><a href="https://opencv.org/opencv-3-4/" target="_blank" rel="noopener">https://opencv.org/opencv-3-4/</a><br>下载opencv3.4的压缩包<br>解压后到目录启动cmake</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cmake-gui</span><br></pre></td></tr></table></figure><p>如图配置<br><img src="https://img-blog.csdnimg.cn/20190616162725518.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMDkz,size_16,color_FFFFFF,t_70" alt></p><p>然后点击Generate<br>安装完成后需要对系统相关环境变量进行配置:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo gedit /etc/ld.so.conf.d/opencv.conf</span><br></pre></td></tr></table></figure><p>将以下内容添加到最后:<br>/usr/local/lib<br>接下来配置库:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo ldconfig</span><br></pre></td></tr></table></figure><p>更改环境变量:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo gedit /etc/bash.bashrc</span><br></pre></td></tr></table></figure><p>在文件后添加:</p><blockquote><p>PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig<br>export PKG_CONFIG_PATH</p></blockquote><p>保存退出,在运行下面的例程之前,需要重新开启终端来使配置生效。</p><h1 id="六.Openpose的安装"><a href="#六.Openpose的安装" class="headerlink" title="六.Openpose的安装"></a>六.Openpose的安装</h1><p>现在开始安装openpose</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/CMU-Perceptual-Computing-Lab/openpose.git</span><br></pre></td></tr></table></figure><p>检查是否需要更新</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git pull origin master</span><br></pre></td></tr></table></figure><h1 id="七-安装cmake-gui"><a href="#七-安装cmake-gui" class="headerlink" title="七.安装cmake-gui"></a>七.安装cmake-gui</h1><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get install cmake-qt-gui </span><br><span class="line">下载模型</span><br><span class="line"><span class="built_in">cd</span> models</span><br><span class="line">./getModels.sh</span><br><span class="line"><span class="built_in">cd</span> ..</span><br><span class="line">创建build文件</span><br><span class="line">mkdir build</span><br></pre></td></tr></table></figure><h1 id="八-启动cmake-gui进行编译"><a href="#八-启动cmake-gui进行编译" class="headerlink" title="八.启动cmake-gui进行编译"></a>八.启动cmake-gui进行编译</h1><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cmake-gui</span><br></pre></td></tr></table></figure><p>填写openpose源码目录以及build,点击Configure按钮, 选择Unix Makefile和use default native compling,点击finish按钮<br><img src="https://img-blog.csdnimg.cn/20190616162757490.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMDkz,size_16,color_FFFFFF,t_70" alt></p><p>点击Generate即可开始编译,编译完成后我们在openpose文件夹中执行</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./build/examples/openpose/openpose.bin --video examples/media/video.avi</span><br></pre></td></tr></table></figure><p><img src="https://img-blog.csdnimg.cn/201906161628345.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMDkz,size_16,color_FFFFFF,t_70" alt><br>七.Pytorch模型的训练<br>在github中下载pytorch训练模型的代码<br><a href="https://github.com/NiteshBharadwaj/part-affinity" target="_blank" rel="noopener">https://github.com/NiteshBharadwaj/part-affinity</a><br>从COCO项目下载train2017.zip,val2017.zip和annotations_trainval2017.zip 关键点描述可在此处找到。提取文件夹并将其放在“/ data”中<br>然后运行</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python main.py -data ../data -expID vgg19 -model vgg -train</span><br></pre></td></tr></table></figure><p><img src="https://img-blog.csdnimg.cn/20190616162921159.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMDkz,size_16,color_FFFFFF,t_70" alt></p><p>模型在训练中<br>这里是通过迭代训练模型的,默认迭代150次,每次迭代都会加大模型的精度,我们这里迭代了三天训练出了29个模型<br> <img src="https://img-blog.csdnimg.cn/20190616162951725.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMDkz,size_16,color_FFFFFF,t_70" alt><br>训练出来的29个模型</p><p>即可对视频中的人流进行人数统计</p>]]></content>
<summary type="html">经验分享</summary>
<category term="-经验分享" scheme="http://qustkx.com/tags/经验分享/"/>
</entry>
<entry>
<title>C/C++ CGI处理文件上传</title>
<link href="http://qustkx.com/2019/08/17/blog1/"/>
<id>http://qustkx.com/2019/08/17/blog1/</id>
<published>2019-08-17T02:52:51.000Z</published>
<updated>2019-08-27T13:37:53.995Z</updated>
<content type="html"><![CDATA[<p>前端页面如下:(index.html)</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE></span></span><br><span class="line"><span class="tag"><<span class="name">html</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>Upload File Test<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">form</span> <span class="attr">enctype</span>=<span class="string">'multipart/form-data'</span> <span class="attr">action</span>=<span class="string">"/cgi-bin/LocalVideoUpload"</span> <span class="attr">method</span>=<span class="string">"post"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"file"</span> <span class="attr">name</span>=<span class="string">'pics'</span> <span class="attr">multiple</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"file"</span> <span class="attr">name</span>=<span class="string">'another_pic'</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"submit"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">form</span> ></span></span><br><span class="line"> <span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure><p>从中可以看到,使用了一个表单作为上传内容,其中enctype属性表明这个表单在上传的时候使用multipart/form-data格式。表单中有两个输入框,在浏览器里会显示为【选择文件】。其中pics可以选择多个文件上传,another_pic只能选择一个文件上传。</p><p>那么什么是multipart/form-data格式呢?</p><p>首先根据标准文档和搜索到的资料,这是一种Content-Type,而且是建立于POST请求方式基础上的。其本身意味着整个表单数据编码为一条消息,每个控件的数据对应消息的一部分。</p><p>先用Wireshark抓一下包,这里要注意的是,由于wireshark没法抓localhost环回的包,因此我在本地的另一个设备上设置了一个代理,这样请求会经过该设备的中转,从而能够被wireshark捕获到。当然也有更好的办法,比如配置路由,安装rawpacp等等…. 可以参考<a href="https://blog.csdn.net/yetyongjin/article/details/8101392/" target="_blank" rel="noopener">这个博客</a></p><p>抓到的包大概是这样:<br><img src="https://i.loli.net/2019/08/21/769QZOoYvKrgq2j.png" alt="1.png"></p><p>这里用了wireshark的过滤条件:ip.src eq 192.168.31.102 and ip.dst eq 192.168.31.51 and ip.proto eq TCP,这样能够筛选出从102机器发往51机器的所有TCP报文,沿着SYN查找带有PSH,ACK的报文(其中PSH表示push操作位,意味着发送方希望接收方立刻处理数据,具体参见<a href="https://www.2cto.com/net/201307/229079.html" target="_blank" rel="noopener">这个博客</a> ,在截图中还可以看到很多TCP segment of a reassembled PDU这样的提示,这表明TCP报文经过了分片,可以参考<a href="https://blog.csdn.net/hldjf/article/details/7450565" target="_blank" rel="noopener">这个博客</a>。关于更多的wireshark过滤条件语法,参见<a href="https://blog.csdn.net/wojiaopanpan/article/details/69944970" target="_blank" rel="noopener">这个博客</a>)然后右键报文——追踪TCP流,就会弹出来这样一个窗口:</p><p><img src="https://i.loli.net/2019/08/21/3gXjvab1IFMSHR2.png" alt="2.png"></p><p>这里就可以看到报文的格式了。在Content-Type中,multipart/form-data被指定,随后跟着一个boundary参数顾名思义就是消息的边界分隔符。在POST的正文中可以看到,每个消息以–{$boundary}开始。最后一个消息后附带一个–{$boundary}–表示结束。整个POST的正文长度(包括一大堆的分隔符和内部消息头)为Content-Length。</p><p>这样,在CGI中,接收到CONTENT_TYPE和CONTENT_LENGTH参数后,分析是不是multipart/form-data,如果是就提取出来boundary,读取post内容,根据boundary分割输入数据,解析内部请求头。(此处代码较多,就不贴了)</p><p>需要注意的是,如果CGI运行在Windows下,而且上传的文件中包含二进制数据,此时需要将标准输入流设置成二进制模式,具体参见<a href="https://blog.csdn.net/Kiritow/article/details/81697542" target="_blank" rel="noopener">这个博客</a>。</p><p>有关内部消息头中的Content-Disposition,可以参考<a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Disposition" target="_blank" rel="noopener">这里</a>。另外Content-Disposition还可以被用在响应头中,用于下载文件,具体参考<a href="https://blog.csdn.net/sinat_38364990/article/details/70867357" target="_blank" rel="noopener">这个博客</a>。</p><p>由于内部消息头没有Content-Length,因此没有办法预知这一部分有多少数据,只能不断读入然后判断是否遇到了边界。</p><p>需要小心的是,内部消息头指出的filename可能是经过精心编辑的带有类似 ../ 的路径,如果直接使用有可能会覆盖其他文件,从而为攻击提供了可乘之机。</p><p>这里再介绍一种能够显示上传进度的前端页面写法:(摘自<a href="https://www.cnblogs.com/xiaoqian1993/p/5775121.html" target="_blank" rel="noopener">这个博客</a>)</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="meta-keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>Upload Files using XMLHttpRequest - Minimal<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span>></span></span><br><span class="line"> function fileSelected() {</span><br><span class="line"> var file = document.getElementById('fileToUpload').files[0];</span><br><span class="line"> if (file) {</span><br><span class="line"> var fileSize = 0;</span><br><span class="line"> if (file.size > 1024 * 1024)</span><br><span class="line"> fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + 'MB';</span><br><span class="line"> else</span><br><span class="line"> fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + 'KB';</span><br><span class="line"> document.getElementById('fileName').innerHTML = 'Name: ' + file.name;</span><br><span class="line"> document.getElementById('fileSize').innerHTML = 'Size: ' + fileSize;</span><br><span class="line"> document.getElementById('fileType').innerHTML = 'Type: ' + file.type;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> function uploadFile() {</span><br><span class="line"> var fd = new FormData();</span><br><span class="line"> fd.append("fileToUpload", document.getElementById('fileToUpload').files[0]);</span><br><span class="line"> var xhr = new XMLHttpRequest();</span><br><span class="line"> xhr.upload.addEventListener("progress", uploadProgress, false);</span><br><span class="line"> xhr.addEventListener("load", uploadComplete, false);</span><br><span class="line"> xhr.addEventListener("error", uploadFailed, false);</span><br><span class="line"> xhr.addEventListener("abort", uploadCanceled, false);</span><br><span class="line"> xhr.open("POST", "/cgi-bin/LocalVideoUpload");//修改成自己的接口</span><br><span class="line"> xhr.send(fd);</span><br><span class="line"> }</span><br><span class="line"> function uploadProgress(evt) {</span><br><span class="line"> if (evt.lengthComputable) {</span><br><span class="line"> var percentComplete = Math.round(evt.loaded * 100 / evt.total);</span><br><span class="line"> document.getElementById('progressNumber').innerHTML = percentComplete.toString() + '%';</span><br><span class="line"> }</span><br><span class="line"> else {</span><br><span class="line"> document.getElementById('progressNumber').innerHTML = 'unable to compute';</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> function uploadComplete(evt) {</span><br><span class="line"> /* 服务器端返回响应时候触发event事件*/</span><br><span class="line"> alert(evt.target.responseText);</span><br><span class="line"> }</span><br><span class="line"> function uploadFailed(evt) {</span><br><span class="line"> alert("There was an error attempting to upload the file.");</span><br><span class="line"> }</span><br><span class="line"> function uploadCanceled(evt) {</span><br><span class="line"> alert("The upload has been canceled by the user or the browser dropped the connection.");</span><br><span class="line"> }</span><br><span class="line"> <span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">form</span> <span class="attr">id</span>=<span class="string">"form1"</span> <span class="attr">enctype</span>=<span class="string">"multipart/form-data"</span> <span class="attr">method</span>=<span class="string">"post"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"row"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">label</span> <span class="attr">for</span>=<span class="string">"fileToUpload"</span>></span>Select a File to Upload<span class="tag"></<span class="name">label</span>></span><span class="tag"><<span class="name">br</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"file"</span> <span class="attr">name</span>=<span class="string">"fileToUpload"</span> <span class="attr">id</span>=<span class="string">"fileToUpload"</span> ο<span class="attr">nchange</span>=<span class="string">"fileSelected();"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"fileName"</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"fileSize"</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"fileType"</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"row"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"button"</span> ο<span class="attr">nclick</span>=<span class="string">"uploadFile()"</span> <span class="attr">value</span>=<span class="string">"Upload"</span> /></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"progressNumber"</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">form</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure><p>此外,还可以使用libcurl库和winhttp库来直接对cgi发起上传文件的POST请求,可以参考<a href="https://www.cnblogs.com/cswuyg/p/3185164.html" target="_blank" rel="noopener">这个博客</a>。</p><p>POST上传数据的时候,除了multipart/form-data外,还有默认的application/x-www-from-urlencoded类型,这种类型会将数据转化为键值对key=value&key2=value2这样的,同时还会对数据进行编码(不适合文件上传)。还有raw类型,其Content-Type为text/plain或者application/json,text/html这样的。其内容不会被修改。有关更多的Content-Type内容,可以参考<a href="https://www.cnblogs.com/52fhy/p/5436673.html" target="_blank" rel="noopener">这个博客</a>。除此之外还有一种binary类型,其Content-Type为application/octet-stream,由于没有分隔符,因此只能上传一个文件。</p><p>文章转自: <a href="https://blog.csdn.net/Kiritow/article/details/81697694" target="_blank" rel="noopener">https://blog.csdn.net/Kiritow/article/details/81697694</a></p>]]></content>
<summary type="html">学长经验分享</summary>
<category term="-public" scheme="http://qustkx.com/tags/public/"/>
</entry>
<entry>
<title>从标准输入stdin读取二进制数据</title>
<link href="http://qustkx.com/2019/08/17/blog3/"/>
<id>http://qustkx.com/2019/08/17/blog3/</id>
<published>2019-08-17T02:52:51.000Z</published>
<updated>2019-08-27T13:37:53.994Z</updated>
<content type="html"><![CDATA[<p>C/C++提供的标准输入stdin默认是以”r”模式打开的,在Linux下由于”r”和”rb”效果相同,因此不会受到影响。在Windows下,”r”意味着文本模式,\r\n会被转换成\n,而且遇到EOF就会停止。</p><p>因此为了从标准输入读取二进制数据,需要向程序中添加以下代码:</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><io.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><fcntl.h></span></span></span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> _setmode(_fileno(<span class="built_in">stdin</span>), _O_BINARY);</span><br></pre></td></tr></table></figure><p>这段代码使用了fcntl.h中的_setmode函数将stdin模式设置为二进制模式。</p><p>另外据说还有一种 freopen(NULL,”rb”,stdin) 的写法,但根据我的测试并没有效果,不推荐使用。</p><p>需要注意的是,一旦设置成了二进制模式,换行符的自动转换将不会被进行。</p><p>文章转自: <a href="https://blog.csdn.net/Kiritow/article/details/81697542" target="_blank" rel="noopener">https://blog.csdn.net/Kiritow/article/details/81697542</a></p>]]></content>
<summary type="html">学长经验分享</summary>
<category term="-public" scheme="http://qustkx.com/tags/public/"/>
</entry>
<entry>
<title>start命令使用需要注意的问题</title>
<link href="http://qustkx.com/2019/08/17/blog2/"/>
<id>http://qustkx.com/2019/08/17/blog2/</id>
<published>2019-08-17T02:52:51.000Z</published>
<updated>2019-08-27T13:37:53.995Z</updated>
<content type="html"><![CDATA[<p>写一段bat脚本,需要不阻塞的调用一个外部程序,于是使用start命令. 遇到了一些坑。</p><ol><li>启动一个路径带空格的程序</li></ol><p>第一直觉是start “command with blank”,但是行不通,因为start默认第一个参数是title因此写start command是可以的但是写start “command with blank”就不行了. 因为此时command with blank就成了新窗口的标题,而内部则是一个cmd程序。因此要写成start “” “command with blank”,或者填写上标题。当然还有另一种办法,先chdir到那个文件夹然后再启动程序。</p><ol start="2"><li>启动一个带参数的程序</li></ol><p>非常naive的写start “title” “command -c xxxx”然后提示command -c xxxx未找到,看来是直接把这一串当成文件名了。于是改成start “title” “command” “-c xxxx”但是也行不通。经过几番尝试发现start “title” “command” “-c=xxxx”和start “title” “command” “-c” “xxx”和start “title” command -c xxxx都可行.</p><p>文章转自: <a href="https://blog.csdn.net/Kiritow/article/details/81323237" target="_blank" rel="noopener">https://blog.csdn.net/Kiritow/article/details/81323237</a></p>]]></content>
<summary type="html">学长经验分享</summary>
<category term="-public" scheme="http://qustkx.com/tags/public/"/>
</entry>
<entry>
<title>Ubuntu下sudo速度很慢原因及解决办法</title>
<link href="http://qustkx.com/2019/08/17/blog4/"/>
<id>http://qustkx.com/2019/08/17/blog4/</id>
<published>2019-08-17T02:52:51.000Z</published>
<updated>2019-08-27T13:37:53.994Z</updated>
<content type="html"><![CDATA[<p>这个问题是最近装Ubuntu Server 18.04 LTS时遇到的,之前用Ubuntu Server 16.04 LTS并没有发现这个问题.</p><p>症状:sudo速度非常慢,提交命令之后大概需要10秒左右才有输入sudo密码或者开始运行。su命令症状相同。</p><p>原因:Ubuntu Server被设计成一种类似于分布式的操作系统网结构,允许/etc/sudoers中的成员不在本机上。从而sudo时会先从网络上寻找可能的sudoer然后才是本地. 而这10s左右的时间就是整个DNS流程的最长时间.</p><p>解决方案:首先输入hostname,得到本机当前的互联网名称(大概跟windows下的计算机名称差不多)。然后使用su或sudo打开/etc/hosts,添加一行:</p><p>127.0.0.1<tab>计算机名<tab>计算机名.localdomain</tab></tab></p><p>关闭并保存,sudo速度恢复正常</p><p>文章转自: <a href="https://blog.csdn.net/Kiritow/article/details/80687036" target="_blank" rel="noopener">https://blog.csdn.net/Kiritow/article/details/80687036</a></p>]]></content>
<summary type="html">学长经验分享</summary>
<category term="-public" scheme="http://qustkx.com/tags/public/"/>
</entry>
<entry>
<title>图书搜索</title>
<link href="http://qustkx.com/2019/08/17/blog5/"/>
<id>http://qustkx.com/2019/08/17/blog5/</id>
<published>2019-08-17T02:52:51.000Z</published>
<updated>2019-08-27T13:37:49.065Z</updated>
<content type="html"><![CDATA[<p>学校的图书馆几年前进行了电子化,因为学校比较弱所以貌似是购买的图书管理系统。无奈这个系统实在是太坑。。。搜索界面点击确定半天都不跳转,分类也是乱七八糟的。。。这严重已经我的心情和工作效率呀!于是今天大半天时间都在写这个图书搜索器。写完之后果然感觉好用一万倍w 各种便利!而且可以生成表单数据,无需处理就能被大多数程序读取并理解。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">BOOKRECNO=1900191914</span><br><span class="line">AUTHOR=庞培编</span><br><span class="line">AUTHOR=庞培编</span><br><span class="line">ISBN=978-7-5354-6413-2</span><br><span class="line">PAGE=12,315页</span><br><span class="line">PRICE=CNY48.00</span><br><span class="line">PUBLISHER=长江文艺出版社</span><br><span class="line">PUBDATE=2013.04</span><br><span class="line">TITLE=江南十二人诗歌集</span><br><span class="line">SUBJECT=诗集</span><br><span class="line">BOOKTYPE=1</span><br><span class="line">BOOKRECNO=1900236135</span><br><span class="line">AUTHOR=闻一多著</span><br><span class="line">AUTHOR=闻一多著</span><br><span class="line">ISBN=978-7-200-11213-9</span><br><span class="line">PAGE=17,325页</span><br><span class="line">PRICE=CNY38.00</span><br><span class="line">PUBLISHER=北京出版社</span><br><span class="line">PUBDATE=2015</span><br><span class="line">TITLE=闻一多说唐诗</span><br><span class="line">SUBJECT=唐诗</span><br><span class="line">BOOKTYPE=1</span><br><span class="line">BOOKRECNO=15537</span><br><span class="line">AUTHOR=诗刊社</span><br><span class="line">AUTHOR=诗刊社</span><br><span class="line">PAGE=389页</span><br><span class="line">PRICE=¥5.10</span><br><span class="line">PUBLISHER=人民文学出版社</span><br></pre></td></tr></table></figure><p>生成的数据差不多就是这个样子啦w<br>当然相应的我也写了一个详情获取的API,然后根据今天尝试C++11新特性std::thread用了多线程(尽管比pthread的代码少,但更多感觉是【不好控制】,没完没了的抛异常…)一边搜索一边获取详情补充,不过结果貌似不太好…过几天我再用pthread试一下.</p><p>还有就是昨天晚上写的独立标识码= =,根据这个算法可以保证该设备的标识码一直不变,而且不同设备的标识码不可能相同。在用户登录与封禁的账户管理上也许会用到吧w</p><p>= = Good Night~</p><p>文章转自: <a href="https://blog.csdn.net/Kiritow/article/details/50499850" target="_blank" rel="noopener">https://blog.csdn.net/Kiritow/article/details/50499850</a></p>]]></content>
<summary type="html">学长经验分享</summary>
<category term="-public" scheme="http://qustkx.com/tags/public/"/>
</entry>
<entry>
<title>迷之八皇后问题(回溯法)</title>
<link href="http://qustkx.com/2019/08/17/blog7/"/>
<id>http://qustkx.com/2019/08/17/blog7/</id>
<published>2019-08-17T02:52:51.000Z</published>
<updated>2019-08-27T13:37:49.065Z</updated>
<content type="html"><![CDATA[<p>虽然说看到这篇博客的人应该是知道八皇后的,但是以防万一,贴一下百度关于这个问题的定义:</p><p>八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题。</p><p>本来,这个问题是不难的,但是我这两天特别蒙… 所以一直在想这个问题却没想出来。正好最近还了解了一下回溯法,于是我就想用回溯法的思想来做。</p><p>下面是表意代码:</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">queen</span><span class="params">(<span class="keyword">int</span> CurrentLine)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">if</span>(CurrentLine==<span class="number">8</span>)</span><br><span class="line"> {</span><br><span class="line"> AnswerCountAdd();</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> Row=<span class="number">0</span>;Row<<span class="number">8</span>;Row++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(CanPlaceHere(CurrentLine,Row))</span><br><span class="line"> {</span><br><span class="line"> PlaceHere(CurrentLine,Row);</span><br><span class="line"> queen(CurrentLine+<span class="number">1</span>);</span><br><span class="line"> RemoveHere(CurrentLine,Row);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> ClearMap();</span><br><span class="line"> queen(<span class="number">0</span>);</span><br><span class="line"> ShowAnswer();</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>经过将近一整天的思考之后,表意代码最终具体化为如下:</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><cstdio></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><cstring></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="comment">/// LINE ROW</span></span><br><span class="line"><span class="keyword">int</span> <span class="built_in">map</span>[<span class="number">8</span>][<span class="number">8</span>];</span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">TryPlace</span><span class="params">(<span class="keyword">int</span> Line,<span class="keyword">int</span> Row)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">if</span>(<span class="built_in">map</span>[Line][Row]==<span class="number">1</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>; i<<span class="number">8</span>; i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(<span class="built_in">map</span>[Line][i]==<span class="number">1</span>||<span class="built_in">map</span>[i][Row]==<span class="number">1</span>) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">/// Main Diagonal</span></span><br><span class="line"> <span class="keyword">int</span> CLine,CRow;</span><br><span class="line"> <span class="keyword">if</span>(Line<Row)</span><br><span class="line"> {</span><br><span class="line"> CLine=<span class="number">0</span>;</span><br><span class="line"> CRow=Row-Line;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> CRow=<span class="number">0</span>;</span><br><span class="line"> CLine=Line-Row;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">while</span>(CLine<<span class="number">8</span>&&CRow<<span class="number">8</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(<span class="built_in">map</span>[CLine][CRow]==<span class="number">1</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> CLine++;</span><br><span class="line"> CRow++;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="comment">/// Sub Diagonal</span></span><br><span class="line"> <span class="keyword">if</span>(Line+Row<=<span class="number">7</span>)</span><br><span class="line"> {</span><br><span class="line"> CLine=<span class="number">0</span>;</span><br><span class="line"> CRow=Line+Row;</span><br><span class="line"> <span class="keyword">while</span>(CLine<<span class="number">8</span>&&CRow>=<span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(<span class="built_in">map</span>[CLine][CRow]==<span class="number">1</span>) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> CLine++;</span><br><span class="line"> CRow--;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> CLine=<span class="number">7</span>;</span><br><span class="line"> CRow=Line+Row<span class="number">-7</span>;</span><br><span class="line"> <span class="keyword">while</span>(CLine>=<span class="number">0</span>&&CRow<<span class="number">8</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(<span class="built_in">map</span>[CLine][CRow]==<span class="number">1</span>) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> CLine--;</span><br><span class="line"> CRow++;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">print</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>; i<<span class="number">8</span>; i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>; j<<span class="number">8</span>; j++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(<span class="built_in">map</span>[i][j])</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"#"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"."</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"\n"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"\n\n"</span>);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">int</span> ans=<span class="number">0</span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">queen</span><span class="params">(<span class="keyword">int</span> CurrentLine)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">if</span>(CurrentLine>=<span class="number">8</span>)</span><br><span class="line"> {</span><br><span class="line"> ans++;</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> row=<span class="number">0</span>; row<<span class="number">8</span>; row++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(TryPlace(CurrentLine,row))</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">map</span>[CurrentLine][row]=<span class="number">1</span>;</span><br><span class="line"> queen(CurrentLine+<span class="number">1</span>);</span><br><span class="line"> <span class="built_in">map</span>[CurrentLine][row]=<span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">memset</span>(<span class="built_in">map</span>,<span class="number">0</span>,<span class="keyword">sizeof</span>(<span class="keyword">int</span>)*<span class="number">8</span>*<span class="number">8</span>);</span><br><span class="line"> queen(<span class="number">0</span>);</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"%d\n"</span>,ans);</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>运行成功,答案自然是92啦~ (过两天推广到N皇后问题)<br>下面是学长给出的一段代码,好简短的样子= =</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"> </span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"> </span><br><span class="line"><span class="keyword">int</span> vis[<span class="number">3</span>][<span class="number">30</span>];</span><br><span class="line"><span class="keyword">int</span> cnt = <span class="number">0</span>;</span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">dfs</span><span class="params">(<span class="keyword">int</span> n)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">if</span> (n == <span class="number">9</span>)</span><br><span class="line"> cnt++;</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">1</span>; i<<span class="number">9</span>; ++i)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(vis[<span class="number">0</span>][i] == <span class="number">0</span> && vis[<span class="number">1</span>][n+i] == <span class="number">0</span> && vis[<span class="number">2</span>][n-i+<span class="number">8</span>] == <span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> vis[<span class="number">0</span>][i] = vis[<span class="number">1</span>][n+i] = vis[<span class="number">2</span>][n-i+<span class="number">8</span>] = <span class="number">1</span>;</span><br><span class="line"> dfs(n+<span class="number">1</span>);</span><br><span class="line"> vis[<span class="number">0</span>][i] = vis[<span class="number">1</span>][n+i] = vis[<span class="number">2</span>][n-i+<span class="number">8</span>] = <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> dfs(<span class="number">1</span>);</span><br><span class="line"> <span class="built_in">cout</span> << cnt << <span class="built_in">endl</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>文章转自: <a href="https://blog.csdn.net/Kiritow/article/details/50966921" target="_blank" rel="noopener">https://blog.csdn.net/Kiritow/article/details/50966921</a></p>]]></content>
<summary type="html">学长经验分享</summary>
<category term="-public" scheme="http://qustkx.com/tags/public/"/>
</entry>
<entry>
<title>MySQL Server 5.7 安装记录</title>
<link href="http://qustkx.com/2019/08/17/blog9/"/>
<id>http://qustkx.com/2019/08/17/blog9/</id>
<published>2019-08-17T02:52:51.000Z</published>
<updated>2020-09-03T08:30:56.089Z</updated>
<content type="html"><![CDATA[<p>首先去官网下载安装文件,这里下载的是ZIP免安装版本,我下载的是MySQL 5.7</p><p>MySQL官网 <a href="https://www.mysql.com/" target="_blank" rel="noopener">https://www.mysql.com/</a></p><p>MySQL下载 <a href="https://www.mysql.com/downloads/" target="_blank" rel="noopener">https://www.mysql.com/downloads/</a> 选择Windows平台</p><p>下载的时候不要选择带test的那个…之前下错了打开之后发现都没法安装(可能是还不太会…)</p><p>下载之后,解压到任一英文路径的文件夹。如果把此文件夹当做安装目录,后面需要修改一下注册表。MySQL的默认安装目录是C:\Program Files\MySQL Server 5.7.</p><p>首先,添加\bin目录到PATH环境变量下.</p><p>使用管理员权限启动cmd,输入mysqld –initialize进行初始化(否则后面会出现启动失败2:找不到文件)</p><p>然后执行安装 mysqld –install (如果需要使用别的ini配置文件需要添加–defaults-file=配置文件路径)</p><p>这里,如果安装文件夹不是默认的,需要修改注册表:</p><p>运行regedit -> 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL</p><p>右边ImagePath右键修改为你的安装文件夹,如果使用了ini配置文件需要添加–defaults-file=配置文件路径</p><p>比如我的: “C:\MySQL Server\bin\mysqld.exe” –defaults-file=”C:\MySQL Server\my-default.ini” MySQL</p><p>完成之后在管理员cmd里面输入 net start MySQL</p><p>MySQL服务正在启动…</p><p>启动成功!</p><p>之前遇到的其他问题:</p><p>服务刚启动就结束 NET HELPMSG 3534</p><p>这种情况下是没有执行初始化操作,初始化操作是从5.7开始的. 解决方法: 停止服务,sc 删除掉,然后执行初始化,再安装,启动</p><p>文章转自: <a href="https://blog.csdn.net/Kiritow/article/details/51814878" target="_blank" rel="noopener">https://blog.csdn.net/Kiritow/article/details/51814878</a></p>]]></content>
<summary type="html">学长经验分享</summary>
<category term="-public" scheme="http://qustkx.com/tags/public/"/>
</entry>
<entry>
<title>升级Win下工具链以支持C++17</title>
<link href="http://qustkx.com/2019/08/17/blog10/"/>
<id>http://qustkx.com/2019/08/17/blog10/</id>
<published>2019-08-17T02:52:51.000Z</published>
<updated>2019-08-27T13:37:44.641Z</updated>
<content type="html"><![CDATA[<p>上次更新后使用的TDM GCC 5.1仅支持了C++11和部分C++14功能。这次选用MinGW-w64提供的Win下的工具链,地址如下:</p><p><a href="https://sourceforge.net/projects/mingw-w64/" target="_blank" rel="noopener">https://sourceforge.net/projects/mingw-w64/</a></p><p>上次我也看到这个网站,但我想当然的以为最后更新是文件夹上标注的2015年。其实内部MinGW-w64的GCC已经支持到7.1啦</p><p>选择Win32,thread model选POSIX(Win32线程模型版本的不支持C++11的多线程),dwarf的Build,下载解压即可。</p><p>随后导入到Codeblocks中一试,完美~!</p><p>文章转自: <a href="https://blog.csdn.net/Kiritow/article/details/75428302" target="_blank" rel="noopener">https://blog.csdn.net/Kiritow/article/details/75428302</a></p>]]></content>
<summary type="html">学长经验分享</summary>
<category term="-public" scheme="http://qustkx.com/tags/public/"/>
</entry>
<entry>
<title>大数运算</title>
<link href="http://qustkx.com/2019/08/17/blog6/"/>
<id>http://qustkx.com/2019/08/17/blog6/</id>
<published>2019-08-17T02:52:51.000Z</published>
<updated>2019-08-27T13:37:49.065Z</updated>
<content type="html"><![CDATA[<p>自己写的大数运算,目前只写了加减乘三个操作。负数、小数、除法还在研究当中。。。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><cstdlib></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><cstring></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><cstdio></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> DEFAULT_BUFF_SIZE 3000</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> SECURITY_BUFF_SIZE 8</span></span><br><span class="line"> </span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"> </span><br><span class="line"><span class="comment">//Kiritow's General class BigNumber. Written on Nov. 14th, 2015</span></span><br><span class="line"><span class="comment">//BigNumber Build 1</span></span><br><span class="line"><span class="comment">//All rights reserved. Nobody is allowed to copy without permission.</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">bign</span></span></span><br><span class="line"><span class="class">{</span></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> <span class="keyword">int</span>* data;</span><br><span class="line"> <span class="keyword">int</span> data_max;</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> bign()</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">try</span></span><br><span class="line"> {</span><br><span class="line"> data=<span class="keyword">new</span> <span class="keyword">int</span>[DEFAULT_BUFF_SIZE];</span><br><span class="line"> data_max=DEFAULT_BUFF_SIZE;</span><br><span class="line"> set_empty();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">catch</span>(...)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">cerr</span><<<span class="string">"Class BIGN : "</span><<(<span class="keyword">void</span>*)<span class="keyword">this</span><<<span class="string">" : Cannot get enough memory"</span><<<span class="built_in">endl</span>;</span><br><span class="line"> data_max=<span class="number">0</span>;</span><br><span class="line"> data=<span class="literal">nullptr</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> bign(<span class="keyword">const</span> bign& inc)</span><br><span class="line"> {</span><br><span class="line"> data_max=inc.data_max;</span><br><span class="line"> <span class="keyword">try</span></span><br><span class="line"> {</span><br><span class="line"> data=<span class="keyword">new</span> <span class="keyword">int</span>[data_max];</span><br><span class="line"> set_empty();</span><br><span class="line"> <span class="built_in">memcpy</span>(data,inc.data,<span class="keyword">sizeof</span>(<span class="keyword">int</span>)*data_max);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">catch</span>(...)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">cerr</span><<<span class="string">"Class BIGN : "</span><<(<span class="keyword">void</span>*)<span class="keyword">this</span><<<span class="string">" : Cannot get enough memory"</span><<<span class="built_in">endl</span>;</span><br><span class="line"> data_max=<span class="number">0</span>;</span><br><span class="line"> data=<span class="literal">nullptr</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> bign(<span class="keyword">long</span> inc)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">char</span> buff[<span class="number">32</span>];</span><br><span class="line"> <span class="keyword">try</span></span><br><span class="line"> {</span><br><span class="line"> <span class="comment">//This is a BIG try module, which is not recommend.</span></span><br><span class="line"> <span class="comment">//But here we have to write it like this as we don't want any exceptions thrown in constructor</span></span><br><span class="line"> <span class="comment">//and we don't know which type to return.</span></span><br><span class="line"> data=<span class="keyword">new</span> <span class="keyword">int</span>[DEFAULT_BUFF_SIZE];</span><br><span class="line"> data_max=DEFAULT_BUFF_SIZE;</span><br><span class="line"> set_empty();</span><br><span class="line"> <span class="built_in">memset</span>(buff,<span class="number">0</span>,<span class="number">32</span>);</span><br><span class="line"> <span class="built_in">sprintf</span>(buff,<span class="string">"%ld"</span>,inc);</span><br><span class="line"> <span class="keyword">int</span> len=<span class="built_in">strlen</span>(buff);</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=len<span class="number">-1</span>;i>=<span class="number">0</span>;i--)</span><br><span class="line"> {</span><br><span class="line"> data[len<span class="number">-1</span>-i]=buff[i]-<span class="string">'0'</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">catch</span>(...)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">cerr</span><<<span class="string">"Class BIGN : "</span><<(<span class="keyword">void</span>*)<span class="keyword">this</span><<<span class="string">" : Cannot get enough memory"</span><<<span class="built_in">endl</span>;</span><br><span class="line"> data=<span class="literal">nullptr</span>;</span><br><span class="line"> data_max=<span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> bign(<span class="keyword">const</span> <span class="keyword">char</span>* inc)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">int</span> len=<span class="built_in">strlen</span>(inc);</span><br><span class="line"> data=<span class="literal">nullptr</span>;</span><br><span class="line"> <span class="keyword">if</span>(len>DEFAULT_BUFF_SIZE)</span><br><span class="line"> {</span><br><span class="line"> data_max=len+SECURITY_BUFF_SIZE;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> data_max=DEFAULT_BUFF_SIZE;</span><br><span class="line"> }</span><br><span class="line"> reset_buff_size(data_max);</span><br><span class="line"> <span class="keyword">if</span>(data!=<span class="literal">nullptr</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=len<span class="number">-1</span>; i>=<span class="number">0</span>; i--)</span><br><span class="line"> {</span><br><span class="line"> data[len<span class="number">-1</span>-i]=inc[i]-<span class="string">'0'</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> ~bign()</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(data!=<span class="literal">nullptr</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">delete</span>[] data;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">char</span>* <span class="title">convert_to_str</span><span class="params">(<span class="keyword">char</span>* str)</span></span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> <span class="keyword">int</span> lenx=len();</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=lenx<span class="number">-1</span>;i>=<span class="number">0</span>;i--)</span><br><span class="line"> {</span><br><span class="line"> str[lenx-i<span class="number">-1</span>]=data[i]+<span class="string">'0'</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> str;</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">bool</span> <span class="title">can_be_converted_to_long</span><span class="params">()</span></span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> <span class="keyword">int</span> thislen=len();</span><br><span class="line"> <span class="keyword">if</span>(thislen<<span class="number">10</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (thislen==<span class="number">10</span>)</span><br><span class="line"> {</span><br><span class="line"> bign tmp(<span class="number">2147438647</span>);</span><br><span class="line"> <span class="keyword">return</span> *<span class="keyword">this</span><tmp;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">operator</span> <span class="title">long</span><span class="params">()</span> <span class="title">throw</span><span class="params">(<span class="keyword">const</span> <span class="keyword">char</span>*)</span></span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> <span class="keyword">if</span>(can_be_converted_to_long())</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">char</span> buff[<span class="number">32</span>];</span><br><span class="line"> <span class="built_in">memset</span>(buff,<span class="number">0</span>,<span class="number">32</span>);</span><br><span class="line"> <span class="keyword">int</span> length=len();</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<length;i++)</span><br><span class="line"> {</span><br><span class="line"> buff[length-i<span class="number">-1</span>]=data[i];</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">long</span> tmp;</span><br><span class="line"> <span class="built_in">sscanf</span>(buff,<span class="string">"%ld"</span>,&tmp);</span><br><span class="line"> <span class="keyword">return</span> tmp;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">throw</span> <span class="string">"BIGN::operator long int() : cannot convert to type long"</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">set_empty</span><span class="params">()</span></span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> <span class="built_in">memset</span>(data,<span class="number">0</span>,<span class="keyword">sizeof</span>(<span class="keyword">int</span>)*data_max);</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">int</span> <span class="title">len</span><span class="params">()</span> <span class="keyword">const</span></span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=data_max<span class="number">-1</span>;i>=<span class="number">0</span>;i--)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(data[i]!=<span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> i+<span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">int</span> <span class="title">reset_buff_size</span><span class="params">(<span class="keyword">int</span> NewBuffSize)</span></span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> <span class="keyword">if</span>(data!=<span class="literal">nullptr</span>) <span class="keyword">delete</span>[] data;</span><br><span class="line"> <span class="keyword">try</span></span><br><span class="line"> {</span><br><span class="line"> data=<span class="keyword">new</span> <span class="keyword">int</span>[NewBuffSize];</span><br><span class="line"> data_max=NewBuffSize;</span><br><span class="line"> set_empty();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">catch</span>(...)</span><br><span class="line"> {</span><br><span class="line"> data=<span class="literal">nullptr</span>;</span><br><span class="line"> data_max=<span class="number">0</span>;</span><br><span class="line"> <span class="built_in">cerr</span><<<span class="string">"Class BIGN : "</span><<(<span class="keyword">void</span>*)<span class="keyword">this</span><<<span class="string">" : Cannot get enough memory"</span><<<span class="built_in">endl</span>;</span><br><span class="line"> <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">bool</span> <span class="keyword">operator</span> < (<span class="keyword">const</span> bign& inc) <span class="keyword">const</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(<span class="keyword">this</span>==&inc) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> <span class="keyword">int</span> lena=len();</span><br><span class="line"> <span class="keyword">int</span> lenb=inc.len();</span><br><span class="line"> <span class="keyword">if</span>(lena<lenb)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span>(lenb>lena)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=lena<span class="number">-1</span>;i>=<span class="number">0</span>;i--)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(data[i]<inc.data[i])</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span>(data[i]>inc.data[i])</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">bool</span> <span class="keyword">operator</span> > (<span class="keyword">const</span> bign& inc) <span class="keyword">const</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(<span class="keyword">this</span>==&inc) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> <span class="keyword">int</span> lena=len();</span><br><span class="line"> <span class="keyword">int</span> lenb=inc.len();</span><br><span class="line"> <span class="keyword">if</span>(lena<lenb)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span>(lenb>lena)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=lena<span class="number">-1</span>;i>=<span class="number">0</span>;i--)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(data[i]<inc.data[i])</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span>(data[i]>inc.data[i])</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">bool</span> <span class="keyword">operator</span> == (<span class="keyword">const</span> bign& inc) <span class="keyword">const</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(<span class="keyword">this</span>==&inc) <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> <span class="keyword">int</span> lena=len();</span><br><span class="line"> <span class="keyword">int</span> lenb=inc.len();</span><br><span class="line"> <span class="keyword">if</span>(lena!=lenb)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=lena<span class="number">-1</span>;i>=<span class="number">0</span>;i--)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(data[i]!=inc.data[i])</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">bool</span> <span class="keyword">operator</span> >= (<span class="keyword">const</span> bign& inc) <span class="keyword">const</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> (*<span class="keyword">this</span>>inc)&&(*<span class="keyword">this</span>==inc);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">bool</span> <span class="keyword">operator</span> <= (<span class="keyword">const</span> bign& inc) <span class="keyword">const</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> (*<span class="keyword">this</span><inc)&&(*<span class="keyword">this</span>==inc);</span><br><span class="line"> }</span><br><span class="line"> bign& <span class="keyword">operator</span> = (<span class="keyword">const</span> bign& inc)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(<span class="keyword">this</span>==&inc) <span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line"> <span class="keyword">if</span>(inc.data_max>data_max)</span><br><span class="line"> {</span><br><span class="line"> reset_buff_size(inc.data_max);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<inc.data_max;i++)</span><br><span class="line"> {</span><br><span class="line"> data[i]=inc.data[i];</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">friend</span> bign <span class="keyword">operator</span> + (<span class="keyword">const</span> bign& a,<span class="keyword">const</span> bign& b);</span><br><span class="line"> <span class="keyword">friend</span> bign <span class="keyword">operator</span> - (<span class="keyword">const</span> bign& a,<span class="keyword">const</span> bign& b);</span><br><span class="line"> <span class="keyword">friend</span> bign <span class="keyword">operator</span> * (<span class="keyword">const</span> bign& a,<span class="keyword">const</span> bign& b);</span><br><span class="line">};</span><br><span class="line"> </span><br><span class="line">bign <span class="keyword">operator</span> + (<span class="keyword">const</span> bign& a ,<span class="keyword">const</span> bign& b)</span><br><span class="line">{</span><br><span class="line"> bign tmp;</span><br><span class="line"> <span class="keyword">int</span> maxsize=(a.data_max>b.data_max)?(a.data_max):(b.data_max);</span><br><span class="line"> <span class="keyword">if</span>(maxsize>tmp.data_max)</span><br><span class="line"> {</span><br><span class="line"> tmp.reset_buff_size(maxsize);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">int</span> maxlen=(a.len()>b.len())?(a.len()):(b.len());</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<maxlen;i++)</span><br><span class="line"> {</span><br><span class="line"> tmp.data[i]+=a.data[i]+b.data[i];</span><br><span class="line"> <span class="keyword">if</span>(tmp.data[i]><span class="number">9</span>)</span><br><span class="line"> {</span><br><span class="line"> tmp.data[i]-=<span class="number">10</span>;</span><br><span class="line"> tmp.data[i+<span class="number">1</span>]++;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> tmp;</span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line">bign <span class="keyword">operator</span> - (<span class="keyword">const</span> bign& a,<span class="keyword">const</span> bign& b)</span><br><span class="line">{</span><br><span class="line"> bign tmp;</span><br><span class="line"> <span class="keyword">int</span> maxsize=(a.data_max>b.data_max)?(a.data_max):(b.data_max);</span><br><span class="line"> <span class="keyword">if</span>(maxsize>tmp.data_max)</span><br><span class="line"> {</span><br><span class="line"> tmp.reset_buff_size(maxsize);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">int</span> maxlen=(a.len()>b.len())?(a.len()):(b.len());</span><br><span class="line"> <span class="keyword">if</span>(a>b)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<maxlen;i++)</span><br><span class="line"> {</span><br><span class="line"> tmp.data[i]+=a.data[i]-b.data[i];</span><br><span class="line"> <span class="keyword">if</span>(tmp.data[i]<<span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> tmp.data[i]+=<span class="number">10</span>;</span><br><span class="line"> tmp.data[i+<span class="number">1</span>]--;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span>(a<b)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<maxlen;i++)</span><br><span class="line"> {</span><br><span class="line"> tmp.data[i]+=b.data[i]-a.data[i];</span><br><span class="line"> <span class="keyword">if</span>(tmp.data[i]<<span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> tmp.data[i]+=<span class="number">10</span>;</span><br><span class="line"> tmp.data[i+<span class="number">1</span>]--;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> tmp;</span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line">bign <span class="keyword">operator</span> * (<span class="keyword">const</span> bign& a,<span class="keyword">const</span> bign& b)</span><br><span class="line">{</span><br><span class="line"> bign tmp;</span><br><span class="line"> <span class="keyword">int</span> lena=a.len();</span><br><span class="line"> <span class="keyword">int</span> lenb=b.len();</span><br><span class="line"> <span class="keyword">if</span>(tmp.data_max<lena+lenb+<span class="number">1</span>)</span><br><span class="line"> {</span><br><span class="line"> tmp.reset_buff_size(lena+lenb+<span class="number">1</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<lena;i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j<lenb;j++)</span><br><span class="line"> {</span><br><span class="line"> tmp.data[i+j]+=a.data[i]*b.data[j];</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<tmp.data_max<span class="number">-1</span>;i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(tmp.data[i]><span class="number">9</span>)</span><br><span class="line"> {</span><br><span class="line"> tmp.data[i+<span class="number">1</span>]+=tmp.data[i]/<span class="number">10</span>;</span><br><span class="line"> tmp.data[i]=tmp.data[i]%<span class="number">10</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> tmp;</span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="keyword">char</span> buff[<span class="number">3000</span>];</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> bign a("1234"),b("5678");</span><br><span class="line"> a=a+b;</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"%s\n"</span>,a.convert_to_str(buff));</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>在写的时候参考了一下string的设计,之前operator都是以成员函数重载的,所以这样的操作</p><p>bign a,b;<br>a+b;</p><p>a+b的时候就会直接把结果存入a中,然而并不一定符合本意。<br>所以就改成了友元函数,并且返回值而不是引用。</p><p>文章转自: <a href="https://blog.csdn.net/Kiritow/article/details/49851521" target="_blank" rel="noopener">https://blog.csdn.net/Kiritow/article/details/49851521</a></p>]]></content>
<summary type="html">学长经验分享</summary>
<category term="-public" scheme="http://qustkx.com/tags/public/"/>
</entry>
<entry>
<title>优先队列priority_queue的使用方法</title>
<link href="http://qustkx.com/2019/08/17/blog8/"/>
<id>http://qustkx.com/2019/08/17/blog8/</id>
<published>2019-08-17T02:52:51.000Z</published>
<updated>2019-08-27T13:37:49.065Z</updated>
<content type="html"><![CDATA[<p>以下内容摘自<a href="http://blog.csdn.net/morewindows/article/details/6976468" target="_blank" rel="noopener">http://blog.csdn.net/morewindows/article/details/6976468</a></p><p>priority_queue 优先级队列是一个拥有权值概念的单向队列queue,在这个队列中,所有元素是按优先级排列的(也可以认为queue是个按进入队列的先后做为优先级的优先级队列——先进入队列的元素优先权要高于后进入队列的元素)。在计算机操作系统中,优先级队列的使用是相当频繁的,进线程调度都会用到。在STL的具体实现中,priority_queue也是以别的容器作为底部结构,再根据堆的处理规则来调整元素之间的位置。下面给出priority_queue的函数列表和VS2008中priority_queue的源代码,本文中与heap有关的函数参见<a href="http://blog.csdn.net/morewindows/article/details/6967409" target="_blank" rel="noopener">《STL系列之四 heap 堆》</a>。</p><p><img src="https://i.loli.net/2019/08/21/Xs5NmxylUDuzhd3.png" alt="3.png"></p><p>可以看出priority_queue的函数列表与栈stack的函数列表是相同的。</p><p>VS2008中priority_queue 优先级队列的源代码</p><p>友情提示:初次阅读时请注意其实现思想,不要在细节上浪费过多的时间</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//VS2008中 priority_queue的定义 MoreWindows整理( http://blog.csdn.net/MoreWindows ) </span></span><br><span class="line"><span class="keyword">template</span><<span class="class"><span class="keyword">class</span> _<span class="title">Ty</span>, <span class="title">class</span> _<span class="title">Container</span> = <span class="title">vector</span><_Ty>, <span class="title">class</span> _<span class="title">Pr</span> = <span class="title">less</span><typename _Container::value_type> > //默认以<span class="title">vector</span>为容器的 </span></span><br><span class="line"><span class="class"><span class="title">class</span> <span class="title">priority_queue</span> </span></span><br><span class="line"><span class="class">{</span> <span class="comment">// priority queue implemented with a _Container </span></span><br><span class="line"><span class="keyword">public</span>: </span><br><span class="line"> <span class="keyword">typedef</span> _Container container_type; </span><br><span class="line"> <span class="keyword">typedef</span> <span class="keyword">typename</span> _Container::value_type value_type; </span><br><span class="line"> <span class="keyword">typedef</span> <span class="keyword">typename</span> _Container::size_type size_type; </span><br><span class="line"> <span class="keyword">typedef</span> <span class="keyword">typename</span> _Container::reference reference; </span><br><span class="line"> <span class="keyword">typedef</span> <span class="keyword">typename</span> _Container::const_reference const_reference; </span><br><span class="line"> </span><br><span class="line"> priority_queue() : c(), comp() </span><br><span class="line"> { <span class="comment">// construct with empty container, default comparator </span></span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> explicit priority_queue(const _Pr& _Pred) : c(), comp(_Pred) </span><br><span class="line"> { <span class="comment">// construct with empty container, specified comparator </span></span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> priority_queue(<span class="keyword">const</span> _Pr& _Pred, <span class="keyword">const</span> _Container& _Cont) : c(_Cont), comp(_Pred) </span><br><span class="line"> { <span class="comment">// construct by copying specified container, comparator </span></span><br><span class="line"> make_heap(c.begin(), c.end(), comp); <span class="comment">//参见《STL系列之四 heap 堆的相关函数》 </span></span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> <span class="keyword">template</span><<span class="class"><span class="keyword">class</span> _<span class="title">Iter</span>> </span></span><br><span class="line"><span class="class"> <span class="title">priority_queue</span>(_<span class="title">Iter</span> _<span class="title">First</span>, _<span class="title">Iter</span> _<span class="title">Last</span>) :</span> c(_First, _Last), comp() </span><br><span class="line"> { <span class="comment">// construct by copying [_First, _Last), default comparator </span></span><br><span class="line"> make_heap(c.begin(), c.end(), comp); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> <span class="keyword">template</span><<span class="class"><span class="keyword">class</span> _<span class="title">Iter</span>> </span></span><br><span class="line"><span class="class"> <span class="title">priority_queue</span>(_<span class="title">Iter</span> _<span class="title">First</span>, _<span class="title">Iter</span> _<span class="title">Last</span>, <span class="title">const</span> _<span class="title">Pr</span>& _<span class="title">Pred</span>) :</span> c(_First, _Last), comp(_Pred) </span><br><span class="line"> { <span class="comment">// construct by copying [_First, _Last), specified comparator </span></span><br><span class="line"> make_heap(c.begin(), c.end(), comp); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> <span class="keyword">template</span><<span class="class"><span class="keyword">class</span> _<span class="title">Iter</span>> </span></span><br><span class="line"><span class="class"> <span class="title">priority_queue</span>(_<span class="title">Iter</span> _<span class="title">First</span>, _<span class="title">Iter</span> _<span class="title">Last</span>, <span class="title">const</span> _<span class="title">Pr</span>& _<span class="title">Pred</span>, <span class="title">const</span> _<span class="title">Container</span>& _<span class="title">Cont</span>) :</span> c(_Cont), comp(_Pred) </span><br><span class="line"> { <span class="comment">// construct by copying [_First, _Last), container, and comparator </span></span><br><span class="line"> c.insert(c.end(), _First, _Last); </span><br><span class="line"> make_heap(c.begin(), c.end(), comp); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">bool</span> <span class="title">empty</span><span class="params">()</span> <span class="keyword">const</span> </span></span><br><span class="line"><span class="function"> </span>{ <span class="comment">// test if queue is empty </span></span><br><span class="line"> <span class="keyword">return</span> (c.empty()); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> <span class="function">size_type <span class="title">size</span><span class="params">()</span> <span class="keyword">const</span> </span></span><br><span class="line"><span class="function"> </span>{ <span class="comment">// return length of queue </span></span><br><span class="line"> <span class="keyword">return</span> (c.size()); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> <span class="function">const_reference <span class="title">top</span><span class="params">()</span> <span class="keyword">const</span> </span></span><br><span class="line"><span class="function"> </span>{ <span class="comment">// return highest-priority element </span></span><br><span class="line"> <span class="keyword">return</span> (c.front()); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> <span class="function">reference <span class="title">top</span><span class="params">()</span> </span></span><br><span class="line"><span class="function"> </span>{ <span class="comment">// return mutable highest-priority element (retained) </span></span><br><span class="line"> <span class="keyword">return</span> (c.front()); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">push</span><span class="params">(<span class="keyword">const</span> value_type& _Pred)</span> </span></span><br><span class="line"><span class="function"> </span>{ <span class="comment">// insert value in priority order </span></span><br><span class="line"> c.push_back(_Pred); </span><br><span class="line"> push_heap(c.begin(), c.end(), comp); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">pop</span><span class="params">()</span> </span></span><br><span class="line"><span class="function"> </span>{ <span class="comment">// erase highest-priority element </span></span><br><span class="line"> pop_heap(c.begin(), c.end(), comp); </span><br><span class="line"> c.pop_back(); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"><span class="keyword">protected</span>: </span><br><span class="line"> _Container c; <span class="comment">// the underlying container </span></span><br><span class="line"> _Pr comp; <span class="comment">// the comparator functor </span></span><br><span class="line">};</span><br></pre></td></tr></table></figure><p>下面先给出优级先级队列的使用范例。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//优先级队列 priority_queue by MoreWindows( http://blog.csdn.net/MoreWindows ) </span></span><br><span class="line"><span class="comment">// 支持 empty() size() top() push() pop() 与stack的操作函数全部一样 </span></span><br><span class="line"><span class="comment">//by MoreWindows </span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><queue> </span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><list> </span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><cstdio> </span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>; </span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span> </span></span><br><span class="line"><span class="function"></span>{ </span><br><span class="line"> <span class="comment">//优先级队列默认是使用vector作容器。 </span></span><br><span class="line"> priority_queue<<span class="keyword">int</span>> a; </span><br><span class="line"> priority_queue<<span class="keyword">int</span>, <span class="built_in">list</span><<span class="keyword">int</span>>> b; <span class="comment">//可以这样声明,但无法使用 </span></span><br><span class="line"> <span class="keyword">int</span> i; </span><br><span class="line"> <span class="comment">//压入数据 </span></span><br><span class="line"> <span class="keyword">for</span> (i = <span class="number">0</span>; i < <span class="number">10</span>; i++) </span><br><span class="line"> { </span><br><span class="line"> a.push(i * <span class="number">2</span> - <span class="number">5</span>); </span><br><span class="line"> <span class="comment">//b.push(i); //编译错误 </span></span><br><span class="line"> } </span><br><span class="line"> <span class="comment">//优先级队列的大小 </span></span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"%d\n"</span>, a.size()); </span><br><span class="line"> <span class="comment">//取优先级队列数据并将数据移出队列 </span></span><br><span class="line"> <span class="keyword">while</span> (!a.empty()) </span><br><span class="line"> { </span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"%d "</span>, a.top()); </span><br><span class="line"> a.pop(); </span><br><span class="line"> } </span><br><span class="line"> <span class="built_in">putchar</span>(<span class="string">'\n'</span>); </span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>; </span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>下面程序是针对结构体的,对数据的比较是通过对结构体重载operator()。</p><p>程序功能是模拟排队过程,每人有姓名和优先级,优先级相同则比较姓名,开始有5个人进入队列,然后队头2个人出队,再有3个人进入队列,最后所有人都依次出队,程序会输出离开队伍的顺序。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//by MoreWindows( http://blog.csdn.net/MoreWindows ) </span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><queue> </span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><cstring> </span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><cstdio> </span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>; </span><br><span class="line"><span class="comment">//结构体 </span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Node</span> </span></span><br><span class="line"><span class="class">{</span> </span><br><span class="line"> <span class="keyword">char</span> szName[<span class="number">20</span>]; </span><br><span class="line"> <span class="keyword">int</span> priority; </span><br><span class="line"> Node(<span class="keyword">int</span> nri, <span class="keyword">char</span> *pszName) </span><br><span class="line"> { </span><br><span class="line"> <span class="built_in">strcpy</span>(szName, pszName); </span><br><span class="line"> priority = nri; </span><br><span class="line"> } </span><br><span class="line">}; </span><br><span class="line"><span class="comment">//结构体的比较方法 改写operator() </span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">NodeCmp</span> </span></span><br><span class="line"><span class="class">{</span> </span><br><span class="line"> <span class="function"><span class="keyword">bool</span> <span class="title">operator</span><span class="params">()</span><span class="params">(<span class="keyword">const</span> Node &na, <span class="keyword">const</span> Node &nb)</span> </span></span><br><span class="line"><span class="function"> </span>{ </span><br><span class="line"> <span class="keyword">if</span> (na.priority != nb.priority) </span><br><span class="line"> <span class="keyword">return</span> na.priority <= nb.priority; </span><br><span class="line"> <span class="keyword">else</span> </span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">strcmp</span>(na.szName, nb.szName) > <span class="number">0</span>; </span><br><span class="line"> } </span><br><span class="line">}; </span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">PrintfNode</span><span class="params">(Node &na)</span> </span></span><br><span class="line"><span class="function"></span>{ </span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"%s %d\n"</span>, na.szName, na.priority); </span><br><span class="line">} </span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span> </span></span><br><span class="line"><span class="function"></span>{ </span><br><span class="line"> <span class="comment">//优先级队列默认是使用vector作容器,底层数据结构为堆。 </span></span><br><span class="line"> priority_queue<Node, <span class="built_in">vector</span><Node>, NodeCmp> a; </span><br><span class="line"> </span><br><span class="line"> <span class="comment">//有5个人进入队列 </span></span><br><span class="line"> a.push(Node(<span class="number">5</span>, <span class="string">"小谭"</span>)); </span><br><span class="line"> a.push(Node(<span class="number">3</span>, <span class="string">"小刘"</span>)); </span><br><span class="line"> a.push(Node(<span class="number">1</span>, <span class="string">"小涛"</span>)); </span><br><span class="line"> a.push(Node(<span class="number">5</span>, <span class="string">"小王"</span>)); </span><br><span class="line"> </span><br><span class="line"> <span class="comment">//队头的2个人出队 </span></span><br><span class="line"> PrintfNode(a.top()); </span><br><span class="line"> a.pop(); </span><br><span class="line"> PrintfNode(a.top()); </span><br><span class="line"> a.pop(); </span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"--------------------\n"</span>); </span><br><span class="line"> </span><br><span class="line"> <span class="comment">//再进入3个人 </span></span><br><span class="line"> a.push(Node(<span class="number">2</span>, <span class="string">"小白"</span>)); </span><br><span class="line"> a.push(Node(<span class="number">2</span>, <span class="string">"小强"</span>)); </span><br><span class="line"> a.push(Node(<span class="number">3</span>, <span class="string">"小新"</span>)); </span><br><span class="line"> </span><br><span class="line"> <span class="comment">//所有人都依次出队 </span></span><br><span class="line"> <span class="keyword">while</span> (!a.empty()) </span><br><span class="line"> { </span><br><span class="line"> PrintfNode(a.top()); </span><br><span class="line"> a.pop(); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>; </span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>简单来说,优先队列有如下使用方法<br>构建一个 内置类型 /具有operator < 的优先队列</p><p>priority_queue<type> Queue; </type></p><p>其中Type必须有operator <, 否则将引起编译错误。另外,如果以成员函数重载operator <,需要注意this与传入相同的问题。友元重载就没有这个问题。</p><p>构建一个 自定义算法的 优先队列</p><p>priority_queue<Type,vector<type>,TypeCmp> Queue;</type></p><p>其中vector<type>是优先队列内部使用的容器,建议使用vector. TypeCmp是一个类(或结构体)重载()形成仿函数形式</type></p><p>struct TypeCmp</p><p>{</p><p>bool operator() (const Type& a,const Type& b);</p><p>};</p><p>如果TypeCmp()调用了Type的私有数据域,那么Type的定义中相应的应该加上friend TypeCmp;</p><p>(由于仿函数和lambda的相似性我又写了个lambda然而编译失败了….)</p><p>另外,优先队列的排序方法与实际结果正好是相反的,这一点需要注意。</p><p>文章转自: <a href="https://blog.csdn.net/Kiritow/article/details/51451574" target="_blank" rel="noopener">https://blog.csdn.net/Kiritow/article/details/51451574</a></p>]]></content>
<summary type="html">学长经验分享</summary>
<category term="-public" scheme="http://qustkx.com/tags/public/"/>
</entry>
</feed>