-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
1118 lines (542 loc) · 865 KB
/
search.xml
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
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>杭州义益计组软件仿真 - 指令设计综合实验</title>
<link href="/2023/06/18/0001-10/"/>
<url>/2023/06/18/0001-10/</url>
<content type="html"><![CDATA[<h1 id="计算机组成原理实验8"><a href="#计算机组成原理实验8" class="headerlink" title="计算机组成原理实验8"></a>计算机组成原理实验8</h1><h2 id="实验目的"><a href="#实验目的" class="headerlink" title="实验目的"></a>实验目的</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">1) 掌握指令设计方法,自主设计指令</span><br><span class="line">2) 掌握使用自己设计的指令编写程序的方法</span><br></pre></td></tr></table></figure><br><h2 id="实验内容及原理"><a href="#实验内容及原理" class="headerlink" title="实验内容及原理"></a>实验内容及原理</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">实验内容</button></li><li class="tab"><button type="button" data-href="#-2">实验原理</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">>实验内容:</span><br><span class="line">•定义指令SUB ADDR,指令码为D4,实现功能:[addr]-drdr;</span><br><span class="line">•改写简单模型机中的ADD ADDR指令,使之能判别进位标志;</span><br><span class="line">•定义指令JMPC ADDR,指令码为DC,实现功能:若cy=1,addr pc;</span><br><span class="line">•运用上述指令,结合简单模型机五条指令,编写程序实现:将地址为20H的内存单元中的数据(初始值为0),加上一个输入数据</span><br><span class="line">(50H),存放到20H内存单元,并输出到OUT单元显示,并循环累加,当数据即将溢出时,转做减法操作,当减到即将溢出时,又做</span><br><span class="line">加法操作,如此循环。</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><p><img src="https://s2.loli.net/2023/06/18/waQxY4TKmEqhvNo.png" alt="0ac91d1bfb79e1261306556ee9a6a5f.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><br><h2 id="实验主要仪器设备"><a href="#实验主要仪器设备" class="headerlink" title="实验主要仪器设备"></a>实验主要仪器设备</h2><blockquote><p><strong>略</strong></p></blockquote><br><h2 id="实验步骤、数据记录及总结分析"><a href="#实验步骤、数据记录及总结分析" class="headerlink" title="实验步骤、数据记录及总结分析"></a>实验步骤、数据记录及总结分析</h2><h3 id="实验数据"><a href="#实验数据" class="headerlink" title="实验数据"></a>实验数据</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">存储器</button></li><li class="tab"><button type="button" data-href="#-2">微存储器</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><p><img src="https://s2.loli.net/2023/06/18/O6CWsmIGKfJt91r.png" alt="453c9a1f2ced83421d729905fea23d3.png"><br><img src="https://s2.loli.net/2023/06/18/1ry6tBLUHOvgfIw.png" alt="dcfae6aa873c31a20badcf9f851b6c0.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><p><img src="https://s2.loli.net/2023/06/18/Ahz1wyYgBDOZlbG.png" alt="8de2c21627fbcc3566722e5257305f2.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="实验结果与结论"><a href="#实验结果与结论" class="headerlink" title="实验结果与结论"></a>实验结果与结论</h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">一个周期输出结果:</span><br><span class="line">00H -> 50H -> A0H ->F0H -> A0H -> 50H -> 00H</span><br><span class="line"></span><br><span class="line">J(4)散转入口地址=微代码下址(OR)0,0,0,0,0,FC,FZ</span><br><span class="line">因为是或的逻辑关系,如果我们想用FZ,而与FC无关,来控制分支的话,</span><br><span class="line">只需要设置微代码下址为xxxxx10即可。</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="存在疑问"><a href="#存在疑问" class="headerlink" title="存在疑问"></a>存在疑问</h3><blockquote><p><strong>略</strong></p></blockquote><hr>]]></content>
<categories>
<category> 计算机组成原理实验课 </category>
</categories>
<tags>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> 计算机组成原理 </tag>
</tags>
</entry>
<entry>
<title>杭州义益计组软件仿真 - 带移位模型机实验</title>
<link href="/2023/06/18/0001-09/"/>
<url>/2023/06/18/0001-09/</url>
<content type="html"><![CDATA[<h1 id="计算机组成原理实验9"><a href="#计算机组成原理实验9" class="headerlink" title="计算机组成原理实验9"></a>计算机组成原理实验9</h1><h2 id="实验目的"><a href="#实验目的" class="headerlink" title="实验目的"></a>实验目的</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">1) 掌握指令设计方法,自主设计指令</span><br><span class="line">2) 掌握使用自己设计的指令编写程序的方法</span><br></pre></td></tr></table></figure><br><h2 id="实验内容及原理"><a href="#实验内容及原理" class="headerlink" title="实验内容及原理"></a>实验内容及原理</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">实验内容</button></li><li class="tab"><button type="button" data-href="#-2">实验原理</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">>实验内容一:</span><br><span class="line">•利用定义的RR指令编程序实现输出指示灯”10000000”(来源于input单元)从左往右循环移动。</span><br><span class="line">•利用定义的RR ADDR编程序实现输出指示灯”10000000”(来源于input单元)从左往右循环移动。</span><br><span class="line"></span><br><span class="line">>实验内容二:</span><br><span class="line">•利用定义的FIVE指令编程序实现输出指示灯”00000001”(来源于input单元)循环乘5输出。</span><br><span class="line">•定义指令FIVE ADDR实现功能[addr]*5DR,并用该指令来实现上述程序。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><p><img src="https://s2.loli.net/2023/06/18/QS276JzyZjXvbte.png" alt="b0500cb6a2c237dfa50bf8cf741657d.png"><br><img src="https://s2.loli.net/2023/06/18/vM2Tyqu4iPs6VW1.png" alt="189b823e4f5aaeabc9fc1158a7792a8.png"><br><img src="https://s2.loli.net/2023/06/18/odADt8COPcJWuMx.png" alt="d63295fc436955f2b755eb7120e2dd6.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><br><h2 id="实验主要仪器设备"><a href="#实验主要仪器设备" class="headerlink" title="实验主要仪器设备"></a>实验主要仪器设备</h2><blockquote><p><strong>略</strong></p></blockquote><br><h2 id="实验步骤、数据记录及总结分析"><a href="#实验步骤、数据记录及总结分析" class="headerlink" title="实验步骤、数据记录及总结分析"></a>实验步骤、数据记录及总结分析</h2><h3 id="实验一-RR实现循环右移-初始值10H"><a href="#实验一-RR实现循环右移-初始值10H" class="headerlink" title="实验一 RR实现循环右移(初始值10H)"></a>实验一 RR实现循环右移(初始值10H)</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">存储器1</button></li><li class="tab"><button type="button" data-href="#-2">微存储器1</button></li><li class="tab"><button type="button" data-href="#-3">实验结果1</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><p><img src="https://s2.loli.net/2023/06/18/4JDUdYnhZraFjP6.png" alt="88085a8e96c8a20324ce114442c5033.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><p><img src="https://s2.loli.net/2023/06/18/S3wrkLRcIKXyTaG.png" alt="a729d5b72073d1e8a62b8db69895a91.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-3"><p>前三轮输出:08H,04H,02H</p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="实验二-RR-ADDR实现循环右移-初始值10H"><a href="#实验二-RR-ADDR实现循环右移-初始值10H" class="headerlink" title="实验二 RR ADDR实现循环右移(初始值10H)"></a>实验二 RR ADDR实现循环右移(初始值10H)</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">存储器2</button></li><li class="tab"><button type="button" data-href="#-2">微存储器2</button></li><li class="tab"><button type="button" data-href="#-3">实验结果2</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><p><img src="https://s2.loli.net/2023/06/18/cfoU8dNHSk752ua.png" alt="7dd58b7b1e4b92c6f80ed7cce04b3b8.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><p><img src="https://s2.loli.net/2023/06/18/qyb1ZNocQ4rlEtJ.png" alt="009f1b374ba0d53a41bf44b4d2659e5.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-3"><p>前三轮输出:10H,08H,04H</p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="实验三-FIVE实现循环乘5-初始值01H"><a href="#实验三-FIVE实现循环乘5-初始值01H" class="headerlink" title="实验三 FIVE实现循环乘5(初始值01H)"></a>实验三 FIVE实现循环乘5(初始值01H)</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">存储器3</button></li><li class="tab"><button type="button" data-href="#-2">微存储器3</button></li><li class="tab"><button type="button" data-href="#-3">实验结果3</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><p><img src="https://s2.loli.net/2023/06/18/P19xDuHgCkFGh6A.png" alt="87ad0383d160d8569c1cf6fa59617af.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><p><img src="https://s2.loli.net/2023/06/18/eTU3h7mLg4t6FVq.png" alt="963c7ff09d02632edccadb451e3ce1a.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-3"><p>前三轮输出:05H,19H,7DH</p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="思考题"><a href="#思考题" class="headerlink" title="思考题"></a>思考题</h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">定义指令FIVE ADDR1 ADDR2实现功能[addr1]*5[addr2],思考要实现实验二的程序,还需要定义什么指令?如何实现?</span><br><span class="line"></span><br><span class="line">解答:</span><br><span class="line"></span><br><span class="line">指令: FIVE ADDR1 ADDR2</span><br><span class="line">指令格式: D4 addr1 addr2</span><br><span class="line">功能: [addr1] * 5 -> [addr2]</span><br><span class="line"></span><br><span class="line">PC->AR PC+1PC-B, B-AR, PC+1</span><br><span class="line">RAM->AR/M-R, B-AR</span><br><span class="line">RAM->DA1/M-R, B-DA1</span><br><span class="line">RAM->299/M-R, S1S0=11</span><br><span class="line">PC->AR PC+1PC-B, B-AR, PC+1</span><br><span class="line">RAM->DR/M-R, B-DR</span><br><span class="line">299->DA1/299-B, B-DA1</span><br><span class="line">299->循环左移/299-B, S1S0M=010</span><br><span class="line">299->循环左移/299-B, S1S0M=010</span><br><span class="line">299->DA2/299-B, B-DA2</span><br><span class="line">DR->ARDR-B,B-AR</span><br><span class="line">DA1+DA2-> [AR]/299-B, /M-W</span><br></pre></td></tr></table></figure><h3 id="存在疑问"><a href="#存在疑问" class="headerlink" title="存在疑问"></a>存在疑问</h3><blockquote><p><strong>略</strong></p></blockquote><hr>]]></content>
<categories>
<category> 计算机组成原理实验课 </category>
</categories>
<tags>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> 计算机组成原理 </tag>
</tags>
</entry>
<entry>
<title>Qt实验 - 二维绘图</title>
<link href="/2023/06/18/0002-09/"/>
<url>/2023/06/18/0002-09/</url>
<content type="html"><![CDATA[<h1 id="C-桌面应用程序实验9"><a href="#C-桌面应用程序实验9" class="headerlink" title="C++桌面应用程序实验9"></a>C++桌面应用程序实验9</h1><h2 id="第1题"><a href="#第1题" class="headerlink" title="第1题"></a>第1题</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">1. 创建一个简单窗口, 按下鼠标左键,拖动鼠标,在用户区上画出一个矩形,矩形左上角以初始按下鼠标的点,右下角为鼠标当前</span><br><span class="line">位置,放开鼠标,窗口用户区显示一个最后的矩形。按下键盘的‘l’(英文字母L的小写),矩形放大,按下‘s’键,矩形缩小,并能用</span><br><span class="line">方向键实现所画矩形按相应方向移动。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">mainwindow.h</button></li><li class="tab"><button type="button" data-href="#-2">mainwindow.cpp</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> MAINWINDOW_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> MAINWINDOW_H</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QMainWindow></span></span></span><br><span class="line"></span><br><span class="line">QT_BEGIN_NAMESPACE</span><br><span class="line"><span class="keyword">namespace</span> Ui { <span class="keyword">class</span> <span class="title class_">MainWindow</span>; }</span><br><span class="line">QT_END_NAMESPACE</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MainWindow</span> : <span class="keyword">public</span> QMainWindow</span><br><span class="line">{</span><br><span class="line"> Q_OBJECT</span><br><span class="line"></span><br><span class="line"><span class="keyword">protected</span>:</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">paintEvent</span><span class="params">(QPaintEvent *event)</span></span>;</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">mousePressEvent</span><span class="params">(QMouseEvent *event)</span></span>;</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">mouseMoveEvent</span><span class="params">(QMouseEvent *event)</span></span>;</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">mouseReleaseEvent</span><span class="params">(QMouseEvent *event)</span></span>;</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">keyPressEvent</span><span class="params">(QKeyEvent *event)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> QPoint st = {<span class="number">0</span>, <span class="number">0</span>};</span><br><span class="line"> QPoint ed = {<span class="number">0</span>, <span class="number">0</span>};</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="built_in">MainWindow</span>(QWidget *parent = <span class="literal">nullptr</span>);</span><br><span class="line"> ~<span class="built_in">MainWindow</span>();</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> Ui::MainWindow *ui;</span><br><span class="line">};</span><br><span class="line"><span class="meta">#<span class="keyword">endif</span> <span class="comment">// MAINWINDOW_H</span></span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"mainwindow.h"</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"ui_mainwindow.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QMouseEvent></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QPainter></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QPen></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QDebug></span></span></span><br><span class="line"></span><br><span class="line">MainWindow::<span class="built_in">MainWindow</span>(QWidget *parent)</span><br><span class="line"> : <span class="built_in">QMainWindow</span>(parent)</span><br><span class="line"> , <span class="built_in">ui</span>(<span class="keyword">new</span> Ui::MainWindow)</span><br><span class="line">{</span><br><span class="line"> ui-><span class="built_in">setupUi</span>(<span class="keyword">this</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MainWindow::mousePressEvent</span><span class="params">(QMouseEvent *event)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">if</span>(event-><span class="built_in">button</span>() == Qt::LeftButton)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">this</span>->st = <span class="keyword">this</span>->ed = event-><span class="built_in">pos</span>();</span><br><span class="line"><span class="comment">// qDebug() << st.x() << " " << st.y() << "\n";</span></span><br><span class="line"> QCursor cursor;</span><br><span class="line"> cursor.<span class="built_in">setShape</span>(Qt::CrossCursor);</span><br><span class="line"> QApplication::<span class="built_in">setOverrideCursor</span>(cursor);</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="type">void</span> <span class="title">MainWindow::mouseReleaseEvent</span><span class="params">(QMouseEvent *event)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="comment">// qDebug() << st.x() << " " << st.y() << "\n";</span></span><br><span class="line"><span class="comment">// qDebug() << ed.x() << " " << ed.y() << "\n";</span></span><br><span class="line"> <span class="built_in">Q_UNUSED</span>(event);</span><br><span class="line"> QApplication::<span class="built_in">restoreOverrideCursor</span>();</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="type">void</span> <span class="title">MainWindow::mouseMoveEvent</span><span class="params">(QMouseEvent *event)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">if</span> (event-><span class="built_in">buttons</span>() == Qt::LeftButton)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">this</span>->ed = event-><span class="built_in">pos</span>();</span><br><span class="line"> <span class="built_in">qDebug</span>() << st.<span class="built_in">x</span>() << <span class="string">" "</span> << st.<span class="built_in">y</span>() << <span class="string">"\n"</span>;</span><br><span class="line"> <span class="built_in">qDebug</span>() << ed.<span class="built_in">x</span>() << <span class="string">" "</span> << ed.<span class="built_in">y</span>() << <span class="string">"\n"</span>;</span><br><span class="line"> QMainWindow::<span class="built_in">update</span>();</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="type">void</span> <span class="title">MainWindow::keyPressEvent</span><span class="params">(QKeyEvent *event)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> QPoint e = (ed - st) / <span class="number">8</span>;</span><br><span class="line"> <span class="type">int</span> p = <span class="number">5</span>;</span><br><span class="line"> <span class="keyword">if</span> (event-><span class="built_in">key</span>() == Qt::Key_L)</span><br><span class="line"> {</span><br><span class="line"> ed += e;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (event-><span class="built_in">key</span>() == Qt::Key_S)</span><br><span class="line"> {</span><br><span class="line"> ed -= e;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (event-><span class="built_in">key</span>() == Qt::Key_Up)</span><br><span class="line"> {</span><br><span class="line"> st.<span class="built_in">setY</span>(st.<span class="built_in">y</span>() - p);</span><br><span class="line"> ed.<span class="built_in">setY</span>(ed.<span class="built_in">y</span>() - p);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (event-><span class="built_in">key</span>() == Qt::Key_Down)</span><br><span class="line"> {</span><br><span class="line"> st.<span class="built_in">setY</span>(st.<span class="built_in">y</span>() + p);</span><br><span class="line"> ed.<span class="built_in">setY</span>(ed.<span class="built_in">y</span>() + p);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (event-><span class="built_in">key</span>() == Qt::Key_Left)</span><br><span class="line"> {</span><br><span class="line"> st.<span class="built_in">setX</span>(st.<span class="built_in">x</span>() - p);</span><br><span class="line"> ed.<span class="built_in">setX</span>(ed.<span class="built_in">x</span>() - p);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (event-><span class="built_in">key</span>() == Qt::Key_Right)</span><br><span class="line"> {</span><br><span class="line"> st.<span class="built_in">setX</span>(st.<span class="built_in">x</span>() + p);</span><br><span class="line"> ed.<span class="built_in">setX</span>(ed.<span class="built_in">x</span>() + p);</span><br><span class="line"> }</span><br><span class="line"> QMainWindow::<span class="built_in">update</span>();</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="type">void</span> <span class="title">MainWindow::paintEvent</span><span class="params">(QPaintEvent *)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="function">QPainter <span class="title">painter</span><span class="params">(<span class="keyword">this</span>)</span></span>;</span><br><span class="line"> <span class="function">QPen <span class="title">pen</span><span class="params">(Qt::black, <span class="number">5</span>, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)</span></span>;</span><br><span class="line"> painter.<span class="built_in">setPen</span>(pen);</span><br><span class="line"> painter.<span class="built_in">drawRect</span>(st.<span class="built_in">x</span>(), st.<span class="built_in">y</span>(), ed.<span class="built_in">x</span>() - st.<span class="built_in">x</span>(), ed.<span class="built_in">y</span>() - st.<span class="built_in">y</span>());</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">MainWindow::~<span class="built_in">MainWindow</span>()</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">delete</span> ui;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="第2题"><a href="#第2题" class="headerlink" title="第2题"></a>第2题</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">2. 做一个简单的画图程序,基本功能:</span><br><span class="line"></span><br><span class="line">1) 按“L”后,用鼠标拖拽能在屏幕上画直线;</span><br><span class="line">2) 按“E”后,用鼠标托拽能在屏幕上画矩形</span><br><span class="line">3) 按“C”后,用鼠标拖拽能在屏幕上画圆</span><br><span class="line">4) 按“R”“G”“B”能够改变所画图形为红、绿、蓝色</span><br><span class="line">5) 对上述功能做菜单、工具栏和状态栏</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">mainwindow.h</button></li><li class="tab"><button type="button" data-href="#-2">mainwindow.cpp</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> MAINWINDOW_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> MAINWINDOW_H</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QMainWindow></span></span></span><br><span class="line"></span><br><span class="line">QT_BEGIN_NAMESPACE</span><br><span class="line"><span class="keyword">namespace</span> Ui { <span class="keyword">class</span> <span class="title class_">MainWindow</span>; }</span><br><span class="line">QT_END_NAMESPACE</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MainWindow</span> : <span class="keyword">public</span> QMainWindow</span><br><span class="line">{</span><br><span class="line"> Q_OBJECT</span><br><span class="line"></span><br><span class="line"><span class="keyword">protected</span>:</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">paintEvent</span><span class="params">(QPaintEvent *event)</span></span>;</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">mousePressEvent</span><span class="params">(QMouseEvent *event)</span></span>;</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">mouseMoveEvent</span><span class="params">(QMouseEvent *event)</span></span>;</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">mouseReleaseEvent</span><span class="params">(QMouseEvent *event)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> QPoint st = {<span class="number">0</span>, <span class="number">0</span>};</span><br><span class="line"> QPoint ed = {<span class="number">0</span>, <span class="number">0</span>};</span><br><span class="line"> <span class="type">bool</span> Rect = <span class="literal">false</span>;</span><br><span class="line"> <span class="type">bool</span> Circle = <span class="literal">false</span>;</span><br><span class="line"> <span class="type">bool</span> Line = <span class="literal">false</span>;</span><br><span class="line"> <span class="type">bool</span> Red = <span class="literal">false</span>;</span><br><span class="line"> <span class="type">bool</span> Green = <span class="literal">false</span>;</span><br><span class="line"> <span class="type">bool</span> Blue = <span class="literal">false</span>;</span><br><span class="line"> QString shape, color, pos;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="built_in">MainWindow</span>(QWidget *parent = <span class="literal">nullptr</span>);</span><br><span class="line"> ~<span class="built_in">MainWindow</span>();</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span> slots:</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_action_triggered</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_action_2_triggered</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_action_3_triggered</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_action_4_triggered</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_action_5_triggered</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_action_6_triggered</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> Ui::MainWindow *ui;</span><br><span class="line">};</span><br><span class="line"><span class="meta">#<span class="keyword">endif</span> <span class="comment">// MAINWINDOW_H</span></span></span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"mainwindow.h"</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"ui_mainwindow.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QMouseEvent></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QPainter></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QPen></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QDebug></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QString></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QLabel></span></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">MainWindow::<span class="built_in">MainWindow</span>(QWidget *parent)</span><br><span class="line"> : <span class="built_in">QMainWindow</span>(parent)</span><br><span class="line"> , <span class="built_in">ui</span>(<span class="keyword">new</span> Ui::MainWindow)</span><br><span class="line">{</span><br><span class="line"> ui-><span class="built_in">setupUi</span>(<span class="keyword">this</span>);</span><br><span class="line"> <span class="built_in">statusBar</span>()-><span class="built_in">showMessage</span>(<span class="string">"Status is here..."</span>);</span><br><span class="line"> shape = <span class="string">"无"</span>; color = <span class="string">"无"</span>, pos = <span class="string">"无"</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MainWindow::mousePressEvent</span><span class="params">(QMouseEvent *event)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">if</span>(event-><span class="built_in">button</span>() == Qt::LeftButton)</span><br><span class="line"> {</span><br><span class="line"> Red = Green = Blue = <span class="literal">false</span>;</span><br><span class="line"> <span class="keyword">this</span>->st = <span class="keyword">this</span>->ed = event-><span class="built_in">pos</span>();</span><br><span class="line"></span><br><span class="line"> QCursor cursor;</span><br><span class="line"> cursor.<span class="built_in">setShape</span>(Qt::CrossCursor);</span><br><span class="line"> QApplication::<span class="built_in">setOverrideCursor</span>(cursor);</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="type">void</span> <span class="title">MainWindow::mouseReleaseEvent</span><span class="params">(QMouseEvent *event)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">Q_UNUSED</span>(event);</span><br><span class="line"> QApplication::<span class="built_in">restoreOverrideCursor</span>();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MainWindow::mouseMoveEvent</span><span class="params">(QMouseEvent *event)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">if</span> (event-><span class="built_in">buttons</span>() == Qt::LeftButton)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">this</span>->ed = event-><span class="built_in">pos</span>();</span><br><span class="line"> QMainWindow::<span class="built_in">update</span>();</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="type">void</span> <span class="title">MainWindow::paintEvent</span><span class="params">(QPaintEvent *)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="function">QPainter <span class="title">painter</span><span class="params">(<span class="keyword">this</span>)</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (pos != <span class="string">"无"</span>)</span><br><span class="line"> {</span><br><span class="line"> pos = <span class="string">"("</span> + QString::<span class="built_in">number</span>(st.<span class="built_in">x</span>()) + <span class="string">","</span> + QString::<span class="built_in">number</span>(st.<span class="built_in">y</span>()) +</span><br><span class="line"> <span class="string">") -> ("</span> + QString::<span class="built_in">number</span>(ed.<span class="built_in">x</span>()) + <span class="string">","</span> + QString::<span class="built_in">number</span>(ed.<span class="built_in">y</span>()) + <span class="string">")"</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">statusBar</span>()-><span class="built_in">showMessage</span>(<span class="string">"形状:"</span> + shape + <span class="string">" / 颜色:"</span> + color + <span class="string">" / 坐标:"</span> + pos);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 画笔颜色</span></span><br><span class="line"> <span class="function">QPen <span class="title">pen</span><span class="params">(Qt::black, <span class="number">5</span>, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)</span></span>;</span><br><span class="line"> <span class="function">QPen <span class="title">pen_r</span><span class="params">(Qt::red, <span class="number">5</span>, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)</span></span>;</span><br><span class="line"> <span class="function">QPen <span class="title">pen_g</span><span class="params">(Qt::green, <span class="number">5</span>, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)</span></span>;</span><br><span class="line"> <span class="function">QPen <span class="title">pen_b</span><span class="params">(Qt::blue, <span class="number">5</span>, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)</span></span>;</span><br><span class="line"> <span class="keyword">if</span> (Red)</span><br><span class="line"> {</span><br><span class="line"> painter.<span class="built_in">setPen</span>(pen_r);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (Green)</span><br><span class="line"> {</span><br><span class="line"> painter.<span class="built_in">setPen</span>(pen_g);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (Blue)</span><br><span class="line"> {</span><br><span class="line"> painter.<span class="built_in">setPen</span>(pen_b);</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"> painter.<span class="built_in">setPen</span>(pen);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//形状</span></span><br><span class="line"> <span class="keyword">if</span> (Line)</span><br><span class="line"> {</span><br><span class="line"> painter.<span class="built_in">drawLine</span>(st.<span class="built_in">x</span>(), st.<span class="built_in">y</span>(), ed.<span class="built_in">x</span>(), ed.<span class="built_in">y</span>());</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (Rect)</span><br><span class="line"> {</span><br><span class="line"> painter.<span class="built_in">drawRect</span>(st.<span class="built_in">x</span>(), st.<span class="built_in">y</span>(), ed.<span class="built_in">x</span>() - st.<span class="built_in">x</span>(), ed.<span class="built_in">y</span>() - st.<span class="built_in">y</span>());</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (Circle)</span><br><span class="line"> {</span><br><span class="line"> painter.<span class="built_in">drawEllipse</span>(st.<span class="built_in">x</span>(), st.<span class="built_in">y</span>(), ed.<span class="built_in">x</span>() - st.<span class="built_in">x</span>(), ed.<span class="built_in">y</span>() - st.<span class="built_in">y</span>());</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="type">void</span> <span class="title">MainWindow::on_action_triggered</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> Line = <span class="literal">true</span>; Rect = Circle = <span class="literal">false</span>;</span><br><span class="line"> shape = <span class="string">"直线"</span>; color = <span class="string">"黑色(默认)"</span>; pos = <span class="string">"(0,0) -> (0,0)"</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MainWindow::on_action_2_triggered</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> Rect = <span class="literal">true</span>; Circle = Line = <span class="literal">false</span>;</span><br><span class="line"> shape = <span class="string">"矩形"</span>; color = <span class="string">"黑色(默认)"</span>; pos = <span class="string">"(0,0) -> (0,0)"</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MainWindow::on_action_3_triggered</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> Circle = <span class="literal">true</span>; Rect = Line = <span class="literal">false</span>;</span><br><span class="line"> shape = <span class="string">"圆"</span>; color = <span class="string">"黑色(默认)"</span>; pos = <span class="string">"(0,0) -> (0,0)"</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MainWindow::on_action_4_triggered</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> Red = <span class="literal">true</span>; Green = Blue = <span class="literal">false</span>; color = <span class="string">"红色"</span>;</span><br><span class="line"> QMainWindow::<span class="built_in">update</span>();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MainWindow::on_action_5_triggered</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> Green = <span class="literal">true</span>; Red = Blue = <span class="literal">false</span>; color = <span class="string">"绿色"</span>;</span><br><span class="line"> QMainWindow::<span class="built_in">update</span>();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MainWindow::on_action_6_triggered</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> Blue = <span class="literal">true</span>; Green = Red = <span class="literal">false</span>; color = <span class="string">"蓝色"</span>;</span><br><span class="line"> QMainWindow::<span class="built_in">update</span>();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">MainWindow::~<span class="built_in">MainWindow</span>()</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">delete</span> ui;</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><hr>]]></content>
<categories>
<category> C++桌面应用程序 </category>
</categories>
<tags>
<tag> C++ </tag>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> 桌面应用程序 </tag>
<tag> QT creator </tag>
</tags>
</entry>
<entry>
<title>杭州义益计组软件仿真 - 简单模型机循环加(减)法实验</title>
<link href="/2023/05/14/0001-08/"/>
<url>/2023/05/14/0001-08/</url>
<content type="html"><![CDATA[<h1 id="计算机组成原理实验8"><a href="#计算机组成原理实验8" class="headerlink" title="计算机组成原理实验8"></a>计算机组成原理实验8</h1><h2 id="实验目的"><a href="#实验目的" class="headerlink" title="实验目的"></a>实验目的</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">1) 了解存储器的工作原理</span><br><span class="line">2) 了解6116芯片结构与功能</span><br><span class="line">3) 掌握存储器读写方法</span><br><span class="line">4) 理解内存地址与内存内容</span><br></pre></td></tr></table></figure><br><h2 id="实验内容及原理"><a href="#实验内容及原理" class="headerlink" title="实验内容及原理"></a>实验内容及原理</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">实验内容</button></li><li class="tab"><button type="button" data-href="#-2">实验原理</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">>实验内容一:</span><br><span class="line">•根据简单模型机已经定义的5条指令,编程实现以下功能:</span><br><span class="line">•从输入单元输入数据20H;</span><br><span class="line">•将该输入数据与地址为20H的内存单元中存储的数据([20H])相加后,存放回地址为20H的内存单元中,并在输出单元显示。</span><br><span class="line">•一直重复该过程实现循环累加。</span><br><span class="line"></span><br><span class="line">>实验内容二:</span><br><span class="line">•新定义一条减法指令SUB,实现功能 [ADDR]-R0R0。</span><br><span class="line">•编程实现以下功能:</span><br><span class="line">•从输入单元输入数据20H;</span><br><span class="line">•将地址为20H的内存单元中存储的数据([20H])减去该输入数据后,存放回地址为20H的内存单元中,并在输出单元显示。</span><br><span class="line">•一直重复该过程实现循环累减。</span><br><span class="line">注:[20H]中数据预置为80H。</span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><p><img src="https://s2.loli.net/2023/05/12/XGUQioLCahYfnmV.jpg" alt="图片4.jpg"><br><img src="https://s2.loli.net/2023/05/12/Atscx6qQZfwrDpX.jpg" alt="图片3.jpg"></p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">J(1)散转的方式:</span><br><span class="line"></span><br><span class="line">当指令码I7 I6=11时</span><br><span class="line">散转入口地址=微代码下址(OR)0,1,0,I5,I4,I3,I2</span><br><span class="line"></span><br><span class="line">当指令码I7 I6≠11时</span><br><span class="line">散转入口地址=微代码下址(OR)0,0,0,I7,I6,I5,I4</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><br><h2 id="实验主要仪器设备"><a href="#实验主要仪器设备" class="headerlink" title="实验主要仪器设备"></a>实验主要仪器设备</h2><blockquote><p><strong>略</strong></p></blockquote><br><h2 id="实验步骤、数据记录及总结分析"><a href="#实验步骤、数据记录及总结分析" class="headerlink" title="实验步骤、数据记录及总结分析"></a>实验步骤、数据记录及总结分析</h2><h3 id="操作过程"><a href="#操作过程" class="headerlink" title="操作过程"></a>操作过程</h3><figure class="highlight plaintext"><table><tr><td class="code"><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.输入数据键入20H</span><br><span class="line">8.运行</span><br></pre></td></tr></table></figure><h3 id="实验数据"><a href="#实验数据" class="headerlink" title="实验数据"></a>实验数据</h3><p><img src="https://s2.loli.net/2023/05/12/rRUXJpw6qMunbdG.png" alt="a25eb21ac8ace119efafad5fb0b8163.png"><br><img src="https://s2.loli.net/2023/05/12/4J9Eksh2twMmRiT.png" alt="3c6ad4d3e7329141c6479395cd44b7b.png"></p><h3 id="实验结果与结论"><a href="#实验结果与结论" class="headerlink" title="实验结果与结论"></a>实验结果与结论</h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">80 -> 60 -> 40 -> 20 -> 00 -> E0 -> C0 -> A0 -> 80 -> 60 -> …</span><br></pre></td></tr></table></figure><h3 id="存在疑问"><a href="#存在疑问" class="headerlink" title="存在疑问"></a>存在疑问</h3><blockquote><p><strong>略</strong></p></blockquote><hr>]]></content>
<categories>
<category> 计算机组成原理实验课 </category>
</categories>
<tags>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> 计算机组成原理 </tag>
</tags>
</entry>
<entry>
<title>杭州义益计组软件仿真 - 存储器读写实验</title>
<link href="/2023/05/14/0001-07/"/>
<url>/2023/05/14/0001-07/</url>
<content type="html"><![CDATA[<h1 id="计算机组成原理实验7"><a href="#计算机组成原理实验7" class="headerlink" title="计算机组成原理实验7"></a>计算机组成原理实验7</h1><h2 id="实验目的"><a href="#实验目的" class="headerlink" title="实验目的"></a>实验目的</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">1) 了解存储器的工作原理</span><br><span class="line">2) 了解6116芯片结构与功能</span><br><span class="line">3) 掌握存储器读写方法</span><br><span class="line">4) 理解内存地址与内存内容</span><br></pre></td></tr></table></figure><br><h2 id="实验内容及原理"><a href="#实验内容及原理" class="headerlink" title="实验内容及原理"></a>实验内容及原理</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">初始数据</button></li><li class="tab"><button type="button" data-href="#-2">实验内容</button></li><li class="tab"><button type="button" data-href="#-3">实验原理</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">在内存中存入初始数据。</span><br><span class="line"></span><br><span class="line">地址 数据</span><br><span class="line">01H 80H</span><br><span class="line">02H 40H</span><br><span class="line">03H </span><br><span class="line">40H 11H</span><br><span class="line">80H 22H</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">>实验内容一:</span><br><span class="line"></span><br><span class="line">将地址分别为01、02的内存中的数据相加后,写入到地址为03的内存中。并在OUT单元读出。</span><br><span class="line"></span><br><span class="line">>实验内容二:</span><br><span class="line"></span><br><span class="line">在实验一的基础上,将地址分别为01、02的内存中的数据为地址的内存中的数据相加后,写入到地址为03的内存中的数据</span><br><span class="line">为地址的内存单元中,并在OUT单元读出。这里地址01和02中存储的数据都是一个内存地址(假设分别为A和B),而真正</span><br><span class="line">要进行加法运算的操作数据存放在地址A和B中;类似的,内存地址03中存储的数据也是一个地址(假设为C),则最后加法</span><br><span class="line">运算的结果应该存放在地址C中。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-3"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">6116芯片主要引脚功能(见下图1):</span><br><span class="line">D7-D0:8位数据输入输出,芯片的数据输入/输出共用一个引脚。</span><br><span class="line">A10-A0:11位地址线,指示芯片内部的2048个存储单元编号。</span><br><span class="line">/CS:片选控制信号,低电平时,芯片可进行读写操作,高电平时,芯片保存信息不能进行读写操作。</span><br><span class="line">/WE:写控制信号,低电平时,把数据线上的数据写入到地址线A10-A0指示的存储器单元中。</span><br><span class="line">/OE:读控制信号,低电平时,把地址线A10-A0指示的存储器单元的数据读出到数据线上。</span><br></pre></td></tr></table></figure><p><img src="https://s2.loli.net/2023/05/03/nF3oQpNECfrlHJt.jpg" alt="图片1.jpg"></p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">计组实验箱中存储器工作模式(见下图2):</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><br><span class="line">存这个酒店的客房里不一定是房客,也有可能放了一张字条,上面写着“给105的房客送果盘”(指令);也有可能里面放了</span><br><span class="line">一张206的房卡(地址),你可以去206找那里的房客。</span><br></pre></td></tr></table></figure><p><img src="https://s2.loli.net/2023/05/03/quHA8lERznS1jih.png" alt="图片2.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><br><h2 id="实验主要仪器设备"><a href="#实验主要仪器设备" class="headerlink" title="实验主要仪器设备"></a>实验主要仪器设备</h2><blockquote><p><strong>略</strong></p></blockquote><br><h2 id="实验步骤、数据记录及总结分析"><a href="#实验步骤、数据记录及总结分析" class="headerlink" title="实验步骤、数据记录及总结分析"></a>实验步骤、数据记录及总结分析</h2><h3 id="连线"><a href="#连线" class="headerlink" title="连线"></a>连线</h3><blockquote><mark class="hl-label orange"> </mark> <table><thead><tr><th align="center">序号</th><th align="center">源单元/源控制信号</th><th align="center">目的单元/目的控制信号</th></tr></thead><tbody><tr><td align="center">1</td><td align="center">Input unit/#IO-R</td><td align="center">Manual unit/#IO-R</td></tr><tr><td align="center">2</td><td align="center">Output unit/#IO-W</td><td align="center">Manual unit/#IO-W</td></tr><tr><td align="center">3</td><td align="center">ALU unit/#/ALU-B</td><td align="center">Manual unit/#/ALU-B</td></tr><tr><td align="center">4</td><td align="center">ALU unit/#S3~S0MCI</td><td align="center">Manual unit/#S3~S0MCI</td></tr><tr><td align="center">5</td><td align="center">ALU unit/#B-DA1</td><td align="center">Manual unit/#B-DA1</td></tr><tr><td align="center">6</td><td align="center">ALU unit/#B-DA2</td><td align="center">Manual unit/#B-DA2</td></tr><tr><td align="center">7</td><td align="center">Manual unit/#/M-W</td><td align="center">MEM unit/#/M-W</td></tr><tr><td align="center">8</td><td align="center">Manual unit/#/M-R</td><td align="center">MEM unit/#/M-R</td></tr><tr><td align="center">9</td><td align="center">Address unit/#A7~A0</td><td align="center">MEM unit/#A7~A0</td></tr><tr><td align="center">10</td><td align="center">Manual unit/#KA</td><td align="center">REG unit/#B-R0</td></tr><tr><td align="center">11</td><td align="center">Manual unit/#KB</td><td align="center">REG unit/#/R0-B</td></tr></tbody></table></blockquote><h3 id="操作流程"><a href="#操作流程" class="headerlink" title="操作流程"></a>操作流程</h3><blockquote><mark class="hl-label blue">实验一</mark> <table><thead><tr><th align="center">序号</th><th align="center">源单元/源控制信号</th><th align="center">目的单元/目的控制信号</th></tr></thead><tbody><tr><td align="center">1</td><td align="center">IN(01)->AR</td><td align="center">/IO-R, B-AR</td></tr><tr><td align="center">2</td><td align="center">MEM->DA1</td><td align="center">/M-R, B-DA1</td></tr><tr><td align="center">3</td><td align="center">IN(02)->AR</td><td align="center">/IO-R, B-AR</td></tr><tr><td align="center">4</td><td align="center">MEM->DA2</td><td align="center">/M-R, B-DA2</td></tr><tr><td align="center">5</td><td align="center">IN(03)->AR</td><td align="center">/IO-R, B-AR</td></tr><tr><td align="center">6</td><td align="center">ALU(加法)->MEM</td><td align="center">/ALU-B, S3~S0MCI=100101, /M-W</td></tr><tr><td align="center">7</td><td align="center">MEM->OUT</td><td align="center">/M-R, IO-W</td></tr></tbody></table></blockquote><blockquote><mark class="hl-label blue">实验二</mark> <table><thead><tr><th align="center">序号</th><th align="center">源单元/源控制信号</th><th align="center">目的单元/目的控制信号</th></tr></thead><tbody><tr><td align="center">1</td><td align="center">IN(01)->AR</td><td align="center">/IO-R, B-AR</td></tr><tr><td align="center">2</td><td align="center">MEM->R0</td><td align="center">/M-R, B-R0</td></tr><tr><td align="center">3</td><td align="center">R0->AR</td><td align="center">/R0-B, B-AR</td></tr><tr><td align="center">4</td><td align="center">*(01)->DA1</td><td align="center">/M-R, B-DA1</td></tr><tr><td align="center">5</td><td align="center">IN(02)->AR</td><td align="center">/IO-R, B-AR</td></tr><tr><td align="center">6</td><td align="center">MEM->R0</td><td align="center">/M-R, B-R0</td></tr><tr><td align="center">7</td><td align="center">R0->AR</td><td align="center">/R0-B, B-AR</td></tr><tr><td align="center">8</td><td align="center">*(02)->DA2</td><td align="center">/M-R, B-DA2</td></tr><tr><td align="center">9</td><td align="center">IN(03)->AR</td><td align="center">/IO-R, B-AR</td></tr><tr><td align="center">10</td><td align="center">MEM->R0</td><td align="center">/M-R, B-R0</td></tr><tr><td align="center">11</td><td align="center">R0->AR</td><td align="center">/R0-B, B-AR</td></tr><tr><td align="center">12</td><td align="center">LU(加法)->MEM</td><td align="center">/ALU-B, S3~S0MCI=100101, /M-W</td></tr><tr><td align="center">13</td><td align="center">MEM->OUT</td><td align="center">/M-R, IO-W</td></tr></tbody></table></blockquote><h3 id="实验数据"><a href="#实验数据" class="headerlink" title="实验数据"></a>实验数据</h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">地址 数据</span><br><span class="line">01H 80H</span><br><span class="line">02H 40H</span><br><span class="line">03H C0H</span><br><span class="line">40H 11H</span><br><span class="line">80H 22H</span><br><span class="line">C0H 33H</span><br></pre></td></tr></table></figure><h3 id="实验结果与结论"><a href="#实验结果与结论" class="headerlink" title="实验结果与结论"></a>实验结果与结论</h3><blockquote><p><strong>略</strong></p></blockquote><h3 id="存在疑问"><a href="#存在疑问" class="headerlink" title="存在疑问"></a>存在疑问</h3><blockquote><p><strong>略</strong></p></blockquote><hr>]]></content>
<categories>
<category> 计算机组成原理实验课 </category>
</categories>
<tags>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> 计算机组成原理 </tag>
</tags>
</entry>
<entry>
<title>Logisim实验 - 4位快速加法器</title>
<link href="/2023/05/14/0001-06/"/>
<url>/2023/05/14/0001-06/</url>
<content type="html"><![CDATA[<h1 id="计算机组成原理实验6"><a href="#计算机组成原理实验6" class="headerlink" title="计算机组成原理实验6"></a>计算机组成原理实验6</h1><h2 id="实验目的"><a href="#实验目的" class="headerlink" title="实验目的"></a>实验目的</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">• 掌握先行进位的原理</span><br><span class="line">• 能利用相关知识设计4位先行进位电路并利用设计的4位先行进位电路构造4位快速加法器</span><br><span class="line">• 理解串行加法器与先行快速加法器在时间延迟上的区别</span><br></pre></td></tr></table></figure><br><h2 id="实验原理"><a href="#实验原理" class="headerlink" title="实验原理"></a>实验原理</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">如果能打破进位链依赖,提前得到所有全加器所需的进位输入信号,则所有全加器都可以并行运算,从而提高</span><br><span class="line">运算性能。n位串行加法电路中和数与进位输出的逻辑表达式如下:</span><br><span class="line">Si = Xi ⊕ Yi ⊕ Ci Ci+1 = Xi&Yi + (Xi ⊕ Yi)&Ci</span><br><span class="line">若设Gi = Xi&Yi,Pi = Xi ⊕ Yi:</span><br><span class="line">当Gi=1时,Ci+1一定为1,所以将Gi称为进位生成函数;</span><br><span class="line">当Pi=1时,进位输入信号Ci才能传递到进位输出Ci+1处,所以将Pi称为进位传递函数。</span><br><span class="line"></span><br><span class="line">有了进位生成函数和进位传递函数,则Si和Ci+1可转换为:</span><br><span class="line">Si = Pi ⊕ Ci Ci+1 = Gi + Pi&Ci</span><br><span class="line">由递推关系推导可得到:</span><br><span class="line">Cn = Gn-1 + Pn-1&Gn-2 + Pn-1&Pn-2&Gn-3 + … + Pn-1&Pn-2…P1&P0&C0</span><br><span class="line">由此我们可以利用额外的组合逻辑电路提前产生各位加法运算需要的所有进位输入,再利用Si=Pi ⊕ Ci进行</span><br><span class="line">一级异或门运算即可得到最终的和数。</span><br><span class="line"></span><br><span class="line">G* = G3 + P3&G2 + P3&P2&G1 + P3&P2&P1&G0,称为成组进位生成函数;</span><br><span class="line">P* = P3&P2&P1&P0 ,称为成组进位传递函数。</span><br><span class="line">则有C4 = G* + P&C0</span><br><span class="line"></span><br><span class="line">(tips: '+' 代表或 , '&' 代表与 , '⊕' 代表异或)</span><br></pre></td></tr></table></figure><br><h2 id="实验内容"><a href="#实验内容" class="headerlink" title="实验内容"></a>实验内容</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">利用logisim打开“实验06 4位快速加法器(教学版).circ”文件。</span><br><span class="line"></span><br><span class="line">1. 完成“4位先行进位74182”子电路(注意不要改变封装)。</span><br><span class="line">2. 完成“4位快速加法器”电路。</span><br><span class="line">3. 保存电路文件为“学号姓名实验06.circ”并上传到ftp相关目录(实验06)。</span><br></pre></td></tr></table></figure><br><h2 id="4位先行进位74182"><a href="#4位先行进位74182" class="headerlink" title="4位先行进位74182"></a>4位先行进位74182</h2><mark class="hl-label green">连线图</mark> <p><img src="https://s2.loli.net/2023/04/19/eGHMLBmQPkzbKNf.png" alt="4位先行进位74182-0.png"></p><mark class="hl-label green">封装电路图</mark> <p><img src="https://s2.loli.net/2023/04/19/TLvzSpOf6uN3snt.png" alt="4位先行进位74182-1.png"></p><h2 id="4位快速加法器"><a href="#4位快速加法器" class="headerlink" title="4位快速加法器"></a>4位快速加法器</h2><p>采用了 ‘4位先行进位74182’ 的封装电路</p><p><img src="https://s2.loli.net/2023/04/19/uXe4Lz8UGy5F2CN.png" alt="4位快速加法器.png"></p><hr>]]></content>
<categories>
<category> 计算机组成原理实验课 </category>
</categories>
<tags>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> 计算机组成原理 </tag>
<tag> Logisim </tag>
</tags>
</entry>
<entry>
<title>Logisim实验 - 8位串行可控加减法</title>
<link href="/2023/05/14/0001-05/"/>
<url>/2023/05/14/0001-05/</url>
<content type="html"><![CDATA[<h1 id="计算机组成原理实验5"><a href="#计算机组成原理实验5" class="headerlink" title="计算机组成原理实验5"></a>计算机组成原理实验5</h1><h2 id="实验目的"><a href="#实验目的" class="headerlink" title="实验目的"></a>实验目的</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">• 理解多位可控加减法电路的实现原理</span><br><span class="line">• 了解隧道标签和探针的作用</span><br><span class="line">• 掌握logisim子电路封装的方法</span><br><span class="line">• 掌握logisim子电路的使用方法</span><br></pre></td></tr></table></figure><br><h2 id="实验原理"><a href="#实验原理" class="headerlink" title="实验原理"></a>实验原理</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">将n个全加器的进位链串联,即可得到n位串行加法器。</span><br><span class="line">两个操作数Xn-1Xn-2···X0与Yn-1Yn-2···Y0相加,和为Sn-1Sn-2···S0 。Xn-1与Yn-1为符号位,Cn为最</span><br><span class="line">高位进位,溢出检测信号overflow= CnꚚCn-1。</span><br><span class="line"></span><br><span class="line">由于补码运算的特殊性质,减法可以通过加法实现,只需将减数Y的补码进行适当变化后送入加法器中即可实</span><br><span class="line">现减法运算,具体公式如下:</span><br><span class="line">[X-Y]补 = [X]补 + [-Y]补 = [X]补 - [Y]补</span><br><span class="line">[-Y]补 = -[Y]补 ------- [-Y]补可以通过对[Y]补连同符号位一起逐位取反、末位加1来得到。</span><br><span class="line"></span><br><span class="line">在n位串行加法器的基础上,增加一个加减控制信号Sub。当Sub =0时,正常进行加法运算;当Sub=1时进行减</span><br><span class="line">法运算,实际就是利用Sub信号来实现减数的逐位取反、末位加1,然后进行加法运算。当进行有符号减法时,</span><br><span class="line">溢出判断与加法相同。</span><br></pre></td></tr></table></figure><br><h2 id="实验内容"><a href="#实验内容" class="headerlink" title="实验内容"></a>实验内容</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">利用logisim打开“实验05 8位串行可控加减法(教学版).circ”文件。</span><br><span class="line"></span><br><span class="line">1. 添加电路“一位全加器FA封装”,实现一位全加器的子电路,其电路封装与引脚功能描述如表1。</span><br><span class="line">2. 在对应子电路中利用已封装好的全加器设计8位串行加法器电路,其电路封装与引脚功能描述如表2。</span><br><span class="line">3. 在对应子电路中利用已封装好的全加器设计8位串行可控加减法电路,其电路封装与引脚功能描述如表3。</span><br><span class="line">4. 保存电路文件为“学号姓名实验05.circ”并上传到ftp相关目录(实验05)。</span><br></pre></td></tr></table></figure><br><h2 id="一位全加器FA"><a href="#一位全加器FA" class="headerlink" title="一位全加器FA"></a>一位全加器FA</h2><mark class="hl-label green">连线图</mark> <p><img src="https://s2.loli.net/2023/04/19/nptCu1w4xVIgBNP.png" alt="一位全加器FA-0.png"></p><mark class="hl-label green">封装电路图</mark> <p><img src="https://s2.loli.net/2023/04/19/4jbEwc5vkCrO3NM.png" alt="一位全加器FA-1.png"></p><h2 id="八位可控加减法器"><a href="#八位可控加减法器" class="headerlink" title="八位可控加减法器"></a>八位可控加减法器</h2><p>采用了 ‘一位全加器FA’ 的封装电路</p><p><img src="https://s2.loli.net/2023/04/19/qxg64U8tHhIN3Y2.png" alt="8位可控加减法器.png"></p><h2 id="八位桶形移位器"><a href="#八位桶形移位器" class="headerlink" title="八位桶形移位器"></a>八位桶形移位器</h2><p>采用了八位二路选择器的封装电路</p><p><img src="https://s2.loli.net/2023/04/19/1OI3ncMiYdHsRGV.png" alt="八位桶形移位器.png"></p><hr>]]></content>
<categories>
<category> 计算机组成原理实验课 </category>
</categories>
<tags>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> 计算机组成原理 </tag>
<tag> Logisim </tag>
</tags>
</entry>
<entry>
<title>Logisim实验 - 8位桶形移位器</title>
<link href="/2023/05/14/0001-04/"/>
<url>/2023/05/14/0001-04/</url>
<content type="html"><![CDATA[<h1 id="计算机组成原理实验4"><a href="#计算机组成原理实验4" class="headerlink" title="计算机组成原理实验4"></a>计算机组成原理实验4</h1><h2 id="实验目的"><a href="#实验目的" class="headerlink" title="实验目的"></a>实验目的</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">• 了解桶形移位器的工作原理</span><br><span class="line">• 掌握多路选择器、移位器、分线器的使用方法</span><br></pre></td></tr></table></figure><br><h2 id="实验原理"><a href="#实验原理" class="headerlink" title="实验原理"></a>实验原理</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">对于固定位数的移位运算,逻辑实现不需要逻辑器件,只需要对原有数据位进行简单重组即可。</span><br><span class="line">对于可变参数的移位运算,可分解成若干个固定位数的移位运算的组合来实现。例如x<<y,假设x为32位变</span><br><span class="line">量,移位参数y为5位变量,则可以将可变移位运算按权值分解成5个固定位数的移位运算(1、2、4、8、16)</span><br><span class="line">的组合,其实现电路常称为桶形移位器。</span><br><span class="line">下图为桶形移位器的原理图,虚线所示路径为y=5的运算路径。</span><br></pre></td></tr></table></figure><p><img src="https://s2.loli.net/2023/04/19/xFPwq3oQDdz6IkJ.png" alt="ppt.png"></p><br><h2 id="实验内容"><a href="#实验内容" class="headerlink" title="实验内容"></a>实验内容</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">1. 设计一个桶形移位器电路,使得32位输入数据X能够进行可变位数的移位操作。</span><br><span class="line">2. 使用戳工具测试上述电路。</span><br></pre></td></tr></table></figure><br><h2 id="一位二路选择器"><a href="#一位二路选择器" class="headerlink" title="一位二路选择器"></a>一位二路选择器</h2><mark class="hl-label green">连线图</mark> <p><img src="https://s2.loli.net/2023/04/19/pWJiLsbkGoVmXvj.png" alt="一位二路选择器-0.png"></p><mark class="hl-label green">封装电路图</mark> <p><img src="https://s2.loli.net/2023/04/19/ZrQodUXkDSc1w2g.png" alt="一位二路选择器-1.png"></p><h2 id="八位二路选择器"><a href="#八位二路选择器" class="headerlink" title="八位二路选择器"></a>八位二路选择器</h2><p>采用了 ‘一位二路选择器’ 的封装电路</p><mark class="hl-label green">连线图</mark> <p><img src="https://s2.loli.net/2023/04/19/qkeXRJ6YcMa5mNf.png" alt="八位二路选择器-1.png"></p><mark class="hl-label green">封装电路图</mark> <p><img src="https://s2.loli.net/2023/04/19/16JvlnEpLmWOVuZ.png" alt="八位二路选择器-0.png"></p><h2 id="八位桶形移位器"><a href="#八位桶形移位器" class="headerlink" title="八位桶形移位器"></a>八位桶形移位器</h2><p>采用了 ‘八位二路选择器’ 的封装电路</p><p><img src="https://s2.loli.net/2023/04/19/1OI3ncMiYdHsRGV.png" alt="八位桶形移位器.png"></p><hr>]]></content>
<categories>
<category> 计算机组成原理实验课 </category>
</categories>
<tags>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> 计算机组成原理 </tag>
<tag> Logisim </tag>
</tags>
</entry>
<entry>
<title>计组实验 - 移位运算器</title>
<link href="/2023/05/14/0001-03/"/>
<url>/2023/05/14/0001-03/</url>
<content type="html"><![CDATA[<h1 id="计算机组成原理实验3"><a href="#计算机组成原理实验3" class="headerlink" title="计算机组成原理实验3"></a>计算机组成原理实验3</h1><h2 id="实验目的"><a href="#实验目的" class="headerlink" title="实验目的"></a>实验目的</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">• 了解移位寄存器芯片(74LS299)的逻辑功能</span><br><span class="line">• 了解移位控制实验中数据输入、左移、右移方法及在实际中的用处</span><br><span class="line">• 验证移位控制的组合功能</span><br></pre></td></tr></table></figure><br><h2 id="实验内容及原理"><a href="#实验内容及原理" class="headerlink" title="实验内容及原理"></a>实验内容及原理</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">>实验内容一:</span><br><span class="line"></span><br><span class="line">(1)将数据80H实现循环右移</span><br><span class="line">(2)将数据01H实现循环左移</span><br><span class="line">(3)验证带CY循环移位和不带CY循环移位的区别</span><br><span class="line">(4)不带CY循环右移操作流程</span><br><span class="line">(5)尝试把时钟单元的开关“STEP”切换为“RUN”来连续循环移位。</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">(1)计算数据F0H*3/4,把结果输出到输出部件(OUT)。</span><br><span class="line">(2)F0H*3/4=F0H*(1/2+1/4)=F0H*(1-1/4)</span><br><span class="line">(3)乘以1/2相当于右移一位,乘以1/4相当于右移两位</span><br><span class="line">(4)移一位需要一个时钟脉冲(T4),移两位需要两个时钟脉冲</span><br><span class="line">(5)如果是乘以5/8,应该怎样做?</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">74LS299芯片主要引脚功能:</span><br><span class="line">• IO7-IO0:8位数据输入输出,芯片的数据输入/输出共用一个引脚。</span><br><span class="line">• S0、S1:功能控制端,控制数据输入、左移、右移等逻辑功能。</span><br><span class="line">• OE1、OE2:使能端,低电平有效。</span><br><span class="line">• CP:时钟输入端,数据的输入、移位需要在时钟脉冲的同步控制下执行。</span><br><span class="line">• MR:清零端,低电平有效,清零移位寄存器。</span><br><span class="line">• Q7:高位左移输出,左移时接受D7的信号。</span><br><span class="line">• Q0:低位右移输出,右移时接受D0的信号。</span><br><span class="line">• DS7:高位右移输入,右移时向D7输入信号。</span><br><span class="line">• DS0:低位左移输入,左移时向D0输入信号。</span><br></pre></td></tr></table></figure><br><h2 id="实验主要仪器设备"><a href="#实验主要仪器设备" class="headerlink" title="实验主要仪器设备"></a>实验主要仪器设备</h2><blockquote><p><strong>略</strong></p></blockquote><br><h2 id="实验步骤、数据记录及总结分析"><a href="#实验步骤、数据记录及总结分析" class="headerlink" title="实验步骤、数据记录及总结分析"></a>实验步骤、数据记录及总结分析</h2><h3 id="连线"><a href="#连线" class="headerlink" title="连线"></a>连线</h3><blockquote><mark class="hl-label orange"> </mark> <table><thead><tr><th align="center">序号</th><th align="center">源单元/源控制信号</th><th align="center">目的单元/目的控制信号</th></tr></thead><tbody><tr><td align="center">1</td><td align="center">Input unit/#IO-R</td><td align="center">Manual unit/#IO-R</td></tr><tr><td align="center">2</td><td align="center">Output unit/#IO-W</td><td align="center">Manual unit/#IO-W</td></tr><tr><td align="center">3</td><td align="center">ALU unit/#/ALU-B</td><td align="center">Manual unit/#/ALU-B</td></tr><tr><td align="center">4</td><td align="center">ALU unit/#/299-B</td><td align="center">Manual unit/#/299-B</td></tr><tr><td align="center">5</td><td align="center">ALU unit/#S3~S0MCI</td><td align="center">Manual unit/#S3~S0MCI</td></tr><tr><td align="center">6</td><td align="center">ALU unit/#B-DA1</td><td align="center">Manual unit/#B-DA1</td></tr><tr><td align="center">7</td><td align="center">ALU unit/#B-DA2</td><td align="center">Manual unit/#B-DA2</td></tr><tr><td align="center">8</td><td align="center">ALU unit/#/CYCN</td><td align="center">Manual unit/#/CYCN</td></tr><tr><td align="center">9</td><td align="center">ALU unit/#/CYNCN</td><td align="center">Manual unit/#/CYNCN</td></tr><tr><td align="center">10</td><td align="center">Main Control unit/#T4</td><td align="center">Clock unit/#T4</td></tr></tbody></table></blockquote><h3 id="操作流程"><a href="#操作流程" class="headerlink" title="操作流程"></a>操作流程</h3><blockquote><mark class="hl-label blue">不带CY循环右移</mark> <table><thead><tr><th align="center">序号</th><th align="center">源单元/源控制信号</th><th align="center">目的单元/目的控制信号</th></tr></thead><tbody><tr><td align="center">1</td><td align="center">IN->299</td><td align="center">/IO-R, (S1S0)=11,T4</td></tr><tr><td align="center">2</td><td align="center">299不带CY循环右移->OUT</td><td align="center">/299-B,(S1S0,M)=100,T4,B-IO-W</td></tr></tbody></table></blockquote><blockquote><mark class="hl-label blue">FOH×3/4的减法实现</mark> <table><thead><tr><th align="center">序号</th><th align="center">源单元/源控制信号</th><th align="center">目的单元/目的控制信号</th></tr></thead><tbody><tr><td align="center">1</td><td align="center">IN->DA1</td><td align="center">/IO-R,B-DA1</td></tr><tr><td align="center">2</td><td align="center">IN->299</td><td align="center">/IO-R,(S1S0)=11,T4</td></tr><tr><td align="center">3</td><td align="center">299右移2次->DA2</td><td align="center">/299-B,(S1S0)=10,T4,T4,B-DA2</td></tr><tr><td align="center">4</td><td align="center">ALU->OUT</td><td align="center">/ALU-B,(S3~S0,M,CI)=011000,IO-W</td></tr></tbody></table></blockquote><blockquote><mark class="hl-label blue">FOH×3/4的加法实现</mark> <table><thead><tr><th align="center">序号</th><th align="center">源单元/源控制信号</th><th align="center">目的单元/目的控制信号</th></tr></thead><tbody><tr><td align="center">1</td><td align="center">IN->299</td><td align="center">/IO-R,(S1S0)=11,T4</td></tr><tr><td align="center">2</td><td align="center">299右移1次->DA1</td><td align="center">/299-B,(S1S0,M)=100,T4,B-DA1</td></tr><tr><td align="center">3</td><td align="center">IN->299</td><td align="center">/IO-R,(S1S0)=11,T4</td></tr><tr><td align="center">4</td><td align="center">299右移2次->DA2</td><td align="center">/299-B,(S1S0,M)=100,T4,T4,B-DA2</td></tr><tr><td align="center">5</td><td align="center">ALU->OUT</td><td align="center">/ALU-B,(S3~S0,M,CI)=100101,IO-W</td></tr></tbody></table></blockquote><h3 id="实验数据"><a href="#实验数据" class="headerlink" title="实验数据"></a>实验数据</h3><blockquote><ol><li>进行四种移位实验:不带CY循环右移、带CY循环右移、不带CY循环左移、带CY循环左移。<br>每移一位,观察总线上的数据显示,并记录到下表中:<table><thead><tr><th align="center">T4次数</th><th align="center">不带CY循环右移</th><th align="center">带CY循环右移</th><th align="center">不带CY循环左移</th><th align="center">带CY循环左移</th></tr></thead><tbody><tr><td align="center">0</td><td align="center">10000000</td><td align="center">10110110</td><td align="center">10001000</td><td align="center">11011101</td></tr><tr><td align="center">1</td><td align="center">01000000</td><td align="center">01011011</td><td align="center">00010001</td><td align="center">10111010</td></tr><tr><td align="center">2</td><td align="center">00100000</td><td align="center">00101101</td><td align="center">00100010</td><td align="center">01110101</td></tr><tr><td align="center">3</td><td align="center">00010000</td><td align="center">10010110</td><td align="center">01000100</td><td align="center">11101011</td></tr><tr><td align="center">4</td><td align="center">00001000</td><td align="center">11001011</td><td align="center">10001000</td><td align="center">11010110</td></tr><tr><td align="center">5</td><td align="center">00000100</td><td align="center">01100101</td><td align="center">00010001</td><td align="center">10101101</td></tr><tr><td align="center">6</td><td align="center">00000010</td><td align="center">10110010</td><td align="center">00100010</td><td align="center">01011011</td></tr><tr><td align="center">7</td><td align="center">00000001</td><td align="center">11011001</td><td align="center">01000100</td><td align="center">10110111</td></tr><tr><td align="center">8</td><td align="center">10000000</td><td align="center">01101100</td><td align="center">10001000</td><td align="center">01101110</td></tr><tr><td align="center">9</td><td align="center">01000000</td><td align="center">10110110</td><td align="center">00010001</td><td align="center">11011101</td></tr></tbody></table></li></ol></blockquote><blockquote><ol start="2"><li>FOH × 3/4 = B4H</li></ol></blockquote><h3 id="实验结果与结论"><a href="#实验结果与结论" class="headerlink" title="实验结果与结论"></a>实验结果与结论</h3><blockquote><p><strong>略</strong></p></blockquote><h3 id="存在疑问"><a href="#存在疑问" class="headerlink" title="存在疑问"></a>存在疑问</h3><blockquote><p><strong>略</strong></p></blockquote><hr>]]></content>
<categories>
<category> 计算机组成原理实验课 </category>
</categories>
<tags>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> 计算机组成原理 </tag>
<tag> EDA实验箱 </tag>
</tags>
</entry>
<entry>
<title>计组实验 - 算术运算</title>
<link href="/2023/05/14/0001-02/"/>
<url>/2023/05/14/0001-02/</url>
<content type="html"><![CDATA[<h1 id="计算机组成原理实验2"><a href="#计算机组成原理实验2" class="headerlink" title="计算机组成原理实验2"></a>计算机组成原理实验2</h1><h2 id="实验目的"><a href="#实验目的" class="headerlink" title="实验目的"></a>实验目的</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">• 了解简单运算器的数据传输方式</span><br><span class="line">• 验证运算器芯片(74LS181)的算术运算功能</span><br><span class="line">• 了解运算标志位,掌握进位标志位、零标志位的判定方法以及它们在运算中的作用</span><br></pre></td></tr></table></figure><br><h2 id="实验内容及原理"><a href="#实验内容及原理" class="headerlink" title="实验内容及原理"></a>实验内容及原理</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">>实验内容一:</span><br><span class="line"></span><br><span class="line">根据P68表11-4,验证“操作”列各项操作理论运算结果与实验结果是否一致,并完成表格。</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">(1)从输入部件(INPUT)自行输入两个数送入ALU部件进行减法运算,</span><br><span class="line"> 判断借位标志CY和零标志ZI,以比较两个数的大小。</span><br><span class="line">(2)实现3465H和12A7H相加和相减结果保存到两个通用寄存器中并读出。</span><br><span class="line">(3)加法操作流程</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">74LS181芯片主要引脚功能:</span><br><span class="line">• A[3..0]:第一组操作数据输入端。</span><br><span class="line">• B[3..0]:第二组操作数据输人端。</span><br><span class="line">• F[3..0]:操作结果数据输出端。</span><br><span class="line">• S[3..0]:操作功能控制端。</span><br><span class="line">• CN:低端进位接收端。</span><br><span class="line">• CN4:高端进位输出端。</span><br><span class="line">• M:算术/逻辑功能控制端。</span><br><span class="line"></span><br><span class="line">算术运算标志位:</span><br><span class="line">• 进位标志CF</span><br><span class="line"> 运算结果最高位产生进位或借位,其值为1;否则为0。</span><br><span class="line"> 常用于加减运算、无符号数比较大小等。</span><br><span class="line">• 零标志ZF</span><br><span class="line"> 如果运算结果为0,则其值为1;否则为0。</span><br><span class="line"> 可用于判断两数是否相等。</span><br><span class="line">• 奇偶标志PF</span><br><span class="line"> 运算结果中“1”的个数为偶数,则其值为1;否则为0。</span><br><span class="line"> 可用于数据校验。</span><br><span class="line">• 溢出标志OF</span><br><span class="line"> 运算结果溢出,则其值为1;否则为0。</span><br><span class="line"> 注意“溢出”和“进位”的区别。</span><br><span class="line"></span><br><span class="line">相关控制信号:</span><br><span class="line">• T4:外部脉冲信号,判断CY、ZI标志的时钟脉冲。</span><br><span class="line">• /CLR:清零信号,清除CY、ZI标志的控制信号。</span><br><span class="line">• /CYCN:带低端进位输入的进位标志CY产生控制端。</span><br><span class="line">• /CYNCN:不带低端进位输入的进位标志CY产生控制端。</span><br></pre></td></tr></table></figure><br><h2 id="实验主要仪器设备"><a href="#实验主要仪器设备" class="headerlink" title="实验主要仪器设备"></a>实验主要仪器设备</h2><blockquote><p><strong>略</strong></p></blockquote><br><h2 id="实验步骤、数据记录及总结分析"><a href="#实验步骤、数据记录及总结分析" class="headerlink" title="实验步骤、数据记录及总结分析"></a>实验步骤、数据记录及总结分析</h2><h3 id="连线"><a href="#连线" class="headerlink" title="连线"></a>连线</h3><blockquote><mark class="hl-label orange">实验内容一:算术运算</mark> <table><thead><tr><th align="center">序号</th><th align="center">源单元/源控制信号</th><th align="center">目的单元/目的控制信号</th></tr></thead><tbody><tr><td align="center">1</td><td align="center">Input unit/#IO-R</td><td align="center">Manual unit/#IO-R</td></tr><tr><td align="center">2</td><td align="center">Output unit/#IO-W</td><td align="center">Manual unit/#IO-W</td></tr><tr><td align="center">3</td><td align="center">ALU unit/#/ALU-B</td><td align="center">Manual unit/#/ALU-B</td></tr><tr><td align="center">4</td><td align="center">ALU unit/#S3~S0MCI</td><td align="center">Manual unit/#S3~S0MCI</td></tr><tr><td align="center">5</td><td align="center">ALU unit/#B-DA1</td><td align="center">Manual unit/#B-DA1</td></tr><tr><td align="center">6</td><td align="center">ALU unit/#B-DA2</td><td align="center">Manual unit/#B-DA2</td></tr><tr><td align="center">7</td><td align="center">ALU unit/#/CYCN</td><td align="center">Manual unit/#/CYCN</td></tr><tr><td align="center">8</td><td align="center">ALU unit/#/CYNCN</td><td align="center">Manual unit/#/CYNCN</td></tr><tr><td align="center">9</td><td align="center">Main Control unit/#T4</td><td align="center">Clock unit/#T4</td></tr></tbody></table></blockquote><blockquote><mark class="hl-label orange">实验内容二:16位数进(借)位加减法</mark> <table><thead><tr><th align="center">序号</th><th align="center">源单元/源控制信号</th><th align="center">目的单元/目的控制信号</th></tr></thead><tbody><tr><td align="center">1</td><td align="center">Input unit/#IO-R</td><td align="center">Manual unit/#IO-R</td></tr><tr><td align="center">2</td><td align="center">Output unit/#IO-W</td><td align="center">Manual unit/#IO-W</td></tr><tr><td align="center">3</td><td align="center">ALU unit/#/ALU-B</td><td align="center">Manual unit/#B-AR</td></tr><tr><td align="center">4</td><td align="center">ALU unit/#S3~S0MCI</td><td align="center">Manual unit/#S3~S0MCI</td></tr><tr><td align="center">5</td><td align="center">ALU unit/#B-DA1</td><td align="center">Manual unit/#B-DA1</td></tr><tr><td align="center">6</td><td align="center">ALU unit/#B-DA2</td><td align="center">Manual unit/#B-DA2</td></tr><tr><td align="center">7</td><td align="center">ALU unit/#/CYCN</td><td align="center">Manual unit/#/CYCN</td></tr><tr><td align="center">8</td><td align="center">ALU unit/#/CYNCN</td><td align="center">Manual unit/#/CYNCN</td></tr><tr><td align="center">9</td><td align="center">Main Control unit/#T4</td><td align="center">Clock unit/#T4</td></tr><tr><td align="center">10</td><td align="center">REG unit/#B-R1</td><td align="center">Manual unit/#KA</td></tr><tr><td align="center">11</td><td align="center">REG unit/#B-R0</td><td align="center">Manual unit/#KB</td></tr><tr><td align="center">12</td><td align="center">REG unit/#/R1-B</td><td align="center">Manual unit/#/R1-B</td></tr><tr><td align="center">13</td><td align="center">REG unit/#/R0-B</td><td align="center">Manual unit/#/R0-B</td></tr></tbody></table></blockquote><h3 id="操作流程"><a href="#操作流程" class="headerlink" title="操作流程"></a>操作流程</h3><blockquote><mark class="hl-label blue">实验内容一:算术运算</mark> <table><thead><tr><th align="center">序号</th><th align="center">源单元/源控制信号</th><th align="center">目的单元/目的控制信号</th></tr></thead><tbody><tr><td align="center">1</td><td align="center">IN->DA1</td><td align="center">/IO-R, B-DA1</td></tr><tr><td align="center">2</td><td align="center">IN->DA2</td><td align="center">/IO-R, B-DA2</td></tr><tr><td align="center">3</td><td align="center">ALU->OUT</td><td align="center">/ALU-B, S3~S0MCI=100101, IO-W</td></tr></tbody></table></blockquote><blockquote><mark class="hl-label blue">实验内容二:16位数进(借)位加减法</mark> <table><thead><tr><th align="center">序号</th><th align="center">源单元/源控制信号</th><th align="center">目的单元/目的控制信号</th></tr></thead><tbody><tr><td align="center">1</td><td align="center">IN->DA1</td><td align="center">/IO-R, B-DA1</td></tr><tr><td align="center">2</td><td align="center">IN->DA2</td><td align="center">/IO-R, B-DA2</td></tr><tr><td align="center">3</td><td align="center">ALU->R0</td><td align="center">B-AR,S3~S0MCI=100101, KA</td></tr><tr><td align="center">4</td><td align="center">判断CY</td><td align="center">/CYCN或/CYNCN, T4</td></tr><tr><td align="center">5</td><td align="center">IN->DA1</td><td align="center">/IO-R, B-DA1</td></tr><tr><td align="center">6</td><td align="center">IN->DA2</td><td align="center">/IO-R, B-DA2</td></tr><tr><td align="center">7</td><td align="center">ALU->R1</td><td align="center">/CYCN, B-AR, S3~S0MCI=100101, KB</td></tr><tr><td align="center">8</td><td align="center">R1->OUT</td><td align="center">/R1-B, IO-W</td></tr><tr><td align="center">9</td><td align="center">R0->OUT</td><td align="center">/R0-B, IO-W</td></tr></tbody></table></blockquote><h3 id="实验数据"><a href="#实验数据" class="headerlink" title="实验数据"></a>实验数据</h3><blockquote><ol><li>验证F=A,F=B,F=A加B,F=A减B, F=(A+/B)加(A*B),F=/(A⊕B)运算结果,<br> 验证理论运算结果与实验结果是否一致。(F[7..0]列填16进制数)<table><thead><tr><th align="center">操作</th><th align="center">S[3..0]</th><th align="center">M</th><th align="center">CN</th><th align="center">A[7..0]</th><th align="center">B[7..0]</th><th align="center">F[7..0]</th></tr></thead><tbody><tr><td align="center">F=A</td><td align="center">1111</td><td align="center">1</td><td align="center">x</td><td align="center">65H</td><td align="center">A7H</td><td align="center">65H</td></tr><tr><td align="center">F=B</td><td align="center">1010</td><td align="center">1</td><td align="center">x</td><td align="center">65H</td><td align="center">A7H</td><td align="center">A7H</td></tr><tr><td align="center">F=A加B</td><td align="center">1001</td><td align="center">0</td><td align="center">1</td><td align="center">65H</td><td align="center">A7H</td><td align="center">0CH</td></tr><tr><td align="center">F=A减B</td><td align="center">0110</td><td align="center">0</td><td align="center">0</td><td align="center">65H</td><td align="center">A7H</td><td align="center">BEH</td></tr><tr><td align="center">F=(A+/B)加(A*B)</td><td align="center">1010</td><td align="center">0</td><td align="center">1</td><td align="center">65H</td><td align="center">A7H</td><td align="center">A2H</td></tr><tr><td align="center">F=/(A⊕B)</td><td align="center">1001</td><td align="center">1</td><td align="center">x</td><td align="center">65H</td><td align="center">A7H</td><td align="center">3DH</td></tr></tbody></table></li></ol></blockquote><blockquote><ol start="2"><li>3465H + 12A7H = 470CH<br> 3465H - 12A7H = 21BEH</li></ol></blockquote><h3 id="实验结果与结论"><a href="#实验结果与结论" class="headerlink" title="实验结果与结论"></a>实验结果与结论</h3><blockquote><p><strong>略</strong></p></blockquote><h3 id="存在疑问"><a href="#存在疑问" class="headerlink" title="存在疑问"></a>存在疑问</h3><blockquote><p><strong>略</strong></p></blockquote><hr>]]></content>
<categories>
<category> 计算机组成原理实验课 </category>
</categories>
<tags>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> 计算机组成原理 </tag>
<tag> EDA实验箱 </tag>
</tags>
</entry>
<entry>
<title>计组实验 - 输入输出控制</title>
<link href="/2023/05/14/0001-01/"/>
<url>/2023/05/14/0001-01/</url>
<content type="html"><![CDATA[<h1 id="计算机组成原理实验1"><a href="#计算机组成原理实验1" class="headerlink" title="计算机组成原理实验1"></a>计算机组成原理实验1</h1><h2 id="实验目的"><a href="#实验目的" class="headerlink" title="实验目的"></a>实验目的</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">• 熟悉实验台基本结构,了解各模块功能;</span><br><span class="line">• 理解控制信号的基本概念和作用;</span><br><span class="line">• 掌握输入模块与输出模块的功能、原理和操作方法。</span><br></pre></td></tr></table></figure><br><h2 id="实验内容及原理"><a href="#实验内容及原理" class="headerlink" title="实验内容及原理"></a>实验内容及原理</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">>实验内容:</span><br><span class="line">(1)实现从输入部件输入一个数据65H,并将之通过总线BUS从输出部件输出</span><br><span class="line">(2)把输入部件(INPUT)上的数据65H送到总线(BUS):IN BUS,涉及控制信号/IO-R。</span><br><span class="line">(3)把总线(BUS)上的数据送到输出部件(OUT):BUS OUT,涉及控制信号/IO-W。</span><br><span class="line">(4)数据变换操作(clock单元代替开关),OUT单元的数据随着INPUT单元的数据变化而变化(连续脉冲)。</span><br></pre></td></tr></table></figure><br><h2 id="实验主要仪器设备"><a href="#实验主要仪器设备" class="headerlink" title="实验主要仪器设备"></a>实验主要仪器设备</h2><blockquote><p><strong>略</strong></p></blockquote><br><h2 id="实验步骤、数据记录及总结分析"><a href="#实验步骤、数据记录及总结分析" class="headerlink" title="实验步骤、数据记录及总结分析"></a>实验步骤、数据记录及总结分析</h2><h3 id="连线"><a href="#连线" class="headerlink" title="连线"></a>连线</h3><blockquote><mark class="hl-label orange">实验内容:简单的输入输出</mark> <table><thead><tr><th align="center">序号</th><th align="center">源单元/源控制信号</th><th align="center">目的单元/目的控制信号</th></tr></thead><tbody><tr><td align="center">1</td><td align="center">Input unit/#IO-R</td><td align="center">Manual unit/#IO-R</td></tr><tr><td align="center">2</td><td align="center">Output unit/#IO-W</td><td align="center">Manual unit/#IO-W</td></tr></tbody></table></blockquote><h3 id="操作流程"><a href="#操作流程" class="headerlink" title="操作流程"></a>操作流程</h3><blockquote><mark class="hl-label blue">实验内容:简单的输入输出</mark> <table><thead><tr><th align="center">序号</th><th align="center">源单元/源控制信号</th><th align="center">目的单元/目的控制信号</th></tr></thead><tbody><tr><td align="center">1</td><td align="center">IN->OUT</td><td align="center">/IO-R, IO-W</td></tr></tbody></table></blockquote><h3 id="实验数据"><a href="#实验数据" class="headerlink" title="实验数据"></a>实验数据</h3><blockquote><p><strong>略</strong></p></blockquote><h3 id="实验结果与结论"><a href="#实验结果与结论" class="headerlink" title="实验结果与结论"></a>实验结果与结论</h3><blockquote><p><strong>略</strong></p></blockquote><h3 id="存在疑问"><a href="#存在疑问" class="headerlink" title="存在疑问"></a>存在疑问</h3><blockquote><p><strong>略</strong></p></blockquote><hr>]]></content>
<categories>
<category> 计算机组成原理实验课 </category>
</categories>
<tags>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> 计算机组成原理 </tag>
<tag> EDA实验箱 </tag>
</tags>
</entry>
<entry>
<title>Qt实验 - 事件,随机数和计时器练习</title>
<link href="/2023/05/14/0002-08/"/>
<url>/2023/05/14/0002-08/</url>
<content type="html"><![CDATA[<h1 id="C-桌面应用程序实验8"><a href="#C-桌面应用程序实验8" class="headerlink" title="C++桌面应用程序实验8"></a>C++桌面应用程序实验8</h1><h2 id="第1题"><a href="#第1题" class="headerlink" title="第1题"></a>第1题</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">做一窗口,上面有一按钮</span><br><span class="line">(1)按下鼠标左键并拖动鼠标,按钮随着鼠标的光标移动,同时在状态栏显示鼠标以用户区坐标系表示的位置坐标;</span><br><span class="line">(2)当输入焦点在窗口上时,按下键盘上的Ctrl同时按下M的时候,窗口最大化显示;</span><br><span class="line">(3)做弹出式菜单“窗口”,下面三个菜单项“最大”“最小”“普通”,要求菜单项需要有图标,图标自定,要求使用qt的资</span><br><span class="line"> 源;实现三个菜单项对应的功能;</span><br><span class="line">(4)在工具栏上添加上述三个菜单项所对应的Action。</span><br><span class="line">(5)在窗口上双击鼠标左键,窗口最大化,双击右键,由最大化恢复。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">dragpushbutton.h</button></li><li class="tab"><button type="button" data-href="#-2">dragpushbutton.cpp</button></li><li class="tab"><button type="button" data-href="#-3">mainwindow.h</button></li><li class="tab"><button type="button" data-href="#-4">mainwindow.cpp</button></li><li class="tab"><button type="button" data-href="#-5">注意事项!</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> DRAGPUSHBUTTON_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> DRAGPUSHBUTTON_H</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QWidget></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QPushButton></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QMouseEvent></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QDebug></span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">DragPushButton</span> : <span class="keyword">public</span> QPushButton</span><br><span class="line">{</span><br><span class="line"> Q_OBJECT</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="keyword">explicit</span> <span class="title">DragPushButton</span><span class="params">(QWidget *parent = <span class="literal">nullptr</span>)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">protected</span>:</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">mousePressEvent</span><span class="params">(QMouseEvent *event)</span></span>;</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">mouseMoveEvent</span><span class="params">(QMouseEvent *event)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> QPoint pressPoint;</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span> <span class="comment">// DRAGPUSHBUTTON_H</span></span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"dragpushbutton.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QString></span></span></span><br><span class="line"></span><br><span class="line">DragPushButton::<span class="built_in">DragPushButton</span>(QWidget *parent) : <span class="built_in">QPushButton</span>(parent){}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">DragPushButton::mousePressEvent</span><span class="params">(QMouseEvent *event)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">if</span>(event-><span class="built_in">button</span>() == Qt::LeftButton){</span><br><span class="line"> <span class="keyword">this</span>-><span class="built_in">raise</span>(); <span class="comment">//将此按钮移动到顶层显示</span></span><br><span class="line"> <span class="keyword">this</span>->pressPoint = event-><span class="built_in">pos</span>();</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="type">void</span> <span class="title">DragPushButton::mouseMoveEvent</span><span class="params">(QMouseEvent *event)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">if</span>(event-><span class="built_in">buttons</span>() == Qt::LeftButton){</span><br><span class="line"> QPoint curPos = <span class="keyword">this</span>-><span class="built_in">mapToParent</span>(event-><span class="built_in">pos</span>() - <span class="keyword">this</span>->pressPoint);</span><br><span class="line"><span class="comment">// QString str = QString("按钮当前位置: (%1 , %2)").arg(event->pos().x()).arg(event->pos().y());</span></span><br><span class="line"> QString str = <span class="built_in">QString</span>(<span class="string">"按钮相对全屏所在位置: (%1 , %2)"</span>).<span class="built_in">arg</span>(curPos.<span class="built_in">x</span>()).<span class="built_in">arg</span>(curPos.<span class="built_in">y</span>());</span><br><span class="line"> <span class="keyword">this</span>-><span class="built_in">move</span>(curPos);</span><br><span class="line"> <span class="keyword">this</span>-><span class="built_in">setText</span>(str);</span><br><span class="line"> <span class="comment">//防止按钮移出父窗口</span></span><br><span class="line"> <span class="keyword">if</span>(<span class="keyword">this</span>-><span class="built_in">mapToParent</span>(<span class="keyword">this</span>-><span class="built_in">rect</span>().<span class="built_in">topLeft</span>()).<span class="built_in">x</span>() <= <span class="number">0</span>){</span><br><span class="line"> <span class="keyword">this</span>-><span class="built_in">move</span>(<span class="number">0</span>, <span class="keyword">this</span>-><span class="built_in">pos</span>().<span class="built_in">y</span>());</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(<span class="keyword">this</span>-><span class="built_in">mapToParent</span>(<span class="keyword">this</span>-><span class="built_in">rect</span>().<span class="built_in">bottomRight</span>()).<span class="built_in">x</span>() >= <span class="keyword">this</span>-><span class="built_in">parentWidget</span>()-><span class="built_in">rect</span>().<span class="built_in">width</span>()){</span><br><span class="line"> <span class="keyword">this</span>-><span class="built_in">move</span>(<span class="keyword">this</span>-><span class="built_in">parentWidget</span>()-><span class="built_in">rect</span>().<span class="built_in">width</span>() - <span class="keyword">this</span>-><span class="built_in">width</span>(), <span class="keyword">this</span>-><span class="built_in">pos</span>().<span class="built_in">y</span>());</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(<span class="keyword">this</span>-><span class="built_in">mapToParent</span>(<span class="keyword">this</span>-><span class="built_in">rect</span>().<span class="built_in">topLeft</span>()).<span class="built_in">y</span>() <= <span class="number">0</span>){</span><br><span class="line"> <span class="keyword">this</span>-><span class="built_in">move</span>(<span class="keyword">this</span>-><span class="built_in">pos</span>().<span class="built_in">x</span>(), <span class="number">0</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(<span class="keyword">this</span>-><span class="built_in">mapToParent</span>(<span class="keyword">this</span>-><span class="built_in">rect</span>().<span class="built_in">bottomRight</span>()).<span class="built_in">y</span>() >= <span class="keyword">this</span>-><span class="built_in">parentWidget</span>()-><span class="built_in">rect</span>().<span class="built_in">height</span>()){</span><br><span class="line"> <span class="keyword">this</span>-><span class="built_in">move</span>(<span class="keyword">this</span>-><span class="built_in">pos</span>().<span class="built_in">x</span>(), <span class="keyword">this</span>-><span class="built_in">parentWidget</span>()-><span class="built_in">rect</span>().<span class="built_in">height</span>() - <span class="keyword">this</span>-><span class="built_in">height</span>());</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-3"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> MAINWINDOW_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> MAINWINDOW_H</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"dragpushbutton.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QMainWindow></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QMenu></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QMenuBar></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QAction></span></span></span><br><span class="line"></span><br><span class="line">QT_BEGIN_NAMESPACE</span><br><span class="line"><span class="keyword">namespace</span> Ui { <span class="keyword">class</span> <span class="title class_">MainWindow</span>; }</span><br><span class="line">QT_END_NAMESPACE</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MainWindow</span> : <span class="keyword">public</span> QMainWindow</span><br><span class="line">{</span><br><span class="line"> Q_OBJECT</span><br><span class="line"></span><br><span class="line"><span class="keyword">protected</span>:</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">mouseDoubleClickEvent</span><span class="params">(QMouseEvent *event)</span> <span class="keyword">override</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">mouseReleaseEvent</span><span class="params">(QMouseEvent *event)</span> <span class="keyword">override</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">mousePressEvent</span><span class="params">(QMouseEvent *event)</span> <span class="keyword">override</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">mouseMoveEvent</span><span class="params">(QMouseEvent *event)</span> <span class="keyword">override</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">keyPressEvent</span><span class="params">(QKeyEvent *event)</span> <span class="keyword">override</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> QPoint offset;</span><br><span class="line"></span><br><span class="line"> QMenu pMenu;</span><br><span class="line"></span><br><span class="line"> DragPushButton *pbDrag;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span> slots:</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">onTaskBoxContextMenuEvent</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_MainWindow_customContextMenuRequested</span><span class="params">(<span class="type">const</span> QPoint &pos)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="built_in">MainWindow</span>(QWidget *parent = <span class="literal">nullptr</span>);</span><br><span class="line"> ~<span class="built_in">MainWindow</span>();</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> Ui::MainWindow *ui;</span><br><span class="line">};</span><br><span class="line"><span class="meta">#<span class="keyword">endif</span> <span class="comment">// MAINWINDOW_H</span></span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-4"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"mainwindow.h"</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"ui_mainwindow.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QMouseEvent></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QKeyEvent></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QDebug></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QString></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QLabel></span></span></span><br><span class="line"></span><br><span class="line">MainWindow::<span class="built_in">MainWindow</span>(QWidget *parent)</span><br><span class="line"> : <span class="built_in">QMainWindow</span>(parent)</span><br><span class="line"> , <span class="built_in">ui</span>(<span class="keyword">new</span> Ui::MainWindow)</span><br><span class="line">{</span><br><span class="line"> ui-><span class="built_in">setupUi</span>(<span class="keyword">this</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 可拖动的按钮</span></span><br><span class="line"> pbDrag = <span class="keyword">new</span> <span class="built_in">DragPushButton</span>(<span class="keyword">this</span>);</span><br><span class="line"> pbDrag-><span class="built_in">resize</span>(<span class="number">300</span>, <span class="number">100</span>);</span><br><span class="line"> pbDrag-><span class="built_in">move</span>(<span class="number">100</span>, <span class="number">100</span>);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">statusBar</span>()-><span class="built_in">showMessage</span>(<span class="string">"Status is here..."</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MainWindow::mousePressEvent</span><span class="params">(QMouseEvent *event)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">if</span> (event-><span class="built_in">button</span>() == Qt::LeftButton)</span><br><span class="line"> {</span><br><span class="line"> QCursor cursor;</span><br><span class="line"> cursor.<span class="built_in">setShape</span>(Qt::CrossCursor);</span><br><span class="line"> QApplication::<span class="built_in">setOverrideCursor</span>(cursor);</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="type">void</span> <span class="title">MainWindow::mouseReleaseEvent</span><span class="params">(QMouseEvent *event)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">Q_UNUSED</span>(event);</span><br><span class="line"> QApplication::<span class="built_in">restoreOverrideCursor</span>();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MainWindow::mouseMoveEvent</span><span class="params">(QMouseEvent *event)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> QString str = <span class="built_in">QString</span>(<span class="string">"鼠标在用户区的坐标: (%1 , %2)"</span>).<span class="built_in">arg</span>(event-><span class="built_in">pos</span>().<span class="built_in">x</span>()).<span class="built_in">arg</span>(event-><span class="built_in">pos</span>().<span class="built_in">y</span>());</span><br><span class="line"> <span class="built_in">statusBar</span>()-><span class="built_in">showMessage</span>(str);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MainWindow::mouseDoubleClickEvent</span><span class="params">(QMouseEvent *event)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">if</span> (event-><span class="built_in">button</span>() == Qt::LeftButton)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">setWindowState</span>(Qt::WindowFullScreen);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (event-><span class="built_in">button</span>() == Qt::RightButton)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">setWindowState</span>(Qt::WindowNoState);</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="type">void</span> <span class="title">MainWindow::keyPressEvent</span><span class="params">(QKeyEvent *event)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">if</span> (event-><span class="built_in">modifiers</span>() == Qt::ControlModifier)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (event-><span class="built_in">key</span>() == Qt::Key_M)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">setWindowState</span>(Qt::WindowMaximized);</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="type">void</span> <span class="title">MainWindow::on_MainWindow_customContextMenuRequested</span><span class="params">(<span class="type">const</span> QPoint &<span class="comment">/*pos*/</span>)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="comment">//创建菜单对象</span></span><br><span class="line"> QMenu *pMenu = <span class="keyword">new</span> <span class="built_in">QMenu</span>(<span class="keyword">this</span>);</span><br><span class="line"></span><br><span class="line"> QAction *pChange1 = <span class="keyword">new</span> <span class="built_in">QAction</span>(<span class="built_in">tr</span>(<span class="string">"最大"</span>), <span class="keyword">this</span>);</span><br><span class="line"> QAction *pChange2 = <span class="keyword">new</span> <span class="built_in">QAction</span>(<span class="built_in">tr</span>(<span class="string">"普通"</span>), <span class="keyword">this</span>);</span><br><span class="line"> QAction *pChange3 = <span class="keyword">new</span> <span class="built_in">QAction</span>(<span class="built_in">tr</span>(<span class="string">"最小"</span>), <span class="keyword">this</span>);</span><br><span class="line"> pChange1-><span class="built_in">setData</span>(<span class="number">1</span>);</span><br><span class="line"> pChange2-><span class="built_in">setData</span>(<span class="number">2</span>);</span><br><span class="line"> pChange3-><span class="built_in">setData</span>(<span class="number">3</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//添加图标</span></span><br><span class="line"> <span class="function">QIcon <span class="title">icon</span><span class="params">(<span class="string">":/image/coleduck.jpg"</span>)</span></span>;</span><br><span class="line"> pChange1-><span class="built_in">setIcon</span>(icon);</span><br><span class="line"> pChange2-><span class="built_in">setIcon</span>(icon);</span><br><span class="line"> pChange3-><span class="built_in">setIcon</span>(icon);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//把QAction对象添加到菜单上</span></span><br><span class="line"> pMenu-><span class="built_in">addAction</span>(pChange1);</span><br><span class="line"> pMenu-><span class="built_in">addAction</span>(pChange2);</span><br><span class="line"> pMenu-><span class="built_in">addAction</span>(pChange3);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//连接鼠标右键点击信号</span></span><br><span class="line"> <span class="built_in">connect</span>(pChange1, <span class="built_in">SIGNAL</span>(<span class="built_in">triggered</span>()), <span class="keyword">this</span>, <span class="built_in">SLOT</span>(<span class="built_in">onTaskBoxContextMenuEvent</span>()));</span><br><span class="line"> <span class="built_in">connect</span>(pChange2, <span class="built_in">SIGNAL</span>(<span class="built_in">triggered</span>()), <span class="keyword">this</span>, <span class="built_in">SLOT</span>(<span class="built_in">onTaskBoxContextMenuEvent</span>()));</span><br><span class="line"> <span class="built_in">connect</span>(pChange3, <span class="built_in">SIGNAL</span>(<span class="built_in">triggered</span>()), <span class="keyword">this</span>, <span class="built_in">SLOT</span>(<span class="built_in">onTaskBoxContextMenuEvent</span>()));</span><br><span class="line"></span><br><span class="line"> <span class="comment">//在鼠标右键点击的地方显示菜单</span></span><br><span class="line"> pMenu-><span class="built_in">exec</span>(<span class="built_in">cursor</span>().<span class="built_in">pos</span>());</span><br><span class="line"></span><br><span class="line"> <span class="comment">//释放内存</span></span><br><span class="line"> QList<QAction*> list = pMenu-><span class="built_in">actions</span>();</span><br><span class="line"> foreach (QAction* pAction, list) <span class="keyword">delete</span> pAction;</span><br><span class="line"> <span class="keyword">delete</span> pMenu;</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="type">void</span> <span class="title">MainWindow::onTaskBoxContextMenuEvent</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> QAction *pEven = <span class="built_in">qobject_cast</span><QAction *>(<span class="keyword">this</span>-><span class="built_in">sender</span>()); <span class="comment">//this->sender()就是发信号者 QAction</span></span><br><span class="line"></span><br><span class="line"> <span class="type">int</span> iType = pEven-><span class="built_in">data</span>().<span class="built_in">toInt</span>();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">switch</span> (iType)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> <span class="number">1</span>:</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">setWindowState</span>(Qt::WindowMaximized);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="number">2</span>:</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">setWindowState</span>(Qt::WindowNoState);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="number">3</span>:</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">setWindowState</span>(Qt::WindowMinimized);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">break</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">MainWindow::~<span class="built_in">MainWindow</span>()</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">delete</span> ui;</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-5"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">一定要把 contextMenuPolicy 设置成 CustomContextMenu</span><br><span class="line">这样才可以使用自定义的弹出式菜单栏</span><br></pre></td></tr></table></figure><p><img src="https://s2.loli.net/2023/05/12/ti2z7NFbxyjLSPo.png" alt="7960d707e41e2e3f2059692d93e5cbd.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="第2题"><a href="#第2题" class="headerlink" title="第2题"></a>第2题</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">目的与要求</button></li><li class="tab"><button type="button" data-href="#-2">实验准备</button></li><li class="tab"><button type="button" data-href="#-3">实验内容</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><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></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">做一窗口,上面有一按钮</span><br><span class="line">(1)了解信号和槽的基本使用方法</span><br><span class="line">(2)了解定时器和随机数的基本概念</span><br><span class="line">(3)准备好需要使用的图片文件</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-3"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">使用定时器可以在指定时间执行一些功能,而要实现随机效果就要使用随机数来实现。实验目标为新建程序实现电子时钟效</span><br><span class="line">果,并每隔一秒随机显示一张图片。</span><br><span class="line"></span><br><span class="line">(1)新建Qt Widgets应用,项目名称为mytimer,基类选择QWidget,类名为Widget。</span><br><span class="line">(2)完成项目创建后,双击widget.ui进入设计模式,然后向界面上拖入两个Push Button、一个Line Edit和一个Label部件,修改其显示文本,效果如下图所示。</span><br></pre></td></tr></table></figure><p><img src="https://s2.loli.net/2023/05/12/GT8W7U9LDC4FlcE.jpg" alt="1.jpg"></p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(3)然后到widget.h文件中添加类的前置声明:</span><br><span class="line"> class QTimer;</span><br><span class="line"></span><br><span class="line"> 再添加一个私有槽声明:</span><br><span class="line"> private slots:</span><br><span class="line"> void timerUpdate();</span><br><span class="line"></span><br><span class="line"> 和一个私有对象指针:</span><br><span class="line"> private:</span><br><span class="line"> QTimer *timer;</span><br><span class="line"></span><br><span class="line">(4)到widget.cpp中,先添加头文件包含:</span><br><span class="line"> #include <QTimer></span><br><span class="line"> #include <QDateTime></span><br><span class="line"> #include <QRandomGenerator></span><br><span class="line"> 然后在构造函数中添加如下代码:</span><br><span class="line"> timer = new QTimer(this);</span><br><span class="line"> //关联定时器溢出信号和相应的槽函数</span><br><span class="line"> connect(timer, &QTimer::timeout, this, &Widget::timerUpdate);</span><br><span class="line"> 这里创建了一个定时器,并将其溢出信号和更新槽关联起来。</span><br><span class="line"></span><br><span class="line">(5)下面在widget.cpp文件中添加timerUpdate()函数的定义:</span><br><span class="line"> void Widget::timerUpdate()</span><br><span class="line"> {</span><br><span class="line"> //获取系统现在的时间</span><br><span class="line"> QDateTime time = QDateTime::currentDateTime();</span><br><span class="line"> //设置系统时间显示格式</span><br><span class="line"> QString str = time.toString("yyyy-MM-dd hh:mm:ss dddd");</span><br><span class="line"> //在标签上显示时间</span><br><span class="line"> ui->lineEdit->setText(str);</span><br><span class="line"></span><br><span class="line"> int rand = QRandomGenerator::global()->bounded(5); // 产生5以内随机整数即0-4</span><br><span class="line"></span><br><span class="line"> QPixmap pix = QPixmap(QString("../mytimer/images/%1.png").arg(rand));</span><br><span class="line"> ui->label->setPixmap(pix.scaled(ui->label->size(), Qt::IgnoreAspectRatio));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> 这里在行编辑器中显示了当前的时间。然后使用global()->bounded(5)产生5以内的随机数,并使用这个随机数来获取图片,并在标签中进行显示。</span><br><span class="line"> </span><br><span class="line"> 关于随机数,Qt中是使用QRandomGenerator类实现的,它可以从一个高质量的随机数生成器来生成随机的数值。使用</span><br><span class="line"> 时,可以在创建QRandomGenerator对象时直接给定一个数值作为种子来生成一组相同的随机数,给定不同的种子,那</span><br><span class="line"> 么生成的随机数序列也是不同的,也可以使用seed()来设置种子。另外,可以使用bounded()函数来设置生成随机数</span><br><span class="line"> 的范围,它有多种重载形式,例如bounded(256)可以生成 [0, 256)(包含0但不包含256)之间的一个随机整数;</span><br><span class="line"> bounded(5.0)可以生成[0,5)之间的双精度浮点数;bounded(-10, 10)生成随机数的范围是[-10, 10)。在实际编程</span><br><span class="line"> 中,我们经常使用QRandomGenerator::global()来获取一个QRandomGenerator的全局实例。</span><br><span class="line"></span><br><span class="line">(6)前面代码中使用了0.png、1.png、2.png、3.png、4.png这样5张图片,需要复制5张图片到项目目录下面新建的</span><br><span class="line"> images目录中。当然,也可以将图片放到资源文件中。</span><br><span class="line"></span><br><span class="line">(7)在设计模式,分别右击“开始”按钮和“停止”按钮,选择转到槽,然后选择clicked()信号。将对应的槽函数修改如下:</span><br><span class="line"> // 开始按钮</span><br><span class="line"> void Widget::on_pushButton_clicked()</span><br><span class="line"> {</span><br><span class="line"> timer->start(1000);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> // 停止按钮</span><br><span class="line"> void Widget::on_pushButton_2_clicked()</span><br><span class="line"> {</span><br><span class="line"> timer->stop();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> 使用start()来启动定时器,其中参数用来指定溢出时间间隔,单位为毫秒。这里设置为1000,表明每隔1秒发射一次</span><br><span class="line"> timeout()信号。如果要停止定时器,可以调用stop()函数。</span><br><span class="line"></span><br><span class="line">(8)运行程序,点击“开始”按钮,会显示当前系统时间,并每隔一秒随机显示一张图片。效果如图5-2所示。</span><br></pre></td></tr></table></figure><p><img src="https://s2.loli.net/2023/05/12/GXgHo6Ri7VtnP5h.jpg" alt="2.jpg"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">widget.h</button></li><li class="tab"><button type="button" data-href="#-2">widget.cpp</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> WIDGET_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> WIDGET_H</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QWidget></span></span></span><br><span class="line"></span><br><span class="line">QT_BEGIN_NAMESPACE</span><br><span class="line"><span class="keyword">namespace</span> Ui { <span class="keyword">class</span> <span class="title class_">Widget</span>; }</span><br><span class="line">QT_END_NAMESPACE</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">QTimer</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Widget</span> : <span class="keyword">public</span> QWidget</span><br><span class="line">{</span><br><span class="line"> Q_OBJECT</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span> slots:</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">timerUpdate</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_pb_run_clicked</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_pb_stop_clicked</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> QTimer *timer;</span><br><span class="line"></span><br><span class="line"> <span class="type">int</span> pre = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="built_in">Widget</span>(QWidget *parent = <span class="literal">nullptr</span>);</span><br><span class="line"> ~<span class="built_in">Widget</span>();</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> Ui::Widget *ui;</span><br><span class="line">};</span><br><span class="line"><span class="meta">#<span class="keyword">endif</span> <span class="comment">// WIDGET_H</span></span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"widget.h"</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"ui_widget.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QTimer></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QDateTime></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QRandomGenerator></span></span></span><br><span class="line"></span><br><span class="line">Widget::<span class="built_in">Widget</span>(QWidget *parent)</span><br><span class="line"> : <span class="built_in">QWidget</span>(parent)</span><br><span class="line"> , <span class="built_in">ui</span>(<span class="keyword">new</span> Ui::Widget)</span><br><span class="line">{</span><br><span class="line"> ui-><span class="built_in">setupUi</span>(<span class="keyword">this</span>);</span><br><span class="line"></span><br><span class="line"> timer = <span class="keyword">new</span> <span class="built_in">QTimer</span>(<span class="keyword">this</span>);</span><br><span class="line"> <span class="built_in">connect</span>(timer, &QTimer::timeout, <span class="keyword">this</span>, &Widget::timerUpdate);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">Widget::timerUpdate</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="comment">//获取系统现在的时间</span></span><br><span class="line"> QDateTime time = QDateTime::<span class="built_in">currentDateTime</span>();</span><br><span class="line"> <span class="comment">//设置系统时间显示格式</span></span><br><span class="line"> QString str = time.<span class="built_in">toString</span>(<span class="string">"yyyy-MM-dd hh:mm:ss dddd"</span>);</span><br><span class="line"> <span class="comment">//在标签上显示时间</span></span><br><span class="line"> ui->lineEdit-><span class="built_in">setText</span>(str);</span><br><span class="line"></span><br><span class="line"> <span class="type">int</span> rand = QRandomGenerator::<span class="built_in">global</span>()-><span class="built_in">bounded</span>(<span class="number">5</span>); <span class="comment">// 产生5以内随机整数即0-4</span></span><br><span class="line"> <span class="keyword">while</span> (rand == pre)</span><br><span class="line"> {</span><br><span class="line"> rand = QRandomGenerator::<span class="built_in">global</span>()-><span class="built_in">bounded</span>(<span class="number">5</span>);</span><br><span class="line"> }</span><br><span class="line"> pre = rand;</span><br><span class="line"></span><br><span class="line"> QPixmap pix = <span class="built_in">QPixmap</span>(<span class="built_in">QString</span>(<span class="string">"../pro2/%1.jpg"</span>).<span class="built_in">arg</span>(rand));</span><br><span class="line"> ui->label-><span class="built_in">setPixmap</span>(pix.<span class="built_in">scaled</span>(ui->label-><span class="built_in">size</span>(), Qt::IgnoreAspectRatio));</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">Widget::~<span class="built_in">Widget</span>()</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">delete</span> ui;</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="type">void</span> <span class="title">Widget::on_pb_run_clicked</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> timer-><span class="built_in">start</span>(<span class="number">1000</span>);</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="type">void</span> <span class="title">Widget::on_pb_stop_clicked</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> timer-><span class="built_in">stop</span>();</span><br><span class="line">}</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><hr>]]></content>
<categories>
<category> C++桌面应用程序 </category>
</categories>
<tags>
<tag> C++ </tag>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> 桌面应用程序 </tag>
<tag> QT creator </tag>
</tags>
</entry>
<entry>
<title>Qt实验 - 主窗口、资源的使用</title>
<link href="/2023/05/14/0002-07/"/>
<url>/2023/05/14/0002-07/</url>
<content type="html"><![CDATA[<h1 id="C-桌面应用程序实验7"><a href="#C-桌面应用程序实验7" class="headerlink" title="C++桌面应用程序实验7"></a>C++桌面应用程序实验7</h1><h2 id="第1题"><a href="#第1题" class="headerlink" title="第1题"></a>第1题</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">用Qt做一个基于主窗口的程序,用于处理文档,要求如下:</span><br><span class="line">1.要有菜单,其中至少有3个常用菜单项具有图标,快捷键,图标是基于qt资源的;</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"> 定,核对已有用户名和密码,核对通过则进入,否则提示错误,并且重试;当登陆成功后,登陆菜单项变为灰色;“退</span><br><span class="line"> 出当前用户”变为可用</span><br><span class="line">6.当登陆成功后,状态栏显示临时信息“当前用户为***(你登陆的用户名)”</span><br><span class="line">7.能够打开硬盘上已有记事本文档(使用标准对话框中的文件打开对话框)</span><br><span class="line">8.能够保存窗口显示文字为txt文件</span><br><span class="line">9.能够使用字体选择组合框更改显示字体</span><br><span class="line">10.右键弹出式菜单,能够关闭程序和选择字体。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">Logindialog.h</button></li><li class="tab"><button type="button" data-href="#-2">Mymainwindow.h</button></li><li class="tab"><button type="button" data-href="#-3">Mymainwindow.cpp</button></li><li class="tab"><button type="button" data-href="#-4">Logindialog.ui</button></li><li class="tab"><button type="button" data-href="#-5">Mymainwindow.ui</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> LOGINDIALOG_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> LOGINDIALOG_H</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QDialog></span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> Ui {</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">LoginDialog</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">LoginDialog</span> : <span class="keyword">public</span> QDialog</span><br><span class="line">{</span><br><span class="line"> Q_OBJECT</span><br><span class="line"></span><br><span class="line">signals:</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">emit_login_log</span><span class="params">(QString &str)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="keyword">explicit</span> <span class="title">LoginDialog</span><span class="params">(QWidget *parent = <span class="literal">nullptr</span>)</span></span>;</span><br><span class="line"> ~<span class="built_in">LoginDialog</span>();</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span> slots:</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_LoginBtn_clicked</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> Ui::LoginDialog *ui;</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span> <span class="comment">// LOGINDIALOG_H</span></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">Logindialog.cpp:</span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"logindialog.h"</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"ui_logindialog.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QString></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QMessageBox></span></span></span><br><span class="line"></span><br><span class="line">LoginDialog::<span class="built_in">LoginDialog</span>(QWidget *parent) :</span><br><span class="line"> <span class="built_in">QDialog</span>(parent),</span><br><span class="line"> <span class="built_in">ui</span>(<span class="keyword">new</span> Ui::LoginDialog)</span><br><span class="line">{</span><br><span class="line"> ui-><span class="built_in">setupUi</span>(<span class="keyword">this</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">LoginDialog::~<span class="built_in">LoginDialog</span>()</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">delete</span> ui;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">LoginDialog::on_LoginBtn_clicked</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> QString Username = ui->Username-><span class="built_in">text</span>();</span><br><span class="line"> QString Password = ui->Password-><span class="built_in">text</span>();</span><br><span class="line"> <span class="keyword">if</span> (Username == <span class="string">""</span>)</span><br><span class="line"> {</span><br><span class="line"> QMessageBox::<span class="built_in">information</span>(<span class="keyword">this</span>, <span class="built_in">tr</span>(<span class="string">"Warnning"</span>), <span class="built_in">tr</span>(<span class="string">"用户名不能为空"</span>), QMessageBox::Ok);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (Password == <span class="string">""</span>)</span><br><span class="line"> {</span><br><span class="line"> QMessageBox::<span class="built_in">information</span>(<span class="keyword">this</span>, <span class="built_in">tr</span>(<span class="string">"Warnning"</span>), <span class="built_in">tr</span>(<span class="string">"密码不能为空"</span>), QMessageBox::Ok);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (Username != Password)</span><br><span class="line"> {</span><br><span class="line"> QMessageBox::<span class="built_in">information</span>(<span class="keyword">this</span>, <span class="built_in">tr</span>(<span class="string">"Warnning"</span>), <span class="built_in">tr</span>(<span class="string">"用户名或密码错误,请重新输入"</span>), QMessageBox::Ok);</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"> emit <span class="built_in">emit_login_log</span>(Username);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> MYMAINWINDOW_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> MYMAINWINDOW_H</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QMainWindow></span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><logindialog.h></span></span></span><br><span class="line"></span><br><span class="line">QT_BEGIN_NAMESPACE</span><br><span class="line"><span class="keyword">namespace</span> Ui { <span class="keyword">class</span> <span class="title class_">MyMainWindow</span>; }</span><br><span class="line">QT_END_NAMESPACE</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MyMainWindow</span> : <span class="keyword">public</span> QMainWindow</span><br><span class="line">{</span><br><span class="line"> Q_OBJECT</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="built_in">MyMainWindow</span>(QWidget *parent = <span class="literal">nullptr</span>);</span><br><span class="line"> ~<span class="built_in">MyMainWindow</span>();</span><br><span class="line"></span><br><span class="line"> LoginDialog *login = <span class="keyword">new</span> <span class="built_in">LoginDialog</span>(<span class="keyword">this</span>);</span><br><span class="line"> QString User = <span class="string">""</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span> slots:</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_action_O_triggered</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_action_A_triggered</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_action_L_triggered</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">login_log</span><span class="params">(QString &str)</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_textEdit_cursorPositionChanged</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_action_Q_triggered</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_action_S_triggered</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_MyMainWindow_customContextMenuRequested</span><span class="params">(<span class="type">const</span> QPoint &pos)</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">onTaskBoxContextMenuEvent</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> Ui::MyMainWindow *ui;</span><br><span class="line">};</span><br><span class="line"><span class="meta">#<span class="keyword">endif</span> <span class="comment">// MYMAINWINDOW_H</span></span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-3"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"mymainwindow.h"</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"ui_mymainwindow.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QDebug></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QMenu></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QFileDialog></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QMessageBox></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QFontDialog></span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><fstream></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><string></span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line">MyMainWindow::<span class="built_in">MyMainWindow</span>(QWidget *parent)</span><br><span class="line"> : <span class="built_in">QMainWindow</span>(parent)</span><br><span class="line"> , <span class="built_in">ui</span>(<span class="keyword">new</span> Ui::MyMainWindow)</span><br><span class="line">{</span><br><span class="line"> ui-><span class="built_in">setupUi</span>(<span class="keyword">this</span>);</span><br><span class="line"> <span class="built_in">connect</span>(login, &LoginDialog::emit_login_log, <span class="keyword">this</span>, &MyMainWindow::login_log);</span><br><span class="line"> login-><span class="built_in">setWindowModality</span>(Qt::WindowModal);</span><br><span class="line"></span><br><span class="line"> QString str = <span class="string">"软件作者姓名:一只柯尔鸭\n软件名称:QT第11周作业\n开发日期:2023-04-24\n"</span>;</span><br><span class="line"> ui->textEdit-><span class="built_in">setText</span>(str);</span><br><span class="line"></span><br><span class="line"> ui->action_Q-><span class="built_in">setEnabled</span>(<span class="literal">false</span>); <span class="comment">//禁用该菜单</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">MyMainWindow::~<span class="built_in">MyMainWindow</span>()</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">delete</span> ui;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MyMainWindow::on_textEdit_cursorPositionChanged</span><span class="params">()</span> <span class="comment">//光标发生改变引起行号和列号的改变</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="type">int</span> row, col;</span><br><span class="line"> QTextCursor cursor;</span><br><span class="line"> cursor=ui->textEdit-><span class="built_in">textCursor</span>();</span><br><span class="line"> col = cursor.<span class="built_in">columnNumber</span>();</span><br><span class="line"> row = cursor.<span class="built_in">blockNumber</span>();</span><br><span class="line"></span><br><span class="line"><span class="comment">// qDebug() << col << " " << row << "\n";</span></span><br><span class="line"> QString strcol = QString::<span class="built_in">number</span>(col, <span class="number">10</span>);</span><br><span class="line"> QString strrow = QString::<span class="built_in">number</span>(row, <span class="number">10</span>);</span><br><span class="line"> QString str = <span class="string">"当前位置:"</span> + strrow + <span class="string">" 行 "</span> + strcol + <span class="string">" 列"</span>;</span><br><span class="line"> ui->textInfo-><span class="built_in">setText</span>(str);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MyMainWindow::login_log</span><span class="params">(QString &str)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> QString info = <span class="string">"欢迎你,"</span> + str + <span class="string">" 登录成功!"</span>;</span><br><span class="line"> User = str;</span><br><span class="line"> ui->textEdit-><span class="built_in">setText</span>(info);</span><br><span class="line"> ui->action_Q-><span class="built_in">setEnabled</span>(<span class="literal">true</span>);</span><br><span class="line"> ui->action_L-><span class="built_in">setEnabled</span>(<span class="literal">false</span>);</span><br><span class="line"> login-><span class="built_in">hide</span>();</span><br><span class="line"> <span class="built_in">qDebug</span>() << str << <span class="string">'\n'</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MyMainWindow::on_action_O_triggered</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> QString fileName = QFileDialog::<span class="built_in">getOpenFileName</span>(<span class="keyword">this</span>, <span class="built_in">tr</span>(<span class="string">"文件对话框"</span>), <span class="string">"../"</span>, <span class="string">"txt(*.txt)"</span>);</span><br><span class="line"> <span class="built_in">qDebug</span>() << <span class="string">"fileName: "</span> << fileName;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (!fileName.<span class="built_in">isEmpty</span>())</span><br><span class="line"> {</span><br><span class="line"> <span class="function">QFile <span class="title">file</span><span class="params">(fileName)</span></span>;</span><br><span class="line"> <span class="type">bool</span> isok = file.<span class="built_in">open</span>(QIODevice::ReadOnly); <span class="comment">//打开方式为只读</span></span><br><span class="line"> <span class="keyword">if</span> (isok)</span><br><span class="line"> {</span><br><span class="line"> QByteArray array = file.<span class="built_in">readAll</span>(); <span class="comment">//读取文本中全部文件</span></span><br><span class="line"> ui->textEdit-><span class="built_in">setText</span>(<span class="built_in">QString</span>(array));</span><br><span class="line"> }</span><br><span class="line"> file.<span class="built_in">close</span>();</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="type">void</span> <span class="title">MyMainWindow::on_action_A_triggered</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> QMessageBox::<span class="built_in">about</span>(<span class="keyword">this</span>, <span class="built_in">tr</span>(<span class="string">"关于对话框"</span>), <span class="built_in">tr</span>(<span class="string">"软件作者姓名:一只柯尔鸭\n软件名称:QT第11周作业\n开发日期:2023-04-24\n"</span>));</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MyMainWindow::on_action_L_triggered</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> login-><span class="built_in">show</span>();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MyMainWindow::on_action_Q_triggered</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> ui->action_Q-><span class="built_in">setEnabled</span>(<span class="literal">false</span>);</span><br><span class="line"> ui->action_L-><span class="built_in">setEnabled</span>(<span class="literal">true</span>);</span><br><span class="line"> QString info = <span class="string">"您已安全退出,"</span> + User + <span class="string">" 欢迎下次登录!"</span>;</span><br><span class="line"> ui->textEdit-><span class="built_in">setText</span>(info);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MyMainWindow::on_action_S_triggered</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> QString fileName = QFileDialog::<span class="built_in">getSaveFileName</span>(<span class="keyword">this</span>, <span class="string">"save"</span>, <span class="string">"../"</span>, <span class="string">"txt(*.txt)"</span>); <span class="comment">//写出文件的路径</span></span><br><span class="line"> <span class="keyword">if</span> (!fileName.<span class="built_in">isEmpty</span>())</span><br><span class="line"> {</span><br><span class="line"> <span class="function">QFile <span class="title">file</span><span class="params">(fileName)</span></span>;</span><br><span class="line"> <span class="type">bool</span> isok = file.<span class="built_in">open</span>(QIODevice::WriteOnly); <span class="comment">//打开方式为只写</span></span><br><span class="line"> <span class="keyword">if</span> (isok)</span><br><span class="line"> {</span><br><span class="line"> QString str = ui->textEdit-><span class="built_in">toPlainText</span>(); <span class="comment">//获取文本框中的内容</span></span><br><span class="line"> file.<span class="built_in">write</span>(str.<span class="built_in">toUtf8</span>());</span><br><span class="line"> }</span><br><span class="line"> file.<span class="built_in">close</span>();</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="type">void</span> <span class="title">MyMainWindow::on_MyMainWindow_customContextMenuRequested</span><span class="params">(<span class="type">const</span> QPoint &<span class="comment">/*pos*/</span>)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="comment">//创建菜单对象</span></span><br><span class="line"> QMenu *pMenu = <span class="keyword">new</span> <span class="built_in">QMenu</span>(<span class="keyword">this</span>);</span><br><span class="line"></span><br><span class="line"> QAction *pChangeFont = <span class="keyword">new</span> <span class="built_in">QAction</span>(<span class="built_in">tr</span>(<span class="string">"更改字体"</span>), <span class="keyword">this</span>);</span><br><span class="line"> QAction *pQuitProcess = <span class="keyword">new</span> <span class="built_in">QAction</span>(<span class="built_in">tr</span>(<span class="string">"退出程序"</span>), <span class="keyword">this</span>);</span><br><span class="line"> pChangeFont-><span class="built_in">setData</span>(<span class="number">1</span>);</span><br><span class="line"> pQuitProcess-><span class="built_in">setData</span>(<span class="number">2</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//把QAction对象添加到菜单上</span></span><br><span class="line"> pMenu-><span class="built_in">addAction</span>(pChangeFont);</span><br><span class="line"> pMenu-><span class="built_in">addAction</span>(pQuitProcess);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">//连接鼠标右键点击信号</span></span><br><span class="line"> <span class="built_in">connect</span>(pChangeFont, <span class="built_in">SIGNAL</span>(<span class="built_in">triggered</span>()), <span class="keyword">this</span>, <span class="built_in">SLOT</span>(<span class="built_in">onTaskBoxContextMenuEvent</span>()));</span><br><span class="line"> <span class="built_in">connect</span>(pQuitProcess, <span class="built_in">SIGNAL</span>(<span class="built_in">triggered</span>()), <span class="keyword">this</span>, <span class="built_in">SLOT</span>(<span class="built_in">onTaskBoxContextMenuEvent</span>()));</span><br><span class="line"></span><br><span class="line"> <span class="comment">//在鼠标右键点击的地方显示菜单</span></span><br><span class="line"> pMenu-><span class="built_in">exec</span>(<span class="built_in">cursor</span>().<span class="built_in">pos</span>());</span><br><span class="line"></span><br><span class="line"> <span class="comment">//释放内存</span></span><br><span class="line"> QList<QAction*> list = pMenu-><span class="built_in">actions</span>();</span><br><span class="line"> foreach (QAction* pAction, list) <span class="keyword">delete</span> pAction;</span><br><span class="line"> <span class="keyword">delete</span> pMenu;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MyMainWindow::onTaskBoxContextMenuEvent</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> QAction *pEven = <span class="built_in">qobject_cast</span><QAction *>(<span class="keyword">this</span>-><span class="built_in">sender</span>()); <span class="comment">//this->sender()就是发信号者 QAction</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//获取发送信息类型 1:更改字体 2:退出程序</span></span><br><span class="line"> <span class="type">int</span> iType = pEven-><span class="built_in">data</span>().<span class="built_in">toInt</span>();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">switch</span> (iType)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> <span class="number">1</span>:</span><br><span class="line"> {</span><br><span class="line"> <span class="type">bool</span> ok;</span><br><span class="line"> QFont font = QFontDialog::<span class="built_in">getFont</span>(&ok, <span class="keyword">this</span>);</span><br><span class="line"> <span class="keyword">if</span> (ok) <span class="keyword">this</span>-><span class="built_in">setFont</span>(font);</span><br><span class="line"> <span class="keyword">else</span> <span class="built_in">qDebug</span>() << <span class="built_in">tr</span>(<span class="string">"没有选择字体!"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="number">2</span>:</span><br><span class="line"> <span class="keyword">this</span>-><span class="built_in">hide</span>();</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-4"><p><img src="https://s2.loli.net/2023/05/03/vW3o2TUn94riAzG.png" alt="1.png"><br><img src="https://s2.loli.net/2023/05/03/ORmqaSnItp9uVGP.png" alt="2.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-5"><p><img src="https://s2.loli.net/2023/05/03/OJIpan3FlEiLxDU.png" alt="3.png"><br><img src="https://s2.loli.net/2023/05/03/eAy9ICFcau7EozW.png" alt="4.png"><br><img src="https://s2.loli.net/2023/05/03/o4AlLQtkysgMW5Z.png" alt="5.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><hr>]]></content>
<categories>
<category> C++桌面应用程序 </category>
</categories>
<tags>
<tag> C++ </tag>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> 桌面应用程序 </tag>
<tag> QT creator </tag>
</tags>
</entry>
<entry>
<title>Qt实验 - 窗口布局</title>
<link href="/2023/05/14/0002-06/"/>
<url>/2023/05/14/0002-06/</url>
<content type="html"><![CDATA[<h1 id="C-桌面应用程序实验6"><a href="#C-桌面应用程序实验6" class="headerlink" title="C++桌面应用程序实验6"></a>C++桌面应用程序实验6</h1><h2 id="第1题"><a href="#第1题" class="headerlink" title="第1题"></a>第1题</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">MyDialog.h</button></li><li class="tab"><button type="button" data-href="#-3">MyDialog.cpp</button></li><li class="tab"><button type="button" data-href="#-4">效果</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">布局练习: 参看文档《Qt5开发及实例》(ftp://10.21.11.21/教师课件/计算机科学与技术系/宋超/Qt </span><br><span class="line">ebook)第3章,3.4节,基本布局,照着做图3.7界面(P80)(注意,可以按照该文档做,也可以使用Qt </span><br><span class="line">Designer做)</span><br></pre></td></tr></table></figure><p><img src="https://s2.loli.net/2023/04/19/uyJR7SFCl9DZQe1.png" alt="lab02-pro1-0.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> MYDIALOG_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> MYDIALOG_H</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QDialog></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QLabel></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QLineEdit></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QComboBox></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QTextEdit></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QGridLayout></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QPushButton></span></span></span><br><span class="line"></span><br><span class="line">QT_BEGIN_NAMESPACE</span><br><span class="line"><span class="keyword">namespace</span> Ui { <span class="keyword">class</span> <span class="title class_">MyDialog</span>; }</span><br><span class="line">QT_END_NAMESPACE</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MyDialog</span> : <span class="keyword">public</span> QDialog</span><br><span class="line">{</span><br><span class="line"> Q_OBJECT</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> <span class="comment">//左侧</span></span><br><span class="line"> QLabel *UserNameLabel;</span><br><span class="line"> QLabel *NameLabel;</span><br><span class="line"> QLabel *SexLabel;</span><br><span class="line"> QLabel *DepartmentLabel;</span><br><span class="line"> QLabel *AgeLabel;</span><br><span class="line"> QLabel *OtherLabel;</span><br><span class="line"> QLineEdit *UserNameLineEdit;</span><br><span class="line"> QLineEdit *NameLineEdit;</span><br><span class="line"> QComboBox *SexComboBox;</span><br><span class="line"> QTextEdit *DepartmentTextEdit;</span><br><span class="line"> QLineEdit *AgeLineEdit;</span><br><span class="line"></span><br><span class="line"> QGridLayout *LeftLayout;</span><br><span class="line"></span><br><span class="line"> <span class="comment">//右上侧</span></span><br><span class="line"> QLabel *HeadLabel;</span><br><span class="line"> QLabel *HeadIconLabel;</span><br><span class="line"> QPushButton *UpdateHeadBtn;</span><br><span class="line"></span><br><span class="line"> QHBoxLayout *TopRightLayout;</span><br><span class="line"></span><br><span class="line"> <span class="comment">//右下侧</span></span><br><span class="line"> QLabel *IntroductionLabel;</span><br><span class="line"> QTextEdit *IntroductionTextEdit;</span><br><span class="line"></span><br><span class="line"> QVBoxLayout *RightLayout;</span><br><span class="line"></span><br><span class="line"> <span class="comment">//底部</span></span><br><span class="line"> QPushButton *OkBtn;</span><br><span class="line"> QPushButton *CancelBtn;</span><br><span class="line"></span><br><span class="line"> QHBoxLayout *ButtomLayout;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="built_in">MyDialog</span>(QWidget *parent = <span class="literal">nullptr</span>);</span><br><span class="line"> ~<span class="built_in">MyDialog</span>();</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> Ui::MyDialog *ui;</span><br><span class="line">};</span><br><span class="line"><span class="meta">#<span class="keyword">endif</span> <span class="comment">// MYDIALOG_H</span></span></span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-3"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"mydialog.h"</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"ui_mydialog.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QPixmap></span></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">MyDialog::<span class="built_in">MyDialog</span>(QWidget *parent)</span><br><span class="line"> : <span class="built_in">QDialog</span>(parent)</span><br><span class="line"> , <span class="built_in">ui</span>(<span class="keyword">new</span> Ui::MyDialog)</span><br><span class="line">{</span><br><span class="line"> ui-><span class="built_in">setupUi</span>(<span class="keyword">this</span>);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">setWindowTitle</span>(<span class="built_in">tr</span>(<span class="string">"UserInfo"</span>));</span><br><span class="line"> <span class="comment">/******************* 左侧 *******************/</span></span><br><span class="line"></span><br><span class="line"> UserNameLabel = <span class="keyword">new</span> <span class="built_in">QLabel</span>(<span class="built_in">tr</span>(<span class="string">"用户名:"</span>));</span><br><span class="line"> UserNameLineEdit = <span class="keyword">new</span> QLineEdit;</span><br><span class="line"> NameLabel = <span class="keyword">new</span> <span class="built_in">QLabel</span>(<span class="built_in">tr</span>(<span class="string">"姓名:"</span>));</span><br><span class="line"> NameLineEdit = <span class="keyword">new</span> QLineEdit;</span><br><span class="line"> SexLabel = <span class="keyword">new</span> <span class="built_in">QLabel</span>(<span class="built_in">tr</span>(<span class="string">"性别:"</span>));</span><br><span class="line"> SexComboBox = <span class="keyword">new</span> QComboBox;</span><br><span class="line"> SexComboBox-><span class="built_in">addItem</span>(<span class="built_in">tr</span>(<span class="string">"女"</span>));</span><br><span class="line"> SexComboBox-><span class="built_in">addItem</span>(<span class="built_in">tr</span>(<span class="string">"男"</span>));</span><br><span class="line"> DepartmentLabel = <span class="keyword">new</span> <span class="built_in">QLabel</span>(<span class="built_in">tr</span>(<span class="string">"部门:"</span>));</span><br><span class="line"> DepartmentTextEdit = <span class="keyword">new</span> QTextEdit;</span><br><span class="line"> AgeLabel = <span class="keyword">new</span> <span class="built_in">QLabel</span>(<span class="built_in">tr</span>(<span class="string">"年龄:"</span>));</span><br><span class="line"> AgeLineEdit = <span class="keyword">new</span> QLineEdit;</span><br><span class="line"> OtherLabel = <span class="keyword">new</span> <span class="built_in">QLabel</span>(<span class="built_in">tr</span>(<span class="string">"备注:"</span>));</span><br><span class="line"> OtherLabel-><span class="built_in">setFrameStyle</span>(QFrame::Panel|QFrame::Sunken);</span><br><span class="line"></span><br><span class="line"> LeftLayout = <span class="keyword">new</span> <span class="built_in">QGridLayout</span>();</span><br><span class="line"> LeftLayout-><span class="built_in">addWidget</span>(UserNameLabel, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line"> LeftLayout-><span class="built_in">addWidget</span>(UserNameLineEdit, <span class="number">0</span>, <span class="number">1</span>);</span><br><span class="line"> LeftLayout-><span class="built_in">addWidget</span>(NameLabel, <span class="number">1</span>, <span class="number">0</span>);</span><br><span class="line"> LeftLayout-><span class="built_in">addWidget</span>(NameLineEdit, <span class="number">1</span>, <span class="number">1</span>);</span><br><span class="line"> LeftLayout-><span class="built_in">addWidget</span>(SexLabel, <span class="number">2</span>, <span class="number">0</span>);</span><br><span class="line"> LeftLayout-><span class="built_in">addWidget</span>(SexComboBox, <span class="number">2</span>, <span class="number">1</span>);</span><br><span class="line"> LeftLayout-><span class="built_in">addWidget</span>(DepartmentLabel, <span class="number">3</span>, <span class="number">0</span>);</span><br><span class="line"> LeftLayout-><span class="built_in">addWidget</span>(DepartmentTextEdit, <span class="number">3</span>, <span class="number">1</span>);</span><br><span class="line"> LeftLayout-><span class="built_in">addWidget</span>(AgeLabel, <span class="number">4</span>, <span class="number">0</span>);</span><br><span class="line"> LeftLayout-><span class="built_in">addWidget</span>(AgeLineEdit, <span class="number">4</span>, <span class="number">1</span>);</span><br><span class="line"> LeftLayout-><span class="built_in">addWidget</span>(OtherLabel, <span class="number">5</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>);</span><br><span class="line"></span><br><span class="line"> LeftLayout-><span class="built_in">setColumnStretch</span>(<span class="number">0</span>, <span class="number">1</span>);</span><br><span class="line"> LeftLayout-><span class="built_in">setColumnStretch</span>(<span class="number">1</span>, <span class="number">3</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">/******************* 右上侧 *******************/</span></span><br><span class="line"></span><br><span class="line"> HeadLabel = <span class="keyword">new</span> <span class="built_in">QLabel</span>(<span class="built_in">tr</span>(<span class="string">"头像:"</span>));</span><br><span class="line"> HeadIconLabel = <span class="keyword">new</span> QLabel;</span><br><span class="line"> <span class="function">QPixmap <span class="title">icon</span><span class="params">(<span class="string">"coleduck.jpg"</span>)</span></span>;</span><br><span class="line"> HeadIconLabel-><span class="built_in">setPixmap</span>(icon);</span><br><span class="line"> HeadIconLabel-><span class="built_in">resize</span>(icon.<span class="built_in">width</span>(), icon.<span class="built_in">height</span>());</span><br><span class="line"> UpdateHeadBtn = <span class="keyword">new</span> <span class="built_in">QPushButton</span>(<span class="built_in">tr</span>(<span class="string">"更新"</span>));</span><br><span class="line"></span><br><span class="line"> TopRightLayout = <span class="keyword">new</span> <span class="built_in">QHBoxLayout</span>();</span><br><span class="line"> TopRightLayout-><span class="built_in">setSpacing</span>(<span class="number">20</span>);</span><br><span class="line"> TopRightLayout-><span class="built_in">addWidget</span>(HeadLabel);</span><br><span class="line"> TopRightLayout-><span class="built_in">addWidget</span>(HeadIconLabel);</span><br><span class="line"> TopRightLayout-><span class="built_in">addWidget</span>(UpdateHeadBtn);</span><br><span class="line"></span><br><span class="line"> <span class="comment">/******************* 右下侧 *******************/</span></span><br><span class="line"></span><br><span class="line"> IntroductionLabel = <span class="keyword">new</span> <span class="built_in">QLabel</span>(<span class="built_in">tr</span>(<span class="string">"个人说明:"</span>));</span><br><span class="line"> IntroductionTextEdit = <span class="keyword">new</span> QTextEdit;</span><br><span class="line"></span><br><span class="line"> RightLayout = <span class="keyword">new</span> <span class="built_in">QVBoxLayout</span>();</span><br><span class="line"> RightLayout-><span class="built_in">setMargin</span>(<span class="number">10</span>);</span><br><span class="line"> RightLayout-><span class="built_in">addLayout</span>(TopRightLayout);</span><br><span class="line"> RightLayout-><span class="built_in">addWidget</span>(IntroductionLabel);</span><br><span class="line"> RightLayout-><span class="built_in">addWidget</span>(IntroductionTextEdit);</span><br><span class="line"></span><br><span class="line"> <span class="comment">/******************* 底部 *******************/</span></span><br><span class="line"></span><br><span class="line"> OkBtn = <span class="keyword">new</span> <span class="built_in">QPushButton</span>(<span class="built_in">tr</span>(<span class="string">"确定:"</span>));</span><br><span class="line"> CancelBtn = <span class="keyword">new</span> <span class="built_in">QPushButton</span>(<span class="built_in">tr</span>(<span class="string">"取消:"</span>));</span><br><span class="line"></span><br><span class="line"> ButtomLayout = <span class="keyword">new</span> <span class="built_in">QHBoxLayout</span>();</span><br><span class="line"> ButtomLayout-><span class="built_in">addStretch</span>();</span><br><span class="line"> ButtomLayout-><span class="built_in">addWidget</span>(OkBtn);</span><br><span class="line"> ButtomLayout-><span class="built_in">addWidget</span>(CancelBtn);</span><br><span class="line"></span><br><span class="line"> <span class="comment">/*******************************************/</span></span><br><span class="line"> QGridLayout *mainLayout = <span class="keyword">new</span> <span class="built_in">QGridLayout</span>(<span class="keyword">this</span>);</span><br><span class="line"> mainLayout-><span class="built_in">setMargin</span>(<span class="number">15</span>);</span><br><span class="line"> mainLayout-><span class="built_in">setSpacing</span>(<span class="number">10</span>);</span><br><span class="line"> mainLayout-><span class="built_in">addLayout</span>(LeftLayout, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line"> mainLayout-><span class="built_in">addLayout</span>(RightLayout, <span class="number">0</span>, <span class="number">1</span>);</span><br><span class="line"> mainLayout-><span class="built_in">addLayout</span>(ButtomLayout, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>);</span><br><span class="line"> mainLayout-><span class="built_in">setSizeConstraint</span>(QLayout::SetFixedSize);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">MyDialog::~<span class="built_in">MyDialog</span>()</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">delete</span> ui;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-4"><p><img src="https://s2.loli.net/2023/04/19/KHj1mSG6gqnBic2.png" alt="lab02-pro1-1.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="第2题"><a href="#第2题" class="headerlink" title="第2题"></a>第2题</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">MyWidget.h</button></li><li class="tab"><button type="button" data-href="#-3">MyWidget.cpp</button></li><li class="tab"><button type="button" data-href="#-4">MyWidget.ui</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"> 二、使用Designer进行布局设计</span><br><span class="line">(1) 建立一个以QWidget为窗口的项目Project_1</span><br><span class="line">(2) 在Designer中,设计教材图4-2(旧版4-3)所示的界面</span><br><span class="line">(3) 定义如图中所示的热键(提示:要设定Buddy关系);确定每个部件的Tab order</span><br><span class="line">(4) 性别下拉框中,加入“男”,“女”两项</span><br><span class="line">(5) 年龄范围设为(10-60),步长为1</span><br><span class="line">(6) PushButton的文本改为“保存”</span><br><span class="line">(7) 为“保存”按钮定义一个单击槽函数,处理如下事情:1. 检查姓名、邮箱项是否为空,如果是空的,弹出</span><br><span class="line"> 一个对话框,提示哪项不能为空;2. 如果检查通过了,则根据姓名、性别、年龄和邮箱生成一个数据,</span><br><span class="line"> 保存到一个链表list中。同时,利用qDebug函数输出该数据,看看是否正确。提示: 可以定义一个结构</span><br><span class="line"> 体DataItem, 再使用std::list<DataItem>定义一个链表. std::list为C++标准库中的链表实现, 为</span><br><span class="line"> 一个模板类, 使用时需要#include <list></span><br><span class="line"></span><br><span class="line">三、数据与界面互动:扩展Project_1的功能</span><br><span class="line">(1) 把窗口最下面的LineEdit替换为两个按钮:Pre, Next.</span><br><span class="line">(2) 按下Pre键,窗口显示list中的上一条记录,按下Next键显示list中的下一条记录。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> MYWIDGET_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> MYWIDGET_H</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QWidget></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><list></span></span></span><br><span class="line"></span><br><span class="line">QT_BEGIN_NAMESPACE</span><br><span class="line"><span class="keyword">namespace</span> Ui { <span class="keyword">class</span> <span class="title class_">MyWidget</span>; }</span><br><span class="line">QT_END_NAMESPACE</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">DataItem</span> {</span><br><span class="line"> QString name;</span><br><span class="line"> QString sex;</span><br><span class="line"> <span class="type">int</span> age;</span><br><span class="line"> QString mail;</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MyWidget</span> : <span class="keyword">public</span> QWidget</span><br><span class="line">{</span><br><span class="line"> Q_OBJECT</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="built_in">MyWidget</span>(QWidget *parent = <span class="literal">nullptr</span>);</span><br><span class="line"> ~<span class="built_in">MyWidget</span>();</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> std::list<DataItem> values;</span><br><span class="line"> <span class="type">int</span> pos = <span class="number">0</span>;</span><br><span class="line"> <span class="type">int</span> cnt = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span> slots:</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_SaveBtn_clicked</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_PreBtn_clicked</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_NextBtn_clicked</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> Ui::MyWidget *ui;</span><br><span class="line">};</span><br><span class="line"><span class="meta">#<span class="keyword">endif</span> <span class="comment">// MYWIDGET_H</span></span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-3"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"mywidget.h"</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"ui_mywidget.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QMessageBox></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QDebug></span></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">MyWidget::<span class="built_in">MyWidget</span>(QWidget *parent)</span><br><span class="line"> : <span class="built_in">QWidget</span>(parent)</span><br><span class="line"> , <span class="built_in">ui</span>(<span class="keyword">new</span> Ui::MyWidget)</span><br><span class="line">{</span><br><span class="line"> ui-><span class="built_in">setupUi</span>(<span class="keyword">this</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">MyWidget::~<span class="built_in">MyWidget</span>()</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">delete</span> ui;</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="type">void</span> <span class="title">MyWidget::on_SaveBtn_clicked</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> QString name = ui->NameLineEdit-><span class="built_in">text</span>();</span><br><span class="line"> QString mail = ui->MailLineEdit-><span class="built_in">text</span>();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (name == <span class="string">""</span>)</span><br><span class="line"> {</span><br><span class="line"> QMessageBox::<span class="built_in">information</span>(<span class="keyword">this</span>, <span class="built_in">tr</span>(<span class="string">"Warnning"</span>), <span class="built_in">tr</span>(<span class="string">"姓名不能为空"</span>), QMessageBox::Ok);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (mail == <span class="string">""</span>)</span><br><span class="line"> {</span><br><span class="line"> QMessageBox::<span class="built_in">information</span>(<span class="keyword">this</span>, <span class="built_in">tr</span>(<span class="string">"Warnning"</span>), <span class="built_in">tr</span>(<span class="string">"邮箱不能为空"</span>), QMessageBox::Ok);</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><br><span class="line"> QString sex = ui->SexLineEdit-><span class="built_in">currentText</span>();</span><br><span class="line"> <span class="type">int</span> age = ui->AgeLineEdit-><span class="built_in">value</span>();</span><br><span class="line"> DataItem stu = {name, sex, age, mail};</span><br><span class="line"></span><br><span class="line"> values.<span class="built_in">push_back</span>(stu);</span><br><span class="line"> cnt ++ ;</span><br><span class="line"></span><br><span class="line"> <span class="built_in">qDebug</span>() << <span class="string">"成功录入第"</span> << cnt << <span class="string">"个学生"</span> << <span class="string">"\n姓名:"</span> << name << <span class="string">"\n邮箱:"</span> << mail << <span class="string">"\n性别:"</span> << sex << <span class="string">"\n年龄:"</span> << age << <span class="string">"\n"</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="type">void</span> <span class="title">MyWidget::on_PreBtn_clicked</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">if</span> (!pos)</span><br><span class="line"> {</span><br><span class="line"> QMessageBox::<span class="built_in">information</span>(<span class="keyword">this</span>, <span class="built_in">tr</span>(<span class="string">"Warnning"</span>), <span class="built_in">tr</span>(<span class="string">"当前已是第一个数据"</span>), QMessageBox::Ok);</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"> pos -- ;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> std::list<DataItem>::iterator iter;</span><br><span class="line"> iter = values.<span class="built_in">begin</span>();</span><br><span class="line"> <span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">0</span>; i < pos; ++i)</span><br><span class="line"> {</span><br><span class="line"> iter ++ ;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="built_in">qDebug</span>() << <span class="string">"当前访问的是第"</span> << pos + <span class="number">1</span> << <span class="string">"个学生信息"</span> << <span class="string">"\n姓名:"</span> << iter->name << <span class="string">"\n邮箱:"</span> << iter->mail << <span class="string">"\n性别:"</span> << iter->sex << <span class="string">"\n年龄:"</span> << iter->age << <span class="string">"\n"</span>;</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="type">void</span> <span class="title">MyWidget::on_NextBtn_clicked</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">if</span> (pos + <span class="number">1</span> == cnt)</span><br><span class="line"> {</span><br><span class="line"> QMessageBox::<span class="built_in">information</span>(<span class="keyword">this</span>, <span class="built_in">tr</span>(<span class="string">"Warnning"</span>), <span class="built_in">tr</span>(<span class="string">"当前已是最后一个数据"</span>), QMessageBox::Ok);</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"> pos ++ ;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> std::list<DataItem>::iterator iter;</span><br><span class="line"> iter = values.<span class="built_in">begin</span>();</span><br><span class="line"> <span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">0</span>; i < pos; ++i)</span><br><span class="line"> {</span><br><span class="line"> iter ++ ;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="built_in">qDebug</span>() << <span class="string">"当前访问的是第"</span> << pos + <span class="number">1</span> << <span class="string">"个学生信息"</span> << <span class="string">"\n姓名:"</span> << iter->name << <span class="string">"\n邮箱:"</span> << iter->mail << <span class="string">"\n性别:"</span> << iter->sex << <span class="string">"\n年龄:"</span> << iter->age << <span class="string">"\n"</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-4"><p><img src="https://s2.loli.net/2023/04/19/b9FSth3W8mQD7UP.png" alt="lab02-pro2-1.png"><br><img src="https://s2.loli.net/2023/04/19/C5wiH7hjav2YMVJ.png" alt="lab02-pro2-2.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="第3题"><a href="#第3题" class="headerlink" title="第3题"></a>第3题</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">MyWidget.h</button></li><li class="tab"><button type="button" data-href="#-3">MyWidget.cpp</button></li><li class="tab"><button type="button" data-href="#-4">MyWidget.ui</button></li><li class="tab"><button type="button" data-href="#-5">LoginDialog.h</button></li><li class="tab"><button type="button" data-href="#-6">LoginDialog.cpp</button></li><li class="tab"><button type="button" data-href="#-7">LoginDialog.ui</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">四、做一基于QWidget的程序,上面有一个QTextEdit,还有两个按钮“登录”“更改密码”,请注意以上三个部</span><br><span class="line">件要求使用合理布局。当点击登录时,跳出登录界面如图所示用户能输入用户名、密码</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> MYWIDGET_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> MYWIDGET_H</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QWidget></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><logindialog.h></span></span></span><br><span class="line"></span><br><span class="line">QT_BEGIN_NAMESPACE</span><br><span class="line"><span class="keyword">namespace</span> Ui { <span class="keyword">class</span> <span class="title class_">MyWidget</span>; }</span><br><span class="line">QT_END_NAMESPACE</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MyWidget</span> : <span class="keyword">public</span> QWidget</span><br><span class="line">{</span><br><span class="line"> Q_OBJECT</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="comment">// LoginDialog login;</span></span><br><span class="line"> LoginDialog *login = <span class="keyword">new</span> <span class="built_in">LoginDialog</span>(<span class="keyword">this</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="built_in">MyWidget</span>(QWidget *parent = <span class="literal">nullptr</span>);</span><br><span class="line"> ~<span class="built_in">MyWidget</span>();</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span> slots:</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_LoginBtn_clicked</span><span class="params">()</span></span>;</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">login_log</span><span class="params">(QString &str)</span></span>;</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">back</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> Ui::MyWidget *ui;</span><br><span class="line">};</span><br><span class="line"><span class="meta">#<span class="keyword">endif</span> <span class="comment">// MYWIDGET_H</span></span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-3"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"mywidget.h"</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"ui_mywidget.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QDebug></span></span></span><br><span class="line"></span><br><span class="line">MyWidget::<span class="built_in">MyWidget</span>(QWidget *parent)</span><br><span class="line"> : <span class="built_in">QWidget</span>(parent)</span><br><span class="line"> , <span class="built_in">ui</span>(<span class="keyword">new</span> Ui::MyWidget)</span><br><span class="line">{</span><br><span class="line"> ui-><span class="built_in">setupUi</span>(<span class="keyword">this</span>);</span><br><span class="line"><span class="comment">// LoginDialog *login = new LoginDialog(this);</span></span><br><span class="line"> <span class="built_in">connect</span>(login, &LoginDialog::emit_login_log, <span class="keyword">this</span>, &MyWidget::login_log);</span><br><span class="line"> <span class="built_in">connect</span>(login, &LoginDialog::emit_back, <span class="keyword">this</span>, &MyWidget::back);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">MyWidget::~<span class="built_in">MyWidget</span>()</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">delete</span> ui;</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="type">void</span> <span class="title">MyWidget::on_LoginBtn_clicked</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> login-><span class="built_in">show</span>();</span><br><span class="line"> <span class="keyword">this</span>-><span class="built_in">hide</span>();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MyWidget::login_log</span><span class="params">(QString &str)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> ui->textEdit-><span class="built_in">setText</span>(str);</span><br><span class="line"> <span class="keyword">this</span>-><span class="built_in">show</span>();</span><br><span class="line"> login-><span class="built_in">hide</span>();</span><br><span class="line"> <span class="built_in">qDebug</span>() << str << <span class="string">'\n'</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MyWidget::back</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> login-><span class="built_in">hide</span>();</span><br><span class="line"> <span class="keyword">this</span>-><span class="built_in">show</span>();</span><br><span class="line">}</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-4"><p><img src="https://s2.loli.net/2023/04/19/XKm84TS57AjGpFL.png" alt="lab02-pro3-1.png"><br><img src="https://s2.loli.net/2023/04/19/ecx47vsZhnAomdr.png" alt="lab02-pro3-2.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-5"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> LOGINDIALOG_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> LOGINDIALOG_H</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QDialog></span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> Ui {</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">LoginDialog</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">LoginDialog</span> : <span class="keyword">public</span> QDialog</span><br><span class="line">{</span><br><span class="line"> Q_OBJECT</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">signals:</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">emit_login_log</span><span class="params">(QString &str)</span></span>;</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">emit_back</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span> slots:</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_EnterBtn_clicked</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">on_QuitBtn_clicked</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="keyword">explicit</span> <span class="title">LoginDialog</span><span class="params">(QWidget *parent = <span class="literal">nullptr</span>)</span></span>;</span><br><span class="line"> ~<span class="built_in">LoginDialog</span>();</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> Ui::LoginDialog *ui;</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span> <span class="comment">// LOGINDIALOG_H</span></span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-6"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"logindialog.h"</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"ui_logindialog.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QMessageBox></span></span></span><br><span class="line"></span><br><span class="line">LoginDialog::<span class="built_in">LoginDialog</span>(QWidget *parent) :</span><br><span class="line"> <span class="built_in">QDialog</span>(parent),</span><br><span class="line"> <span class="built_in">ui</span>(<span class="keyword">new</span> Ui::LoginDialog)</span><br><span class="line">{</span><br><span class="line"> ui-><span class="built_in">setupUi</span>(<span class="keyword">this</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">LoginDialog::~<span class="built_in">LoginDialog</span>()</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">delete</span> ui;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">LoginDialog::on_EnterBtn_clicked</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> QString username = ui->UsernameLineEdit-><span class="built_in">text</span>();</span><br><span class="line"> QString password = ui->PasswordLineEdit-><span class="built_in">text</span>();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (username == <span class="string">""</span>)</span><br><span class="line"> {</span><br><span class="line"> QMessageBox::<span class="built_in">information</span>(<span class="keyword">this</span>, <span class="built_in">tr</span>(<span class="string">"Warnning"</span>), <span class="built_in">tr</span>(<span class="string">"用户名不能为空"</span>), QMessageBox::Ok);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (password == <span class="string">""</span>)</span><br><span class="line"> {</span><br><span class="line"> QMessageBox::<span class="built_in">information</span>(<span class="keyword">this</span>, <span class="built_in">tr</span>(<span class="string">"Warnning"</span>), <span class="built_in">tr</span>(<span class="string">"密码不能为空"</span>), QMessageBox::Ok);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (username != <span class="string">"admin"</span> || password != <span class="string">"admin"</span>)</span><br><span class="line"> {</span><br><span class="line"> QString str = <span class="string">"用户名或密码错误,请重新输入"</span>;</span><br><span class="line"> <span class="function">emit <span class="title">emit_login_log</span><span class="params">(str)</span></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"> QString str = <span class="string">"欢迎你,"</span> + username + <span class="string">" 登录成功!"</span>;</span><br><span class="line"> <span class="function">emit <span class="title">emit_login_log</span><span class="params">(str)</span></span>;</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="type">void</span> <span class="title">LoginDialog::on_QuitBtn_clicked</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="function">emit <span class="title">emit_back</span><span class="params">()</span></span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-7"><p><img src="https://s2.loli.net/2023/04/19/HlGNqI3s4BYpUh2.png" alt="lab02-pro3-3.png"><br><img src="https://s2.loli.net/2023/04/19/HOyivYKNTMo2xmf.png" alt="lab02-pro3-4.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><hr>]]></content>
<categories>
<category> C++桌面应用程序 </category>
</categories>
<tags>
<tag> C++ </tag>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> 桌面应用程序 </tag>
<tag> QT creator </tag>
</tags>
</entry>
<entry>
<title>Qt实验 - 基础程序结构与控件使用</title>
<link href="/2023/05/14/0002-05/"/>
<url>/2023/05/14/0002-05/</url>
<content type="html"><![CDATA[<h1 id="C-桌面应用程序实验5"><a href="#C-桌面应用程序实验5" class="headerlink" title="C++桌面应用程序实验5"></a>C++桌面应用程序实验5</h1><h2 id="第1题"><a href="#第1题" class="headerlink" title="第1题"></a>第1题</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目1</button></li><li class="tab"><button type="button" data-href="#-2">Project_1.pro</button></li><li class="tab"><button type="button" data-href="#-3">main.cpp</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">题目要求:窗口与子部件的区别</span><br><span class="line">(1)新建一个空的Qt项目:Project_1;</span><br><span class="line">(2)在main函数中新建三个部件:一个widget,两个label。其中,一个label为子部件,即它的父对象为那个</span><br><span class="line">widget。分别设置它们的标题及文本。</span><br><span class="line">(3)显示窗口:widget以及那个非子部件的label</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">QT += core gui</span><br><span class="line"></span><br><span class="line">greaterThan(QT_MAJOR_VERSION, 4): QT += widgets</span><br><span class="line"></span><br><span class="line">TEMPLATE = app</span><br><span class="line">#INCLUDEPATH += .</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">SOURCES += \</span><br><span class="line"> main.cpp</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#TEMPLATE = app</span><br><span class="line">#CONFIG += console c++11</span><br><span class="line">#CONFIG -= app_bundle</span><br><span class="line">#CONFIG -= qt</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-3"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QtWidgets></span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">char</span> *argv[])</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="function">QApplication <span class="title">a</span><span class="params">(argc, argv)</span></span>;</span><br><span class="line"> QWidget * widget = <span class="keyword">new</span> <span class="built_in">QWidget</span>();</span><br><span class="line"> widget-><span class="built_in">setWindowTitle</span>(QObject::<span class="built_in">tr</span>(<span class="string">"这是Widget"</span>));</span><br><span class="line"></span><br><span class="line"> QLabel * label1 = <span class="keyword">new</span> <span class="built_in">QLabel</span>();</span><br><span class="line"> label1-><span class="built_in">setWindowTitle</span>(QObject::<span class="built_in">tr</span>(<span class="string">"这是Label"</span>));</span><br><span class="line"> label1-><span class="built_in">setText</span>(QObject::<span class="built_in">tr</span>(<span class="string">"label1:我不是Widget的子部件"</span>));</span><br><span class="line"> label1-><span class="built_in">resize</span>(<span class="number">500</span>, <span class="number">50</span>);</span><br><span class="line"></span><br><span class="line"> QLabel * label2 = <span class="keyword">new</span> <span class="built_in">QLabel</span>(widget);</span><br><span class="line"> label2-><span class="built_in">setText</span>(QObject::<span class="built_in">tr</span>(<span class="string">"label2:我是Widget的子部件"</span>));</span><br><span class="line"> label2-><span class="built_in">resize</span>(<span class="number">500</span>, <span class="number">50</span>);</span><br><span class="line"></span><br><span class="line"> cout << <span class="string">"Hello World!"</span> << endl;</span><br><span class="line"></span><br><span class="line"> label1-><span class="built_in">show</span>();</span><br><span class="line"> widget-><span class="built_in">show</span>();</span><br><span class="line"> <span class="type">int</span> ret = a.<span class="built_in">exec</span>();</span><br><span class="line"> <span class="keyword">delete</span> widget;</span><br><span class="line"> <span class="keyword">return</span> ret;</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="第2题"><a href="#第2题" class="headerlink" title="第2题"></a>第2题</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目2</button></li><li class="tab"><button type="button" data-href="#-2">Mywidget.cpp</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">题目要求:熟悉模态和非模态对话框</span><br><span class="line">(1)新建一个Qt Widget Application项目:Project_2</span><br><span class="line">(2)在主窗口类的构造函数中,设置主窗口的标题为:I’m the main window</span><br><span class="line">(3)在主窗口类的构造函数中,定义一个基本对话框对象,设置其标题为:I’m a dialog</span><br><span class="line">(4)在主窗口类的构造函数中,以模态形式显示(3)中定义的对话框</span><br><span class="line">(5)撤消(4)操作,在主窗口类的构造函数中,以非模态形式显示(3)中定义的对话框</span><br><span class="line">(6)分析比较模态和非模态对话框的行为</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"mywidget.h"</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"ui_mywidget.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QDialog></span></span></span><br><span class="line"></span><br><span class="line">MyWidget::<span class="built_in">MyWidget</span>(QWidget *parent)</span><br><span class="line"> : <span class="built_in">QWidget</span>(parent)</span><br><span class="line"> , <span class="built_in">ui</span>(<span class="keyword">new</span> Ui::MyWidget)</span><br><span class="line">{</span><br><span class="line"> ui-><span class="built_in">setupUi</span>(<span class="keyword">this</span>);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">this</span>-><span class="built_in">setWindowTitle</span>(<span class="string">"I’m the main window"</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// QDialog dialog(this);</span></span><br><span class="line"><span class="comment">// dialog.show();</span></span><br><span class="line"><span class="comment">// dialog.exec();</span></span><br><span class="line"></span><br><span class="line"> QDialog * dialog = <span class="keyword">new</span> <span class="built_in">QDialog</span>(<span class="keyword">this</span>);</span><br><span class="line"> dialog-><span class="built_in">setWindowTitle</span>(<span class="string">"I’m a dialog"</span>);</span><br><span class="line"> dialog-><span class="built_in">resize</span>(<span class="number">500</span>, <span class="number">50</span>);</span><br><span class="line"><span class="comment">// dialog->setModal(true); //以模态形式显示</span></span><br><span class="line"> dialog-><span class="built_in">show</span>();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">MyWidget::~<span class="built_in">MyWidget</span>()</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">delete</span> ui;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="第3题"><a href="#第3题" class="headerlink" title="第3题"></a>第3题</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目3</button></li><li class="tab"><button type="button" data-href="#-2">myWidget.h</button></li><li class="tab"><button type="button" data-href="#-3">myWidget.cpp</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">题目要求:一个Qt界面程序的一般框架结构。通常,为程序的主窗口定义一个类,并在这个类中完成主窗口中的子部件</span><br><span class="line">的创建以及信号的处理。这样,程序的GUI部分全部放在主窗口中实现,便于管理和维护</span><br><span class="line">(1)新建一个空的Qt项目:Project_3</span><br><span class="line">(2)新建一个主窗口类,继承于Widget</span><br><span class="line">(3)在main函数中定义一个主窗口实例,并显示。</span><br><span class="line">(4)运行程序</span><br><span class="line">(5)在主窗口中添加一个PushButton。注意:在主窗口类的构造函数中完成该操作,不要在main函数中。运行程序。</span><br><span class="line">(6)通过Qt Designer在主窗口放置一个label标签,位置与(5)中的PushButton不要重叠,并设置其文本为:</span><br><span class="line">I’m a label。运行程序。</span><br><span class="line">(7)尝试在主窗口类的构造函数中修改(6)中label的文本为:access from code。运行程序。</span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> MYWIDGET_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> MYWIDGET_H</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QMainWindow></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QPushButton></span></span></span><br><span class="line"></span><br><span class="line">QT_BEGIN_NAMESPACE</span><br><span class="line"><span class="keyword">namespace</span> Ui { <span class="keyword">class</span> <span class="title class_">MyWidget</span>; }</span><br><span class="line">QT_END_NAMESPACE</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MyWidget</span> : <span class="keyword">public</span> QMainWindow</span><br><span class="line">{</span><br><span class="line"> Q_OBJECT</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="built_in">MyWidget</span>(QWidget *parent = <span class="literal">nullptr</span>);</span><br><span class="line"> ~<span class="built_in">MyWidget</span>();</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> QPushButton *myPushButton;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> Ui::MyWidget *ui;</span><br><span class="line">};</span><br><span class="line"><span class="meta">#<span class="keyword">endif</span> <span class="comment">// MYWIDGET_H</span></span></span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-3"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"mywidget.h"</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"ui_mywidget.h"</span></span></span><br><span class="line"></span><br><span class="line">MyWidget::<span class="built_in">MyWidget</span>(QWidget *parent)</span><br><span class="line"> : <span class="built_in">QMainWindow</span>(parent)</span><br><span class="line"> , <span class="built_in">ui</span>(<span class="keyword">new</span> Ui::MyWidget)</span><br><span class="line">{</span><br><span class="line"> ui-><span class="built_in">setupUi</span>(<span class="keyword">this</span>);</span><br><span class="line"></span><br><span class="line"> myPushButton = <span class="keyword">new</span> <span class="built_in">QPushButton</span>(<span class="string">"按钮"</span>, <span class="keyword">this</span>);</span><br><span class="line"></span><br><span class="line"> ui->label-><span class="built_in">setText</span>(<span class="string">"access from code"</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">MyWidget::~<span class="built_in">MyWidget</span>()</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">delete</span> ui;</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="第4题"><a href="#第4题" class="headerlink" title="第4题"></a>第4题</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目4</button></li><li class="tab"><button type="button" data-href="#-2">mywidget.h_</button></li><li class="tab"><button type="button" data-href="#-3">mywidget.cpp_</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">题目要求:熟悉信号槽机制。该题目在上面的Project_3上继续完成。</span><br><span class="line">(1)在主窗口类中定义一个slot槽函数changeLabelText()。</span><br><span class="line">(2)在主窗口类中把主窗口中PushButton的clicked信号与槽changeLabelText ()关联在一起. </span><br><span class="line">(3)在showDlg()完成如下处理:如果主窗口中的label的文本为: access from code,则修改其文本为:I’m </span><br><span class="line">a label;反之,则修改为:access from code。提示:字符串比较,可以用QString中的compare函数。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> MYWIDGET_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> MYWIDGET_H</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QWidget></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QPushButton></span></span></span><br><span class="line"></span><br><span class="line">QT_BEGIN_NAMESPACE</span><br><span class="line"><span class="keyword">namespace</span> Ui { <span class="keyword">class</span> <span class="title class_">MyWidget</span>; }</span><br><span class="line">QT_END_NAMESPACE</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MyWidget</span> : <span class="keyword">public</span> QWidget</span><br><span class="line">{</span><br><span class="line"> Q_OBJECT</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> slots:</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">changeLabelText</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> QPushButton *myPushButton;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="built_in">MyWidget</span>(QWidget *parent = <span class="literal">nullptr</span>);</span><br><span class="line"> ~<span class="built_in">MyWidget</span>();</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> Ui::MyWidget *ui;</span><br><span class="line">};</span><br><span class="line"><span class="meta">#<span class="keyword">endif</span> <span class="comment">// MYWIDGET_H</span></span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-3"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"mywidget.h"</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"ui_mywidget.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QDialog></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QString></span></span></span><br><span class="line"></span><br><span class="line">MyWidget::<span class="built_in">MyWidget</span>(QWidget *parent)</span><br><span class="line"> : <span class="built_in">QWidget</span>(parent)</span><br><span class="line"> , <span class="built_in">ui</span>(<span class="keyword">new</span> Ui::MyWidget)</span><br><span class="line">{</span><br><span class="line"> ui-><span class="built_in">setupUi</span>(<span class="keyword">this</span>);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">this</span>-><span class="built_in">setWindowTitle</span>(<span class="string">"I’m the main window"</span>);</span><br><span class="line"></span><br><span class="line"> QDialog * dialog = <span class="keyword">new</span> <span class="built_in">QDialog</span>(<span class="keyword">this</span>);</span><br><span class="line"> dialog-><span class="built_in">setWindowTitle</span>(<span class="string">"I’m a dialog"</span>);</span><br><span class="line"> dialog-><span class="built_in">resize</span>(<span class="number">500</span>, <span class="number">50</span>);</span><br><span class="line"><span class="comment">// dialog->setModal(true); //以模态形式显示</span></span><br><span class="line"> dialog-><span class="built_in">show</span>();</span><br><span class="line"></span><br><span class="line"> myPushButton = <span class="keyword">new</span> <span class="built_in">QPushButton</span>(<span class="string">"转换"</span>, <span class="keyword">this</span>);</span><br><span class="line"><span class="comment">// ui->label->setText("access from code");</span></span><br><span class="line"><span class="comment">// connect(myPushButton, SIGNAL(clicked()), this, SLOT(changeLabelText()));</span></span><br><span class="line"> <span class="built_in">connect</span>(myPushButton, &QPushButton::clicked, <span class="keyword">this</span>, &MyWidget::changeLabelText);</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">MyWidget::~<span class="built_in">MyWidget</span>()</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">delete</span> ui;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MyWidget::changeLabelText</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> QString str1 = <span class="string">"access from code"</span>;</span><br><span class="line"> QString str2 = <span class="string">"I’m a label"</span>;</span><br><span class="line"> QString str_now = ui->label-><span class="built_in">text</span>();</span><br><span class="line"> <span class="keyword">if</span> (QString::<span class="built_in">localeAwareCompare</span>(str_now, str1) == <span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> ui->label-><span class="built_in">setText</span>(str2);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (QString::<span class="built_in">localeAwareCompare</span>(str_now, str2) == <span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> ui->label-><span class="built_in">setText</span>(str1);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="第5题"><a href="#第5题" class="headerlink" title="第5题"></a>第5题</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目5</button></li><li class="tab"><button type="button" data-href="#-2">mywidget.h</button></li><li class="tab"><button type="button" data-href="#-3">mywidget.cpp</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">题目要求:熟悉标准对话框</span><br><span class="line">(1)新建一个空的Qt项目:Project_4</span><br><span class="line">(2)新建一个主窗口类,继承于Widget</span><br><span class="line">(3)在Qt Designer中编辑主窗口界面,放置如教材中图3-11所示的按钮</span><br><span class="line">(4)增加并关联每个按钮单击的信号槽</span><br><span class="line">(5)在每个按钮对应的槽函数中,显示对应的标准对话框。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> MYWIDGET_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> MYWIDGET_H</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QWidget></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QPushButton></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QWizard></span></span></span><br><span class="line"></span><br><span class="line">QT_BEGIN_NAMESPACE</span><br><span class="line"><span class="keyword">namespace</span> Ui { <span class="keyword">class</span> <span class="title class_">MyWidget</span>; }</span><br><span class="line">QT_END_NAMESPACE</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">QErrorMessage</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MyWidget</span> : <span class="keyword">public</span> QWidget</span><br><span class="line">{</span><br><span class="line"> Q_OBJECT</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> slots:</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">show_Dlg1</span><span class="params">()</span></span>;</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">show_Dlg2</span><span class="params">()</span></span>;</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">show_Dlg3</span><span class="params">()</span></span>;</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">show_Dlg4</span><span class="params">()</span></span>;</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">show_Dlg5</span><span class="params">()</span></span>;</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">show_Dlg6</span><span class="params">()</span></span>;</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">show_Dlg7</span><span class="params">()</span></span>;</span><br><span class="line"> <span class="function"><span class="type">void</span> <span class="title">show_Dlg8</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> QPushButton *myPushButton1;</span><br><span class="line"> QPushButton *myPushButton2;</span><br><span class="line"> QPushButton *myPushButton3;</span><br><span class="line"> QPushButton *myPushButton4;</span><br><span class="line"> QPushButton *myPushButton5;</span><br><span class="line"> QPushButton *myPushButton6;</span><br><span class="line"> QPushButton *myPushButton7;</span><br><span class="line"> QPushButton *myPushButton8;</span><br><span class="line"></span><br><span class="line"> QErrorMessage *errordlg;</span><br><span class="line"></span><br><span class="line"> <span class="function">QWizardPage *<span class="title">createPage1</span><span class="params">()</span></span>;</span><br><span class="line"> <span class="function">QWizardPage *<span class="title">createPage2</span><span class="params">()</span></span>;</span><br><span class="line"> <span class="function">QWizardPage *<span class="title">createPage3</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="built_in">MyWidget</span>(QWidget *parent = <span class="literal">nullptr</span>);</span><br><span class="line"> ~<span class="built_in">MyWidget</span>();</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> Ui::MyWidget *ui;</span><br><span class="line">};</span><br><span class="line"><span class="meta">#<span class="keyword">endif</span> <span class="comment">// MYWIDGET_H</span></span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-3"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"mywidget.h"</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"ui_mywidget.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QtDebug></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QColorDialog></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QFileDialog></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QFontDialog></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QInputDialog></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QMessageBox></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QProgressDialog></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QErrorMessage></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><QWizard></span></span></span><br><span class="line"></span><br><span class="line">MyWidget::<span class="built_in">MyWidget</span>(QWidget *parent)</span><br><span class="line"> : <span class="built_in">QWidget</span>(parent)</span><br><span class="line"> , <span class="built_in">ui</span>(<span class="keyword">new</span> Ui::MyWidget)</span><br><span class="line">{</span><br><span class="line"> ui-><span class="built_in">setupUi</span>(<span class="keyword">this</span>);</span><br><span class="line"></span><br><span class="line"> myPushButton1 = <span class="keyword">new</span> <span class="built_in">QPushButton</span>(<span class="string">"颜色对话框"</span>, <span class="keyword">this</span>);</span><br><span class="line"> myPushButton1-><span class="built_in">setGeometry</span>(<span class="number">150</span>, <span class="number">100</span>, <span class="number">150</span>, <span class="number">50</span>);</span><br><span class="line"> <span class="built_in">connect</span>(myPushButton1, &QPushButton::clicked, <span class="keyword">this</span>, &MyWidget::show_Dlg1);</span><br><span class="line"></span><br><span class="line"> myPushButton2 = <span class="keyword">new</span> <span class="built_in">QPushButton</span>(<span class="string">"文件对话框"</span>, <span class="keyword">this</span>);</span><br><span class="line"> myPushButton2-><span class="built_in">setGeometry</span>(<span class="number">450</span>, <span class="number">100</span>, <span class="number">150</span>, <span class="number">50</span>);</span><br><span class="line"> <span class="built_in">connect</span>(myPushButton2, &QPushButton::clicked, <span class="keyword">this</span>, &MyWidget::show_Dlg2);</span><br><span class="line"></span><br><span class="line"> myPushButton3 = <span class="keyword">new</span> <span class="built_in">QPushButton</span>(<span class="string">"字体对话框"</span>, <span class="keyword">this</span>);</span><br><span class="line"> myPushButton3-><span class="built_in">setGeometry</span>(<span class="number">150</span>, <span class="number">200</span>, <span class="number">150</span>, <span class="number">50</span>);</span><br><span class="line"> <span class="built_in">connect</span>(myPushButton3, &QPushButton::clicked, <span class="keyword">this</span>, &MyWidget::show_Dlg3);</span><br><span class="line"></span><br><span class="line"> myPushButton4 = <span class="keyword">new</span> <span class="built_in">QPushButton</span>(<span class="string">"输入对话框"</span>, <span class="keyword">this</span>);</span><br><span class="line"> myPushButton4-><span class="built_in">setGeometry</span>(<span class="number">450</span>, <span class="number">200</span>, <span class="number">150</span>, <span class="number">50</span>);</span><br><span class="line"> <span class="built_in">connect</span>(myPushButton4, &QPushButton::clicked, <span class="keyword">this</span>, &MyWidget::show_Dlg4);</span><br><span class="line"></span><br><span class="line"> myPushButton5 = <span class="keyword">new</span> <span class="built_in">QPushButton</span>(<span class="string">"消息对话框"</span>, <span class="keyword">this</span>);</span><br><span class="line"> myPushButton5-><span class="built_in">setGeometry</span>(<span class="number">150</span>, <span class="number">300</span>, <span class="number">150</span>, <span class="number">50</span>);</span><br><span class="line"> <span class="built_in">connect</span>(myPushButton5, &QPushButton::clicked, <span class="keyword">this</span>, &MyWidget::show_Dlg5);</span><br><span class="line"></span><br><span class="line"> myPushButton6 = <span class="keyword">new</span> <span class="built_in">QPushButton</span>(<span class="string">"进度对话框"</span>, <span class="keyword">this</span>);</span><br><span class="line"> myPushButton6-><span class="built_in">setGeometry</span>(<span class="number">450</span>, <span class="number">300</span>, <span class="number">150</span>, <span class="number">50</span>);</span><br><span class="line"> <span class="built_in">connect</span>(myPushButton6, &QPushButton::clicked, <span class="keyword">this</span>, &MyWidget::show_Dlg6);</span><br><span class="line"></span><br><span class="line"> errordlg = <span class="keyword">new</span> <span class="built_in">QErrorMessage</span>(<span class="keyword">this</span>);</span><br><span class="line"> myPushButton7 = <span class="keyword">new</span> <span class="built_in">QPushButton</span>(<span class="string">"错误信息对话框"</span>, <span class="keyword">this</span>);</span><br><span class="line"> myPushButton7-><span class="built_in">setGeometry</span>(<span class="number">150</span>, <span class="number">400</span>, <span class="number">150</span>, <span class="number">50</span>);</span><br><span class="line"> <span class="built_in">connect</span>(myPushButton7, &QPushButton::clicked, <span class="keyword">this</span>, &MyWidget::show_Dlg7);</span><br><span class="line"></span><br><span class="line"> myPushButton8 = <span class="keyword">new</span> <span class="built_in">QPushButton</span>(<span class="string">"向导对话框"</span>, <span class="keyword">this</span>);</span><br><span class="line"> myPushButton8-><span class="built_in">setGeometry</span>(<span class="number">450</span>, <span class="number">400</span>, <span class="number">150</span>, <span class="number">50</span>);</span><br><span class="line"> <span class="built_in">connect</span>(myPushButton8, &QPushButton::clicked, <span class="keyword">this</span>, &MyWidget::show_Dlg8);</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">MyWidget::~<span class="built_in">MyWidget</span>()</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">delete</span> ui;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MyWidget::show_Dlg1</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> QColor color = QColorDialog::<span class="built_in">getColor</span>(Qt::red, <span class="keyword">this</span>, <span class="built_in">tr</span>(<span class="string">"颜色对话框"</span>));</span><br><span class="line"> <span class="built_in">qDebug</span>() << <span class="string">"color: "</span> << color;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MyWidget::show_Dlg2</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> QString fileName = QFileDialog::<span class="built_in">getOpenFileName</span>(<span class="keyword">this</span>, <span class="built_in">tr</span>(<span class="string">"文件对话框"</span>), <span class="string">"D:"</span>, <span class="built_in">tr</span>(<span class="string">"图片文件(*png *jpg)"</span>));</span><br><span class="line"> <span class="built_in">qDebug</span>() << <span class="string">"fileName: "</span> << fileName;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MyWidget::show_Dlg3</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="type">bool</span> ok;</span><br><span class="line"> QFont font = QFontDialog::<span class="built_in">getFont</span>(&ok, <span class="keyword">this</span>);</span><br><span class="line"> <span class="keyword">if</span> (ok) myPushButton3-><span class="built_in">setFont</span>(font);</span><br><span class="line"> <span class="keyword">else</span> <span class="built_in">qDebug</span>() << <span class="built_in">tr</span>(<span class="string">"没有选择字体!"</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MyWidget::show_Dlg4</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="type">bool</span> ok;</span><br><span class="line"> QString string = QInputDialog::<span class="built_in">getText</span>(<span class="keyword">this</span>, <span class="built_in">tr</span>(<span class="string">"输入字符串对话框"</span>), <span class="built_in">tr</span>(<span class="string">"请输入用户名:"</span>), QLineEdit::Normal, <span class="built_in">tr</span>(<span class="string">"admin"</span>), &ok);</span><br><span class="line"> <span class="keyword">if</span> (ok) <span class="built_in">qDebug</span>() << <span class="string">"string: "</span> << string;</span><br><span class="line"></span><br><span class="line"> <span class="type">int</span> value1 = QInputDialog::<span class="built_in">getInt</span>(<span class="keyword">this</span>, <span class="built_in">tr</span>(<span class="string">"输入整数对话框"</span>), <span class="built_in">tr</span>(<span class="string">"请输入-1000到1000之间的数值:"</span>), <span class="number">100</span>, <span class="number">-1000</span>, <span class="number">1000</span>, <span class="number">10</span>, &ok);</span><br><span class="line"> <span class="keyword">if</span> (ok) <span class="built_in">qDebug</span>() << <span class="string">"value1: "</span> << value1;</span><br><span class="line"></span><br><span class="line"> <span class="type">double</span> value2 = QInputDialog::<span class="built_in">getDouble</span>(<span class="keyword">this</span>, <span class="built_in">tr</span>(<span class="string">"输入浮点数对话框"</span>), <span class="built_in">tr</span>(<span class="string">"请输入-1000到1000之间的数值:"</span>), <span class="number">0.00</span>, <span class="number">-1000</span>, <span class="number">1000</span>, <span class="number">2</span>, &ok);</span><br><span class="line"> <span class="keyword">if</span> (ok) <span class="built_in">qDebug</span>() << <span class="string">"value2: "</span> << value2;</span><br><span class="line"></span><br><span class="line"> QStringList items;</span><br><span class="line"> items << <span class="built_in">tr</span>(<span class="string">"条目1"</span>) << <span class="built_in">tr</span>(<span class="string">"条目2"</span>);</span><br><span class="line"> QString item = QInputDialog::<span class="built_in">getItem</span>(<span class="keyword">this</span>, <span class="built_in">tr</span>(<span class="string">"输入条目对话框"</span>), <span class="built_in">tr</span>(<span class="string">"请选择或输入一个条目"</span>), items, <span class="number">0</span>, <span class="literal">true</span>, &ok);</span><br><span class="line"> <span class="keyword">if</span> (ok) <span class="built_in">qDebug</span>() << <span class="string">"item: "</span> << item;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MyWidget::show_Dlg5</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="type">int</span> ret1 = QMessageBox::<span class="built_in">question</span>(<span class="keyword">this</span>, <span class="built_in">tr</span>(<span class="string">"问题对话框"</span>), <span class="built_in">tr</span>(<span class="string">"你了解Qt吗?"</span>), QMessageBox::Yes, QMessageBox::No);</span><br><span class="line"> <span class="keyword">if</span> (ret1 == QMessageBox::Yes) <span class="built_in">qDebug</span>() << <span class="built_in">tr</span>(<span class="string">"问题!"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="type">int</span> ret2 = QMessageBox::<span class="built_in">information</span>(<span class="keyword">this</span>, <span class="built_in">tr</span>(<span class="string">"提示对话框"</span>), <span class="built_in">tr</span>(<span class="string">"这是Qt书籍!"</span>), QMessageBox::Ok);</span><br><span class="line"> <span class="keyword">if</span> (ret2 == QMessageBox::Ok) <span class="built_in">qDebug</span>() << <span class="built_in">tr</span>(<span class="string">"提示!"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="type">int</span> ret3 = QMessageBox::<span class="built_in">warning</span>(<span class="keyword">this</span>, <span class="built_in">tr</span>(<span class="string">"警告对话框"</span>), <span class="built_in">tr</span>(<span class="string">"不能提前结束!"</span>), QMessageBox::Abort);</span><br><span class="line"> <span class="keyword">if</span> (ret3 == QMessageBox::Abort) <span class="built_in">qDebug</span>() << <span class="built_in">tr</span>(<span class="string">"警告!"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="type">int</span> ret4 = QMessageBox::<span class="built_in">critical</span>(<span class="keyword">this</span>, <span class="built_in">tr</span>(<span class="string">"严重错误对话框"</span>), <span class="built_in">tr</span>(<span class="string">"发现一个严重错误,现在要关闭所有文件!"</span>), QMessageBox::YesAll);</span><br><span class="line"> <span class="keyword">if</span> (ret4 == QMessageBox::YesAll) <span class="built_in">qDebug</span>() << <span class="built_in">tr</span>(<span class="string">"错误!"</span>);</span><br><span class="line"></span><br><span class="line"> QMessageBox::<span class="built_in">about</span>(<span class="keyword">this</span>, <span class="built_in">tr</span>(<span class="string">"关于对话框"</span>), <span class="built_in">tr</span>(<span class="string">"嗯嗯嗯嗯嗯嗯"</span>));</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MyWidget::show_Dlg6</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="function">QProgressDialog <span class="title">dialog</span><span class="params">(tr(<span class="string">"文件复制进度"</span>), tr(<span class="string">"取消"</span>), <span class="number">0</span>, <span class="number">50000</span>, <span class="keyword">this</span>)</span></span>;</span><br><span class="line"> dialog.<span class="built_in">setWindowTitle</span>(<span class="string">"进度对话框"</span>);</span><br><span class="line"> dialog.<span class="built_in">setWindowModality</span>(Qt::WindowModal);</span><br><span class="line"> dialog.<span class="built_in">show</span>();</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < <span class="number">50000</span>; i ++ )</span><br><span class="line"> {</span><br><span class="line"> dialog.<span class="built_in">setValue</span>(i);</span><br><span class="line"> QCoreApplication::<span class="built_in">processEvents</span>();</span><br><span class="line"> <span class="keyword">if</span> (dialog.<span class="built_in">wasCanceled</span>()) <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> dialog.<span class="built_in">setValue</span>(<span class="number">50000</span>);</span><br><span class="line"> <span class="built_in">qDebug</span>() << <span class="built_in">tr</span>(<span class="string">"复制结束!"</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MyWidget::show_Dlg7</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> errordlg-><span class="built_in">setWindowTitle</span>(<span class="built_in">tr</span>(<span class="string">"错误信息对话框"</span>));</span><br><span class="line"> errordlg-><span class="built_in">showMessage</span>(<span class="built_in">tr</span>(<span class="string">"这里是出错信息!"</span>));</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">MyWidget::show_Dlg8</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="function">QWizard <span class="title">wizard</span><span class="params">(<span class="keyword">this</span>)</span></span>;</span><br><span class="line"> wizard.<span class="built_in">setWindowTitle</span>(<span class="built_in">tr</span>(<span class="string">"向导对话框"</span>));</span><br><span class="line"> wizard.<span class="built_in">addPage</span>(<span class="built_in">createPage1</span>());</span><br><span class="line"> wizard.<span class="built_in">addPage</span>(<span class="built_in">createPage2</span>());</span><br><span class="line"> wizard.<span class="built_in">addPage</span>(<span class="built_in">createPage3</span>());</span><br><span class="line"> wizard.<span class="built_in">exec</span>();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function">QWizardPage * <span class="title">MyWidget::createPage1</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> QWizardPage *page = <span class="keyword">new</span> QWizardPage;</span><br><span class="line"> page-><span class="built_in">setTitle</span>(<span class="built_in">tr</span>(<span class="string">"介绍"</span>));</span><br><span class="line"> <span class="keyword">return</span> page;</span><br><span class="line">}</span><br><span class="line"><span class="function">QWizardPage * <span class="title">MyWidget::createPage2</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> QWizardPage *page = <span class="keyword">new</span> QWizardPage;</span><br><span class="line"> page-><span class="built_in">setTitle</span>(<span class="built_in">tr</span>(<span class="string">"用户选择信息"</span>));</span><br><span class="line"> <span class="keyword">return</span> page;</span><br><span class="line">}</span><br><span class="line"><span class="function">QWizardPage * <span class="title">MyWidget::createPage3</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> QWizardPage *page = <span class="keyword">new</span> QWizardPage;</span><br><span class="line"> page-><span class="built_in">setTitle</span>(<span class="built_in">tr</span>(<span class="string">"结束"</span>));</span><br><span class="line"> <span class="keyword">return</span> page;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><hr>]]></content>
<categories>
<category> C++桌面应用程序 </category>
</categories>
<tags>
<tag> C++ </tag>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> 桌面应用程序 </tag>
<tag> QT creator </tag>
</tags>
</entry>
<entry>
<title>VS C++桌面应用程序 - 对话框练习</title>
<link href="/2023/05/14/0002-04/"/>
<url>/2023/05/14/0002-04/</url>
<content type="html"><![CDATA[<h1 id="C-桌面应用程序实验4"><a href="#C-桌面应用程序实验4" class="headerlink" title="C++桌面应用程序实验4"></a>C++桌面应用程序实验4</h1><mark class="hl-label green">题目</mark> <div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">第一题</button></li><li class="tab"><button type="button" data-href="#-2">第二题</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">1. 模式对话框练习:做一简单窗口, 具有弹出式菜单“文件”,文件下面有3个菜单项,分别为“打开”,“保存”,“退</span><br><span class="line">出”,要求</span><br><span class="line"></span><br><span class="line">1) 初始状态下,“打开”“退出”两个菜单项为可用,“保存”菜单项为不可用</span><br><span class="line">2) 点击“打开”,弹出模式对话框,对话框中有一按钮“确定”</span><br><span class="line">3)当点击对话框“确定”按钮时,对话框关闭,窗口用户区中央显示文字“对话框已成功关闭!”,“保存”菜单项为可用</span><br><span class="line">4)点击“保存”菜单项时,跳出消息框,包含标题为“模式对话框”内容为“您已经保存!”,按钮OK。</span><br><span class="line">4)点击“退出”菜单项,窗口关闭,程序退出</span><br><span class="line">5)为上述三个菜单项添加相应加速键,并能正确响应加速键消息</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">2. 非模式对话框练习:在第1题中的文件菜单项中“保存”菜单项下加入一分隔线后,添加一个“非模式对话框”菜单项,</span><br><span class="line">当用户点击该菜单项时,在主菜单条下添加一个弹出式菜单“对话框”,下面有菜单项,分别为“打开”、“关闭”、分隔线和</span><br><span class="line">“删除菜单”,初始情况下“删除菜单”为不可用</span><br><span class="line"></span><br><span class="line">1) 当点击“打开”菜单项时,弹出非模式对话框,标题为“非模式对话框”,该对话框有一编辑框和一按钮确定,</span><br><span class="line">2)当用户在编辑框中输入文字,并点击“确定”按钮时,非模式对话框关闭,主窗口左上角显示:“非模式对话框输入文字</span><br><span class="line">为: ”加上编辑框输入的文字。</span><br><span class="line">3)当非模式对话框显示的情况下,点击“关闭”菜单项,也可以关闭非模式对话框,但是此时主窗口不显示非模式对话框</span><br><span class="line">相关文字。</span><br><span class="line">4) 2)和3)种情况发生时,“删除菜单”均变为可用</span><br><span class="line">5)当“删除菜单”可用时,点击之,可以将弹出式菜单“对话框”删除</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><mark class="hl-label green">代码</mark> <div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">(1)</button></li><li class="tab"><button type="button" data-href="#-2">(2)</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="comment">// Resource.h</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> IDD_DIALOG1 129</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> IDC_TITLE 1000</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ID_OPEN 32774</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ID_SAVE 32775</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ID_EXIT 32776</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/* ---- 以下是程序部分 ---- */</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// 全局变量:</span></span><br><span class="line"><span class="type">static</span> <span class="type">char</span>* text = <span class="keyword">new</span> <span class="type">char</span>[MAX_LOADSTRING]; <span class="comment">// 主窗口输出文本</span></span><br><span class="line"><span class="type">static</span> <span class="type">char</span>* text_dlg = <span class="keyword">new</span> <span class="type">char</span>[MAX_LOADSTRING]; <span class="comment">// 对话框输出文本</span></span><br><span class="line"><span class="function">INT_PTR CALLBACK <span class="title">Dialog1</span><span class="params">(HWND, UINT, WPARAM, LPARAM)</span></span>; <span class="comment">// 前向声明</span></span><br><span class="line"></span><br><span class="line"><span class="function">LRESULT CALLBACK <span class="title">WndProc</span><span class="params">(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="type">static</span> BOOL flag = TRUE;</span><br><span class="line"></span><br><span class="line"> HDC hdc;</span><br><span class="line"> HMENU hmenu = <span class="built_in">GetMenu</span>(hWnd);</span><br><span class="line"> PAINTSTRUCT ps;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">switch</span> (message)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> WM_COMMAND:</span><br><span class="line"> {</span><br><span class="line"> <span class="type">int</span> wmId = <span class="built_in">LOWORD</span>(wParam);</span><br><span class="line"> <span class="comment">// 分析菜单选择:</span></span><br><span class="line"> <span class="keyword">switch</span> (wmId)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> IDM_ABOUT:</span><br><span class="line"> <span class="built_in">DialogBox</span>(hInst, <span class="built_in">MAKEINTRESOURCE</span>(IDD_ABOUTBOX), hWnd, About);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_EXIT:</span><br><span class="line"> <span class="built_in">DestroyWindow</span>(hWnd);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_OPEN:</span><br><span class="line"> <span class="built_in">DialogBox</span>(hInst, <span class="built_in">MAKEINTRESOURCE</span>(IDD_DIALOG1), hWnd, Dialog1);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_SAVE:</span><br><span class="line"> <span class="built_in">strcpy_s</span>(text_dlg, <span class="built_in">sizeof</span>(<span class="string">"您已经保存!"</span>), <span class="string">"您已经保存!"</span>);</span><br><span class="line"> <span class="built_in">DialogBox</span>(hInst, <span class="built_in">MAKEINTRESOURCE</span>(IDD_DIALOG1), hWnd, Dialog1);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_PAINT:</span><br><span class="line"> {</span><br><span class="line"> hdc = <span class="built_in">BeginPaint</span>(hWnd, &ps);</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">if</span> (flag)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < MAX_LOADSTRING; i++)</span><br><span class="line"> {</span><br><span class="line"> text[i] = text_dlg[i] = <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">EnableMenuItem</span>(hmenu, ID_SAVE, MF_GRAYED);</span><br><span class="line"> flag = FALSE;</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">TextOut</span>(hdc, <span class="number">10</span>, <span class="number">10</span>, text, <span class="built_in">strlen</span>(text));</span><br><span class="line"></span><br><span class="line"> <span class="built_in">EndPaint</span>(hWnd, &ps);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_DESTROY:</span><br><span class="line"> <span class="built_in">PostQuitMessage</span>(<span class="number">0</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</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><br><span class="line"></span><br><span class="line"><span class="comment">// “模式对话框”框的消息处理程序。</span></span><br><span class="line"><span class="function">INT_PTR CALLBACK <span class="title">Dialog1</span><span class="params">(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> HMENU hmenu = <span class="built_in">GetMenu</span>(<span class="built_in">GetParent</span>(hDlg));</span><br><span class="line"></span><br><span class="line"> <span class="built_in">UNREFERENCED_PARAMETER</span>(lParam);</span><br><span class="line"> <span class="keyword">switch</span> (message)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> WM_INITDIALOG:</span><br><span class="line"> <span class="built_in">SetDlgItemText</span>(hDlg, IDC_TITLE, text_dlg);</span><br><span class="line"> <span class="keyword">return</span> (INT_PTR)TRUE;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">case</span> WM_COMMAND:</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">LOWORD</span>(wParam) == IDOK)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">strcpy_s</span>(text, <span class="built_in">sizeof</span>(<span class="string">"对话框已成功关闭!"</span>), <span class="string">"对话框已成功关闭!"</span>);</span><br><span class="line"> <span class="built_in">EnableMenuItem</span>(hmenu, ID_SAVE, MF_ENABLED);</span><br><span class="line"> <span class="built_in">EndDialog</span>(hDlg, <span class="built_in">LOWORD</span>(wParam));</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(<span class="built_in">GetParent</span>(hDlg), <span class="literal">NULL</span>, TRUE);</span><br><span class="line"> <span class="keyword">return</span> (INT_PTR)TRUE;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_CLOSE:</span><br><span class="line"> <span class="built_in">EndDialog</span>(hDlg, <span class="number">0</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> (INT_PTR)FALSE;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="comment">//Resource.h</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> IDD_DIALOG1 129</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> IDD_DIALOG2 130</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> IDC_TITLE 1001</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> IDC_EDIT 1002</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ID_OPEN 32774</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ID_SAVE 32775</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ID_EXIT 32776</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ID_MODALLESS_DEL 32779</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ID_MODALLESS_CLOSE 32780</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ID_MODALLESS_OPEN 32781</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ID_MODALLESS 32783</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/* ---- 以下是程序部分 ---- */</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// 全局变量</span></span><br><span class="line">HWND hdlg_modalless;</span><br><span class="line"><span class="type">static</span> <span class="type">char</span>* text = <span class="keyword">new</span> <span class="type">char</span>[MAX_LOADSTRING]; <span class="comment">// 主窗口输出文本</span></span><br><span class="line"><span class="type">static</span> <span class="type">char</span>* text_dlg = <span class="keyword">new</span> <span class="type">char</span>[MAX_LOADSTRING]; <span class="comment">// 对话框输出文本</span></span><br><span class="line"><span class="type">static</span> BOOL flag_center = FALSE;</span><br><span class="line"><span class="function">INT_PTR CALLBACK <span class="title">Dialog1</span><span class="params">(HWND, UINT, WPARAM, LPARAM)</span></span>;<span class="comment">// 前向声明</span></span><br><span class="line"><span class="function">INT_PTR CALLBACK <span class="title">Dialog2</span><span class="params">(HWND, UINT, WPARAM, LPARAM)</span></span>;<span class="comment">// 前向声明</span></span><br><span class="line"></span><br><span class="line"><span class="function">LRESULT CALLBACK <span class="title">WndProc</span><span class="params">(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="type">static</span> BOOL flag = TRUE;</span><br><span class="line"> <span class="type">static</span> BOOL has_modalless = FALSE;</span><br><span class="line"></span><br><span class="line"> HDC hdc;</span><br><span class="line"> PAINTSTRUCT ps;</span><br><span class="line"> HMENU hPopupMenu = <span class="built_in">CreatePopupMenu</span>();</span><br><span class="line"> HMENU hmenu = <span class="built_in">GetMenu</span>(hWnd);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">switch</span> (message)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> WM_COMMAND:</span><br><span class="line"> {</span><br><span class="line"> <span class="type">int</span> wmId = <span class="built_in">LOWORD</span>(wParam);</span><br><span class="line"> <span class="comment">// 分析菜单选择:</span></span><br><span class="line"> <span class="keyword">switch</span> (wmId)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> ID_EXIT:</span><br><span class="line"> <span class="built_in">DestroyWindow</span>(hWnd);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_OPEN:</span><br><span class="line"> <span class="built_in">DialogBox</span>(hInst, <span class="built_in">MAKEINTRESOURCE</span>(IDD_DIALOG1), hWnd, Dialog1);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_SAVE:</span><br><span class="line"> <span class="built_in">strcpy_s</span>(text_dlg, <span class="built_in">sizeof</span>(<span class="string">"您已经保存!"</span>), <span class="string">"您已经保存!"</span>);</span><br><span class="line"> <span class="built_in">DialogBox</span>(hInst, <span class="built_in">MAKEINTRESOURCE</span>(IDD_DIALOG1), hWnd, Dialog1);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_MODALLESS:</span><br><span class="line"> <span class="keyword">if</span> (!has_modalless)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">AppendMenu</span>(hmenu, MF_ENABLED | MF_POPUP, (INT_PTR)hPopupMenu, <span class="built_in">TEXT</span>(<span class="string">"对话框"</span>));</span><br><span class="line"> <span class="built_in">AppendMenu</span>(hPopupMenu, MF_ENABLED, ID_MODALLESS_OPEN, <span class="string">"打开"</span>);</span><br><span class="line"> <span class="built_in">AppendMenu</span>(hPopupMenu, MF_ENABLED, ID_MODALLESS_CLOSE, <span class="string">"关闭"</span>);</span><br><span class="line"> <span class="built_in">AppendMenu</span>(hPopupMenu, MF_STRING, <span class="number">0</span>, <span class="literal">NULL</span>);</span><br><span class="line"> <span class="built_in">AppendMenu</span>(hPopupMenu, MF_GRAYED, ID_MODALLESS_DEL, <span class="string">"删除菜单"</span>);</span><br><span class="line"> <span class="built_in">DrawMenuBar</span>(hWnd);</span><br><span class="line"> has_modalless = TRUE;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_MODALLESS_OPEN:</span><br><span class="line"> <span class="built_in">EnableMenuItem</span>(hmenu, ID_MODALLESS_DEL, MF_GRAYED);</span><br><span class="line"> hdlg_modalless = <span class="built_in">CreateDialog</span>(hInst, <span class="built_in">MAKEINTRESOURCE</span>(IDD_DIALOG2), hWnd, Dialog2);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_MODALLESS_CLOSE:</span><br><span class="line"> <span class="built_in">EnableMenuItem</span>(hmenu, ID_MODALLESS_DEL, MF_ENABLED);</span><br><span class="line"> <span class="built_in">EndDialog</span>(hdlg_modalless, <span class="number">0</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_MODALLESS_DEL:</span><br><span class="line"> <span class="built_in">RemoveMenu</span>(hmenu, <span class="number">1</span>, MF_BYPOSITION);</span><br><span class="line"> <span class="built_in">DrawMenuBar</span>(hWnd);</span><br><span class="line"> has_modalless = FALSE;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_PAINT:</span><br><span class="line"> {</span><br><span class="line"> hdc = <span class="built_in">BeginPaint</span>(hWnd, &ps);</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">if</span> (flag)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < MAX_LOADSTRING; i++)</span><br><span class="line"> {</span><br><span class="line"> text[i] = text_dlg[i] = <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">EnableMenuItem</span>(hmenu, ID_SAVE, MF_GRAYED);</span><br><span class="line"> flag = FALSE;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (flag_center)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">TextOut</span>(hdc, <span class="number">500</span>, <span class="number">250</span>, text, <span class="built_in">strlen</span>(text));</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">TextOut</span>(hdc, <span class="number">10</span>, <span class="number">10</span>, text, <span class="built_in">strlen</span>(text));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="built_in">EndPaint</span>(hWnd, &ps);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_DESTROY:</span><br><span class="line"> <span class="built_in">PostQuitMessage</span>(<span class="number">0</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</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><br><span class="line"></span><br><span class="line"><span class="comment">// “非模式对话框”框的消息处理程序。</span></span><br><span class="line"><span class="function">INT_PTR CALLBACK <span class="title">Dialog2</span><span class="params">(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> HMENU hmenu = <span class="built_in">GetMenu</span>(<span class="built_in">GetParent</span>(hDlg));</span><br><span class="line"> <span class="type">static</span> <span class="type">char</span>* str = <span class="keyword">new</span> <span class="type">char</span>[MAX_LOADSTRING];</span><br><span class="line"></span><br><span class="line"> <span class="built_in">UNREFERENCED_PARAMETER</span>(lParam);</span><br><span class="line"> <span class="keyword">switch</span> (message)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> WM_INITDIALOG:</span><br><span class="line"> <span class="built_in">SetDlgItemText</span>(hDlg, IDC_TITLE, text_dlg);</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < MAX_LOADSTRING; i++)</span><br><span class="line"> {</span><br><span class="line"> str[i] = text[i] = <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> (INT_PTR)TRUE;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">case</span> WM_COMMAND:</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">LOWORD</span>(wParam) == IDOK)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">GetDlgItemText</span>(hDlg, IDC_EDIT, str, <span class="number">200</span>);</span><br><span class="line"> <span class="built_in">strcpy_s</span>(text, <span class="built_in">sizeof</span>(<span class="string">"非模式对话框输入文字为:"</span>), <span class="string">"非模式对话框输入文字为:"</span>);</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="built_in">strlen</span>(text), j = <span class="number">0</span>; i < MAX_LOADSTRING; i++, j++)</span><br><span class="line"> {</span><br><span class="line"> text[i] = str[j];</span><br><span class="line"> }</span><br><span class="line"> flag_center = FALSE;</span><br><span class="line"> <span class="built_in">EnableMenuItem</span>(hmenu, ID_MODALLESS_DEL, MF_ENABLED);</span><br><span class="line"> <span class="built_in">EndDialog</span>(hDlg, <span class="built_in">LOWORD</span>(wParam));</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(<span class="built_in">GetParent</span>(hDlg), <span class="literal">NULL</span>, TRUE);</span><br><span class="line"> <span class="keyword">return</span> (INT_PTR)TRUE;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_CLOSE:</span><br><span class="line"> <span class="built_in">EndDialog</span>(hDlg, <span class="number">0</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> (INT_PTR)FALSE;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// “模式对话框”框的消息处理程序。</span></span><br><span class="line"><span class="function">INT_PTR CALLBACK <span class="title">Dialog1</span><span class="params">(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> HMENU hmenu = <span class="built_in">GetMenu</span>(<span class="built_in">GetParent</span>(hDlg));</span><br><span class="line"></span><br><span class="line"> <span class="built_in">UNREFERENCED_PARAMETER</span>(lParam);</span><br><span class="line"> <span class="keyword">switch</span> (message)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> WM_INITDIALOG:</span><br><span class="line"> <span class="built_in">SetDlgItemText</span>(hDlg, IDC_TITLE, text_dlg);</span><br><span class="line"> <span class="keyword">return</span> (INT_PTR)TRUE;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">case</span> WM_COMMAND:</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">LOWORD</span>(wParam) == IDOK)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">strcpy_s</span>(text, <span class="built_in">sizeof</span>(<span class="string">"对话框已成功关闭!"</span>), <span class="string">"对话框已成功关闭!"</span>);</span><br><span class="line"> flag_center = TRUE;</span><br><span class="line"> <span class="built_in">EnableMenuItem</span>(hmenu, ID_SAVE, MF_ENABLED);</span><br><span class="line"> <span class="built_in">EndDialog</span>(hDlg, <span class="built_in">LOWORD</span>(wParam));</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(<span class="built_in">GetParent</span>(hDlg), <span class="literal">NULL</span>, TRUE);</span><br><span class="line"> <span class="keyword">return</span> (INT_PTR)TRUE;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_CLOSE:</span><br><span class="line"> <span class="built_in">EndDialog</span>(hDlg, <span class="number">0</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> (INT_PTR)FALSE;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><hr>]]></content>
<categories>
<category> C++桌面应用程序 </category>
</categories>
<tags>
<tag> C++ </tag>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> 桌面应用程序 </tag>
<tag> Visual Studio </tag>
</tags>
</entry>
<entry>
<title>VS C++桌面应用程序 - 菜单和加速键</title>
<link href="/2023/05/14/0002-03/"/>
<url>/2023/05/14/0002-03/</url>
<content type="html"><![CDATA[<h1 id="C-桌面应用程序实验3"><a href="#C-桌面应用程序实验3" class="headerlink" title="C++桌面应用程序实验3"></a>C++桌面应用程序实验3</h1><mark class="hl-label green">题目</mark> <div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">第一题</button></li><li class="tab"><button type="button" data-href="#-2">第二题</button></li><li class="tab"><button type="button" data-href="#-3">第三题</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">1)菜单资源及其创建。为一简单窗口创建菜单,结构层次和加速键依次为:</span><br><span class="line">文件:打开(Ctrl+O)、保存(Ctrl+S)、另存为、分割线、打印(Ctrl+P)、退出(Ctrl+X)</span><br><span class="line">编辑:复制(Ctrl+C)、粘贴(Ctrl+V) </span><br><span class="line">帮助:关于(F1)</span><br><span class="line">2) 初始状态下,保存、打印、复制菜单项为灰色</span><br><span class="line">3)完成如下功能,单击“打开””菜单项或者键盘上按下“Ctrl+O”,在窗口用户区中显示“浙江工商大学欢迎你!”,同</span><br><span class="line">时,将“保存“、复制、打印菜单项变为可用状态,打开菜单项变为不可用状态。</span><br><span class="line">4)后点击菜单项“保存“或在键盘上按下”Ctrl+S”,将窗口中显示的文字存成默认路径下的文本文件,文件名为</span><br><span class="line">“data.txt”,将打开菜单项恢复可用状态,同时在其下方插入新的菜单项“导入”,ID号为ID_FILE_LOAD、可用状</span><br><span class="line">态。,加速键为Ctrl+L</span><br><span class="line">5)点击导入菜单项,程序清除屏幕显示,并从data.txt文件导入文件内容,显示于窗口客户区</span><br><span class="line">6)在编辑弹出式菜单下面追加一分割线,并在其下面添加菜单项“颜色”、ID_EDIT_COLOR,初始状态为可用。当点击颜色菜单时,在其后面追加三个菜单项,分别为红色、绿色、蓝色。ID自选,当选中某一颜色菜单项时,如红色,窗口中字体变为红色,同时该菜单前出现选中标识,也就是文字是什么颜色,则相应颜色菜单项出现选中标识。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">续上题</span><br><span class="line"></span><br><span class="line">1)在“编辑“”菜单下追加一分割线,后追加依次两个菜单项(包含加速键)“显示工具菜单(Ctrl+A)” “删除工具</span><br><span class="line"> 菜单(Ctrl+D)”初始状态“创建工具菜单”菜单项为可用,“删除工具菜单”项为不可用(灰色)</span><br><span class="line">2)完成如下功能:</span><br><span class="line"> A. 点击(或按相应加速键)“显示工具菜单”项,在菜单条中“编辑”菜单后,增加一弹出式菜单“工具”,包含 </span><br><span class="line"> “红色”,”绿色“、“蓝色”,分隔线、“更改文字(Modal)”、更改文字(Modaless)菜单项;同时“显示工</span><br><span class="line"> 具菜单”菜单项变为不可用(变灰),“删除工具菜单”菜单项变为可用。</span><br><span class="line"> B. 点击“删除工具菜单“项,菜单条中弹出式菜单“工具”,被删除,同时“显示工具菜单”菜单项变为可用,“删</span><br><span class="line"> 除工具菜单”变灰</span><br><span class="line"> C. 在“工具”菜单项存在的情况下,分别点击“红色”、“绿色”、“蓝色”菜单项,窗口用户区的文字分别显示为</span><br><span class="line"> 对应的颜色</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-3"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">创建一窗口,具有弹出式菜单“形状”,下面有菜单项“矩形”、“椭圆”,另有弹出式菜单“颜色”,下面有“红色”、“蓝</span><br><span class="line">色”“绿色”,弹出式菜单项“移动”,下面有菜单项“上”“下”“左”“右”,并为之设置四个方向键为其加速键,要求如下:</span><br><span class="line"></span><br><span class="line">1) 当点击椭圆或矩形菜单(相应的具有选中标识),拖动鼠标同时按下左键,在屏幕上画相应的形状,当放开左键</span><br><span class="line"> 时,图形停留在窗口上,</span><br><span class="line">2) 当点击相应的方向(方向键或菜单)时,屏幕图形向该方向移动。</span><br><span class="line">3) 选中颜色菜单,相应改变颜色。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><mark class="hl-label green">代码</mark> <div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">(1)</button></li><li class="tab"><button type="button" data-href="#-2">(2)</button></li><li class="tab"><button type="button" data-href="#-3">(3)</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">第一题和第二题代码写成一份,放在后面</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="comment">// Resource.h 里添加的定义</span></span><br><span class="line"><span class="comment">// #define ID_MENU1_OPEN 32781</span></span><br><span class="line"><span class="comment">// #define ID_MENU1_SAVE 32782</span></span><br><span class="line"><span class="comment">// #define ID_MENU1_SAVES 32783</span></span><br><span class="line"><span class="comment">// #define ID_MENU1_PASTE 32784</span></span><br><span class="line"><span class="comment">// #define ID_MENU1_EXIT 32785</span></span><br><span class="line"><span class="comment">// #define ID_MENU1_COPY 32786</span></span><br><span class="line"><span class="comment">// #define ID_MENU1_FILELOAD 32787</span></span><br><span class="line"><span class="comment">// #define ID_MENU1_PRINT 32788</span></span><br><span class="line"><span class="comment">// #define ID_MENU1_ABOUT 32789</span></span><br><span class="line"><span class="comment">// #define ID_MENU1_COLOR_R 32806</span></span><br><span class="line"><span class="comment">// #define ID_MENU1_COLOR_G 32807</span></span><br><span class="line"><span class="comment">// #define ID_MENU1_COLOR_B 32808</span></span><br><span class="line"><span class="comment">// #define ID_MENU1_COLOR 32809</span></span><br><span class="line"><span class="comment">// #define ID_MENU1_DELTOOL 32819</span></span><br><span class="line"><span class="comment">// #define ID_MENU1_ADDTOOL 32820</span></span><br><span class="line"><span class="comment">// #define ID_MENU1_TOOL 32823</span></span><br><span class="line"><span class="comment">// #define ID_MENU1_MODAL 32821</span></span><br><span class="line"><span class="comment">// #define ID_MENU1_MODALESS 32822</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 加速键的设置内容省略</span></span><br><span class="line"></span><br><span class="line"><span class="function">LRESULT CALLBACK <span class="title">WndProc</span><span class="params">(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> HDC hdc = <span class="built_in">GetDC</span>(hWnd);</span><br><span class="line"> HMENU hmenu = <span class="built_in">GetMenu</span>(hWnd);</span><br><span class="line"> HMENU hPopupMenu = <span class="built_in">CreatePopupMenu</span>();</span><br><span class="line"> <span class="comment">//HMENU hmenu_0 = GetSubMenu(hmenu, 0);</span></span><br><span class="line"> <span class="comment">//HMENU hmenu_1 = GetSubMenu(hmenu, 1);</span></span><br><span class="line"> <span class="comment">//HMENU hmenu_2 = GetSubMenu(hmenu, 2);</span></span><br><span class="line"></span><br><span class="line"> <span class="type">static</span> <span class="type">char</span>* textbuf = <span class="keyword">new</span> <span class="type">char</span>[<span class="number">512</span>];</span><br><span class="line"></span><br><span class="line"> <span class="type">static</span> BOOL flag = TRUE;</span><br><span class="line"> <span class="type">static</span> BOOL flag_fileload = TRUE;</span><br><span class="line"> <span class="type">static</span> BOOL flag_text = FALSE;</span><br><span class="line"> <span class="type">static</span> BOOL flag_color_r = FALSE;</span><br><span class="line"> <span class="type">static</span> BOOL flag_color_g = FALSE;</span><br><span class="line"> <span class="type">static</span> BOOL flag_color_b = FALSE;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">switch</span> (message)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> WM_COMMAND:</span><br><span class="line"> {</span><br><span class="line"> <span class="type">int</span> wmId = <span class="built_in">LOWORD</span>(wParam);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 分析菜单选择:</span></span><br><span class="line"> <span class="keyword">switch</span> (wmId)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> ID_MENU1_ABOUT:</span><br><span class="line"> <span class="built_in">DialogBox</span>(hInst, <span class="built_in">MAKEINTRESOURCE</span>(IDD_ABOUTBOX), hWnd, About);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_MENU1_EXIT:</span><br><span class="line"> <span class="built_in">DestroyWindow</span>(hWnd);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_MENU1_OPEN:</span><br><span class="line"> <span class="built_in">EnableMenuItem</span>(hmenu, ID_MENU1_COPY, MF_ENABLED);</span><br><span class="line"> <span class="built_in">EnableMenuItem</span>(hmenu, ID_MENU1_SAVE, MF_ENABLED);</span><br><span class="line"> <span class="built_in">EnableMenuItem</span>(hmenu, ID_MENU1_PASTE, MF_ENABLED);</span><br><span class="line"> <span class="built_in">EnableMenuItem</span>(hmenu, ID_MENU1_OPEN, MF_GRAYED);</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < <span class="number">512</span>; i++)</span><br><span class="line"> {</span><br><span class="line"> textbuf[i] = <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">strcpy_s</span>(textbuf, <span class="built_in">sizeof</span>(<span class="string">"浙江工商大学欢迎你!\n"</span>), <span class="string">"浙江工商大学欢迎你!\n"</span>);</span><br><span class="line"> flag_text = TRUE;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, TRUE);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_MENU1_SAVE:</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">EnableMenuItem</span>(hmenu, ID_MENU1_OPEN, MF_ENABLED);</span><br><span class="line"> <span class="keyword">if</span> (flag_fileload)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">InsertMenu</span>(hmenu, ID_MENU1_SAVE, MF_BYCOMMAND | MF_ENABLED,</span><br><span class="line"> ID_MENU1_FILELOAD, <span class="string">"导入(&L)"</span>);</span><br><span class="line"> flag_fileload = FALSE;</span><br><span class="line"> }</span><br><span class="line"> <span class="function">std::ofstream <span class="title">ofs</span><span class="params">(<span class="string">"D:\\Code\\VS_desktop\\test6\\data.txt"</span>, std::ios::app)</span></span>;</span><br><span class="line"> ofs.<span class="built_in">write</span>(textbuf, <span class="built_in">strlen</span>(textbuf));</span><br><span class="line"> ofs.<span class="built_in">close</span>();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_MENU1_FILELOAD:</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">DeleteMenu</span>(hmenu, ID_MENU1_FILELOAD, MF_BYCOMMAND);</span><br><span class="line"> flag_fileload = TRUE;</span><br><span class="line"> <span class="function">std::ifstream <span class="title">ifs</span><span class="params">(<span class="string">"D:\\Code\\VS_desktop\\test6\\data.txt"</span>, std::ios::in)</span></span>;</span><br><span class="line"> ifs.<span class="built_in">read</span>(textbuf, <span class="number">512</span>);</span><br><span class="line"> ifs.<span class="built_in">close</span>();</span><br><span class="line"> flag_text = TRUE;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, TRUE);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="comment">//case ID_MENU1_COLOR:</span></span><br><span class="line"> <span class="comment">// AppendMenu(hmenu_1, MF_ENABLED, ID_MENU1_COLOR_R, "红色");</span></span><br><span class="line"> <span class="comment">// AppendMenu(hmenu_1, MF_ENABLED, ID_MENU1_COLOR_G, "绿色");</span></span><br><span class="line"> <span class="comment">// AppendMenu(hmenu_1, MF_ENABLED, ID_MENU1_COLOR_B, "蓝色");</span></span><br><span class="line"> <span class="comment">// EnableMenuItem(hmenu, ID_MENU1_COLOR, MF_GRAYED);</span></span><br><span class="line"> <span class="comment">// break;</span></span><br><span class="line"> <span class="keyword">case</span> ID_MENU1_COLOR_R:</span><br><span class="line"> <span class="built_in">CheckMenuItem</span>(hmenu, ID_MENU1_COLOR_R, MF_CHECKED);</span><br><span class="line"> <span class="built_in">CheckMenuItem</span>(hmenu, ID_MENU1_COLOR_G, MF_UNCHECKED);</span><br><span class="line"> <span class="built_in">CheckMenuItem</span>(hmenu, ID_MENU1_COLOR_B, MF_UNCHECKED);</span><br><span class="line"> flag_color_r = flag_text = TRUE;</span><br><span class="line"> flag_color_g = flag_color_b = FALSE;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, TRUE);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_MENU1_COLOR_G:</span><br><span class="line"> <span class="built_in">CheckMenuItem</span>(hmenu, ID_MENU1_COLOR_R, MF_UNCHECKED);</span><br><span class="line"> <span class="built_in">CheckMenuItem</span>(hmenu, ID_MENU1_COLOR_G, MF_CHECKED);</span><br><span class="line"> <span class="built_in">CheckMenuItem</span>(hmenu, ID_MENU1_COLOR_B, MF_UNCHECKED);</span><br><span class="line"> flag_color_g = flag_text = TRUE;</span><br><span class="line"> flag_color_r = flag_color_b = FALSE;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, TRUE);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_MENU1_COLOR_B:</span><br><span class="line"> <span class="built_in">CheckMenuItem</span>(hmenu, ID_MENU1_COLOR_R, MF_UNCHECKED);</span><br><span class="line"> <span class="built_in">CheckMenuItem</span>(hmenu, ID_MENU1_COLOR_G, MF_UNCHECKED);</span><br><span class="line"> <span class="built_in">CheckMenuItem</span>(hmenu, ID_MENU1_COLOR_B, MF_CHECKED);</span><br><span class="line"> flag_color_b = flag_text = TRUE;</span><br><span class="line"> flag_color_r = flag_color_g = FALSE;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, TRUE);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_MENU1_ADDTOOL:</span><br><span class="line"> <span class="built_in">EnableMenuItem</span>(hmenu, ID_MENU1_DELTOOL, MF_ENABLED);</span><br><span class="line"> <span class="built_in">EnableMenuItem</span>(hmenu, ID_MENU1_ADDTOOL, MF_GRAYED);</span><br><span class="line"> <span class="comment">//hPopupMenu = CreatePopupMenu();</span></span><br><span class="line"> <span class="comment">//AppendMenu(hmenu, MF_POPUP, (UINT_PTR)hPopupmenu, "工具");</span></span><br><span class="line"> <span class="built_in">InsertMenu</span>(hmenu, <span class="number">2</span>, MF_BYPOSITION | MF_ENABLED | MF_POPUP, (INT_PTR)hPopupMenu, <span class="built_in">TEXT</span>(<span class="string">"工具"</span>));</span><br><span class="line"> <span class="built_in">AppendMenu</span>(hPopupMenu, MF_ENABLED, ID_MENU1_COLOR_R, <span class="string">"红色"</span>);</span><br><span class="line"> <span class="built_in">AppendMenu</span>(hPopupMenu, MF_ENABLED, ID_MENU1_COLOR_G, <span class="string">"绿色"</span>);</span><br><span class="line"> <span class="built_in">AppendMenu</span>(hPopupMenu, MF_ENABLED, ID_MENU1_COLOR_B, <span class="string">"蓝色"</span>);</span><br><span class="line"> <span class="built_in">AppendMenu</span>(hPopupMenu, MF_STRING, <span class="number">0</span>, <span class="literal">NULL</span>);</span><br><span class="line"> <span class="built_in">AppendMenu</span>(hPopupMenu, MF_ENABLED, ID_MENU1_MODAL, <span class="string">"更改文字(Modal)"</span>);</span><br><span class="line"> <span class="built_in">AppendMenu</span>(hPopupMenu, MF_ENABLED, ID_MENU1_MODALESS, <span class="string">"更改文字(Modaless)"</span>);</span><br><span class="line"> <span class="built_in">DrawMenuBar</span>(hWnd);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_MENU1_DELTOOL:</span><br><span class="line"> <span class="built_in">EnableMenuItem</span>(hmenu, ID_MENU1_DELTOOL, MF_GRAYED);</span><br><span class="line"> <span class="built_in">EnableMenuItem</span>(hmenu, ID_MENU1_ADDTOOL, MF_ENABLED);</span><br><span class="line"> <span class="built_in">RemoveMenu</span>(hmenu, <span class="number">2</span>, MF_BYPOSITION);</span><br><span class="line"> <span class="built_in">DrawMenuBar</span>(hWnd);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_PAINT:</span><br><span class="line"> {</span><br><span class="line"> PAINTSTRUCT ps;</span><br><span class="line"> HDC hdc = <span class="built_in">BeginPaint</span>(hWnd, &ps);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (flag)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">EnableMenuItem</span>(hmenu, ID_MENU1_COPY, MF_GRAYED);</span><br><span class="line"> <span class="built_in">EnableMenuItem</span>(hmenu, ID_MENU1_SAVE, MF_GRAYED);</span><br><span class="line"> <span class="built_in">EnableMenuItem</span>(hmenu, ID_MENU1_PASTE, MF_GRAYED);</span><br><span class="line"> <span class="built_in">EnableMenuItem</span>(hmenu, ID_MENU1_DELTOOL, MF_GRAYED);</span><br><span class="line"> flag = FALSE;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (flag_text)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (flag_color_r)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">SetTextColor</span>(hdc, <span class="built_in">RGB</span>(<span class="number">255</span>, <span class="number">0</span>, <span class="number">0</span>));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (flag_color_g)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">SetTextColor</span>(hdc, <span class="built_in">RGB</span>(<span class="number">0</span>, <span class="number">255</span>, <span class="number">0</span>));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (flag_color_b)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">SetTextColor</span>(hdc, <span class="built_in">RGB</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">255</span>));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="type">char</span>* str_line = <span class="keyword">new</span> <span class="type">char</span>[<span class="number">512</span>];</span><br><span class="line"> <span class="type">int</span> pos = <span class="number">0</span>, line_cnt = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < <span class="built_in">strlen</span>(textbuf); i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (textbuf[i] != <span class="string">'\n'</span>)</span><br><span class="line"> {</span><br><span class="line"> str_line[pos++] = textbuf[i];</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"> str_line[pos++] = <span class="number">0</span>;</span><br><span class="line"> line_cnt++;</span><br><span class="line"> <span class="built_in">TextOut</span>(hdc, <span class="number">10</span>, <span class="number">10</span> + line_cnt * <span class="number">30</span>, str_line, <span class="built_in">strlen</span>(str_line));</span><br><span class="line"> pos = <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> flag_text = FALSE;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="built_in">EndPaint</span>(hWnd, &ps);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_DESTROY:</span><br><span class="line"> <span class="built_in">PostQuitMessage</span>(<span class="number">0</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</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><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-3"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="comment">// Resource.h 里添加的定义</span></span><br><span class="line"><span class="comment">// #define ID_RECT 32780</span></span><br><span class="line"><span class="comment">// #define ID_CIRCLE 32781</span></span><br><span class="line"><span class="comment">// #define ID_RED 32782</span></span><br><span class="line"><span class="comment">// #define ID_BLUE 32783</span></span><br><span class="line"><span class="comment">// #define ID_GREEN 32784</span></span><br><span class="line"><span class="comment">// #define ID_UP 32785</span></span><br><span class="line"><span class="comment">// #define ID_DOWN 32786</span></span><br><span class="line"><span class="comment">// #define ID_LEFT 32787</span></span><br><span class="line"><span class="comment">// #define ID_RIGHT 32788</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 加速键的设置内容省略</span></span><br><span class="line"></span><br><span class="line"><span class="function">LRESULT CALLBACK <span class="title">WndProc</span><span class="params">(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> HMENU hmenu = <span class="built_in">GetMenu</span>(hWnd), haddmenu;</span><br><span class="line"> HMENU hmenu_0 = <span class="built_in">GetSubMenu</span>(hmenu, <span class="number">0</span>);</span><br><span class="line"> HMENU hmenu_1 = <span class="built_in">GetSubMenu</span>(hmenu, <span class="number">1</span>);</span><br><span class="line"> HMENU hmenu_2 = <span class="built_in">GetSubMenu</span>(hmenu, <span class="number">2</span>);</span><br><span class="line"></span><br><span class="line"> HPEN hPen_black = (HPEN)<span class="built_in">CreatePen</span>(PS_SOLID, <span class="number">2</span>, <span class="built_in">RGB</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>));</span><br><span class="line"> HPEN hPen_white = (HPEN)<span class="built_in">CreatePen</span>(PS_SOLID, <span class="number">5</span>, <span class="built_in">RGB</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>));</span><br><span class="line"> HBRUSH hBrush_white = (HBRUSH)<span class="built_in">GetStockObject</span>(WHITE_BRUSH);</span><br><span class="line"> HBRUSH hBrush_red = (HBRUSH)<span class="built_in">CreateSolidBrush</span>(<span class="built_in">RGB</span>(<span class="number">255</span>, <span class="number">0</span>, <span class="number">0</span>));</span><br><span class="line"> HBRUSH hBrush_green = (HBRUSH)<span class="built_in">CreateSolidBrush</span>(<span class="built_in">RGB</span>(<span class="number">0</span>, <span class="number">255</span>, <span class="number">0</span>));</span><br><span class="line"> HBRUSH hBrush_blue = (HBRUSH)<span class="built_in">CreateSolidBrush</span>(<span class="built_in">RGB</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">255</span>));</span><br><span class="line"></span><br><span class="line"> <span class="type">static</span> BOOL bRect = FALSE;</span><br><span class="line"> <span class="type">static</span> BOOL bCircle = FALSE;</span><br><span class="line"> <span class="type">static</span> BOOL bRed = FALSE;</span><br><span class="line"> <span class="type">static</span> BOOL bBlue = FALSE;</span><br><span class="line"> <span class="type">static</span> BOOL bGreen = FALSE;</span><br><span class="line"> <span class="type">static</span> BOOL nLButtonDown = FALSE;</span><br><span class="line"> <span class="type">static</span> <span class="type">int</span> start_x = <span class="number">0</span>, end_x = <span class="number">0</span>;</span><br><span class="line"> <span class="type">static</span> <span class="type">int</span> start_y = <span class="number">0</span>, end_y = <span class="number">0</span>;</span><br><span class="line"> <span class="type">int</span> x = <span class="built_in">LOWORD</span>(lParam);</span><br><span class="line"> <span class="type">int</span> y = <span class="built_in">HIWORD</span>(lParam);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> HDC hDC;</span><br><span class="line"> PAINTSTRUCT ps;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">switch</span> (message)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> WM_COMMAND:</span><br><span class="line"> {</span><br><span class="line"> <span class="type">int</span> wmId = <span class="built_in">LOWORD</span>(wParam);</span><br><span class="line"> <span class="comment">// 分析菜单选择:</span></span><br><span class="line"> <span class="keyword">switch</span> (wmId)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> ID_CIRCLE:</span><br><span class="line"> <span class="built_in">CheckMenuItem</span>(hmenu, ID_CIRCLE, MF_CHECKED);</span><br><span class="line"> <span class="built_in">CheckMenuItem</span>(hmenu, ID_RECT, MF_UNCHECKED);</span><br><span class="line"> bCircle = TRUE; bRect = FALSE;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_RECT:</span><br><span class="line"> <span class="built_in">CheckMenuItem</span>(hmenu, ID_RECT, MF_CHECKED);</span><br><span class="line"> <span class="built_in">CheckMenuItem</span>(hmenu, ID_CIRCLE, MF_UNCHECKED);</span><br><span class="line"> bRect = TRUE; bCircle = FALSE;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_UP:</span><br><span class="line"> start_y -= <span class="number">50</span>;</span><br><span class="line"> end_y -= <span class="number">50</span>;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, FALSE);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_DOWN:</span><br><span class="line"> start_y += <span class="number">50</span>;</span><br><span class="line"> end_y += <span class="number">50</span>;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, FALSE);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_LEFT:</span><br><span class="line"> start_x -= <span class="number">50</span>;</span><br><span class="line"> end_x -= <span class="number">50</span>;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, FALSE);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_RIGHT:</span><br><span class="line"> start_x += <span class="number">50</span>;</span><br><span class="line"> end_x += <span class="number">50</span>;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, FALSE);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_BLUE:</span><br><span class="line"> bBlue = TRUE; bRed = FALSE; bGreen = FALSE;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, FALSE);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_RED:</span><br><span class="line"> bRed = TRUE; bBlue = FALSE; bGreen = FALSE;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, FALSE);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> ID_GREEN:</span><br><span class="line"> bGreen = TRUE; bRed = FALSE; bBlue = FALSE;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, FALSE);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">case</span> WM_LBUTTONDOWN:</span><br><span class="line"> {</span><br><span class="line"> start_x = end_x = x;</span><br><span class="line"> start_y = end_y = y;</span><br><span class="line"> nLButtonDown = TRUE;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">case</span> WM_LBUTTONUP:</span><br><span class="line"> {</span><br><span class="line"> nLButtonDown = FALSE;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">case</span> WM_MOUSEMOVE:</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (nLButtonDown)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, FALSE);</span><br><span class="line"> end_x = x, end_y = y;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">case</span> WM_PAINT:</span><br><span class="line"> {</span><br><span class="line"> hDC = <span class="built_in">BeginPaint</span>(hWnd, &ps);</span><br><span class="line"> </span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hPen_white);</span><br><span class="line"> <span class="built_in">Rectangle</span>(hDC, <span class="number">0</span>, <span class="number">0</span>, <span class="number">1000</span>, <span class="number">1000</span>);</span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hPen_black);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (bRed)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hBrush_red);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (bBlue)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hBrush_blue);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (bGreen)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hBrush_green);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (bRect)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">Rectangle</span>(hDC, start_x, start_y, end_x, end_y);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (bCircle)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">Ellipse</span>(hDC, start_x, start_y, end_x, end_y);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="built_in">EndPaint</span>(hWnd, &ps);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_DESTROY:</span><br><span class="line"> <span class="built_in">PostQuitMessage</span>(<span class="number">0</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</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><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><hr>]]></content>
<categories>
<category> C++桌面应用程序 </category>
</categories>
<tags>
<tag> C++ </tag>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> 桌面应用程序 </tag>
<tag> Visual Studio </tag>
</tags>
</entry>
<entry>
<title>VS C++桌面应用程序 - 鼠标键盘编程</title>
<link href="/2023/05/14/0002-02/"/>
<url>/2023/05/14/0002-02/</url>
<content type="html"><![CDATA[<h1 id="C-桌面应用程序实验2"><a href="#C-桌面应用程序实验2" class="headerlink" title="C++桌面应用程序实验2"></a>C++桌面应用程序实验2</h1><mark class="hl-label green">题目</mark> <div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">第一题</button></li><li class="tab"><button type="button" data-href="#-2">第二题</button></li><li class="tab"><button type="button" data-href="#-3">第三题</button></li><li class="tab"><button type="button" data-href="#-4">第四题</button></li><li class="tab"><button type="button" data-href="#-5">第五题</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">1.重做书中例题1(旧版教材找到相应题目),测试是否达到要求。(注意,通过此题重新测试)</span><br><span class="line"> (a)大小写问题 (b)复合按键问题(ctrl+A) (c)如果按键既产生按键消息又产生字符消息,谁先谁后?</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">2.用户区中央显示一个正方形(大小自定),然后</span><br><span class="line"></span><br><span class="line">a.按键盘上的方向键,正方形能够按方向键的指示相应移动,大小不变。</span><br><span class="line">b.按键盘上的 b键,正方形涂黑,再按一下b键,正方形又切换为白色填充。如此,可以利用b键</span><br><span class="line"> 正方形可以在黑白两色间切换(要求在WM_CHAR消息中对b键进行相应,即在case WM_CHAR:</span><br><span class="line">c. 按下键盘上的ctrl + R键,圆形变为正方形,按下ctrl+C键又变回圆形,如此,可实现圆和正方形间的</span><br><span class="line"> 切换,其他功能仍可正常执行。(可能但不一定能用到: GetKeyState(VK_*) < 0 说明VK_*被按下,</span><br><span class="line"> >0 :VK_*没有按下,但是VK_CAPITAL 除外)</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-3"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">创建一个简单窗口, 按下鼠标左键,同时按下键盘上的ctrl键,拖动鼠标,在用户区上画出一个矩形,</span><br><span class="line">矩形左上角以初始按下鼠标的点,右下角为鼠标当前位置,放开鼠标,窗口用户区显示一个最后的矩形。</span><br><span class="line">按下键盘的‘l’(英文字母L的小写),矩形放大,按下‘s’键,矩形缩小,</span><br><span class="line">并能用方向键实现所画矩形按相应方向移动。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-4"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">做一个简单的画图程序,基本功能:</span><br><span class="line"></span><br><span class="line">1)按“L”后,用鼠标拖拽能在屏幕上画直线;</span><br><span class="line">2)按“E”后,用鼠标托拽能在屏幕上画矩形</span><br><span class="line">3)按“C”后,用鼠标拖拽能在屏幕上画圆</span><br><span class="line">4)按“R”“G”“B”能够改变所画图形为红、绿、蓝色</span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-5"><p>在窗口用户区中做一个简单的英文文本编辑器,基本功能:</p><p>1) 能够响应键盘输入文字;<br>2) 按Ctrl+A,实现文字底色全部变为蓝色,试着实现Ctrl+C,Ctrl+V<br> 实现复制粘贴功能,粘贴位置紧随原文之后<br>3) 按“Ctrl+S”键能够将所输入文字存成文件<br>4) 分别按“R”“G”“B”能够相应改变文字颜色<br>5) 能够用键盘移动在文字键插入字母<br>6) 如果采用定长数组存储输入文字,当输入越界时给出提示(提示——消息框:<br> MessageBox(hWnd, “你的输入已经超过了最大存储!”, “消息框实例”, MB_OK);</p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><mark class="hl-label green">代码</mark> <div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">第一题</button></li><li class="tab"><button type="button" data-href="#-2">第二题</button></li><li class="tab"><button type="button" data-href="#-3">第三题</button></li><li class="tab"><button type="button" data-href="#-4">第四题</button></li><li class="tab"><button type="button" data-href="#-5">第五题</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="function">LRESULT CALLBACK <span class="title">WndProc</span><span class="params">(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> HDC hDC;</span><br><span class="line"> PAINTSTRUCT ps;</span><br><span class="line"> HPEN hPen;</span><br><span class="line"> HBRUSH hBrush;</span><br><span class="line"></span><br><span class="line"> <span class="type">static</span> <span class="type">char</span> cUp[] = <span class="string">"You had pressed the UP key"</span>;</span><br><span class="line"> <span class="type">static</span> <span class="type">char</span> cCtrl[] = <span class="string">"You had pressed the CTRL key"</span>;</span><br><span class="line"> <span class="type">static</span> <span class="type">char</span> cShift[] = <span class="string">"You had pressed the SHIFT key"</span>;</span><br><span class="line"> <span class="type">static</span> <span class="type">char</span> cCtrl_A[] = <span class="string">"You had pressed the CTRL A key"</span>;</span><br><span class="line"> <span class="type">static</span> <span class="type">char</span> cShift_B[] = <span class="string">"You had pressed the SHIFT B key"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="type">static</span> BOOL nUpKeyDown = FALSE, nShiftKeyDown = FALSE, nCtrlKeyDown = FALSE;</span><br><span class="line"> <span class="type">static</span> BOOL nCtrlAKeyDown = FALSE, nShiftBKeyDown = FALSE;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">switch</span> (message)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> WM_KEYDOWN:</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">switch</span> (wParam)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> VK_UP:</span><br><span class="line"> nUpKeyDown = TRUE;</span><br><span class="line"> nCtrlKeyDown = nCtrlAKeyDown = FALSE;</span><br><span class="line"> nShiftKeyDown = nShiftBKeyDown = FALSE;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> VK_SHIFT:</span><br><span class="line"> nShiftKeyDown = TRUE;</span><br><span class="line"> nUpKeyDown = nShiftBKeyDown = FALSE;</span><br><span class="line"> nCtrlKeyDown = nCtrlAKeyDown = FALSE;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> VK_CONTROL:</span><br><span class="line"> nCtrlKeyDown = TRUE;</span><br><span class="line"> nUpKeyDown = nCtrlAKeyDown = FALSE;</span><br><span class="line"> nShiftKeyDown = nShiftBKeyDown = FALSE;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, FALSE);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//case WM_KEYUP:</span></span><br><span class="line"> <span class="comment">// InvalidateRect(hWnd, NULL, FALSE);</span></span><br><span class="line"> <span class="comment">// break;</span></span><br><span class="line"> <span class="keyword">case</span> WM_CHAR:</span><br><span class="line"> <span class="keyword">if</span> (wParam == <span class="string">'a'</span> || wParam == <span class="string">'A'</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">GetKeyState</span>(VK_CONTROL) < <span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> nCtrlAKeyDown = TRUE;</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> (wParam == <span class="string">'b'</span> || wParam == <span class="string">'B'</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">GetKeyState</span>(VK_SHIFT) < <span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> nShiftBKeyDown = TRUE;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span>;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, FALSE);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_COMMAND:</span><br><span class="line"> {</span><br><span class="line"> <span class="type">int</span> wmId = <span class="built_in">LOWORD</span>(wParam);</span><br><span class="line"> <span class="comment">// 分析菜单选择:</span></span><br><span class="line"> <span class="keyword">switch</span> (wmId)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> IDM_ABOUT:</span><br><span class="line"> <span class="built_in">DialogBox</span>(hInst, <span class="built_in">MAKEINTRESOURCE</span>(IDD_ABOUTBOX), hWnd, About);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> IDM_EXIT:</span><br><span class="line"> <span class="built_in">DestroyWindow</span>(hWnd);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_PAINT:</span><br><span class="line"> {</span><br><span class="line"> <span class="comment">// <span class="doctag">TODO:</span> 在此处添加使用 hdc 的任何绘图代码...</span></span><br><span class="line"> hDC = <span class="built_in">BeginPaint</span>(hWnd, &ps);</span><br><span class="line"> hBrush = (HBRUSH)<span class="built_in">GetStockObject</span>(WHITE_BRUSH);</span><br><span class="line"> hPen = (HPEN)<span class="built_in">GetStockObject</span>(WHITE_PEN);</span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hPen);</span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hBrush);</span><br><span class="line"> <span class="built_in">SetTextColor</span>(hDC, <span class="built_in">RGB</span>(<span class="number">255</span>, <span class="number">0</span>, <span class="number">0</span>));</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (nUpKeyDown == TRUE)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">Rectangle</span>(hDC, <span class="number">0</span>, <span class="number">0</span>, <span class="number">300</span>, <span class="number">200</span>);</span><br><span class="line"> <span class="built_in">TextOut</span>(hDC, <span class="number">0</span>, <span class="number">0</span>, cUp, <span class="built_in">strlen</span>(cUp));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (nCtrlAKeyDown == TRUE)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">Rectangle</span>(hDC, <span class="number">0</span>, <span class="number">0</span>, <span class="number">300</span>, <span class="number">200</span>);</span><br><span class="line"> <span class="built_in">TextOut</span>(hDC, <span class="number">0</span>, <span class="number">100</span>, cCtrl_A, <span class="built_in">strlen</span>(cCtrl_A));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (nCtrlKeyDown == TRUE)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">Rectangle</span>(hDC, <span class="number">0</span>, <span class="number">0</span>, <span class="number">300</span>, <span class="number">200</span>);</span><br><span class="line"> <span class="built_in">TextOut</span>(hDC, <span class="number">0</span>, <span class="number">60</span>, cCtrl, <span class="built_in">strlen</span>(cCtrl));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (nShiftBKeyDown == TRUE)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">Rectangle</span>(hDC, <span class="number">0</span>, <span class="number">0</span>, <span class="number">300</span>, <span class="number">200</span>);</span><br><span class="line"> <span class="built_in">TextOut</span>(hDC, <span class="number">0</span>, <span class="number">0</span>, cShift_B, <span class="built_in">strlen</span>(cShift_B));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (nShiftKeyDown == TRUE)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">Rectangle</span>(hDC, <span class="number">0</span>, <span class="number">0</span>, <span class="number">300</span>, <span class="number">200</span>);</span><br><span class="line"> <span class="built_in">TextOut</span>(hDC, <span class="number">0</span>, <span class="number">0</span>, cShift, <span class="built_in">strlen</span>(cShift));</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">DeleteObject</span>(hPen);</span><br><span class="line"> <span class="built_in">DeleteObject</span>(hBrush);</span><br><span class="line"> <span class="built_in">EndPaint</span>(hWnd, &ps);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_DESTROY:</span><br><span class="line"> <span class="built_in">PostQuitMessage</span>(<span class="number">0</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</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><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="function">LRESULT CALLBACK <span class="title">WndProc</span><span class="params">(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> HDC hDC;</span><br><span class="line"> PAINTSTRUCT ps;</span><br><span class="line"> HPEN hPen_black = (HPEN)<span class="built_in">CreatePen</span>(PS_SOLID, <span class="number">2</span>, <span class="built_in">RGB</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>));</span><br><span class="line"> HPEN hPen_white = (HPEN)<span class="built_in">CreatePen</span>(PS_SOLID, <span class="number">5</span>, <span class="built_in">RGB</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>));</span><br><span class="line"> HBRUSH hBrush_white = (HBRUSH)<span class="built_in">GetStockObject</span>(WHITE_BRUSH);</span><br><span class="line"> HBRUSH hBrush_black = (HBRUSH)<span class="built_in">GetStockObject</span>(BLACK_BRUSH);</span><br><span class="line"></span><br><span class="line"> <span class="type">static</span> BOOL backColor_White = TRUE;</span><br><span class="line"> <span class="type">static</span> BOOL shape_circle = FALSE;</span><br><span class="line"></span><br><span class="line"> <span class="type">static</span> <span class="type">int</span> start_x = <span class="number">500</span>;</span><br><span class="line"> <span class="type">static</span> <span class="type">int</span> start_y = <span class="number">200</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">switch</span> (message)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> WM_KEYDOWN:</span><br><span class="line"> {</span><br><span class="line"> hDC = <span class="built_in">GetDC</span>(hWnd);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hPen_white);</span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hBrush_white);</span><br><span class="line"> <span class="built_in">Rectangle</span>(hDC, start_x, start_y, start_x + <span class="number">200</span>, start_y + <span class="number">200</span>);</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, FALSE);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">switch</span> (wParam)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> VK_UP:</span><br><span class="line"> start_y -= <span class="number">50</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> VK_DOWN:</span><br><span class="line"> start_y += <span class="number">50</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> VK_LEFT:</span><br><span class="line"> start_x -= <span class="number">50</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> VK_RIGHT:</span><br><span class="line"> start_x += <span class="number">50</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'B'</span>:</span><br><span class="line"> backColor_White = !backColor_White;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'C'</span>:</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">GetKeyState</span>(VK_CONTROL) < <span class="number">0</span>)</span><br><span class="line"> shape_circle = TRUE;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'R'</span>:</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">GetKeyState</span>(VK_CONTROL) < <span class="number">0</span>)</span><br><span class="line"> shape_circle = FALSE;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, FALSE);</span><br><span class="line"> <span class="built_in">ReleaseDC</span>(hWnd, hDC);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//case WM_CHAR:</span></span><br><span class="line"> <span class="comment">// {</span></span><br><span class="line"> <span class="comment">// if (wParam == 'B')</span></span><br><span class="line"> <span class="comment">// backColor_White = !backColor_White;</span></span><br><span class="line"> <span class="comment">// else if (wParam == 'R')</span></span><br><span class="line"> <span class="comment">// {</span></span><br><span class="line"> <span class="comment">// if (GetKeyState(VK_CONTROL) < 0)</span></span><br><span class="line"> <span class="comment">// shape_circle = FALSE;</span></span><br><span class="line"> <span class="comment">// }</span></span><br><span class="line"> <span class="comment">// else if (wParam == 'C')</span></span><br><span class="line"> <span class="comment">// {</span></span><br><span class="line"> <span class="comment">// if (GetKeyState(VK_CONTROL) < 0)</span></span><br><span class="line"> <span class="comment">// shape_circle = TRUE;</span></span><br><span class="line"> <span class="comment">// }</span></span><br><span class="line"> <span class="comment">// InvalidateRect(hWnd, NULL, FALSE);</span></span><br><span class="line"> <span class="comment">// break;</span></span><br><span class="line"> <span class="comment">// }</span></span><br><span class="line"> <span class="keyword">case</span> WM_COMMAND:</span><br><span class="line"> {</span><br><span class="line"> <span class="type">int</span> wmId = <span class="built_in">LOWORD</span>(wParam);</span><br><span class="line"> <span class="comment">// 分析菜单选择:</span></span><br><span class="line"> <span class="keyword">switch</span> (wmId)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> IDM_ABOUT:</span><br><span class="line"> <span class="built_in">DialogBox</span>(hInst, <span class="built_in">MAKEINTRESOURCE</span>(IDD_ABOUTBOX), hWnd, About);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> IDM_EXIT:</span><br><span class="line"> <span class="built_in">DestroyWindow</span>(hWnd);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_PAINT:</span><br><span class="line"> {</span><br><span class="line"> hDC = <span class="built_in">BeginPaint</span>(hWnd, &ps);</span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hPen_black);</span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hBrush_white);</span><br><span class="line"> <span class="keyword">if</span> (backColor_White == FALSE)</span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hBrush_black);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (shape_circle == TRUE)</span><br><span class="line"> <span class="built_in">Ellipse</span>(hDC, start_x, start_y, start_x + <span class="number">200</span>, start_y + <span class="number">200</span>);</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> <span class="built_in">Rectangle</span>(hDC, start_x, start_y, start_x + <span class="number">200</span>, start_y + <span class="number">200</span>);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">EndPaint</span>(hWnd, &ps);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_DESTROY:</span><br><span class="line"> <span class="built_in">PostQuitMessage</span>(<span class="number">0</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</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><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-3"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="function">LRESULT CALLBACK <span class="title">WndProc</span><span class="params">(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> HDC hDC;</span><br><span class="line"> PAINTSTRUCT ps;</span><br><span class="line"> HPEN hPen_black = (HPEN)<span class="built_in">CreatePen</span>(PS_SOLID, <span class="number">2</span>, <span class="built_in">RGB</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>));</span><br><span class="line"> HPEN hPen_white = (HPEN)<span class="built_in">CreatePen</span>(PS_SOLID, <span class="number">5</span>, <span class="built_in">RGB</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>));</span><br><span class="line"> HBRUSH hBrush_white = (HBRUSH)<span class="built_in">GetStockObject</span>(WHITE_BRUSH);</span><br><span class="line"> HBRUSH hBrush_black = (HBRUSH)<span class="built_in">GetStockObject</span>(BLACK_BRUSH);</span><br><span class="line"></span><br><span class="line"> <span class="type">static</span> <span class="type">int</span> start_x = <span class="number">0</span>;</span><br><span class="line"> <span class="type">static</span> <span class="type">int</span> start_y = <span class="number">0</span>;</span><br><span class="line"> <span class="type">static</span> <span class="type">int</span> end_x = <span class="number">0</span>;</span><br><span class="line"> <span class="type">static</span> <span class="type">int</span> end_y = <span class="number">0</span>;</span><br><span class="line"> <span class="type">static</span> <span class="type">int</span> increase_x = <span class="number">0</span>;</span><br><span class="line"> <span class="type">static</span> <span class="type">int</span> increase_y = <span class="number">0</span>;</span><br><span class="line"> <span class="type">static</span> BOOL Rect = FALSE;</span><br><span class="line"> <span class="type">int</span> x = <span class="built_in">LOWORD</span>(lParam);</span><br><span class="line"> <span class="type">int</span> y = <span class="built_in">HIWORD</span>(lParam);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">switch</span> (message)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> WM_LBUTTONDOWN:</span><br><span class="line"> hDC = <span class="built_in">GetDC</span>(hWnd);</span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hPen_white);</span><br><span class="line"> <span class="built_in">Rectangle</span>(hDC, <span class="number">0</span>, <span class="number">0</span>, <span class="number">1000</span>, <span class="number">1000</span>);</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">GetKeyState</span>(VK_CONTROL) < <span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> Rect = TRUE;</span><br><span class="line"> start_x = x;</span><br><span class="line"> start_y = y;</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">ReleaseDC</span>(hWnd, hDC);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_LBUTTONUP:</span><br><span class="line"> Rect = FALSE;</span><br><span class="line"> <span class="keyword">if</span> (end_x < start_x)</span><br><span class="line"> {</span><br><span class="line"> <span class="type">int</span> temp = end_x;</span><br><span class="line"> end_x = start_x;</span><br><span class="line"> start_x = temp;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (end_y < start_y)</span><br><span class="line"> {</span><br><span class="line"> <span class="type">int</span> temp = end_y;</span><br><span class="line"> end_y = start_y;</span><br><span class="line"> start_y = temp;</span><br><span class="line"> }</span><br><span class="line"> increase_x = (end_x - start_x) / <span class="number">4</span>;</span><br><span class="line"> increase_y = (end_y - start_y) / <span class="number">4</span>;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, FALSE);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_MOUSEMOVE:</span><br><span class="line"> hDC = <span class="built_in">GetDC</span>(hWnd);</span><br><span class="line"> <span class="keyword">if</span> (Rect)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hPen_white);</span><br><span class="line"> <span class="built_in">Rectangle</span>(hDC, start_x, start_y, end_x, end_y);</span><br><span class="line"> end_x = x, end_y = y;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, FALSE);</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">ReleaseDC</span>(hWnd, hDC);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_KEYDOWN:</span><br><span class="line"> {</span><br><span class="line"> hDC = <span class="built_in">GetDC</span>(hWnd);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hPen_white);</span><br><span class="line"> <span class="built_in">Rectangle</span>(hDC, start_x, start_y, end_x, end_y);</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, FALSE);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">switch</span> (wParam)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> VK_UP:</span><br><span class="line"> start_y -= <span class="number">50</span>;</span><br><span class="line"> end_y -= <span class="number">50</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> VK_DOWN:</span><br><span class="line"> start_y += <span class="number">50</span>;</span><br><span class="line"> end_y += <span class="number">50</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> VK_LEFT:</span><br><span class="line"> start_x -= <span class="number">50</span>;</span><br><span class="line"> end_x -= <span class="number">50</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> VK_RIGHT:</span><br><span class="line"> start_x += <span class="number">50</span>;</span><br><span class="line"> end_x += <span class="number">50</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, FALSE);</span><br><span class="line"> <span class="built_in">ReleaseDC</span>(hWnd, hDC);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">case</span> WM_CHAR:</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (wParam == <span class="string">'l'</span>)</span><br><span class="line"> { </span><br><span class="line"> end_x += increase_x;</span><br><span class="line"> end_y += increase_y;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (wParam == <span class="string">'s'</span>)</span><br><span class="line"> {</span><br><span class="line"> end_x -= increase_x;</span><br><span class="line"> end_y -= increase_y;</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, FALSE);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">case</span> WM_COMMAND:</span><br><span class="line"> {</span><br><span class="line"> <span class="type">int</span> wmId = <span class="built_in">LOWORD</span>(wParam);</span><br><span class="line"> <span class="comment">// 分析菜单选择:</span></span><br><span class="line"> <span class="keyword">switch</span> (wmId)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> IDM_ABOUT:</span><br><span class="line"> <span class="built_in">DialogBox</span>(hInst, <span class="built_in">MAKEINTRESOURCE</span>(IDD_ABOUTBOX), hWnd, About);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> IDM_EXIT:</span><br><span class="line"> <span class="built_in">DestroyWindow</span>(hWnd);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_PAINT:</span><br><span class="line"> {</span><br><span class="line"> hDC = <span class="built_in">BeginPaint</span>(hWnd, &ps);</span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hPen_black);</span><br><span class="line"> </span><br><span class="line"> <span class="built_in">Rectangle</span>(hDC, start_x, start_y, end_x, end_y);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">EndPaint</span>(hWnd, &ps);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_DESTROY:</span><br><span class="line"> <span class="built_in">PostQuitMessage</span>(<span class="number">0</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</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><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-4"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> 为什么我运行之后执行两三次操作就无响应了???</span></span><br><span class="line"><span class="comment"> 问题是我还不觉得代码哪里有错,Debug不出来呀!!</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"></span><br><span class="line"><span class="function">LRESULT CALLBACK <span class="title">WndProc</span><span class="params">(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> HDC hDC;</span><br><span class="line"> PAINTSTRUCT ps;</span><br><span class="line"></span><br><span class="line"> HPEN hPen_white = (HPEN)<span class="built_in">CreatePen</span>(PS_SOLID, <span class="number">5</span>, <span class="built_in">RGB</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>));</span><br><span class="line"> HPEN hPen_black = (HPEN)<span class="built_in">CreatePen</span>(PS_SOLID, <span class="number">2</span>, <span class="built_in">RGB</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>));</span><br><span class="line"> HPEN hPen_red = (HPEN)<span class="built_in">CreatePen</span>(PS_SOLID, <span class="number">2</span>, <span class="built_in">RGB</span>(<span class="number">255</span>, <span class="number">0</span>, <span class="number">0</span>));</span><br><span class="line"> HPEN hPen_green = (HPEN)<span class="built_in">CreatePen</span>(PS_SOLID, <span class="number">2</span>, <span class="built_in">RGB</span>(<span class="number">0</span>, <span class="number">255</span>, <span class="number">0</span>));</span><br><span class="line"> HPEN hPen_blue = (HPEN)<span class="built_in">CreatePen</span>(PS_SOLID, <span class="number">2</span>, <span class="built_in">RGB</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">255</span>));</span><br><span class="line"></span><br><span class="line"> HBRUSH hBrush_white = (HBRUSH)<span class="built_in">GetStockObject</span>(WHITE_BRUSH);</span><br><span class="line"> HBRUSH hBrush_black = (HBRUSH)<span class="built_in">GetStockObject</span>(BLACK_BRUSH);</span><br><span class="line"> HBRUSH hBrush_red = (HBRUSH)<span class="built_in">CreateSolidBrush</span>(<span class="built_in">RGB</span>(<span class="number">255</span>, <span class="number">0</span>, <span class="number">0</span>));</span><br><span class="line"> HBRUSH hBrush_green = (HBRUSH)<span class="built_in">CreateSolidBrush</span>(<span class="built_in">RGB</span>(<span class="number">0</span>, <span class="number">255</span>, <span class="number">0</span>));</span><br><span class="line"> HBRUSH hBrush_blue = (HBRUSH)<span class="built_in">CreateSolidBrush</span>(<span class="built_in">RGB</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">255</span>));</span><br><span class="line"></span><br><span class="line"> <span class="type">static</span> BOOL nLKeyDown = FALSE, nEKeyDown = FALSE, nCKeyDown = FALSE;</span><br><span class="line"> <span class="type">static</span> BOOL nRKeyDown = FALSE, nGKeyDown = FALSE, nBKeyDown = FALSE;</span><br><span class="line"> <span class="type">static</span> BOOL nLButtonKeyDown = FALSE, nEButtonKeyDown = FALSE, nCButtonKeyDown = FALSE;</span><br><span class="line"> <span class="type">static</span> BOOL isLButtonDown = FALSE;</span><br><span class="line"></span><br><span class="line"> <span class="type">static</span> <span class="type">int</span> op = <span class="number">0</span>;</span><br><span class="line"> <span class="type">static</span> POINT LeftUp = { <span class="number">0</span>, <span class="number">0</span> }, RightDown = { <span class="number">0</span>, <span class="number">0</span> };</span><br><span class="line"></span><br><span class="line"> <span class="keyword">switch</span> (message)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> WM_LBUTTONDOWN:</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, TRUE);</span><br><span class="line"> op = nRKeyDown = nGKeyDown = nBKeyDown = FALSE;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (!isLButtonDown) </span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (nLKeyDown) </span><br><span class="line"> {</span><br><span class="line"> op = <span class="number">1</span>;</span><br><span class="line"> nLButtonKeyDown = TRUE;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (nEKeyDown) </span><br><span class="line"> {</span><br><span class="line"> op = <span class="number">2</span>;</span><br><span class="line"> nEButtonKeyDown = TRUE;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (nCKeyDown) </span><br><span class="line"> {</span><br><span class="line"> op = <span class="number">3</span>;</span><br><span class="line"> nCButtonKeyDown = TRUE;</span><br><span class="line"> }</span><br><span class="line"> LeftUp = RightDown = { <span class="built_in">LOWORD</span>(lParam), <span class="built_in">HIWORD</span>(lParam) };</span><br><span class="line"> }</span><br><span class="line"> isLButtonDown = TRUE;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">case</span> WM_LBUTTONUP:</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (nLButtonKeyDown) </span><br><span class="line"> {</span><br><span class="line"> RightDown = { <span class="built_in">LOWORD</span>(lParam), <span class="built_in">HIWORD</span>(lParam) };</span><br><span class="line"> nLButtonKeyDown = FALSE;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (nEButtonKeyDown) </span><br><span class="line"> {</span><br><span class="line"> RightDown = { <span class="built_in">LOWORD</span>(lParam), <span class="built_in">HIWORD</span>(lParam) };</span><br><span class="line"> nEButtonKeyDown = FALSE;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (nCButtonKeyDown) </span><br><span class="line"> {</span><br><span class="line"> RightDown = { <span class="built_in">LOWORD</span>(lParam), <span class="built_in">HIWORD</span>(lParam) };</span><br><span class="line"> nCButtonKeyDown = FALSE;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (LeftUp.x > RightDown.x || LeftUp.y > RightDown.y)</span><br><span class="line"> {</span><br><span class="line"> POINT Temp = LeftUp;</span><br><span class="line"> LeftUp = RightDown;</span><br><span class="line"> RightDown = Temp;</span><br><span class="line"> }</span><br><span class="line"> isLButtonDown = FALSE;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">case</span> WM_MOUSEMOVE:</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (isLButtonDown) </span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (nLButtonKeyDown) </span><br><span class="line"> {</span><br><span class="line"> op = <span class="number">1</span>;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, TRUE);</span><br><span class="line"> RightDown = { <span class="built_in">LOWORD</span>(lParam), <span class="built_in">HIWORD</span>(lParam) };</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (nEButtonKeyDown) </span><br><span class="line"> {</span><br><span class="line"> op = <span class="number">2</span>;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, TRUE);</span><br><span class="line"> RightDown = { <span class="built_in">LOWORD</span>(lParam), <span class="built_in">HIWORD</span>(lParam) };</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (nCButtonKeyDown) </span><br><span class="line"> {</span><br><span class="line"> op = <span class="number">3</span>;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, TRUE);</span><br><span class="line"> RightDown = { <span class="built_in">LOWORD</span>(lParam), <span class="built_in">HIWORD</span>(lParam) };</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">case</span> WM_KEYDOWN:</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">switch</span> (wParam)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'L'</span>:</span><br><span class="line"> nLKeyDown = TRUE;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'E'</span>:</span><br><span class="line"> nEKeyDown = TRUE;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'C'</span>:</span><br><span class="line"> nCKeyDown = TRUE;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'R'</span>:</span><br><span class="line"> nRKeyDown = TRUE;</span><br><span class="line"> nGKeyDown = nBKeyDown = FALSE;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'G'</span>:</span><br><span class="line"> nGKeyDown = TRUE;</span><br><span class="line"> nRKeyDown = nBKeyDown = FALSE;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'B'</span>:</span><br><span class="line"> nBKeyDown = TRUE;</span><br><span class="line"> nRKeyDown = nGKeyDown = FALSE;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">case</span> WM_KEYUP:</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, TRUE);</span><br><span class="line"> nLKeyDown = nLButtonKeyDown = FALSE;</span><br><span class="line"> nEKeyDown = nEButtonKeyDown = FALSE;</span><br><span class="line"> nCKeyDown = nCButtonKeyDown = FALSE;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">case</span> WM_COMMAND:</span><br><span class="line"> {</span><br><span class="line"> <span class="type">int</span> wmId = <span class="built_in">LOWORD</span>(wParam);</span><br><span class="line"> <span class="comment">// 分析菜单选择:</span></span><br><span class="line"> <span class="keyword">switch</span> (wmId)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> IDM_ABOUT:</span><br><span class="line"> <span class="built_in">DialogBox</span>(hInst, <span class="built_in">MAKEINTRESOURCE</span>(IDD_ABOUTBOX), hWnd, About);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> IDM_EXIT:</span><br><span class="line"> <span class="built_in">DestroyWindow</span>(hWnd);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">case</span> WM_PAINT:</span><br><span class="line"> {</span><br><span class="line"> hDC = <span class="built_in">BeginPaint</span>(hWnd, &ps);</span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hPen_black);</span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hBrush_white);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (op) </span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (nRKeyDown) </span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hPen_red);</span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hBrush_red);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (nGKeyDown) </span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hPen_green);</span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hBrush_green);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (nBKeyDown) </span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hPen_blue);</span><br><span class="line"> <span class="built_in">SelectObject</span>(hDC, hBrush_blue);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (op == <span class="number">1</span>) </span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">MoveToEx</span>(hDC, LeftUp.x, LeftUp.y, <span class="literal">NULL</span>);</span><br><span class="line"> <span class="built_in">LineTo</span>(hDC, RightDown.x, RightDown.y);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (op == <span class="number">2</span>) </span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">Rectangle</span>(hDC, LeftUp.x, LeftUp.y, RightDown.x, RightDown.y);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (op == <span class="number">3</span>) </span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">Ellipse</span>(hDC, LeftUp.x, LeftUp.y, RightDown.x, RightDown.y);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="built_in">EndPaint</span>(hWnd, &ps);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">case</span> WM_DESTROY:</span><br><span class="line"> <span class="built_in">PostQuitMessage</span>(<span class="number">0</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</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><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-5"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> 失败了,这题我不会写!!!真的好难呀!</span></span><br><span class="line"><span class="comment"> 为什么老师都是刚教会我们走路就要我们去参加赛跑呀</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> IDC_MAIN_EDIT 101</span></span><br><span class="line"></span><br><span class="line"><span class="function">LRESULT CALLBACK <span class="title">WndProc</span><span class="params">(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="type">static</span> BOOL nRKeyDown = FALSE, nGKeyDown = FALSE, nBKeyDown = FALSE;</span><br><span class="line"> <span class="type">static</span> BOOL KeyDown = FALSE;</span><br><span class="line"> <span class="comment">//static BOOL nBkDown = FALSE;</span></span><br><span class="line"></span><br><span class="line"> HDC hDC;</span><br><span class="line"> HWND hEdit;</span><br><span class="line"> PAINTSTRUCT ps;</span><br><span class="line"></span><br><span class="line"> TCHAR buffer[<span class="number">512</span>] = <span class="string">"这是编辑框的文本内容"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">switch</span> (message)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> WM_CTLCOLOREDIT:</span><br><span class="line"> {</span><br><span class="line"> HDC hdc = (HDC)wParam;</span><br><span class="line"> <span class="keyword">if</span> (nRKeyDown)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">SetTextColor</span>(hdc, <span class="built_in">RGB</span>(<span class="number">255</span>, <span class="number">0</span>, <span class="number">0</span>));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (nGKeyDown)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">SetTextColor</span>(hdc, <span class="built_in">RGB</span>(<span class="number">0</span>, <span class="number">255</span>, <span class="number">0</span>));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (nBKeyDown)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">SetTextColor</span>(hdc, <span class="built_in">RGB</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">255</span>));</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">SetTextColor</span>(hdc, <span class="built_in">RGB</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">255</span>));</span><br><span class="line"> <span class="comment">//if (nBkDown)</span></span><br><span class="line"> <span class="comment">//{</span></span><br><span class="line"> <span class="comment">// SetBkColor(hdc, RGB(0, 0, 255));</span></span><br><span class="line"> <span class="comment">//}</span></span><br><span class="line"> <span class="keyword">return</span> (INT_PTR)<span class="built_in">CreateSolidBrush</span>(<span class="built_in">RGB</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">case</span> WM_CREATE:</span><br><span class="line"> {</span><br><span class="line"> <span class="comment">//HWND hEdit = CreateWindowEx(</span></span><br><span class="line"> <span class="comment">// WS_EX_CLIENTEDGE,</span></span><br><span class="line"> <span class="comment">// "EDIT",</span></span><br><span class="line"> <span class="comment">// NULL,</span></span><br><span class="line"> <span class="comment">// WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_LEFT |</span></span><br><span class="line"> <span class="comment">// WS_VSCROLL | ES_AUTOVSCROLL | ES_AUTOHSCROLL,</span></span><br><span class="line"> <span class="comment">// 0, 0, 1000, 1000,</span></span><br><span class="line"> <span class="comment">// hWnd,</span></span><br><span class="line"> <span class="comment">// (HMENU)IDC_MAIN_EDIT,</span></span><br><span class="line"> <span class="comment">// GetModuleHandle(NULL),</span></span><br><span class="line"> <span class="comment">// NULL);</span></span><br><span class="line"> <span class="comment">//SetWindowText(hEdit, "这是编辑框的文本内容");</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">case</span> WM_KEYDOWN:</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (!KeyDown)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">switch</span> (wParam)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'R'</span>:</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">GetKeyState</span>(VK_CONTROL) < <span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> KeyDown = nRKeyDown = TRUE;</span><br><span class="line"> nGKeyDown = nBKeyDown = FALSE;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, TRUE);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'G'</span>:</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">GetKeyState</span>(VK_CONTROL) < <span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> KeyDown = nGKeyDown = TRUE;</span><br><span class="line"> nRKeyDown = nBKeyDown = FALSE;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, TRUE);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'B'</span>:</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">GetKeyState</span>(VK_CONTROL) < <span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> KeyDown = nBKeyDown = TRUE;</span><br><span class="line"> nRKeyDown = nGKeyDown = FALSE;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, TRUE);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'P'</span>:</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">GetKeyState</span>(VK_CONTROL) < <span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> KeyDown = TRUE;</span><br><span class="line"> nBKeyDown = nRKeyDown = nGKeyDown = FALSE;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, TRUE);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">case</span> WM_KEYUP:</span><br><span class="line"> {</span><br><span class="line"> KeyDown = FALSE;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">case</span> EM_GETSEL:</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="keyword">case</span> WM_COMMAND:</span><br><span class="line"> {</span><br><span class="line"> <span class="type">int</span> wmId = <span class="built_in">LOWORD</span>(wParam);</span><br><span class="line"> <span class="comment">// 分析菜单选择:</span></span><br><span class="line"> <span class="keyword">switch</span> (wmId)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> IDM_ABOUT:</span><br><span class="line"> <span class="built_in">DialogBox</span>(hInst, <span class="built_in">MAKEINTRESOURCE</span>(IDD_ABOUTBOX), hWnd, About);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> IDM_EXIT:</span><br><span class="line"> <span class="built_in">DestroyWindow</span>(hWnd);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_PAINT:</span><br><span class="line"> {</span><br><span class="line"> hDC = <span class="built_in">BeginPaint</span>(hWnd, &ps);</span><br><span class="line"></span><br><span class="line"> hEdit = <span class="built_in">CreateWindowEx</span>(</span><br><span class="line"> WS_EX_CLIENTEDGE,</span><br><span class="line"> <span class="string">"EDIT"</span>,</span><br><span class="line"> <span class="literal">NULL</span>,</span><br><span class="line"> WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_LEFT |</span><br><span class="line"> WS_VSCROLL | ES_AUTOVSCROLL | ES_AUTOHSCROLL,</span><br><span class="line"> <span class="number">0</span>, <span class="number">0</span>, <span class="number">1000</span>, <span class="number">1000</span>,</span><br><span class="line"> hWnd,</span><br><span class="line"> (HMENU)IDC_MAIN_EDIT,</span><br><span class="line"> <span class="built_in">GetModuleHandle</span>(<span class="literal">NULL</span>),</span><br><span class="line"> <span class="literal">NULL</span>);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">SetWindowText</span>(hEdit, buffer);</span><br><span class="line"> <span class="built_in">GetWindowText</span>(hEdit, buffer, <span class="number">512</span>);</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">strlen</span>(buffer) > <span class="number">256</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">MessageBox</span>(hWnd, <span class="string">"你的输入已经超过了最大存储!"</span>, <span class="string">"消息框实例"</span>, MB_OK);</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//DestroyWindow(hEdit);</span></span><br><span class="line"></span><br><span class="line"> <span class="built_in">EndPaint</span>(hWnd, &ps);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_DESTROY:</span><br><span class="line"> <span class="built_in">PostQuitMessage</span>(<span class="number">0</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</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><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><hr>]]></content>
<categories>
<category> C++桌面应用程序 </category>
</categories>
<tags>
<tag> C++ </tag>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> 桌面应用程序 </tag>
<tag> Visual Studio </tag>
</tags>
</entry>
<entry>
<title>VS C++桌面应用程序 - 图形文字显示</title>
<link href="/2023/05/14/0002-01/"/>
<url>/2023/05/14/0002-01/</url>
<content type="html"><![CDATA[<h1 id="C-桌面应用程序实验1"><a href="#C-桌面应用程序实验1" class="headerlink" title="C++桌面应用程序实验1"></a>C++桌面应用程序实验1</h1><mark class="hl-label green">题目</mark> <div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">第一题</button></li><li class="tab"><button type="button" data-href="#-2">第二题</button></li><li class="tab"><button type="button" data-href="#-3">第三题</button></li><li class="tab"><button type="button" data-href="#-4">第四题</button></li><li class="tab"><button type="button" data-href="#-5">第五题</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(一) 编写一个简单的画图程序,要求如下: </span><br><span class="line"></span><br><span class="line">(1) 在例题2.1程序(可以用vc自动生成程序)的基础上,增加画图功能; </span><br><span class="line"></span><br><span class="line">(2) 在窗口函数中处理鼠标左键单击消息。在该消息处理中,绘制一条直线段,要求线段为实线,</span><br><span class="line"> 宽度为 2 个像素,颜色为淡蓝色(132, 129, 255)。线段端点为(0, 0)和(100, 100)。</span><br><span class="line"> (注意,首先需要获取到设备环境,然后再进行绘制) </span><br><span class="line"></span><br><span class="line">(3) 认真调试,让程序顺利运行,并且结果正确。 </span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(二) 程序二:刷新处理。要求如下: </span><br><span class="line"></span><br><span class="line">(1) 在程序(一)的基础上,完善该程序; </span><br><span class="line"></span><br><span class="line">(2) 大家调整一下窗口大小,是不是发现直线段没了。这是因为,窗口需要刷新。当需要刷新时,</span><br><span class="line"> 操作系统会向窗口发送 WM_PAINT 消息,我们需要在 WM_PAINT 消息中,对刷新请求进行处理。</span><br><span class="line"></span><br><span class="line">(3) 怎么处理呢?我们可采用最直接的方法:在 WM_PAINT 消息中,再把直线段绘制一遍(注意,</span><br><span class="line"> 在绘制前,也需要先获取到设备环境)。这样,当窗口需要刷新时,该直线段就会重新绘制一遍。</span><br><span class="line"></span><br><span class="line">(4) 认真调试,让程序顺利运行,并且结果正确。(再调整一下窗口,结果正确吗?) </span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-3"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(三) 程序三:刷新进阶。要求如下: </span><br><span class="line"></span><br><span class="line">(1) 在上述程序的基础上,改进该程序; </span><br><span class="line"></span><br><span class="line">(2) 定义一个 BOOL 型全局变量 bStatus,初如化其值为 TRUE; </span><br><span class="line"></span><br><span class="line">(3) 在 WM_PAINT 消息处理中,当 bStatus 为 TRUE 时,绘制一个矩形,其左上角在(10, 10)处,</span><br><span class="line"> 右下角在(150, 100)处。要求矩形框为虚线,线宽为 1,矩形边框颜色为黑色,</span><br><span class="line"> 内部填充色为(100, 167, 201)。当 bStatus 为 FALSE 时,绘制一条直线段,要求线段为实线,</span><br><span class="line"> 宽度为 2 个像素,颜色为淡蓝色(132, 129, 255)。线段端点为(0, 0)和(100, 100)。 </span><br><span class="line"></span><br><span class="line">(4) 在 WM_LBUTTONDWON 消息处理中,反转 bStatus 的值,即 bStatus = !bStatus</span><br><span class="line"> (真变假,假变真)。写完后,运行程序。大家有没发现,窗口中的绘制内容并不会随 bStatus 的值</span><br><span class="line"> 而更新,我们必需调整窗口大小,窗口中的内容才会更新。即只有请求刷新时,窗口才会刷新重绘。 </span><br><span class="line"></span><br><span class="line">(5) 那有没有无需调整窗口大小请求刷新的方法呢?有的,可通过函数InvalidateRect(),</span><br><span class="line"> 大家在 WM_LBUTTONDOWN 消息处理中调用该函数。发现没,现在无需调整窗口大小,</span><br><span class="line"> 窗口内容就自动刷新了。函数原型如下: </span><br><span class="line"> BOOL InvalidateRect( </span><br><span class="line"> HWND hWnd, // 窗口句柄 </span><br><span class="line"> CONST RECT* lpRect, // 矩形区域 </span><br><span class="line"> BOOL bErase //是否擦除背景 </span><br><span class="line"> ); </span><br><span class="line"> 该函数会放一个 WM_PAINT 消息到消息队列中,因此相当于让窗口变脏重绘。可以这样调用该函数:</span><br><span class="line"> InvalidateRect(hWnd, NULL, TRUE);关于该函数的具体说明,大家可以去百度。</span><br><span class="line"></span><br><span class="line">(6) 认真调试,让程序顺利运行,并且结果正确。 </span><br><span class="line"></span><br><span class="line">(7) 总结:绘制代码可以放在 WM_PAINT 消息处理中,用于处理刷新。</span><br><span class="line"> 而当代码中需要重绘时,可以通过 InvalidateRect()发送一个 WM_PAINT 消息。 </span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-4"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(四) 做一个窗口,窗口用户区每隔1s颜色变化一次(红->白->黑->蓝)</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-5"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(五) 在窗口用户区滚动显示文字“浙江工商大学欢迎你”(效果如“动态文字”程序运行结果)</span><br><span class="line"> 要求文字背景为红色,文字为白色。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><mark class="hl-label green">代码</mark> <div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">第一题</button></li><li class="tab"><button type="button" data-href="#-2">第二题</button></li><li class="tab"><button type="button" data-href="#-3">第三题</button></li><li class="tab"><button type="button" data-href="#-4">第四题</button></li><li class="tab"><button type="button" data-href="#-5">第五题</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"> <span class="function">LRESULT CALLBACK <span class="title">WndProc</span><span class="params">(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">switch</span> (message)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> WM_COMMAND:</span><br><span class="line"> {</span><br><span class="line"> <span class="type">int</span> wmId = <span class="built_in">LOWORD</span>(wParam);</span><br><span class="line"> <span class="comment">// 分析菜单选择:</span></span><br><span class="line"> <span class="keyword">switch</span> (wmId)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> IDM_ABOUT:</span><br><span class="line"> <span class="built_in">DialogBox</span>(hInst, <span class="built_in">MAKEINTRESOURCE</span>(IDD_ABOUTBOX), hWnd, About);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> IDM_EXIT:</span><br><span class="line"> <span class="built_in">DestroyWindow</span>(hWnd);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_PAINT:</span><br><span class="line"> {</span><br><span class="line"> PAINTSTRUCT ps;</span><br><span class="line"> HDC hdc = <span class="built_in">BeginPaint</span>(hWnd, &ps);</span><br><span class="line"> <span class="comment">// <span class="doctag">TODO:</span> 在此处添加使用 hdc 的任何绘图代码...</span></span><br><span class="line"> <span class="built_in">EndPaint</span>(hWnd, &ps);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_LBUTTONDOWN:</span><br><span class="line"> {</span><br><span class="line"> HDC hdc = <span class="built_in">GetDC</span>(hWnd);</span><br><span class="line"> HPEN hPen = <span class="built_in">CreatePen</span>(PS_SOLID, <span class="number">2</span>, <span class="built_in">RGB</span>(<span class="number">132</span>, <span class="number">129</span>, <span class="number">255</span>));</span><br><span class="line"> HGDIOBJ hPenOld = <span class="built_in">SelectObject</span>(hdc, hPen);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">MoveToEx</span>(hdc, <span class="number">0</span>, <span class="number">0</span>, <span class="literal">NULL</span>);</span><br><span class="line"> <span class="built_in">LineTo</span>(hdc, <span class="number">100</span>, <span class="number">100</span>);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">SelectObject</span>(hdc, hPenOld);</span><br><span class="line"> <span class="built_in">DeleteObject</span>(hPen);</span><br><span class="line"> <span class="built_in">ReleaseDC</span>(hWnd, hdc);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_DESTROY:</span><br><span class="line"> <span class="built_in">PostQuitMessage</span>(<span class="number">0</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</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><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line">BOOL flag = FALSE;</span><br><span class="line"></span><br><span class="line"><span class="function">LRESULT CALLBACK <span class="title">WndProc</span><span class="params">(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">switch</span> (message)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> WM_COMMAND:</span><br><span class="line"> {</span><br><span class="line"> <span class="type">int</span> wmId = <span class="built_in">LOWORD</span>(wParam);</span><br><span class="line"> <span class="comment">// 分析菜单选择:</span></span><br><span class="line"> <span class="keyword">switch</span> (wmId)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> IDM_ABOUT:</span><br><span class="line"> <span class="built_in">DialogBox</span>(hInst, <span class="built_in">MAKEINTRESOURCE</span>(IDD_ABOUTBOX), hWnd, About);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> IDM_EXIT:</span><br><span class="line"> <span class="built_in">DestroyWindow</span>(hWnd);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_PAINT:</span><br><span class="line"> {</span><br><span class="line"> PAINTSTRUCT ps;</span><br><span class="line"> HDC hdc = <span class="built_in">BeginPaint</span>(hWnd, &ps);</span><br><span class="line"> <span class="comment">// <span class="doctag">TODO:</span> 在此处添加使用 hdc 的任何绘图代码...</span></span><br><span class="line"></span><br><span class="line"> HPEN hP = <span class="built_in">CreatePen</span>(PS_SOLID, <span class="number">1</span>, <span class="built_in">RGB</span>(<span class="number">132</span>, <span class="number">129</span>, <span class="number">255</span>));</span><br><span class="line"> HGDIOBJ hPenOld = <span class="built_in">SelectObject</span>(hdc, hP);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (flag) {</span><br><span class="line"> <span class="built_in">MoveToEx</span>(hdc, <span class="number">0</span>, <span class="number">0</span>, <span class="literal">NULL</span>);</span><br><span class="line"> <span class="built_in">LineTo</span>(hdc, <span class="number">100</span>, <span class="number">100</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="built_in">SelectObject</span>(hdc, hPenOld);</span><br><span class="line"> <span class="built_in">DeleteObject</span>(hP);</span><br><span class="line"> <span class="built_in">EndPaint</span>(hWnd, &ps);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_LBUTTONDOWN:</span><br><span class="line"> {</span><br><span class="line"> flag = TRUE;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, TRUE);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_DESTROY:</span><br><span class="line"> <span class="built_in">PostQuitMessage</span>(<span class="number">0</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</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><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-3"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line">BOOL bStatus = TRUE;</span><br><span class="line"></span><br><span class="line"><span class="function">LRESULT CALLBACK <span class="title">WndProc</span><span class="params">(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">switch</span> (message)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> WM_COMMAND:</span><br><span class="line"> {</span><br><span class="line"> <span class="type">int</span> wmId = <span class="built_in">LOWORD</span>(wParam);</span><br><span class="line"> <span class="comment">// 分析菜单选择:</span></span><br><span class="line"> <span class="keyword">switch</span> (wmId)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> IDM_ABOUT:</span><br><span class="line"> <span class="built_in">DialogBox</span>(hInst, <span class="built_in">MAKEINTRESOURCE</span>(IDD_ABOUTBOX), hWnd, About);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> IDM_EXIT:</span><br><span class="line"> <span class="built_in">DestroyWindow</span>(hWnd);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_PAINT:</span><br><span class="line"> {</span><br><span class="line"> PAINTSTRUCT ps;</span><br><span class="line"> HDC hdc = <span class="built_in">BeginPaint</span>(hWnd, &ps);</span><br><span class="line"> <span class="comment">// <span class="doctag">TODO:</span> 在此处添加使用 hdc 的任何绘图代码...</span></span><br><span class="line"></span><br><span class="line"> HPEN hP1 = <span class="built_in">CreatePen</span>(PS_SOLID, <span class="number">1</span>, <span class="built_in">RGB</span>(<span class="number">132</span>, <span class="number">129</span>, <span class="number">255</span>));</span><br><span class="line"> HPEN hP2 = <span class="built_in">CreatePen</span>(PS_DASH, <span class="number">0</span>, <span class="built_in">RGB</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>));</span><br><span class="line"> HGDIOBJ hPenOld = <span class="built_in">SelectObject</span>(hdc, hP1);</span><br><span class="line"></span><br><span class="line"> HBRUSH hBr1 = <span class="built_in">CreateSolidBrush</span>(<span class="built_in">RGB</span>(<span class="number">100</span>, <span class="number">167</span>, <span class="number">201</span>));</span><br><span class="line"> HGDIOBJ hBrOld = <span class="built_in">SelectObject</span>(hdc, hBr1);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (bStatus) {</span><br><span class="line"> hPenOld = <span class="built_in">SelectObject</span>(hdc, hP2);</span><br><span class="line"> hBrOld = <span class="built_in">SelectObject</span>(hdc, hBr1);</span><br><span class="line"> <span class="built_in">Rectangle</span>(hdc, <span class="number">10</span>, <span class="number">10</span>, <span class="number">150</span>, <span class="number">100</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> {</span><br><span class="line"> hPenOld = <span class="built_in">SelectObject</span>(hdc, hP1);</span><br><span class="line"> <span class="built_in">MoveToEx</span>(hdc, <span class="number">0</span>, <span class="number">0</span>, <span class="literal">NULL</span>);</span><br><span class="line"> <span class="built_in">LineTo</span>(hdc, <span class="number">100</span>, <span class="number">100</span>); </span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">SelectObject</span>(hdc, hPenOld);</span><br><span class="line"> <span class="built_in">DeleteObject</span>(hP1);</span><br><span class="line"> <span class="built_in">DeleteObject</span>(hP2);</span><br><span class="line"> <span class="built_in">SelectObject</span>(hdc, hBrOld);</span><br><span class="line"> <span class="built_in">DeleteObject</span>(hBr1);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">EndPaint</span>(hWnd, &ps);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_LBUTTONDOWN:</span><br><span class="line"> {</span><br><span class="line"> HDC hdc = <span class="built_in">GetDC</span>(hWnd);</span><br><span class="line"> bStatus = !bStatus;</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, TRUE);</span><br><span class="line"> <span class="built_in">ReleaseDC</span>(hWnd, hdc);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_DESTROY:</span><br><span class="line"> <span class="built_in">PostQuitMessage</span>(<span class="number">0</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</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><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-4"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="type">const</span> <span class="type">int</span> TIMER_ID = <span class="number">1</span>;</span><br><span class="line"><span class="type">int</span> Index = <span class="number">0</span>;</span><br><span class="line">COLORREF colors[] = { <span class="built_in">RGB</span>(<span class="number">255</span>, <span class="number">0</span>, <span class="number">0</span>), <span class="built_in">RGB</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>), <span class="built_in">RGB</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>), <span class="built_in">RGB</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">255</span>) };</span><br><span class="line"></span><br><span class="line"><span class="function">LRESULT CALLBACK <span class="title">WndProc</span><span class="params">(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">switch</span> (message)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> WM_CREATE:</span><br><span class="line"> <span class="built_in">SetTimer</span>(hWnd, TIMER_ID, <span class="number">1000</span>, <span class="literal">NULL</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_TIMER:</span><br><span class="line"> Index = (Index + <span class="number">1</span>) % <span class="number">4</span>;</span><br><span class="line"> <span class="built_in">SetClassLongPtr</span>(hWnd, GCLP_HBRBACKGROUND, </span><br><span class="line"> (LONG)<span class="built_in">CreateSolidBrush</span>(colors[Index]));</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, TRUE);</span><br><span class="line"> <span class="keyword">case</span> WM_COMMAND:</span><br><span class="line"> {</span><br><span class="line"> <span class="type">int</span> wmId = <span class="built_in">LOWORD</span>(wParam);</span><br><span class="line"> <span class="comment">// 分析菜单选择:</span></span><br><span class="line"> <span class="keyword">switch</span> (wmId)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> IDM_ABOUT:</span><br><span class="line"> <span class="built_in">DialogBox</span>(hInst, <span class="built_in">MAKEINTRESOURCE</span>(IDD_ABOUTBOX), hWnd, About);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> IDM_EXIT:</span><br><span class="line"> <span class="built_in">DestroyWindow</span>(hWnd);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_PAINT:</span><br><span class="line"> {</span><br><span class="line"> PAINTSTRUCT ps;</span><br><span class="line"> HDC hdc = <span class="built_in">BeginPaint</span>(hWnd, &ps);</span><br><span class="line"> <span class="comment">// <span class="doctag">TODO:</span> 在此处添加使用 hdc 的任何绘图代码...</span></span><br><span class="line"> <span class="built_in">EndPaint</span>(hWnd, &ps);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_DESTROY:</span><br><span class="line"> <span class="built_in">PostQuitMessage</span>(<span class="number">0</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</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><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-5"><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="function">LRESULT CALLBACK <span class="title">WndProc</span><span class="params">(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">switch</span> (message)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> WM_COMMAND:</span><br><span class="line"> {</span><br><span class="line"> <span class="type">int</span> wmId = <span class="built_in">LOWORD</span>(wParam);</span><br><span class="line"> <span class="comment">// 分析菜单选择:</span></span><br><span class="line"> <span class="keyword">switch</span> (wmId)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> IDM_ABOUT:</span><br><span class="line"> <span class="built_in">DialogBox</span>(hInst, <span class="built_in">MAKEINTRESOURCE</span>(IDD_ABOUTBOX), hWnd, About);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> IDM_EXIT:</span><br><span class="line"> <span class="built_in">DestroyWindow</span>(hWnd);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_PAINT:</span><br><span class="line"> {</span><br><span class="line"> PAINTSTRUCT ps;</span><br><span class="line"> HDC hdc = <span class="built_in">BeginPaint</span>(hWnd, &ps);</span><br><span class="line"> <span class="comment">// <span class="doctag">TODO:</span> 在此处添加使用 hdc 的任何绘图代码...</span></span><br><span class="line"></span><br><span class="line"> HBRUSH hBr = <span class="built_in">CreateSolidBrush</span>(<span class="built_in">RGB</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>));</span><br><span class="line"> HGDIOBJ hBrOld = <span class="built_in">SelectObject</span>(hdc, hBr);</span><br><span class="line"> HFONT hFont = <span class="built_in">CreateFont</span>(<span class="number">50</span>, <span class="number">30</span>, <span class="number">0</span>, <span class="number">0</span>, FW_NORMAL, FALSE, FALSE,</span><br><span class="line"> FALSE, DEFAULT_CHARSET,</span><br><span class="line"> OUT_DEFAULT_PRECIS,</span><br><span class="line"> CLIP_DEFAULT_PRECIS,</span><br><span class="line"> DEFAULT_QUALITY,</span><br><span class="line"> DEFAULT_PITCH | FF_SWISS,</span><br><span class="line"> <span class="string">"Arial"</span>); <span class="comment">// 创建一个新的字体对象</span></span><br><span class="line"> HFONT hOldFont = (HFONT)<span class="built_in">SelectObject</span>(hdc, hFont);</span><br><span class="line"></span><br><span class="line"> <span class="type">const</span> CHAR* textbuf[] =</span><br><span class="line"> { <span class="string">"浙江工商大学欢迎你 "</span> ,</span><br><span class="line"> <span class="string">"江工商大学欢迎你 "</span>,</span><br><span class="line"> <span class="string">"工商大学欢迎你 "</span>,</span><br><span class="line"> <span class="string">"商大学欢迎你 "</span>,</span><br><span class="line"> <span class="string">"大学欢迎你 "</span>,</span><br><span class="line"> <span class="string">"学欢迎你 "</span>,</span><br><span class="line"> <span class="string">"欢迎你 "</span>,</span><br><span class="line"> <span class="string">"迎你 "</span>,</span><br><span class="line"> <span class="string">"你 "</span></span><br><span class="line"> };</span><br><span class="line"> <span class="built_in">SetBkColor</span>(hdc, <span class="built_in">RGB</span>(<span class="number">255</span>, <span class="number">0</span>, <span class="number">0</span>));</span><br><span class="line"> <span class="built_in">SetTextColor</span>(hdc, <span class="built_in">RGB</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>));</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> x = <span class="number">0</span>; x < <span class="number">9</span>; x++) {</span><br><span class="line"> <span class="built_in">TextOut</span>(hdc, <span class="number">0</span>, <span class="number">0</span>, textbuf[x], <span class="built_in">lstrlen</span>(textbuf[x]));</span><br><span class="line"> <span class="built_in">Sleep</span>(<span class="number">1000</span>);</span><br><span class="line"> <span class="built_in">InvalidateRect</span>(hWnd, <span class="literal">NULL</span>, TRUE);</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">Sleep</span>(<span class="number">1000</span>);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">SelectObject</span>(hdc, hOldFont); <span class="comment">// 恢复原来的字体</span></span><br><span class="line"> <span class="built_in">DeleteObject</span>(hFont); <span class="comment">// 删除新创建的字体对象</span></span><br><span class="line"> <span class="built_in">SelectObject</span>(hdc, hBrOld);</span><br><span class="line"> <span class="built_in">DeleteObject</span>(hBr);</span><br><span class="line"> <span class="built_in">EndPaint</span>(hWnd, &ps);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> WM_DESTROY:</span><br><span class="line"> <span class="built_in">PostQuitMessage</span>(<span class="number">0</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">DefWindowProc</span>(hWnd, message, wParam, lParam);</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><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><hr>]]></content>
<categories>
<category> C++桌面应用程序 </category>
</categories>
<tags>
<tag> C++ </tag>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> 桌面应用程序 </tag>
<tag> Visual Studio </tag>
</tags>
</entry>
<entry>
<title>数字图像 - 形态学处理</title>
<link href="/2023/05/14/0004-04/"/>
<url>/2023/05/14/0004-04/</url>
<content type="html"><![CDATA[<mark class="hl-label green">图像下载链接</mark> <p><a href="https://coleduck.cn/annex/%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86/TestFigures.7z">data.zip</a></p><h2 id="4-A-基于区域的图像分割"><a href="#4-A-基于区域的图像分割" class="headerlink" title="4-A 基于区域的图像分割"></a>4-A 基于区域的图像分割</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目A</button></li><li class="tab"><button type="button" data-href="#-2">解答A</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">1. 打 开 TestFigures 目录中的 BirdFlying.png, 将其转换成灰度图像, 以cv2.adaptiveThreshold()对其进行自</span><br><span class="line">适应阈值化分割,该函数的用法参见如下(或阅读示例代码),理解各个参数的意义,且尝试不同的参数所得的结果。</span><br><span class="line"></span><br><span class="line">2. 打开 TestFigures 目录中的 BirdFlying.png,以 cv2.floodFill()对其进行漫水填充分割,该函数的用法参见如</span><br><span class="line">下(或阅读示例代码),理解各个参数的意义,且尝试不同的参数所得的结果。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> cv2</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt </span><br><span class="line"><span class="keyword">from</span> ipdb <span class="keyword">import</span> set_trace</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">flood_fill</span>(<span class="params">src</span>):</span><br><span class="line"> mask = np.zeros((src.shape[<span class="number">0</span>]+<span class="number">2</span>, src.shape[<span class="number">1</span>] +<span class="number">2</span>), dtype=np.uint8)</span><br><span class="line"></span><br><span class="line"> <span class="string">'''</span></span><br><span class="line"><span class="string"> 实现漫水填充: cv2.floodFill(im, mask, seed_point, new_val, low_diff, up_diff, flags)</span></span><br><span class="line"><span class="string"> im--8位或浮点输入图像; mask -- 单通道8位掩膜图像, 长宽需比输入图像大两个像素,算法不填充掩膜非零像素区域</span></span><br><span class="line"><span class="string"> seed_point -- 种子点; new_val -- 像素点填充后被染色的值</span></span><br><span class="line"><span class="string"> low_diff -- 待加入的像素与当前观察像素之间的颜色的最大负差值</span></span><br><span class="line"><span class="string"> up_diff -- 待加入的像素与当前观察像素之间的颜色的最大正差值</span></span><br><span class="line"><span class="string"> flags -- 操作标志符, 低八位用于控制算法的连通性,可取4(默认4连通)或者8,高8位建议 FLOODFILL_FIXED_RANGE, 此时考虑当前像素与种子像素之间的差,否则将考虑当前像素与其相邻像素的差</span></span><br><span class="line"><span class="string"> '''</span></span><br><span class="line"> newVal = (<span class="number">200</span>, <span class="number">0</span>, <span class="number">0</span>)</span><br><span class="line"> lowV = (<span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>)</span><br><span class="line"> upV = (<span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>)</span><br><span class="line"> seed = (<span class="number">650</span>, <span class="number">220</span>)</span><br><span class="line"> flags = <span class="number">4</span>|cv2.FLOODFILL_FIXED_RANGE</span><br><span class="line"> ret, bin_im, mask, rect = cv2.floodFill(src.copy(), mask, seed, newVal, lowV, upV, flags)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> bin_im</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">adapt_thresh</span>(<span class="params">src</span>):</span><br><span class="line"> gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)</span><br><span class="line"></span><br><span class="line"> <span class="string">'''</span></span><br><span class="line"><span class="string"> cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)</span></span><br><span class="line"><span class="string"> src -- 输入的灰度图像; maxValue -- 二值化后图像中的较大灰度值</span></span><br><span class="line"><span class="string"> adaptiveMethod -- 自适应阈值算法, 可选 ADAPTIVE_THRESH_MEAN_C 或 ADAPTIVE_THRESH_GAUSSIAN_C</span></span><br><span class="line"><span class="string"> thresholdType -- 二值化方法,只能选 THRESH_BINARY 或 THRESH_BINARY_INV, 其它如THRESH_TRUNC等似乎无法选</span></span><br><span class="line"><span class="string"> blockSize -- 区域大小,取奇数, 需多试几次; C -- 常数,每个区域计算出的阈值的基础上在减去这个常数作为这个区域的最终阈值</span></span><br><span class="line"><span class="string"> '''</span></span><br><span class="line"> bin_im = cv2.adaptiveThreshold(gray, <span class="number">255</span>, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, <span class="number">301</span>, <span class="number">5</span>) </span><br><span class="line"> </span><br><span class="line"> se = cv2.getStructuringElement(cv2.MORPH_RECT, (<span class="number">7</span>, <span class="number">7</span>), (-<span class="number">1</span>, -<span class="number">1</span>))</span><br><span class="line"> bin_im = cv2.morphologyEx(bin_im, cv2.MORPH_OPEN, se) <span class="comment"># 开运算去除噪声</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> bin_im</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>: </span><br><span class="line"> image = cv2.imread(<span class="string">'D:/Code/Python/Vscode/TestFigures/BirdFly.png'</span>) </span><br><span class="line"> </span><br><span class="line"> bin_adapt = adapt_thresh(image) <span class="comment"># 1</span></span><br><span class="line"> bin_flood = flood_fill(image) <span class="comment"># 2</span></span><br><span class="line"> </span><br><span class="line"> plt.subplot(<span class="number">131</span>), plt.title(<span class="string">'original'</span>)</span><br><span class="line"> plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))</span><br><span class="line"></span><br><span class="line"> plt.subplot(<span class="number">132</span>), plt.title(<span class="string">'adapt_thresh'</span>)</span><br><span class="line"> plt.imshow(bin_adapt, cmap=<span class="string">'gray'</span>)</span><br><span class="line"></span><br><span class="line"> plt.subplot(<span class="number">133</span>), plt.title(<span class="string">'flood_fill'</span>)</span><br><span class="line"> plt.imshow(cv2.cvtColor(bin_flood, cv2.COLOR_BGR2RGB))</span><br><span class="line"></span><br><span class="line"> plt.show()</span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="4-B-练习图像分离、截取、转换等函数的使用"><a href="#4-B-练习图像分离、截取、转换等函数的使用" class="headerlink" title="4-B 练习图像分离、截取、转换等函数的使用"></a>4-B 练习图像分离、截取、转换等函数的使用</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目B</button></li><li class="tab"><button type="button" data-href="#-2">解答B</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">1. 打开 linux.jpg(保存在 TestFigures 目录),使用 cvtColor()转换成灰度图像,使用 threshold()对图像作阈</span><br><span class="line">值化处理,以 erode()函数对图像作腐蚀运算,dilate()函数对图像作膨胀运算,分别显示结果。</span><br><span class="line"></span><br><span class="line">2. 打开 j_outnoise.png,使用 cvtColor()转换成灰度图像,使用 threshold()对图像作阈值化处理,使用 </span><br><span class="line">morphologyEx()对图像作开运算,观察开运算的结果。</span><br><span class="line"></span><br><span class="line">3. 打开 j_innoise.png,使用 cvtColor()转换成灰度图像,使用 threshold()对图像作阈值化处理,使用 </span><br><span class="line">morphologyEx()对图像作闭运算,观察闭运算的结果。函数用法请参见课件。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="string">'''</span></span><br><span class="line"><span class="string">二值形态学处理</span></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"><span class="keyword">import</span> cv2</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt </span><br><span class="line"><span class="keyword">from</span> ipdb <span class="keyword">import</span> set_trace</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">dilate_erode</span>(<span class="params">image</span>):</span><br><span class="line"> se = np.ones((<span class="number">3</span>, <span class="number">3</span>), dtype=np.uint8)</span><br><span class="line"></span><br><span class="line"> <span class="string">'''</span></span><br><span class="line"><span class="string"> ret_thr, dst = cv2.threshold(src, thr, maxVal, type)</span></span><br><span class="line"><span class="string"> src -- 灰度图像, thr -- 阈值, maxVal -- 大于阈值的像素给出的值, type -- 使用的算法类型, cv2.THRESH_BINARY, cv2.THRESH_BINARY_INV, ...</span></span><br><span class="line"><span class="string"> # 返回值 ret_thr--得到的阈值, dst -- 结果图像</span></span><br><span class="line"><span class="string"> '''</span></span><br><span class="line"> ret_thr, bin_im = cv2.threshold(image, <span class="number">160</span>, <span class="number">255</span>, cv2.THRESH_BINARY)</span><br><span class="line"></span><br><span class="line"> <span class="string">'''</span></span><br><span class="line"><span class="string"> dilate 操作, dst = cv2.dilate(src, se, iterations), opencv的膨胀操作, 每个通道独立处理, 可对单个通道执行多次递归操作</span></span><br><span class="line"><span class="string"> src -- 源图像, se -- 结构元素, iterations -- 操作次数</span></span><br><span class="line"><span class="string"> '''</span></span><br><span class="line"> dil_im = cv2.dilate(bin_im, se, iterations = <span class="number">1</span>)</span><br><span class="line"></span><br><span class="line"> <span class="string">'''</span></span><br><span class="line"><span class="string"> 腐蚀: dst = cv2.erode(src, kernel, iterations)</span></span><br><span class="line"><span class="string"> 参数基本同 dilate()</span></span><br><span class="line"><span class="string"> '''</span></span><br><span class="line"> ero_im = cv2.erode(dil_im, se, iterations = <span class="number">3</span>)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 显示比较</span></span><br><span class="line"> plt.subplot(<span class="number">1</span>, <span class="number">3</span>, <span class="number">1</span>); plt.title(<span class="string">'original'</span>)</span><br><span class="line"> plt.imshow(image, cmap=<span class="string">'gray'</span>)</span><br><span class="line"></span><br><span class="line"> plt.subplot(<span class="number">1</span>, <span class="number">3</span>, <span class="number">2</span>); plt.title(<span class="string">'dilated'</span>)</span><br><span class="line"> plt.imshow(dil_im, cmap=<span class="string">'gray'</span>)</span><br><span class="line"></span><br><span class="line"> plt.subplot(<span class="number">1</span>, <span class="number">3</span>, <span class="number">3</span>); plt.title(<span class="string">'eroded'</span>)</span><br><span class="line"> plt.imshow(ero_im, cmap=<span class="string">'gray'</span>)</span><br><span class="line"></span><br><span class="line"> plt.show()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">open_close</span>(<span class="params">im2open, im2close</span>):</span><br><span class="line"></span><br><span class="line"> <span class="comment"># cv2.getStructuringElement()--返回指定形状和尺寸的结构元素</span></span><br><span class="line"> se = cv2.getStructuringElement(cv2.MORPH_RECT, (<span class="number">7</span>, <span class="number">7</span>), (-<span class="number">1</span>, -<span class="number">1</span>))</span><br><span class="line"></span><br><span class="line"> <span class="string">'''</span></span><br><span class="line"><span class="string"> cv2.morphologyEx(src, op, kernel)</span></span><br><span class="line"><span class="string"> op -- cv2.MORPH_OPEN, 开运算; cv2.MORPH_CLOSE--闭运算</span></span><br><span class="line"><span class="string"> 开运算可消除外部噪音, 闭运算可消除内部噪声</span></span><br><span class="line"><span class="string"> kernel -- 结构元素</span></span><br><span class="line"><span class="string"> '''</span></span><br><span class="line"> ret_thr, bin_im = cv2.threshold(im2open, <span class="number">160</span>, <span class="number">255</span>, cv2.THRESH_BINARY)</span><br><span class="line"> bin_opened = cv2.morphologyEx(bin_im, cv2.MORPH_OPEN, se)</span><br><span class="line"></span><br><span class="line"> ret_thr, bin_im = cv2.threshold(im2close, <span class="number">160</span>, <span class="number">255</span>, cv2.THRESH_BINARY) </span><br><span class="line"> bin_closed = cv2.morphologyEx(bin_im, cv2.MORPH_CLOSE, se)</span><br><span class="line"> </span><br><span class="line"> plt.subplot(<span class="number">2</span>, <span class="number">2</span>, <span class="number">1</span>); plt.title(<span class="string">'to open'</span>)</span><br><span class="line"> plt.imshow(im2open, cmap=<span class="string">'gray'</span>)</span><br><span class="line"></span><br><span class="line"> plt.subplot(<span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>); plt.title(<span class="string">'to close'</span>)</span><br><span class="line"> plt.imshow(im2close, cmap=<span class="string">'gray'</span>)</span><br><span class="line"></span><br><span class="line"> plt.subplot(<span class="number">2</span>, <span class="number">2</span>, <span class="number">3</span>); plt.title(<span class="string">'opened'</span>)</span><br><span class="line"> plt.imshow(bin_opened, cmap=<span class="string">'gray'</span>)</span><br><span class="line"></span><br><span class="line"> plt.subplot(<span class="number">2</span>, <span class="number">2</span>, <span class="number">4</span>); plt.title(<span class="string">'closed'</span>)</span><br><span class="line"> plt.imshow(bin_closed, cmap=<span class="string">'gray'</span>)</span><br><span class="line"></span><br><span class="line"> plt.show()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>: </span><br><span class="line"></span><br><span class="line"> <span class="comment"># 1</span></span><br><span class="line"> image = cv2.imread(<span class="string">'D:/Code/Python/Vscode/TestFigures/linux.jpg'</span>, <span class="number">0</span>)</span><br><span class="line"> dilate_erode(image)</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 2 , 3</span></span><br><span class="line"> im2open = cv2.imread(<span class="string">'D:/Code/Python/Vscode/TestFigures/j_outnoise.png'</span>, <span class="number">0</span>)</span><br><span class="line"> im2close = cv2.imread(<span class="string">'D:/Code/Python/Vscode/TestFigures/j_innoise.png'</span>, <span class="number">0</span>)</span><br><span class="line"> open_close(im2open, im2close)</span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="4-C-图像颜色变换"><a href="#4-C-图像颜色变换" class="headerlink" title="4-C 图像颜色变换"></a>4-C 图像颜色变换</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目C</button></li><li class="tab"><button type="button" data-href="#-2">解答C</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">1. 打开 TestFigures 目录下的 j_pattern.png 文件,使用合适的形态学操作得到如下图的结果</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> cv2</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt </span><br><span class="line"><span class="keyword">from</span> ipdb <span class="keyword">import</span> set_trace</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">gradient_proc</span>(<span class="params">image</span>):</span><br><span class="line"> ret_thr, bin_im = cv2.threshold(image, <span class="number">160</span>, <span class="number">255</span>, cv2.THRESH_BINARY)</span><br><span class="line"> se = cv2.getStructuringElement(cv2.MORPH_RECT, (<span class="number">5</span>, <span class="number">5</span>), (-<span class="number">1</span>, -<span class="number">1</span>)) </span><br><span class="line"> <span class="string">'''</span></span><br><span class="line"><span class="string"> 梯度运算: cv2.morphologyEx(src, op, kernel)</span></span><br><span class="line"><span class="string"> op -- cv2.MORPH_GRADIENT, 梯度运算, 结果为: 梯度 = 膨胀(src) - 腐蚀(src)</span></span><br><span class="line"><span class="string"> '''</span></span><br><span class="line"> bin_grad = cv2.morphologyEx(bin_im, cv2.MORPH_GRADIENT, se)</span><br><span class="line"></span><br><span class="line"> plt.subplot(<span class="number">1</span>, <span class="number">2</span>, <span class="number">1</span>); plt.title(<span class="string">'open and close'</span>)</span><br><span class="line"> plt.imshow(image, cmap=<span class="string">'gray'</span>)</span><br><span class="line"> plt.subplot(<span class="number">1</span>, <span class="number">2</span>, <span class="number">2</span>); plt.title(<span class="string">'gradient'</span>)</span><br><span class="line"> plt.imshow(bin_grad, cmap=<span class="string">'gray'</span>)</span><br><span class="line"> plt.show()</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>: </span><br><span class="line"> </span><br><span class="line"> im = cv2.imread(<span class="string">'D:/Code/Python/Vscode/TestFigures/j_pattern.png'</span>, <span class="number">0</span>)</span><br><span class="line"> gradient_proc(im)</span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><hr>]]></content>
<categories>
<category> 数字图像处理 </category>
</categories>
<tags>
<tag> Python </tag>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> OpenCV </tag>
<tag> Visual Studio Code </tag>
<tag> 数字图像处理 </tag>
</tags>
</entry>
<entry>
<title>数字图像 - 图像图形检测</title>
<link href="/2023/05/14/0004-03/"/>
<url>/2023/05/14/0004-03/</url>
<content type="html"><![CDATA[<h2 id="3-A-变换域图像处理"><a href="#3-A-变换域图像处理" class="headerlink" title="3-A 变换域图像处理"></a>3-A 变换域图像处理</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目A</button></li><li class="tab"><button type="button" data-href="#-2">解答A</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">仔细阅读 code_demo\傅里叶变换\目录下的代码 dft_demo.py,编写程序实现:</span><br><span class="line"></span><br><span class="line">1. 打开 Lenna.jpg,取绿色分量图像左上角为(100,100),大小为 64*64 的一个正方形区域,作傅立变</span><br><span class="line">换,且计算频谱,屏幕打印输出0 <= u, v <= 10范围内的频谱值。傅立叶变换和频谱计算的参考函数下:</span><br><span class="line"></span><br><span class="line">2. 打开 Lenna.jpg,取绿色分量图像作二维 DFT 变换,将频率坐标的原点移到图像中心位置,按如下形</span><br><span class="line">式设置一个 mask,作低通滤波,观察截止范围为 16、32、48 等对逆变换图像的影响。部分参考代码如下</span><br><span class="line"></span><br><span class="line">3. 打开 Lenna.jpg,取绿色分量图像左上角为(100,100),大小为 8*8 的一个正方形区域,作傅立叶变</span><br><span class="line">换,且计算频谱,根据频谱的中心对称特征,找出分别与位置(2,3),(3,2),(3,5)频谱相等的坐标位置。</span><br><span class="line"></span><br><span class="line">4. 编写代码由 Lenna 局部图像(LennaFace.png)的相位谱与 Flower 局部图像(Flower_1x1.png)的</span><br><span class="line">幅度谱混合产生合成图像(结果可参见如下的合成图像)。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> cv2</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">from</span> matplotlib <span class="keyword">import</span> pyplot <span class="keyword">as</span> plt</span><br><span class="line"></span><br><span class="line"><span class="comment"># 第 1 题</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># img = cv2.imread('D:/FilesCenter/Miku/picture/92.jpg')</span></span><br><span class="line">img = cv2.imread(<span class="string">'D:/FilesCenter/Miku/image/lenna.jpg'</span>)</span><br><span class="line">img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)</span><br><span class="line">green_channel = img[:,:,<span class="number">1</span>]</span><br><span class="line"></span><br><span class="line">cropped_image = green_channel[<span class="number">100</span>:<span class="number">164</span>, <span class="number">100</span>:<span class="number">164</span>]</span><br><span class="line">f = np.fft.fft2(cropped_image)</span><br><span class="line">fshift = np.fft.fftshift(f)</span><br><span class="line">magnitude_spectrum = <span class="number">20</span>*np.log(np.<span class="built_in">abs</span>(fshift))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">10</span>):</span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">10</span>):</span><br><span class="line"> <span class="built_in">print</span>(magnitude_spectrum[i, j], end = <span class="string">' '</span>)</span><br><span class="line"> <span class="built_in">print</span>()</span><br><span class="line"><span class="built_in">print</span>()</span><br><span class="line"></span><br><span class="line">plt.subplot(<span class="number">131</span>), plt.title(<span class="string">'original image'</span>)</span><br><span class="line">plt.imshow(img, cmap=<span class="string">'gray'</span>)</span><br><span class="line">plt.subplot(<span class="number">132</span>), plt.title(<span class="string">'G[100:164, 100:164]'</span>) </span><br><span class="line">plt.imshow(cropped_image, cmap=<span class="string">'gray'</span>)</span><br><span class="line">plt.subplot(<span class="number">133</span>), plt.title(<span class="string">'with fft shift'</span>) </span><br><span class="line">plt.imshow(magnitude_spectrum, cmap=<span class="string">'gray'</span>)</span><br><span class="line">plt.show()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 第 2 题</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">f = np.fft.fft2(green_channel)</span><br><span class="line">fshift = np.fft.fftshift(f)</span><br><span class="line"></span><br><span class="line">rows, cols = green_channel.shape</span><br><span class="line">crow, ccol = rows//<span class="number">2</span> , cols//<span class="number">2</span></span><br><span class="line"></span><br><span class="line">mask1 = np.zeros((rows,cols),np.uint8)</span><br><span class="line">mask1[crow-<span class="number">16</span>:crow+<span class="number">16</span>, ccol-<span class="number">16</span>:ccol+<span class="number">16</span>] = <span class="number">1</span></span><br><span class="line">mask2 = np.zeros((rows,cols),np.uint8)</span><br><span class="line">mask2[crow-<span class="number">32</span>:crow+<span class="number">32</span>, ccol-<span class="number">32</span>:ccol+<span class="number">32</span>] = <span class="number">1</span></span><br><span class="line">mask3 = np.zeros((rows,cols),np.uint8)</span><br><span class="line">mask3[crow-<span class="number">48</span>:crow+<span class="number">48</span>, ccol-<span class="number">48</span>:ccol+<span class="number">48</span>] = <span class="number">1</span></span><br><span class="line"></span><br><span class="line">fshift1 = fshift*mask1</span><br><span class="line">fshift2 = fshift*mask2</span><br><span class="line">fshift3 = fshift*mask3</span><br><span class="line"></span><br><span class="line">f_ishift1 = np.fft.ifftshift(fshift1)</span><br><span class="line">img_back1 = np.fft.ifft2(f_ishift1)</span><br><span class="line">img_back1 = np.<span class="built_in">abs</span>(img_back1)</span><br><span class="line">f_ishift2 = np.fft.ifftshift(fshift2)</span><br><span class="line">img_back2 = np.fft.ifft2(f_ishift2)</span><br><span class="line">img_back2 = np.<span class="built_in">abs</span>(img_back2)</span><br><span class="line">f_ishift3 = np.fft.ifftshift(fshift3)</span><br><span class="line">img_back3 = np.fft.ifft2(f_ishift3)</span><br><span class="line">img_back3 = np.<span class="built_in">abs</span>(img_back3)</span><br><span class="line"></span><br><span class="line">plt.subplot(<span class="number">221</span>), plt.title(<span class="string">'original image'</span>), plt.imshow(img, cmap=<span class="string">'gray'</span>)</span><br><span class="line">plt.subplot(<span class="number">222</span>), plt.title(<span class="string">'16'</span>), plt.imshow(img_back1, cmap=<span class="string">'gray'</span>)</span><br><span class="line">plt.subplot(<span class="number">223</span>), plt.title(<span class="string">'32'</span>), plt.imshow(img_back2, cmap=<span class="string">'gray'</span>)</span><br><span class="line">plt.subplot(<span class="number">224</span>), plt.title(<span class="string">'48'</span>), plt.imshow(img_back3, cmap=<span class="string">'gray'</span>)</span><br><span class="line">plt.show()</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="comment"># 第 3 题</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 取左上角为(100,100),大小为 8*8 的一个正方形区域</span></span><br><span class="line">roi = green_channel[<span class="number">100</span>:<span class="number">108</span>, <span class="number">100</span>:<span class="number">108</span>]</span><br><span class="line"></span><br><span class="line"><span class="comment"># 傅立叶变换</span></span><br><span class="line">f = np.fft.fft2(roi)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 计算频谱</span></span><br><span class="line">f_abs = np.<span class="built_in">abs</span>(f)</span><br><span class="line">f_abs_shifted = np.fft.fftshift(f_abs)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 根据频谱的中心对称特征,找出分别与位置 (2,3),(3,2),(3,5) 频谱相等的坐标位置</span></span><br><span class="line">rows, cols = f_abs_shifted.shape</span><br><span class="line"></span><br><span class="line">pos_1 = (rows - <span class="number">2</span>, cols - <span class="number">3</span>)</span><br><span class="line">pos_2 = (rows - <span class="number">3</span>, cols - <span class="number">2</span>)</span><br><span class="line">pos_3 = (rows - <span class="number">3</span>, cols - <span class="number">5</span>)</span><br><span class="line"></span><br><span class="line">value_1 = f_abs_shifted[pos_1[<span class="number">0</span>], pos_1[<span class="number">1</span>]]</span><br><span class="line">value_2 = f_abs_shifted[pos_2[<span class="number">0</span>], pos_2[<span class="number">1</span>]]</span><br><span class="line">value_3 = f_abs_shifted[pos_3[<span class="number">0</span>], pos_3[<span class="number">1</span>]]</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">'位置 ({}, {}) 频谱值为 {}'</span>.<span class="built_in">format</span>(pos_1[<span class="number">0</span>], pos_1[<span class="number">1</span>], value_1))</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'位置 ({}, {}) 频谱值为 {}'</span>.<span class="built_in">format</span>(pos_2[<span class="number">0</span>], pos_2[<span class="number">1</span>], value_2))</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'位置 ({}, {}) 频谱值为 {}'</span>.<span class="built_in">format</span>(pos_3[<span class="number">0</span>], pos_3[<span class="number">1</span>], value_3))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 第 4 题</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">dft_merge</span>(<span class="params">im_A, im_B</span>):</span><br><span class="line"> <span class="string">'''</span></span><br><span class="line"><span class="string"> 输入图像A和B,产生一幅新的图像,以B的幅度谱作为新图像的幅度谱,A图像的相位谱作为新图像的相位谱</span></span><br><span class="line"><span class="string"> '''</span></span><br><span class="line"> dft_A = cv2.dft(np.float32(im_A), flags=cv2.DFT_COMPLEX_OUTPUT)</span><br><span class="line"> dft_B = cv2.dft(np.float32(im_B), flags=cv2.DFT_COMPLEX_OUTPUT)</span><br><span class="line"></span><br><span class="line"> dft_mag_A = cv2.magnitude(dft_A[:,:,<span class="number">0</span>], dft_A[:,:,<span class="number">1</span>])</span><br><span class="line"> dft_mag_B = cv2.magnitude(dft_B[:,:,<span class="number">0</span>], dft_B[:,:,<span class="number">1</span>])</span><br><span class="line"></span><br><span class="line"> dft_X = dft_A</span><br><span class="line"></span><br><span class="line"> rows, cols = im_A.shape</span><br><span class="line"></span><br><span class="line"> <span class="string">'''</span></span><br><span class="line"><span class="string"> 注意: 由三角关系, i = m_b*sin(\alpha_a), r = m_b*cos(\alpha_a)</span></span><br><span class="line"><span class="string"> sin(\alpha_a) = i_a/m_a, cos(\alpha_a) = r_a/m_a</span></span><br><span class="line"><span class="string"> '''</span></span><br><span class="line"> <span class="keyword">for</span> y <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>, rows):</span><br><span class="line"> <span class="keyword">for</span> x <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>, cols):</span><br><span class="line"> dft_X[y, x, <span class="number">0</span>] = dft_mag_B[y,x]*dft_A[y,x,<span class="number">0</span>]/(dft_mag_A[y,x]+<span class="number">0.005</span>)</span><br><span class="line"> dft_X[y, x, <span class="number">1</span>] = dft_mag_B[y,x]*dft_A[y,x,<span class="number">1</span>]/(dft_mag_A[y,x]+<span class="number">0.005</span>) </span><br><span class="line"> </span><br><span class="line"> im_i = cv2.idft(dft_X)</span><br><span class="line"> img_X = cv2.magnitude(im_i[:,:,<span class="number">0</span>], im_i[:,:,<span class="number">1</span>])</span><br><span class="line"> plt.subplot(<span class="number">131</span>), plt.title(<span class="string">'A image'</span>)</span><br><span class="line"> plt.imshow(im_A, cmap=<span class="string">'gray'</span>)</span><br><span class="line"> plt.subplot(<span class="number">132</span>), plt.title(<span class="string">'B image'</span>)</span><br><span class="line"> plt.imshow(im_B, cmap=<span class="string">'gray'</span>)</span><br><span class="line"> plt.subplot(<span class="number">133</span>), plt.title(<span class="string">'merged'</span>)</span><br><span class="line"> plt.imshow(img_X, cmap=<span class="string">'gray'</span>)</span><br><span class="line"> plt.show()</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">lenna = cv2.imread(<span class="string">'D:/FilesCenter/Miku/image/LennaFace.png'</span>, <span class="number">0</span>)</span><br><span class="line">flower = cv2.imread(<span class="string">'D:/FilesCenter/Miku/image/Flower_1x1.png'</span>, <span class="number">0</span>)</span><br><span class="line">dft_merge(lenna, flower)</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="3-B-边缘检测"><a href="#3-B-边缘检测" class="headerlink" title="3-B 边缘检测"></a>3-B 边缘检测</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目B</button></li><li class="tab"><button type="button" data-href="#-2">解答B</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">仔细阅读 code_demo\图像分割_边缘角点\目录下的代码 edge_demo.py,编写程序实现:</span><br><span class="line"></span><br><span class="line">1. 打开 Flower.png,用 cv2.cvtColor()将其转换成灰度图像,以 Canny()函数对图像提取边缘,显</span><br><span class="line">示边缘图像。结合 PPT 内容,理解各个参数的意义。</span><br><span class="line">2. 在 1 的基础上,以 Canny()函数返回的结果图像为输入,进一步使用 findContours()函数寻找图像</span><br><span class="line">中的轮廓,且以 drawContours()绘制轮廓。上述两个函数的用法也可参见 </span><br><span class="line">https://docs.opencv.org/4.x/d4/d73/tutorial_py_contours_begin.html</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> cv2</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">from</span> matplotlib <span class="keyword">import</span> pyplot <span class="keyword">as</span> plt</span><br><span class="line"></span><br><span class="line"><span class="comment"># 第 1 题</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># img = cv2.imread('D:/FilesCenter/Miku/image/b.jpg')</span></span><br><span class="line">img = cv2.imread(<span class="string">'D:/FilesCenter/Miku/image/Flower.png'</span>)</span><br><span class="line"></span><br><span class="line">gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 提取边缘</span></span><br><span class="line">edges = cv2.Canny(gray, <span class="number">100</span>, <span class="number">200</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 显示边缘图像</span></span><br><span class="line">cv2.imshow(<span class="string">'Edges'</span>, edges)</span><br><span class="line">cv2.waitKey(<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 class="comment"># 第 2 题</span></span><br><span class="line"></span><br><span class="line">contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)</span><br><span class="line">cv2.drawContours(img, contours, -<span class="number">1</span>, (<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>), <span class="number">3</span>)</span><br><span class="line">cv2.imshow(<span class="string">'Image'</span>, img)</span><br><span class="line">cv2.waitKey(<span class="number">0</span>)</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="3-C-直线检测"><a href="#3-C-直线检测" class="headerlink" title="3-C 直线检测"></a>3-C 直线检测</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目C</button></li><li class="tab"><button type="button" data-href="#-2">解答C</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">1. 打开 TestFigures 目录中的 Lane.jpg,将其转换成灰度图像,以 Canny()函数获取二值化的边缘图</span><br><span class="line">像,以 cv2.HoughLinesP()提取直线,该函数的用法参见如下,结合 PPT 内容,理解各个参数的意义,</span><br><span class="line">且尝试不同的参数所得的结果。</span><br><span class="line"></span><br><span class="line"># cv2.HoughLinesP(bim, rho, theta, threshold, lines=None, minLineLength, maxLineGap)</span><br><span class="line"># bim -- 输入的二值图像,推荐使用 canny 边缘检测的结果图像</span><br><span class="line"># rho -- 线段以像素为单位的距离精度</span><br><span class="line"># theta -- 线段以弧度为单位的角度精度</span><br><span class="line"># threshod -- 累加平面的阈值参数, 超过阈值才被检测出线段, 值越大, 意味着检出的线段越长, 检出</span><br><span class="line">的线段个数越少;</span><br><span class="line"># minLineLength -- 线段以像素为单位的最小长度,</span><br><span class="line"># maxLineGap -- 同一方向上两条线段判定为一条线段的最大允许间隔.</span><br><span class="line"># 返回以端点表示的</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> cv2</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">from</span> matplotlib <span class="keyword">import</span> pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">from</span> math <span class="keyword">import</span> pi</span><br><span class="line"></span><br><span class="line"><span class="comment"># 第 1 题</span></span><br><span class="line"></span><br><span class="line">image = cv2.imread(<span class="string">'D:/FilesCenter/Miku/image/Lane.jpg'</span>)</span><br><span class="line"></span><br><span class="line">gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)</span><br><span class="line">edges = cv2.Canny(gray, <span class="number">50</span>, <span class="number">150</span>)</span><br><span class="line">cv2.imshow(<span class="string">'Edges'</span>, edges)</span><br><span class="line">lines = cv2.HoughLinesP(edges, <span class="number">1</span>, pi/<span class="number">180</span>, <span class="number">50</span>, minLineLength=<span class="number">35</span>, maxLineGap=<span class="number">5</span>)</span><br><span class="line"><span class="keyword">for</span> line <span class="keyword">in</span> lines:</span><br><span class="line"> x1, y1, x2, y2 = line[<span class="number">0</span>]</span><br><span class="line"> cv2.line(image, (x1, y1), (x2, y2), (<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>), <span class="number">4</span>)</span><br><span class="line">cv2.imshow(<span class="string">'Image'</span>, image)</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><hr>]]></content>
<categories>
<category> 数字图像处理 </category>
</categories>
<tags>
<tag> Python </tag>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> OpenCV </tag>
<tag> Visual Studio Code </tag>
<tag> 数字图像处理 </tag>
</tags>
</entry>
<entry>
<title>数字图像 - 图像直方图均衡化处理</title>
<link href="/2023/05/14/0004-02/"/>
<url>/2023/05/14/0004-02/</url>
<content type="html"><![CDATA[<h2 id="2-A-练习空间域图像处理函数的使用"><a href="#2-A-练习空间域图像处理函数的使用" class="headerlink" title="2-A 练习空间域图像处理函数的使用"></a>2-A 练习空间域图像处理函数的使用</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目A</button></li><li class="tab"><button type="button" data-href="#-2">解答A</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">1. 打开图像 Lenna.jpg,分别使用 OpenCV 的平滑滤波函数:blur(),GaussianBlur()和 medianBlur()对打开</span><br><span class="line">的图像进行平滑处理,调整各个函数的参数,通过 imshow()函数观察参数对结果的影响(注:请阅读 PPT 或自行百</span><br><span class="line">度上述函数的用法)。</span><br><span class="line"></span><br><span class="line">2. 打开图像 Lenna.jpg,使用 OpenCV 的 Sobel 算子分别计算 X 和 Y 方向的梯度,使用 imshow()显示 X 和 </span><br><span class="line">Y 两个方向的梯度图像(注:可参阅 ftp 中 code_demo的 Sobel.py),通过调整参数,观察参数对结果的影响;</span><br><span class="line"></span><br><span class="line">3. 打开图像 Lenna.jpg,使用 OpenCV 的 Laplacian 算子对图像进行边缘计算,通过调整参数,观察参数对结果</span><br><span class="line">的影响(注:请百度 opencv 的 Laplacian()函数用法)。</span><br><span class="line"></span><br><span class="line">4. 形如: ker_emb = np.array(([-4, -2, 0], [-1, 1, 1], [0, 2, 4]), dtype="float32")定义一个自定义</span><br><span class="line">的滤波核,使用 OpenCV 的 filter2D()对图像进行滤波处理,观察结果图像。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># encoding:utf-8</span></span><br><span class="line"><span class="keyword">import</span> cv2</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"></span><br><span class="line">im_path = <span class="string">'D:/FilesCenter/Miku/picture/48.png'</span></span><br><span class="line">im = cv2.imread(im_path)</span><br><span class="line">im_gray = cv2.imread(im_path, cv2.IMREAD_GRAYSCALE)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 第 1 题</span></span><br><span class="line"></span><br><span class="line">dst_1_blur = cv2.blur(im, (<span class="number">7</span>, <span class="number">7</span>)) </span><br><span class="line">dst_1_medianBlur = cv2.medianBlur(im, <span class="number">5</span>)</span><br><span class="line">dst_1_gaussianBlur = cv2.GaussianBlur(im, (<span class="number">5</span>, <span class="number">5</span>), <span class="number">0</span>)</span><br><span class="line">cv2.imshow(<span class="string">u'original'</span>, im) <span class="comment"># 原图像</span></span><br><span class="line">cv2.imshow(<span class="string">u'blur'</span>, dst_1_blur) <span class="comment"># 均值滤波</span></span><br><span class="line">cv2.imshow(<span class="string">u'medianBlur'</span>, dst_1_medianBlur) <span class="comment"># 中值滤波</span></span><br><span class="line">cv2.imshow(<span class="string">u'gaussianBlur'</span>, dst_1_gaussianBlur) <span class="comment"># 高斯滤波</span></span><br><span class="line">cv2.waitKey()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 第 2 题</span></span><br><span class="line"></span><br><span class="line">sobelX = cv2.Sobel(im_gray, cv2.CV_64F, <span class="number">1</span>, <span class="number">0</span>, ksize = <span class="number">3</span>)</span><br><span class="line">sobelY = cv2.Sobel(im_gray, cv2.CV_64F, <span class="number">0</span>, <span class="number">1</span>, ksize = <span class="number">3</span>)</span><br><span class="line">absX = cv2.convertScaleAbs(sobelX)</span><br><span class="line">absY = cv2.convertScaleAbs(sobelY)</span><br><span class="line">sobelXY = cv2.addWeighted(absX, <span class="number">0.5</span>, absY, <span class="number">0.5</span>, <span class="number">0</span>)</span><br><span class="line">cv2.imshow(<span class="string">'sobel X'</span>, absX) <span class="comment"># X方向的 Sobel算子滤波</span></span><br><span class="line">cv2.imshow(<span class="string">'sobel Y'</span>, absY) <span class="comment"># Y方向的 Sobel算子滤波</span></span><br><span class="line">cv2.imshow(<span class="string">'sobel XY'</span>, sobelXY) <span class="comment"># XY合成方向的 Sobel算子滤波</span></span><br><span class="line">cv2.waitKey()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 第 3 题</span></span><br><span class="line"></span><br><span class="line">lap_color = cv2.Laplacian(im, cv2.CV_16S, ksize = <span class="number">3</span>)</span><br><span class="line">lap_gray = cv2.Laplacian(im_gray, cv2.CV_16S, ksize = <span class="number">3</span>)</span><br><span class="line">dst_3_color = cv2.convertScaleAbs(lap_color)</span><br><span class="line">dst_3_gray = cv2.convertScaleAbs(lap_gray)</span><br><span class="line">cv2.imshow(<span class="string">'laplacian_color'</span>, dst_3_color) <span class="comment"># 彩色图像的 laplacian算子滤波</span></span><br><span class="line">cv2.imshow(<span class="string">'laplacian_gray'</span>, dst_3_gray) <span class="comment"># 灰度图像的 laplacian算子滤波</span></span><br><span class="line">cv2.waitKey()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 第 4 题</span></span><br><span class="line"></span><br><span class="line">ker_4 = np.array(([-<span class="number">4</span>, -<span class="number">2</span>, <span class="number">0</span>], [-<span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>], [<span class="number">0</span>, <span class="number">2</span>, <span class="number">4</span>]), dtype=<span class="string">"float32"</span>)</span><br><span class="line">dst_4 = cv2.filter2D(im, -<span class="number">1</span>, ker_4)</span><br><span class="line">cv2.imshow(<span class="string">'original'</span>, im) <span class="comment"># 原图像</span></span><br><span class="line">cv2.imshow(<span class="string">'dst_emboss'</span>, dst_4) <span class="comment"># 自定义滤波(类似浮雕效果)</span></span><br><span class="line">cv2.waitKey()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="2-B-图像直方图均衡化处理"><a href="#2-B-图像直方图均衡化处理" class="headerlink" title="2-B 图像直方图均衡化处理"></a>2-B 图像直方图均衡化处理</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目B</button></li><li class="tab"><button type="button" data-href="#-2">解答B</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">1. 打开 Lenna.jpg,取 Blue 分量图像,使用 equalizeHist()对图像作直方图均衡化处理;</span><br><span class="line"></span><br><span class="line">2. 分别以窗体的形式显示均衡化处理之前和之后的直方图(显示请参考以下代码)</span><br><span class="line"> </span><br><span class="line"> '''</span><br><span class="line"> matplot 的方法:plt.hist(x, bins, range, density, ...)</span><br><span class="line"> x -- 数组,bins -- bin 的数目, range -- bin 的下限和上限, ...</span><br><span class="line"> im.raver() -- 多维数组转一维数组 </span><br><span class="line"> '''</span><br><span class="line"> plt.hist(im[:,:,0].ravel(), 256, [0, 256])</span><br><span class="line"> plt.show()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> cv2</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"></span><br><span class="line">im_path = <span class="string">'D:/FilesCenter/Miku/picture/48.png'</span></span><br><span class="line">im = cv2.imread(im_path)</span><br><span class="line"></span><br><span class="line">im_b = im[:,:,<span class="number">0</span>]</span><br><span class="line">dst = cv2.equalizeHist(im_b)</span><br><span class="line">cv2.imshow(<span class="string">'original_B'</span>, im_b) <span class="comment"># 原图像的B通道分量</span></span><br><span class="line">cv2.imshow(<span class="string">'after solve'</span>, dst) <span class="comment"># 全局均衡化后</span></span><br><span class="line"></span><br><span class="line">plt.hist(im_b.ravel(), <span class="number">256</span>, [<span class="number">0</span>, <span class="number">256</span>])</span><br><span class="line">plt.show()</span><br><span class="line"></span><br><span class="line">cv2.waitKey()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="2-C-图像直方图均衡化处理"><a href="#2-C-图像直方图均衡化处理" class="headerlink" title="2-C 图像直方图均衡化处理"></a>2-C 图像直方图均衡化处理</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目C</button></li><li class="tab"><button type="button" data-href="#-2">解答C</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">1. 打开 Lenna.jpg,取绿色分量图像,使用 equalizeHist()对绿色分量图像作直方图均衡化处理;</span><br><span class="line"></span><br><span class="line">2. 以均衡化处理后的绿色分量图像的直方图为目标直方图,对 Lenna 的蓝色分量图像作直方图规定化,分别显示原</span><br><span class="line"> 始和规定化处理后的蓝色分量图像,及各自的直方图(可参考可参阅 ftp 中 code_demo 的 303_hist_match.</span><br><span class="line"> py)。</span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> cv2</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"></span><br><span class="line">im_path = <span class="string">'D:/FilesCenter/Miku/picture/48.png'</span></span><br><span class="line">im = cv2.imread(im_path)</span><br><span class="line"></span><br><span class="line">im_b = im[:,:,<span class="number">0</span>]</span><br><span class="line">im_g = im[:,:,<span class="number">1</span>]</span><br><span class="line">im_g_equalizeHist = cv2.equalizeHist(im_g)</span><br><span class="line">source = im_b</span><br><span class="line">target = im_g_equalizeHist</span><br><span class="line"></span><br><span class="line">s_hist = cv2.calcHist([source], [<span class="number">0</span>], <span class="literal">None</span>, [<span class="number">256</span>], [<span class="number">0</span>, <span class="number">256</span>])</span><br><span class="line">t_hist = cv2.calcHist([target], [<span class="number">0</span>], <span class="literal">None</span>, [<span class="number">256</span>], [<span class="number">0</span>, <span class="number">256</span>])</span><br><span class="line">s_hist = s_hist/source.shape[<span class="number">0</span>]/source.shape[<span class="number">1</span>]</span><br><span class="line">t_hist = t_hist/target.shape[<span class="number">0</span>]/target.shape[<span class="number">1</span>]</span><br><span class="line"></span><br><span class="line"><span class="comment"># 计算积聚直方图形成映射函数(目标和源)</span></span><br><span class="line">t_map = t_hist.copy()</span><br><span class="line">accu_h = <span class="number">0</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">256</span>):</span><br><span class="line"> accu_h += t_hist[i]</span><br><span class="line"> t_map[i] = accu_h</span><br><span class="line"></span><br><span class="line">s_map = s_hist.copy()</span><br><span class="line">accu_h = <span class="number">0</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">256</span>):</span><br><span class="line"> accu_h += s_hist[i]</span><br><span class="line"> s_map[i] = accu_h</span><br><span class="line"></span><br><span class="line"><span class="comment"># 确定映射关系</span></span><br><span class="line">index_map = np.zeros([<span class="number">256</span>, <span class="number">1</span>])</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">256</span>):</span><br><span class="line"> temp_h = np.ones([<span class="number">256</span>, <span class="number">1</span>])*s_map[i]</span><br><span class="line"> temp_h = np.fabs(temp_h - t_map) <span class="comment"># 需取绝对值</span></span><br><span class="line"> index = np.argmin(temp_h) <span class="comment"># 求 temp_h 中最小值所在位置的索引</span></span><br><span class="line"> index_map[i] = index </span><br><span class="line"></span><br><span class="line">out_im = index_map[source]</span><br><span class="line">out_im = out_im.astype(np.uint8)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 显示比较</span></span><br><span class="line">plt.subplot(<span class="number">2</span>, <span class="number">2</span>, <span class="number">1</span>)</span><br><span class="line">plt.title(<span class="string">'source'</span>)</span><br><span class="line">plt.imshow(im_b, cmap=<span class="string">'gray'</span>)</span><br><span class="line"></span><br><span class="line">plt.subplot(<span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>)</span><br><span class="line">plt.title(<span class="string">'after matching'</span>)</span><br><span class="line">plt.imshow(out_im, cmap=<span class="string">'gray'</span>)</span><br><span class="line"></span><br><span class="line">plt.subplot(<span class="number">2</span>, <span class="number">2</span>, <span class="number">3</span>)</span><br><span class="line">plt.title(<span class="string">'hist of source'</span>)</span><br><span class="line">plt.hist(im_b.ravel(), <span class="number">256</span>, [<span class="number">0</span>, <span class="number">256</span>])</span><br><span class="line"></span><br><span class="line">plt.subplot(<span class="number">2</span>, <span class="number">2</span>, <span class="number">4</span>)</span><br><span class="line">plt.title(<span class="string">'hist of matching'</span>)</span><br><span class="line">plt.hist(out_im.ravel(), <span class="number">256</span>, [<span class="number">0</span>, <span class="number">256</span>])</span><br><span class="line"></span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="2-D-图像直方图均衡化算法"><a href="#2-D-图像直方图均衡化算法" class="headerlink" title="2-D 图像直方图均衡化算法"></a>2-D 图像直方图均衡化算法</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目D</button></li><li class="tab"><button type="button" data-href="#-2">解答D</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">如下为一个 100x100,灰度级为 0--15 的灰度图像的直方图,请编写程序实现直方图均衡化算法,且以画表方式给出均衡化处理前后的灰度映射关系(注二行表格,第一行为输入灰度级,第二行为均衡化以后对应的灰度级)。</span><br><span class="line"></span><br><span class="line">灰度|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15</span><br><span class="line">:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:</span><br><span class="line">n 2 57 704 1979 2452 1501 1128 1196 505 316 105 40 12 2 1 0</span><br><span class="line"></span><br><span class="line">注:可将上述直方图定义成一个 16x1 的 numpy 数组,按 PPT 的算法步骤实现均衡化处理(即:归一化、求积聚直</span><br><span class="line">方图、乘最大灰度形成映射)。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> cv2</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"></span><br><span class="line">hist = np.asarray([<span class="number">2</span>,<span class="number">57</span>,<span class="number">704</span>,<span class="number">1979</span>,<span class="number">2452</span>,<span class="number">1501</span>,<span class="number">1128</span>,<span class="number">1196</span>,<span class="number">505</span>,<span class="number">316</span>,<span class="number">105</span>,<span class="number">40</span>,<span class="number">15</span>,<span class="number">2</span>,<span class="number">1</span>,<span class="number">0</span>])</span><br><span class="line">hist_temp = np.asarray([<span class="number">2</span>,<span class="number">57</span>,<span class="number">704</span>,<span class="number">1979</span>,<span class="number">2452</span>,<span class="number">1501</span>,<span class="number">1128</span>,<span class="number">1196</span>,<span class="number">505</span>,<span class="number">316</span>,<span class="number">105</span>,<span class="number">40</span>,<span class="number">15</span>,<span class="number">2</span>,<span class="number">1</span>,<span class="number">0</span>])</span><br><span class="line"></span><br><span class="line">tot = np.<span class="built_in">sum</span>(hist)</span><br><span class="line">hist = np.divide(hist, tot) <span class="comment"># 归一化后的直方图</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>, <span class="number">16</span>):</span><br><span class="line"> hist[i] += hist[i - <span class="number">1</span>]</span><br><span class="line"></span><br><span class="line">hist_map = np.asarray([<span class="number">0.0</span> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">16</span>)]) <span class="comment"># 定义映射后的直方图</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">16</span>):</span><br><span class="line"> index = <span class="built_in">round</span>(hist[i] * <span class="number">15</span>)</span><br><span class="line"> hist_map[index] += hist[i]</span><br><span class="line"></span><br><span class="line">hist_res = [<span class="built_in">int</span>(hist_map[i] * tot) <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">16</span>)]</span><br><span class="line"></span><br><span class="line">res = [hist_temp, hist_res] <span class="comment"># 分别是原始的数据 n ,和均衡化处理后的数目 n</span></span><br><span class="line">col = <span class="built_in">list</span>(<span class="built_in">range</span>(<span class="number">16</span>))</span><br><span class="line">row = [<span class="string">'n1'</span>, <span class="string">'n2'</span>]</span><br><span class="line">fig, ax =plt.subplots(<span class="number">1</span>, <span class="number">1</span>)</span><br><span class="line">ax.axis(<span class="string">'tight'</span>)</span><br><span class="line">ax.axis(<span class="string">'off'</span>)</span><br><span class="line">ax.table(cellText = res, colLabels = col, rowLabels = row, loc = <span class="string">"center"</span>)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><hr>]]></content>
<categories>
<category> 数字图像处理 </category>
</categories>
<tags>
<tag> Python </tag>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> OpenCV </tag>
<tag> Visual Studio Code </tag>
<tag> 数字图像处理 </tag>
</tags>
</entry>
<entry>
<title>数字图像处理实验1</title>
<link href="/2023/05/14/0004-01/"/>
<url>/2023/05/14/0004-01/</url>
<content type="html"><![CDATA[<h2 id="1-A-设置-Python-OpenCV-VS-Code-开发环境"><a href="#1-A-设置-Python-OpenCV-VS-Code-开发环境" class="headerlink" title="1-A 设置 Python + OpenCV + VS Code 开发环境"></a>1-A 设置 Python + OpenCV + VS Code 开发环境</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目A</button></li><li class="tab"><button type="button" data-href="#-2">解答A</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">1. 参考提供的视频“Python-Open-环境.mp4”,设置 Python+OpenCV+VS Code 开发环境;</span><br><span class="line"></span><br><span class="line">2. 在新建的.py 文件中输入如下代码,观察是否能运行成功。</span><br><span class="line"> import cv2</span><br><span class="line"> im = cv2.imread('Flower.png')</span><br><span class="line"> cv2.imshow('The 1st Window', im)</span><br><span class="line"> cv2.waitKey()</span><br><span class="line"> cv2.destroyAllWindows('The 1st Window')</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">略</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="1-B-练习图像分离、截取、转换等函数的使用"><a href="#1-B-练习图像分离、截取、转换等函数的使用" class="headerlink" title="1-B 练习图像分离、截取、转换等函数的使用"></a>1-B 练习图像分离、截取、转换等函数的使用</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目B</button></li><li class="tab"><button type="button" data-href="#-2">解答B</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">1. 打开彩色图像 lenna.jpg,使用 cv2.split()分离红色、绿色和蓝色通道,分别用 imshow() 显示;使用 </span><br><span class="line"> cv2.merge()将分离后的三通道图像合并成一幅彩色图像,尝试不同的顺序时的结果:</span><br><span class="line"> im = cv2.imread(‘lenna.jpg’)</span><br><span class="line"> b,g,r = cv2.split(im)</span><br><span class="line"> ...</span><br><span class="line"> xim = cv2.merge([b,g,r])</span><br><span class="line"> ...</span><br><span class="line"></span><br><span class="line">2. 使用 cvtColor()将彩色图像转换成灰度图像,与上述通过分离获得的灰度图像作比较,观察与哪个分量图像</span><br><span class="line"> 接近(cvtColor()的用法请自行百度)。</span><br><span class="line"> xim = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)</span><br><span class="line"></span><br><span class="line">3. 打开图像 lenna.jpg,保存到矩阵 im,使用如下形式的定义,截取从第 20 行至第 180 行,第 30 列至 </span><br><span class="line"> 220 列的区域图像,且使用 cv2.imwrite(‘FileName’, rim) 保存区域图像(imwrite()的用法请自行百</span><br><span class="line"> 度)</span><br><span class="line"> rim = im[20:180, 30:220, :];</span><br><span class="line"> cv2.imwrite(...)</span><br><span class="line"> ...</span><br><span class="line"></span><br><span class="line">4. 打开图像 lenna.jpg,使用 cv2.flip()产生水平镜像、垂直倒影和对角翻转图像,且加以显示(flip()的用</span><br><span class="line"> 法请自行百度)</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> cv2</span><br><span class="line"></span><br><span class="line"><span class="comment"># 1</span></span><br><span class="line">im = cv2.imread(<span class="string">'image/Miku.jpg'</span>)</span><br><span class="line">b, g, r = cv2.split(im)</span><br><span class="line">xim = cv2.merge([b, g, r])</span><br><span class="line">cv2.imshow(<span class="string">'The R image Window'</span>, r)</span><br><span class="line">cv2.imshow(<span class="string">'The G image Window'</span>, g)</span><br><span class="line">cv2.imshow(<span class="string">'The B image Window'</span>, b)</span><br><span class="line">cv2.imshow(<span class="string">'The merge image Window'</span>, xim)</span><br><span class="line">cv2.waitKey()</span><br><span class="line">cv2.destroyAllWindows()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 2</span></span><br><span class="line">im_toGray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY);</span><br><span class="line"><span class="comment"># 两幅图像作差分,图像越黑说明差异越小</span></span><br><span class="line">diff_b = cv2.absdiff(im_toGray, b)</span><br><span class="line">cv2.imshow(<span class="string">"the difference of B"</span>, diff_b)</span><br><span class="line">diff_g = cv2.absdiff(im_toGray, g)</span><br><span class="line">cv2.imshow(<span class="string">"the difference of G"</span>, diff_g)</span><br><span class="line">diff_r = cv2.absdiff(im_toGray, r)</span><br><span class="line">cv2.imshow(<span class="string">"the difference of R"</span>, diff_r)</span><br><span class="line">cv2.waitKey()</span><br><span class="line">cv2.destroyAllWindows()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 3</span></span><br><span class="line">rim = im[<span class="number">20</span>:<span class="number">180</span>, <span class="number">30</span>:<span class="number">220</span>, :];</span><br><span class="line">cv2.imwrite(<span class="string">'image/Miku_part.jpg'</span>, rim)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 4</span></span><br><span class="line">cv2.imshow(<span class="string">'begining'</span>, im)</span><br><span class="line">h_im = cv2.flip(im, <span class="number">1</span>) <span class="comment">#图像水平翻转</span></span><br><span class="line">cv2.imshow(<span class="string">'flip horizontal'</span>, h_im)</span><br><span class="line">v_im = cv2.flip(im, <span class="number">0</span>) <span class="comment">#图像垂直翻转</span></span><br><span class="line">cv2.imshow(<span class="string">'flip vertically'</span>, v_im)</span><br><span class="line">v_h_im = cv2.flip(im, -<span class="number">1</span>) <span class="comment">#图像垂直和水平翻转</span></span><br><span class="line">cv2.imshow(<span class="string">'flip diagonally'</span>, v_h_im)</span><br><span class="line">cv2.waitKey()</span><br><span class="line">cv2.destroyAllWindows()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="1-C-图像颜色变换"><a href="#1-C-图像颜色变换" class="headerlink" title="1-C 图像颜色变换"></a>1-C 图像颜色变换</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目C</button></li><li class="tab"><button type="button" data-href="#-2">解答C</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">打开图像 Flower.png,将左上角坐标(400,360)、右下角(670,660)矩形范围内的颜色求其补色(即 </span><br><span class="line">Red、Green、Blue 分别计算为 255-Red,255-Green,255-Blue)产生形如下图的结果;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> cv2</span><br><span class="line">im = cv2.imread(<span class="string">'image/Miku.jpg'</span>)</span><br><span class="line">cv2.imshow(<span class="string">'Begining'</span>, im)</span><br><span class="line"></span><br><span class="line">height, width, temp = im.shape</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">400</span>, <span class="number">670</span>):</span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">360</span>, <span class="number">660</span>):</span><br><span class="line"> im[i, j][<span class="number">0</span>] = <span class="number">255</span> - im[i, j][<span class="number">0</span>]</span><br><span class="line"> im[i, j][<span class="number">1</span>] = <span class="number">255</span> - im[i, j][<span class="number">1</span>]</span><br><span class="line"> im[i, j][<span class="number">2</span>] = <span class="number">255</span> - im[i, j][<span class="number">2</span>]</span><br><span class="line">cv2.imshow(<span class="string">'After'</span>, im)</span><br><span class="line"></span><br><span class="line">cv2.waitKey()</span><br><span class="line">cv2.destroyAllWindows()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="1-D-计算和显示直方图"><a href="#1-D-计算和显示直方图" class="headerlink" title="1-D 计算和显示直方图"></a>1-D 计算和显示直方图</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目D</button></li><li class="tab"><button type="button" data-href="#-2">解答D</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">1. 打开图像 lenna.jpg,使用 cvtColor()转换成灰度图像,使用 cv2.calcHist()函数计算灰度图像的直方</span><br><span class="line"> 图,以屏显打印输出的形式显示具有 100-128 灰度值的像素数目(calcHist()的用法可参考 FTP 中的 </span><br><span class="line"> demo 代码 301_calc_hist.py);</span><br><span class="line"></span><br><span class="line">2. 通过设置 cv2.calcHist()的参数,计算 binwidth 等于 8、16 的直方图;</span><br><span class="line"></span><br><span class="line">3. 设计算所得的直方图保存在数组:xhist, 搜索查找具有最多像素数目的灰度级.</span><br><span class="line"></span><br><span class="line">4. 使用 matplotlib 包画出如下的直方图(可参考 FTP 中的 demo 代码302_plot_hist.py)</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> cv2</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 1</span></span><br><span class="line">image = cv2.imread(<span class="string">'image/Miku.jpg'</span>)</span><br><span class="line">gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)</span><br><span class="line">hist = cv2.calcHist([gray], [<span class="number">0</span>], <span class="literal">None</span>, [<span class="number">256</span>], [<span class="number">0</span>, <span class="number">256</span>])</span><br><span class="line"><span class="built_in">print</span>(<span class="string">"The number of pixels with gray values between 100 and 128 is:"</span>, <span class="built_in">sum</span>(hist[<span class="number">100</span>:<span class="number">129</span>]))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 2</span></span><br><span class="line">hist8 = cv2.calcHist([gray], [<span class="number">0</span>], <span class="literal">None</span>, [<span class="number">32</span>], [<span class="number">0</span>, <span class="number">256</span>])</span><br><span class="line">hist16 = cv2.calcHist([gray], [<span class="number">0</span>], <span class="literal">None</span>, [<span class="number">16</span>], [<span class="number">0</span>, <span class="number">256</span>])</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 3</span></span><br><span class="line">max_gray = hist.argmax()</span><br><span class="line"><span class="built_in">print</span>(<span class="string">"The gray level with the most pixels is:"</span>, max_gray)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 4</span></span><br><span class="line">plt.figure()</span><br><span class="line">plt.subplot(<span class="number">221</span>)</span><br><span class="line">plt.title(<span class="string">"Original Image"</span>)</span><br><span class="line">plt.imshow(image[:,:,::-<span class="number">1</span>])</span><br><span class="line">plt.subplot(<span class="number">222</span>)</span><br><span class="line">plt.title(<span class="string">"Gray Image"</span>)</span><br><span class="line">plt.imshow(gray, cmap=<span class="string">"gray"</span>)</span><br><span class="line">plt.subplot(<span class="number">223</span>)</span><br><span class="line">plt.title(<span class="string">"Histogram with binwidth 8"</span>)</span><br><span class="line">plt.plot(hist8)</span><br><span class="line">plt.subplot(<span class="number">224</span>)</span><br><span class="line">plt.title(<span class="string">"Histogram with binwidth 16"</span>)</span><br><span class="line">plt.plot(hist16)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="1-E-图像统计处理"><a href="#1-E-图像统计处理" class="headerlink" title="1-E 图像统计处理"></a>1-E 图像统计处理</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目E</button></li><li class="tab"><button type="button" data-href="#-2">解答E</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">1. 打开 Flower.png,使用 minMaxLoc()统计绿色分量图像的最大值和最小值,print 输出;</span><br><span class="line"></span><br><span class="line">2. 使用 meanStdDev()统计上述绿色分量图像的均值和标准差,且 print 输出;</span><br><span class="line"></span><br><span class="line">3. 请自行百度上述 cv2.minMaxLoc()和 cv2. meanStdDev()函数的使用。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> cv2</span><br><span class="line">im = cv2.imread(<span class="string">'image/Miku.jpg'</span>)</span><br><span class="line">b, g, r = cv2.split(im)</span><br><span class="line">min_val, max_val, min_indx, max_indx = cv2.minMaxLoc(g)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'最小值为:'</span>, min_val, <span class="string">'最大值为:'</span>, max_val)</span><br><span class="line"></span><br><span class="line">height, width = g.shape</span><br><span class="line">ave = cv2.mean(g)</span><br><span class="line">ave, stddv = cv2.meanStdDev(g)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'均值为:'</span>, ave, <span class="string">'标准差为:'</span>, stddv)</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="1-F-图像缩放处理"><a href="#1-F-图像缩放处理" class="headerlink" title="1-F 图像缩放处理"></a>1-F 图像缩放处理</h2><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目F</button></li><li class="tab"><button type="button" data-href="#-2">解答F</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">1. 打开 Lenna.jpg,使用 cv2.resize()分别将图像放大到原图像的 2 倍和 3 倍,比较插值分别设成 cv2.</span><br><span class="line"> INTER_LINEAR,cv2.INTER_CUBIC 和 cv2.LANCZOS4时的视觉表现;</span><br><span class="line"></span><br><span class="line">2. 使用 cv2.resize()将图像缩小到原图像的 0.5 倍,比较插值分别设成cv2.INTER_LINEAR,cv2.</span><br><span class="line"> INTER_CUBIC 和 cv2.LANCZOS4 时的视觉表现。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> cv2</span><br><span class="line">im = cv2.imread(<span class="string">'image/Miku.jpg'</span>)</span><br><span class="line"></span><br><span class="line">im_x_linear = cv2.resize(im, dsize=<span class="literal">None</span>, fx=<span class="number">2</span>, fy=<span class="number">2</span>, interpolation=cv2.INTER_LINEAR)</span><br><span class="line">im_x_cubic = cv2.resize(im, dsize=<span class="literal">None</span>, fx=<span class="number">2</span>, fy=<span class="number">2</span>, interpolation=cv2.INTER_CUBIC)</span><br><span class="line">im_x_lanczos4 = cv2.resize(im, dsize=<span class="literal">None</span>, fx=<span class="number">2</span>, fy=<span class="number">2</span>, interpolation=cv2.INTER_LANCZOS4)</span><br><span class="line">cv2.imshow(<span class="string">'2x linear'</span>, im_x_linear)</span><br><span class="line">cv2.imshow(<span class="string">'2x cubic'</span>, im_x_cubic)</span><br><span class="line">cv2.imshow(<span class="string">'2x lanczos4'</span>, im_x_lanczos4)</span><br><span class="line">cv2.waitKey()</span><br><span class="line">cv2.destroyAllWindows()</span><br><span class="line"></span><br><span class="line">im_y_linear = cv2.resize(im, dsize=<span class="literal">None</span>, fx=<span class="number">3</span>, fy=<span class="number">3</span>, interpolation=cv2.INTER_LINEAR)</span><br><span class="line">im_y_cubic = cv2.resize(im, dsize=<span class="literal">None</span>, fx=<span class="number">3</span>, fy=<span class="number">3</span>, interpolation=cv2.INTER_CUBIC)</span><br><span class="line">im_y_lanczos4 = cv2.resize(im, dsize=<span class="literal">None</span>, fx=<span class="number">3</span>, fy=<span class="number">3</span>, interpolation=cv2.INTER_LANCZOS4)</span><br><span class="line">cv2.imshow(<span class="string">'3x linear'</span>, im_y_linear)</span><br><span class="line">cv2.imshow(<span class="string">'3x cubic'</span>, im_y_cubic)</span><br><span class="line">cv2.imshow(<span class="string">'3x lanczos4'</span>, im_y_lanczos4)</span><br><span class="line">cv2.waitKey()</span><br><span class="line">cv2.destroyAllWindows()</span><br><span class="line"></span><br><span class="line">im_z_linear = cv2.resize(im, dsize=<span class="literal">None</span>, fx=<span class="number">0.5</span>, fy=<span class="number">0.5</span>, interpolation=cv2.INTER_LINEAR)</span><br><span class="line">im_z_cubic = cv2.resize(im, dsize=<span class="literal">None</span>, fx=<span class="number">0.5</span>, fy=<span class="number">0.5</span>, interpolation=cv2.INTER_CUBIC)</span><br><span class="line">im_z_lanczos4 = cv2.resize(im, dsize=<span class="literal">None</span>, fx=<span class="number">0.5</span>, fy=<span class="number">0.5</span>, interpolation=cv2.INTER_LANCZOS4)</span><br><span class="line">cv2.imshow(<span class="string">'0.5x linear'</span>, im_z_linear)</span><br><span class="line">cv2.imshow(<span class="string">'0.5x cubic'</span>, im_z_cubic)</span><br><span class="line">cv2.imshow(<span class="string">'0.5x lanczos4'</span>, im_z_lanczos4)</span><br><span class="line">cv2.waitKey()</span><br><span class="line">cv2.destroyAllWindows()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><hr>]]></content>
<categories>
<category> 数字图像处理 </category>
</categories>
<tags>
<tag> Python </tag>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
<tag> OpenCV </tag>
<tag> Visual Studio Code </tag>
<tag> 数字图像处理 </tag>
</tags>
</entry>
<entry>
<title>文本分类预测实验</title>
<link href="/2023/05/14/0003-10/"/>
<url>/2023/05/14/0003-10/</url>
<content type="html"><![CDATA[<h1 id="Python与数据科学实验8"><a href="#Python与数据科学实验8" class="headerlink" title="Python与数据科学实验8"></a>Python与数据科学实验8</h1><h2 id="实验数据"><a href="#实验数据" class="headerlink" title="实验数据"></a>实验数据</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(1) 训练集</span><br><span class="line">训练集包含30000条商品评论,存放于文件'review_train.csv'中。每一行代表一条商品评论,第一列是评论的分值</span><br><span class="line">`label`,表示该顾客对于当前商品的打分,从1分到5分。第二列是评论的标题, 第三列是评论的具体内容。训练数据集</span><br><span class="line">使用pandas读入后(pd.read_csv('review_train.csv', header=None, names=['评分', '标题', '评论']))</span><br><span class="line"></span><br><span class="line">(2) 测试集</span><br><span class="line">另有10000条未知评分的测试数据,保存在'review_test.csv'文件中。每一行仅给定评论的标题和评论内容(pd.</span><br><span class="line">read_csv('review_test.csv', header=None, names=['标题', '评论'])),而每条商品的评分未知,待建模识别。</span><br></pre></td></tr></table></figure><mark class="hl-label green">下载链接</mark> <p><a href="https://coleduck.cn/annex/Python%E4%B8%8E%E6%95%B0%E6%8D%AE%E7%A7%91%E5%AD%A6%E5%AE%9E%E9%AA%8C/Lab8.7z">data.zip</a></p><h2 id="实验目的"><a href="#实验目的" class="headerlink" title="实验目的"></a>实验目的</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(1) 设计文本的特征向量,具备一定的特征工程能力。</span><br><span class="line">(2) 利用机器学习分类算法,基于训练集构建分类器模型。</span><br><span class="line">(3) 进而将构建好的分类器模型应用于测试集,给出全体未知标签样本的分类结果,即预测文本数据所属的类别(1-5分)。</span><br><span class="line">(4) 鼓励使用神经网络模型,并与传统模型进行对比。</span><br></pre></td></tr></table></figure><h2 id="设计思路"><a href="#设计思路" class="headerlink" title="设计思路"></a>设计思路</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(1) 可使用pandas.read_csv(FileName)读取文件,并返回DataFrame进行后续处理</span><br><span class="line">(2) 需从每条文本中提取特征,表示为固定长度的特征向量。特征向量设计思路不限,例如,可尝试使用tf-idf等常见文本</span><br><span class="line"> 特征提取算法。Tf-idf参考网址:https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html</span><br><span class="line">(3) 具体的机器学习算法不限,以预测效果最佳为目标,使用sklearn.metrics.f1_score的average=micro模式</span><br><span class="line"> (https://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html);体会多分类模</span><br><span class="line"> 型的评价和2分类评价的不同, 思考如何处理不平衡的数据集(imbalanced dataset)。可以尝试多种学习模型的集成。</span><br><span class="line"></span><br><span class="line">注意:在调试模型的过程中,可以分出训练集中的80%用作训练,用剩下的20% 验证模型的好坏。也可以使用交叉验证等手段。</span><br></pre></td></tr></table></figure><h2 id="实验要求"><a href="#实验要求" class="headerlink" title="实验要求"></a>实验要求</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(1) 将预测结果保存在名为“pred.txt”的文本文件中,内容为10000行, 每一行只有一个1-5分之间的分值,代表你的算法对测试数据的预测结果。预测数据顺序须与测试集“review_test.csv”中的样本顺序保持一致。</span><br><span class="line">(2) 将结果文件“pred.txt”,以及源代码以附件形式提交至学习通。另请注意:只需提交结果文件“pred.txt”和源代码,</span><br><span class="line">无需提交本次实验报告文件。</span><br><span class="line">(3) 本次实验成绩评定采用竞赛机制,即计算每位同学预测结果的f1_score的分数高低,然后由高到低进行排序评定相应的</span><br><span class="line">实验成绩。</span><br></pre></td></tr></table></figure><h2 id="我的做法"><a href="#我的做法" class="headerlink" title="我的做法"></a>我的做法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 这次的预测结果准确率普遍偏低。。。</span></span><br><span class="line"><span class="comment"># 随机森林分类模型的准确度: 0.4538888888888889</span></span><br><span class="line"><span class="comment"># KNN分类模型的准确度: 0.3662222222222222</span></span><br><span class="line"><span class="comment"># 逻辑回归分类模型的准确度: 0.44866666666666666</span></span><br><span class="line"><span class="comment"># 朴素贝叶斯模型的准确度:0.4018888888888889</span></span><br><span class="line"><span class="comment"># 支持向量机模型的准确度:0.4441111111111111</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># -*- coding:utf-8 -*-</span></span><br><span class="line"><span class="keyword">import</span> csv</span><br><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> jieba</span><br><span class="line"><span class="keyword">import</span> jieba.analyse</span><br><span class="line"><span class="keyword">from</span> scipy.sparse <span class="keyword">import</span> coo_matrix</span><br><span class="line"><span class="keyword">from</span> sklearn <span class="keyword">import</span> feature_extraction</span><br><span class="line"><span class="keyword">from</span> sklearn.feature_extraction.text <span class="keyword">import</span> TfidfVectorizer</span><br><span class="line"><span class="keyword">from</span> sklearn.feature_extraction.text <span class="keyword">import</span> CountVectorizer</span><br><span class="line"><span class="keyword">from</span> sklearn.feature_extraction.text <span class="keyword">import</span> TfidfTransformer</span><br><span class="line"><span class="keyword">from</span> sklearn.model_selection <span class="keyword">import</span> train_test_split</span><br><span class="line"><span class="keyword">from</span> sklearn.metrics <span class="keyword">import</span> classification_report</span><br><span class="line"><span class="keyword">from</span> sklearn.ensemble <span class="keyword">import</span> RandomForestClassifier</span><br><span class="line"><span class="keyword">from</span> sklearn.tree <span class="keyword">import</span> DecisionTreeClassifier</span><br><span class="line"><span class="keyword">from</span> sklearn <span class="keyword">import</span> svm</span><br><span class="line"><span class="keyword">from</span> sklearn <span class="keyword">import</span> neighbors</span><br><span class="line"><span class="keyword">from</span> sklearn.naive_bayes <span class="keyword">import</span> MultinomialNB</span><br><span class="line"><span class="keyword">from</span> sklearn.pipeline <span class="keyword">import</span> make_pipeline</span><br><span class="line"><span class="keyword">from</span> sklearn.decomposition <span class="keyword">import</span> PCA</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> sklearn.linear_model <span class="keyword">import</span> LogisticRegression</span><br><span class="line"><span class="keyword">from</span> sklearn.naive_bayes <span class="keyword">import</span> MultinomialNB</span><br><span class="line"><span class="keyword">from</span> sklearn.linear_model <span class="keyword">import</span> SGDClassifier</span><br><span class="line"><span class="keyword">from</span> sklearn.neighbors <span class="keyword">import</span> KNeighborsClassifier</span><br><span class="line"><span class="keyword">from</span> sklearn.ensemble <span class="keyword">import</span> RandomForestClassifier</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> collections <span class="keyword">import</span> Counter</span><br><span class="line"><span class="keyword">from</span> sklearn <span class="keyword">import</span> datasets</span><br><span class="line"><span class="keyword">from</span> sklearn.multiclass <span class="keyword">import</span> OneVsRestClassifier</span><br><span class="line"><span class="keyword">from</span> sklearn.multiclass <span class="keyword">import</span> OneVsOneClassifier</span><br><span class="line"><span class="keyword">from</span> sklearn.metrics <span class="keyword">import</span> accuracy_score</span><br><span class="line"></span><br><span class="line"><span class="comment"># ----------------------------------第一步 读取文件--------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># pd.read_csv('review_train.csv', header=None, names=['评分', '标题', '评论'])</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">'D:/Code/Python/Vscode/python与数据科学/第八次/review_train.csv'</span>, <span class="string">'r'</span>, encoding=<span class="string">'UTF-8'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> reader = csv.reader(f)</span><br><span class="line"> labels = []</span><br><span class="line"> contents = []</span><br><span class="line"> <span class="keyword">for</span> row <span class="keyword">in</span> reader:</span><br><span class="line"> labels.append(<span class="built_in">int</span>(row[<span class="number">0</span>])) <span class="comment"># 0-好评 1-差评</span></span><br><span class="line"> contents.append((row[<span class="number">1</span>] + <span class="string">' '</span>) * <span class="number">10</span> + row[<span class="number">2</span>])</span><br><span class="line"></span><br><span class="line">length = <span class="built_in">len</span>(labels)</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">'D:/Code/Python/Vscode/python与数据科学/第八次/review_test.csv'</span>, <span class="string">'r'</span>, encoding=<span class="string">'UTF-8'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> reader = csv.reader(f)</span><br><span class="line"> contents_predata = []</span><br><span class="line"> <span class="keyword">for</span> row <span class="keyword">in</span> reader:</span><br><span class="line"> contents.append((row[<span class="number">0</span>] + <span class="string">' '</span>) * <span class="number">10</span> + row[<span class="number">1</span>])</span><br><span class="line"></span><br><span class="line"><span class="comment"># print(labels[:5])</span></span><br><span class="line"><span class="comment"># print(contents[:5])</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># ----------------------------------第二步 数据预处理--------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建停用词list</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">stopwordslist</span>(<span class="params">filepath</span>):</span><br><span class="line"> stopwords = [line.strip() <span class="keyword">for</span> line <span class="keyword">in</span> <span class="built_in">open</span>(filepath, <span class="string">'r'</span>).readlines()]</span><br><span class="line"> <span class="keyword">return</span> stopwords</span><br><span class="line"> </span><br><span class="line"><span class="comment"># 对句子进行分词</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">seg_sentence</span>(<span class="params">sentence</span>):</span><br><span class="line"> sentence_seged = jieba.cut(sentence.strip())</span><br><span class="line"> stopwords = stopwordslist(<span class="string">'D:/Code/Python/Vscode/python与数据科学/第八次/stopwords_English.txt'</span>) <span class="comment"># 这里加载停用词的路径</span></span><br><span class="line"> outstr = <span class="string">''</span></span><br><span class="line"> <span class="keyword">for</span> word <span class="keyword">in</span> sentence_seged:</span><br><span class="line"> <span class="keyword">if</span> word <span class="keyword">not</span> <span class="keyword">in</span> stopwords:</span><br><span class="line"> <span class="keyword">if</span> word != <span class="string">'\t'</span>:</span><br><span class="line"> outstr += word</span><br><span class="line"> outstr += <span class="string">" "</span></span><br><span class="line"> <span class="keyword">return</span> outstr</span><br><span class="line"> </span><br><span class="line"><span class="comment"># 这里的返回值是字符串</span></span><br><span class="line"><span class="keyword">for</span> index <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(contents)):</span><br><span class="line"> contents[index] = seg_sentence(contents[index]) </span><br><span class="line"><span class="comment"># for index in range(len(contents_predata)):</span></span><br><span class="line"><span class="comment"># contents_predata[index] = seg_sentence(contents_predata[index])</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># X_data = []</span></span><br><span class="line"><span class="comment"># for text in contents:</span></span><br><span class="line"><span class="comment"># keywords = jieba.analyse.extract_tags(text, topK=5, withWeight=False, allowPOS=())</span></span><br><span class="line"><span class="comment"># X_data.append(keywords)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># X_pred = []</span></span><br><span class="line"><span class="comment"># for text in contents_predata:</span></span><br><span class="line"><span class="comment"># keywords = jieba.analyse.extract_tags(text, topK=5, withWeight=False, allowPOS=())</span></span><br><span class="line"><span class="comment"># X_pred.append(keywords)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># # PCA降至 10 维</span></span><br><span class="line"><span class="comment"># pca = PCA(n_components=10, svd_solver='auto').fit(X_data)</span></span><br><span class="line"><span class="comment"># pca = PCA(n_components=10, svd_solver='auto').fit(X_data)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># # print(labels[:5])</span></span><br><span class="line"><span class="comment"># # print(contents[:5])</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 将文本中的词语转换为词频矩阵 矩阵元素a[i][j] 表示j词在i类文本下的词频</span></span><br><span class="line">vectorizer = CountVectorizer(min_df=<span class="number">5</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 该类会统计每个词语的tf-idf权值</span></span><br><span class="line">transformer = TfidfTransformer()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 第一个fit_transform是计算tf-idf 第二个fit_transform是将文本转为词频矩阵</span></span><br><span class="line">tfidf = transformer.fit_transform(vectorizer.fit_transform(contents))</span><br><span class="line"><span class="comment"># for n in tfidf[:5]:</span></span><br><span class="line"><span class="comment"># print(n)</span></span><br><span class="line"><span class="comment"># print(type(tfidf))</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># # 获取词袋模型中的所有词语</span></span><br><span class="line"><span class="comment"># word = vectorizer.get_feature_names()</span></span><br><span class="line"><span class="comment"># for n in word:</span></span><br><span class="line"><span class="comment"># print(n)</span></span><br><span class="line"><span class="comment"># print("单词数量:", len(word))</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 将tf-idf矩阵抽取出来,元素w[i][j]表示j词在i类文本中的tf-idf权重</span></span><br><span class="line">X = coo_matrix(tfidf, dtype=np.float32).toarray() <span class="comment"># 稀疏矩阵 注意float</span></span><br><span class="line"><span class="comment"># print(X.shape)</span></span><br><span class="line"><span class="comment"># print(X[:10])</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># ----------------------------------第三步 数据划分--------------------------------</span></span><br><span class="line"><span class="comment"># 使用 train_test_split 分割 X y 列表</span></span><br><span class="line">X_train, X_test, y_train, y_test = train_test_split(X[:length], labels, test_size=<span class="number">0.3</span>, random_state=<span class="number">3939</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># --------------------------------第四步 机器学习分类--------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># KNN Classifier K近邻算法</span></span><br><span class="line">Knn = KNeighborsClassifier()</span><br><span class="line"></span><br><span class="line"><span class="comment"># Logistic Regression Classifier 逻辑回归</span></span><br><span class="line">Lr = LogisticRegression(C=<span class="number">1.0</span>, tol=<span class="number">1e-6</span>, multi_class=<span class="string">'multinomial'</span>, solver=<span class="string">'newton-cg'</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># Random Forest Classifier 随机森林</span></span><br><span class="line">Rf = RandomForestClassifier(n_estimators=<span class="number">100</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># SVM Classifier 支持向量机</span></span><br><span class="line">Svm = SGDClassifier()</span><br><span class="line"></span><br><span class="line"><span class="comment"># Naive Bayes 朴素贝叶斯</span></span><br><span class="line">Nb = MultinomialNB(alpha=<span class="number">0.001</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 随机森林分类方法模型</span></span><br><span class="line">Rf.fit(X_train, y_train)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'随机森林分类模型的准确度:{}\n'</span>.<span class="built_in">format</span>(Rf.score(X_test, y_test)))</span><br><span class="line">Rf_pred = Rf.predict(X[length:])</span><br><span class="line">Rf_list = Rf_pred.tolist()</span><br><span class="line"><span class="comment"># print(classification_report(y_test, Lr_pred))</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># KNN分类方法模型</span></span><br><span class="line">Knn.fit(X_train, y_train)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'KNN分类模型的准确度:{}\n'</span>.<span class="built_in">format</span>(Knn.score(X_test, y_test)))</span><br><span class="line">Knn_pred = Knn.predict(X[length:])</span><br><span class="line">Knn_list = Knn_pred.tolist()</span><br><span class="line"><span class="comment"># print(classification_report(y_test, Lr_pred))</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 逻辑回归分类方法模型</span></span><br><span class="line">Lr.fit(X_train, y_train)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'逻辑回归分类模型的准确度:{}\n'</span>.<span class="built_in">format</span>(Lr.score(X_test, y_test)))</span><br><span class="line">Lr_pred = Lr.predict(X[length:])</span><br><span class="line">Lr_list = Lr_pred.tolist()</span><br><span class="line"><span class="comment"># print(classification_report(y_test, Lr_pred))</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 朴素贝叶斯算法</span></span><br><span class="line"><span class="comment"># pipe = make_pipeline(vectorizer, Nb)</span></span><br><span class="line">Nb.fit(X_train, y_train)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'朴素贝叶斯模型的准确度:{}\n'</span>.<span class="built_in">format</span>(Nb.score(X_test, y_test)))</span><br><span class="line">Nb_pred = Nb.predict(X[length:])</span><br><span class="line">Nb_list = Nb_pred.tolist()</span><br><span class="line"><span class="comment"># print(classification_report(y_test, Nb_pred))</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 支持向量机</span></span><br><span class="line"><span class="comment"># pipe = make_pipeline(tfidf, Svm)</span></span><br><span class="line">Svm.fit(X_train, y_train)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'支持向量机模型的准确度:{}\n'</span>.<span class="built_in">format</span>(Svm.score(X_test, y_test)))</span><br><span class="line">Svm_pred = Svm.predict(X[length:])</span><br><span class="line">Svm_list = Svm_pred.tolist()</span><br><span class="line"><span class="comment"># print(classification_report(y_test, Svm_pred))</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">filename = <span class="string">"D:/Code/Python/Vscode/python与数据科学/第八次/result-Rf.txt"</span></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(filename, <span class="string">'w'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> Rf_list:</span><br><span class="line"> f.write(<span class="built_in">str</span>(i))</span><br><span class="line"> f.write(<span class="string">'\n'</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">filename = <span class="string">"D:/Code/Python/Vscode/python与数据科学/第八次/result-Knn.txt"</span></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(filename, <span class="string">'w'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> Knn_list:</span><br><span class="line"> f.write(<span class="built_in">str</span>(i))</span><br><span class="line"> f.write(<span class="string">'\n'</span>)</span><br><span class="line"></span><br><span class="line">filename = <span class="string">"D:/Code/Python/Vscode/python与数据科学/第八次/result-Lr.txt"</span></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(filename, <span class="string">'w'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> Lr_list:</span><br><span class="line"> f.write(<span class="built_in">str</span>(i))</span><br><span class="line"> f.write(<span class="string">'\n'</span>)</span><br><span class="line"></span><br><span class="line">filename = <span class="string">"D:/Code/Python/Vscode/python与数据科学/第八次/result-Nb.txt"</span></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(filename, <span class="string">'w'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> Nb_list:</span><br><span class="line"> f.write(<span class="built_in">str</span>(i))</span><br><span class="line"> f.write(<span class="string">'\n'</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">filename = <span class="string">"D:/Code/Python/Vscode/python与数据科学/第八次/result-Svm.txt"</span></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(filename, <span class="string">'w'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> Svm_list:</span><br><span class="line"> f.write(<span class="built_in">str</span>(i))</span><br><span class="line"> f.write(<span class="string">'\n'</span>)</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> Python与数据科学 </category>
</categories>
<tags>
<tag> Python </tag>
<tag> 数据科学 </tag>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
</tags>
</entry>
<entry>
<title>蛋白质功能预测实验</title>
<link href="/2023/05/14/0003-09/"/>
<url>/2023/05/14/0003-09/</url>
<content type="html"><![CDATA[<h1 id="Python与数据科学实验7"><a href="#Python与数据科学实验7" class="headerlink" title="Python与数据科学实验7"></a>Python与数据科学实验7</h1><h2 id="实验数据"><a href="#实验数据" class="headerlink" title="实验数据"></a>实验数据</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(1)训练集 : 该训练数据集包含1616条蛋白质序列,存放于文件“ProSeqs_Train.txt”。文件中每一行若以空格隔开,</span><br><span class="line">内容分别是序列ID、类标号以及蛋白质的氨基酸序列。</span><br><span class="line">(2)测试集 : 另有186条未知标签的测试数据,保存在“ProSeqs_Test.txt”文件中。每一行仅给定序列ID及其氨基酸序</span><br><span class="line">列,而每条序列的类别(1: 具有某种功能,0: 不具有该功能)未知,待建模识别。</span><br></pre></td></tr></table></figure><mark class="hl-label green">下载链接</mark> <p><a href="https://coleduck.cn/annex/Python%E4%B8%8E%E6%95%B0%E6%8D%AE%E7%A7%91%E5%AD%A6%E5%AE%9E%E9%AA%8C/Lab7.7z">data.zip</a></p><h2 id="实验目的"><a href="#实验目的" class="headerlink" title="实验目的"></a>实验目的</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">本次实验目标如下:</span><br><span class="line">(1) 设计样本的特征向量,具备一定的特征工程能力。</span><br><span class="line">(2) 利用机器学习分类算法,基于训练集构建分类器模型;</span><br><span class="line">(3) 进而将构建好的分类器模型应用于测试集,给出全体未知标签样本的分类结果,即预测氨基酸序列为功能蛋白或非功能蛋白。</span><br></pre></td></tr></table></figure><h2 id="设计思路"><a href="#设计思路" class="headerlink" title="设计思路"></a>设计思路</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(1) 具体的机器学习算法不限,以预测效果最佳为目标,追求F1 score越高越好;可以尝试多种学习模型的集成。</span><br><span class="line">(2) 需从每条序列中提取特征,表示为固定长度的向量。特征向量设计思路不限,可尝试如下:</span><br><span class="line"> (a) 氨基酸组分,即每种氨基酸在蛋白质序列中的比例,可以表示为一个20维的向量。</span><br><span class="line"> (b) 可以间隔取子序列,计算各个子序列的氨基酸组分。比如将某条蛋白质序列记为字符串pseq,则可分别计算子串</span><br><span class="line"> pseq[ : : 2]和pseq[1: :2]的氨基酸组分。依次类推,可以尝试计算各种子串pseq[i: :k] (k=2,3,4,…; i=0,</span><br><span class="line"> 1,…,k-1)的氨基酸组分。此类特征统称为k-space氨基酸组分。</span><br><span class="line"> (c) 序列上连续的两个氨基酸称为二肽,且二肽的可能种类共计20*20=400. 我们还可以考虑二肽组分。依次类推,</span><br><span class="line"> 三肽组分?…</span><br><span class="line">(3) 针对设计好的特征向量,可能是高维的,则可尝试进行特征选择、数据变换、降维等特征工程相关预处理,实现方法不限。</span><br></pre></td></tr></table></figure><h2 id="实验要求"><a href="#实验要求" class="headerlink" title="实验要求"></a>实验要求</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(1) 将预测结果保存在名为“preds.txt”的文本文件中,内容为186行, 每一行只有0 或者1,代表你的算法对测试数据</span><br><span class="line">的预测结果。预测数据顺序须与测试集“ProSeqs_Test.txt”中的样本顺序保持一致。</span><br><span class="line">(2) 将结果文件“preds.txt”和代码打包,以附件形式提交至学习通,无需提交本次实验报告文件。</span><br><span class="line">(3) 本次实验成绩评定采用竞赛机制,采用每位同学预测结果的F1 score作为本次实验成绩。</span><br></pre></td></tr></table></figure><h2 id="我的做法"><a href="#我的做法" class="headerlink" title="我的做法"></a>我的做法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 这次的准确率普遍偏低,我没能找到适合的方法</span></span><br><span class="line"><span class="comment"># 经多次测试,准确率最高值出现在了SVC + PCA降维(11维) 这里</span></span><br><span class="line"><span class="comment"># 最高值达到了0.73261,用的随机种子是666</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> csv</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">from</span> sklearn <span class="keyword">import</span> preprocessing</span><br><span class="line"><span class="keyword">from</span> sklearn <span class="keyword">import</span> svm</span><br><span class="line"><span class="keyword">from</span> sklearn.svm <span class="keyword">import</span> SVC</span><br><span class="line"><span class="keyword">from</span> sklearn <span class="keyword">import</span> model_selection</span><br><span class="line"><span class="keyword">from</span> sklearn.decomposition <span class="keyword">import</span> PCA</span><br><span class="line"><span class="keyword">from</span> sklearn.model_selection <span class="keyword">import</span> train_test_split</span><br><span class="line"><span class="keyword">from</span> sklearn.metrics <span class="keyword">import</span> classification_report, confusion_matrix</span><br><span class="line"><span class="keyword">from</span> sklearn.model_selection <span class="keyword">import</span> GridSearchCV</span><br><span class="line"><span class="keyword">from</span> sklearn.ensemble <span class="keyword">import</span> RandomForestClassifier</span><br><span class="line"><span class="keyword">from</span> sklearn <span class="keyword">import</span> preprocessing</span><br><span class="line"></span><br><span class="line"><span class="comment"># ProSeqs_Train</span></span><br><span class="line"></span><br><span class="line">aa20 = [<span class="string">'A'</span>, <span class="string">'R'</span>, <span class="string">'N'</span>, <span class="string">'D'</span>, <span class="string">'C'</span>, <span class="string">'Q'</span>, <span class="string">'E'</span>, <span class="string">'G'</span>, <span class="string">'H'</span>, <span class="string">'I'</span>, <span class="string">'L'</span>, <span class="string">'K'</span>, <span class="string">'M'</span>, <span class="string">'F'</span>, <span class="string">'P'</span>, <span class="string">'S'</span>, <span class="string">'T'</span>, <span class="string">'W'</span>, <span class="string">'Y'</span>, <span class="string">'V'</span>]</span><br><span class="line">filename = <span class="string">"D:/Code/Python/Vscode/python与数据科学/第七次/ProSeqs_Train.txt"</span></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(filename) <span class="keyword">as</span> f:</span><br><span class="line"> line = f.read().split(<span class="string">'\n'</span>)</span><br><span class="line"></span><br><span class="line">cnt = <span class="number">0</span></span><br><span class="line">data_res = [] </span><br><span class="line">data_seq = [[<span class="number">0</span> <span class="keyword">for</span> x <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">21</span>)] <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(line) - <span class="number">1</span>)]</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> line[:-<span class="number">1</span>]:</span><br><span class="line"> item = i.split()</span><br><span class="line"> data_res.append((<span class="number">1</span> <span class="keyword">if</span> item[<span class="number">1</span>] == <span class="string">'1'</span> <span class="keyword">else</span> <span class="number">0</span>))</span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> item[<span class="number">2</span>]:</span><br><span class="line"> <span class="keyword">if</span> (j <span class="keyword">not</span> <span class="keyword">in</span> aa20):</span><br><span class="line"> index = <span class="number">21</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> index = aa20.index(j)</span><br><span class="line"> data_seq[cnt][index] += <span class="number">1</span></span><br><span class="line"> cnt += <span class="number">1</span></span><br><span class="line"></span><br><span class="line">data = []</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(data_seq)):</span><br><span class="line"> listTmp = np.array(data_seq[i]).reshape(-<span class="number">1</span>, <span class="number">1</span>)</span><br><span class="line"> scaler = preprocessing.MinMaxScaler(feature_range=(<span class="number">0</span>,<span class="number">1</span>))</span><br><span class="line"> normalized_list = scaler.fit_transform(listTmp)</span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> normalized_list:</span><br><span class="line"> data.append(j[<span class="number">0</span>])</span><br><span class="line">data = np.array(data).reshape(-<span class="number">1</span>, <span class="number">21</span>)</span><br><span class="line">data_res = np.array(data_res)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># ProSeqs_Test</span></span><br><span class="line"></span><br><span class="line">filename = <span class="string">"D:/Code/Python/Vscode/python与数据科学/第七次/ProSeqs_Test.txt"</span></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(filename) <span class="keyword">as</span> f:</span><br><span class="line"> line = f.read().split(<span class="string">'\n'</span>)</span><br><span class="line"></span><br><span class="line">cnt = <span class="number">0</span></span><br><span class="line">predata = [[<span class="number">0</span> <span class="keyword">for</span> x <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">21</span>)] <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(line) - <span class="number">1</span>)]</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> line[:-<span class="number">1</span>]:</span><br><span class="line"> item = i.split()</span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> item[<span class="number">1</span>]:</span><br><span class="line"> <span class="keyword">if</span> (j <span class="keyword">not</span> <span class="keyword">in</span> aa20):</span><br><span class="line"> index = <span class="number">21</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> index = aa20.index(j)</span><br><span class="line"> predata[cnt][index] += <span class="number">1</span></span><br><span class="line"> cnt += <span class="number">1</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 将数据集分成训练集和测试集</span></span><br><span class="line">X_train, X_test, y_train, y_test = train_test_split(data, data_res, test_size=<span class="number">0.4</span>, random_state=<span class="number">666</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># PCA降维 , 21维降至11维</span></span><br><span class="line">pca = PCA(n_components=<span class="number">11</span>, svd_solver=<span class="string">'auto'</span>).fit(X_train)</span><br><span class="line">X_train_pca = pca.transform(X_train)</span><br><span class="line">X_test_pca = pca.transform(X_test)</span><br><span class="line">predata_pca = pca.transform(predata)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 随机森林模型</span></span><br><span class="line">clf = RandomForestClassifier(n_estimators=<span class="number">100</span>)</span><br><span class="line"></span><br><span class="line">clf.fit(X_train, y_train)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'随机森林 , 准确度:'</span>, end=<span class="string">'\t'</span>)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'%.5f'</span>%clf.score(X_test, y_test))</span><br><span class="line">pre1 = clf.predict(predata)</span><br><span class="line"></span><br><span class="line">clf.fit(X_train_pca, y_train)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'随机森林 + PCA降维(11维) , 准确度:'</span>, end=<span class="string">'\t'</span>)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'%.5f'</span>%clf.score(X_test_pca, y_test))</span><br><span class="line">pre2 = clf.predict(predata_pca)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># SVC模型</span></span><br><span class="line">svc = SVC(kernel=<span class="string">'linear'</span>)</span><br><span class="line"></span><br><span class="line">svc.fit(X_train, y_train)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'SVC , 准确度:'</span>, end=<span class="string">'\t'</span>)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'%.5f'</span>%svc.score(X_test, y_test))</span><br><span class="line">pre3 = svc.predict(predata)</span><br><span class="line"></span><br><span class="line">svc.fit(X_train_pca, y_train)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'SVC + PCA降维(11维) , 准确度:'</span>, end=<span class="string">'\t'</span>)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'%.5f'</span>%svc.score(X_test_pca, y_test))</span><br><span class="line">pre4 = svc.predict(predata_pca)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 随机森林 -> pre1</span></span><br><span class="line"><span class="comment"># 随机森林 + PCA -> pre2</span></span><br><span class="line"><span class="comment"># SVC -> pre3</span></span><br><span class="line"><span class="comment"># SVC + PCA -> pre4</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">filename = <span class="string">"D:/Code/Python/Vscode/python与数据科学/第七次/result.txt"</span></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(filename, <span class="string">'w'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> pre4:</span><br><span class="line"> f.write(<span class="built_in">str</span>(i))</span><br><span class="line"> f.write(<span class="string">'\n'</span>)</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> Python与数据科学 </category>
</categories>
<tags>
<tag> Python </tag>
<tag> 数据科学 </tag>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
</tags>
</entry>
<entry>
<title>数据挖掘入门分类实验</title>
<link href="/2023/05/14/0003-08/"/>
<url>/2023/05/14/0003-08/</url>
<content type="html"><![CDATA[<h1 id="Python与数据科学实验6"><a href="#Python与数据科学实验6" class="headerlink" title="Python与数据科学实验6"></a>Python与数据科学实验6</h1><h2 id="实验数据"><a href="#实验数据" class="headerlink" title="实验数据"></a>实验数据</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">该数据集包含1439条训练数据,存放于“data-train.csv”文件;</span><br><span class="line">另有160条未知标签的测试数据,保存在“data-test.csv”文件中。</span><br><span class="line">训练集数据共含与某种酒品质相关的11个(匿名)特征属性(f1~f11)和1个目标属性(target) </span><br></pre></td></tr></table></figure><mark class="hl-label green">下载链接</mark> <p><a href="https://coleduck.cn/annex/Python%E4%B8%8E%E6%95%B0%E6%8D%AE%E7%A7%91%E5%AD%A6%E5%AE%9E%E9%AA%8C/Lab6-data-train.csv">data-train.csv</a><br><a href="https://coleduck.cn/annex/Python%E4%B8%8E%E6%95%B0%E6%8D%AE%E7%A7%91%E5%AD%A6%E5%AE%9E%E9%AA%8C/Lab6-data-test.csv">data-test.csv</a></p><h2 id="实验目的"><a href="#实验目的" class="headerlink" title="实验目的"></a>实验目的</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">本次实验的目的是利用机器学习分类算法,基于训练集构建分类器模型,进而预测测试集中全体样本的分类结果,即测试</span><br><span class="line">样本的target 值:A、B 或C(品质:A 优于 B,B优于C)。</span><br></pre></td></tr></table></figure><h2 id="实验要求"><a href="#实验要求" class="headerlink" title="实验要求"></a>实验要求</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(1) 具体的机器学习算法不限,以预测效果最佳为目标。</span><br><span class="line">(2) 将预测结果保存在名为“predictions.txt”的文本文件中,内容为160行, 每一行只有A 或者B或者C,代表你的算</span><br><span class="line">法对测试数据的预测结果。预测数据顺序须与测试集“data-test.csv”中的样本顺序保持一致。</span><br><span class="line">(3) 将结果文件“predictions.txt”以附件形式提交至学习通。另外请注意:只需提交结果文件,无需提交本次实验报告</span><br><span class="line">文件。</span><br><span class="line">(4) 本次实验成绩评定采用竞赛机制,即计算每位同学预测结果的micro F1 score,然后由高到低进行排序评定相应的</span><br><span class="line">实验成绩。</span><br></pre></td></tr></table></figure><h2 id="我的做法"><a href="#我的做法" class="headerlink" title="我的做法"></a>我的做法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 经多次测试,随机森林模型 和 随机森林+PCA降维</span></span><br><span class="line"><span class="comment"># 这两种方式不相上下,不能确定哪种方法准确率更高</span></span><br><span class="line"><span class="comment"># 不过准确率最高值出现在了仅使用随机森林模型时</span></span><br><span class="line"><span class="comment"># 最高值达到了0.89583,用的随机种子是1024</span></span><br><span class="line"><span class="comment"># 代码部分只需要把路径替换成自己的路径即可使用</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> csv</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">from</span> sklearn <span class="keyword">import</span> preprocessing</span><br><span class="line"><span class="keyword">from</span> sklearn <span class="keyword">import</span> svm</span><br><span class="line"><span class="keyword">from</span> sklearn.svm <span class="keyword">import</span> SVC</span><br><span class="line"><span class="keyword">from</span> sklearn <span class="keyword">import</span> model_selection</span><br><span class="line"><span class="keyword">from</span> sklearn.decomposition <span class="keyword">import</span> PCA</span><br><span class="line"><span class="keyword">from</span> sklearn.model_selection <span class="keyword">import</span> train_test_split</span><br><span class="line"><span class="keyword">from</span> sklearn.metrics <span class="keyword">import</span> classification_report, confusion_matrix</span><br><span class="line"><span class="keyword">from</span> sklearn.model_selection <span class="keyword">import</span> GridSearchCV</span><br><span class="line"><span class="keyword">from</span> sklearn.ensemble <span class="keyword">import</span> RandomForestClassifier</span><br><span class="line"></span><br><span class="line">data = []</span><br><span class="line">label = []</span><br><span class="line">filename = <span class="string">"D:/Code/Python/Vscode/python与数据科学/第六次/data-train.csv"</span></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(filename) <span class="keyword">as</span> csvfile:</span><br><span class="line"> csv_reader = csv.reader(csvfile) <span class="comment"># 使用csv.reader读取csvfile中的文件</span></span><br><span class="line"> header = <span class="built_in">next</span>(csv_reader) <span class="comment"># 读取第一行每一列的标题</span></span><br><span class="line"> <span class="keyword">for</span> row <span class="keyword">in</span> csv_reader: <span class="comment"># 将csv 文件中的数据保存到data中</span></span><br><span class="line"> <span class="keyword">if</span> (row[-<span class="number">1</span>] == <span class="string">'A'</span>):</span><br><span class="line"> label.append(<span class="number">1</span>)</span><br><span class="line"> <span class="keyword">elif</span> (row[-<span class="number">1</span>] == <span class="string">'B'</span>):</span><br><span class="line"> label.append(<span class="number">2</span>)</span><br><span class="line"> <span class="keyword">elif</span> (row[-<span class="number">1</span>] == <span class="string">'C'</span>):</span><br><span class="line"> label.append(<span class="number">3</span>)</span><br><span class="line"> <span class="comment"># tmp = list(row[:-1]).copy()</span></span><br><span class="line"> data.append([<span class="built_in">float</span>(x) <span class="keyword">for</span> x <span class="keyword">in</span> row[:-<span class="number">1</span>]])</span><br><span class="line"></span><br><span class="line">predata = []</span><br><span class="line">filename = <span class="string">"D:/Code/Python/Vscode/python与数据科学/第六次/data-test.csv"</span></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(filename) <span class="keyword">as</span> csvfile:</span><br><span class="line"> csv_reader = csv.reader(csvfile) <span class="comment"># 使用csv.reader读取csvfile中的文件</span></span><br><span class="line"> header = <span class="built_in">next</span>(csv_reader) <span class="comment"># 读取第一行每一列的标题</span></span><br><span class="line"> <span class="keyword">for</span> row <span class="keyword">in</span> csv_reader: <span class="comment"># 将csv 文件中的数据保存到data中</span></span><br><span class="line"> predata.append(<span class="built_in">list</span>(row[<span class="number">0</span>:-<span class="number">1</span>]))</span><br><span class="line"></span><br><span class="line"><span class="comment"># 将数据集分成训练集和测试集</span></span><br><span class="line">X_train, X_test, y_train, y_test = train_test_split(data, label, test_size=<span class="number">0.2</span>, random_state=<span class="number">1024</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># PCA降维 , 11维降至8维</span></span><br><span class="line">pca = PCA(n_components=<span class="number">8</span>, svd_solver=<span class="string">'auto'</span>).fit(X_train)</span><br><span class="line">X_train_pca = pca.transform(X_train)</span><br><span class="line">X_test_pca = pca.transform(X_test)</span><br><span class="line">predata_pca = pca.transform(predata)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 随机森林模型</span></span><br><span class="line">clf = RandomForestClassifier(n_estimators=<span class="number">100</span>)</span><br><span class="line"></span><br><span class="line">clf.fit(X_train, y_train)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'随机森林 , 准确度:'</span>, end=<span class="string">'\t'</span>)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'%.5f'</span>%clf.score(X_test, y_test))</span><br><span class="line">pre1 = clf.predict(predata)</span><br><span class="line"></span><br><span class="line">clf.fit(X_train_pca, y_train)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'随机森林 + PCA降维(8维) , 准确度:'</span>, end=<span class="string">'\t'</span>)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'%.5f'</span>%clf.score(X_test_pca, y_test))</span><br><span class="line">pre2 = clf.predict(predata_pca)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># SVC模型</span></span><br><span class="line">svc = SVC(kernel=<span class="string">'linear'</span>)</span><br><span class="line"></span><br><span class="line">svc.fit(X_train, y_train)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'SVC , 准确度:'</span>, end=<span class="string">'\t'</span>)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'%.5f'</span>%svc.score(X_test, y_test))</span><br><span class="line">pre3 = svc.predict(predata)</span><br><span class="line"></span><br><span class="line">svc.fit(X_train_pca, y_train)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'SVC + PCA降维(8维) , 准确度:'</span>, end=<span class="string">'\t'</span>)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'%.5f'</span>%svc.score(X_test_pca, y_test))</span><br><span class="line">pre4 = svc.predict(predata_pca)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 随机森林 -> pre1</span></span><br><span class="line"><span class="comment"># 随机森林 + PCA -> pre2</span></span><br><span class="line"><span class="comment"># SVC -> pre3</span></span><br><span class="line"><span class="comment"># SVC + PCA -> pre4</span></span><br><span class="line"></span><br><span class="line">result = []</span><br><span class="line"><span class="comment"># 由此选择 pre1,pre2,pre3,pre4</span></span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> pre1:</span><br><span class="line"> <span class="keyword">if</span> (item == <span class="number">1</span>):</span><br><span class="line"> result.append(<span class="string">'A'</span>)</span><br><span class="line"> <span class="keyword">elif</span> (item == <span class="number">2</span>):</span><br><span class="line"> result.append(<span class="string">'B'</span>)</span><br><span class="line"> <span class="keyword">elif</span> (item == <span class="number">3</span>):</span><br><span class="line"> result.append(<span class="string">'C'</span>)</span><br><span class="line"></span><br><span class="line">filename = <span class="string">"D:/Code/Python/Vscode/python与数据科学/第六次/result.txt"</span></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(filename, <span class="string">'w'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> result:</span><br><span class="line"> f.write(i)</span><br><span class="line"> f.write(<span class="string">'\n'</span>)</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> Python与数据科学 </category>
</categories>
<tags>
<tag> Python </tag>
<tag> 数据科学 </tag>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
</tags>
</entry>
<entry>
<title>Python科学计算实践</title>
<link href="/2023/05/14/0003-07/"/>
<url>/2023/05/14/0003-07/</url>
<content type="html"><![CDATA[<h1 id="Python与数据科学实验5"><a href="#Python与数据科学实验5" class="headerlink" title="Python与数据科学实验5"></a>Python与数据科学实验5</h1><h2 id="实验目的"><a href="#实验目的" class="headerlink" title="实验目的"></a>实验目的</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">本次实验旨在了解和掌握python科学计算工具,包括numpy和scipy的数值计算、pandas数据分析、matplotlib画图</span><br><span class="line">等,具备快速高效的数据处理和一定的可视化分析能力。需掌握的相关知识点主要包括:</span><br><span class="line"></span><br><span class="line">1) numpy数组array的创建、使用,数组元素的切片,各种常见函数、通用函数(universal function)的运用,</span><br><span class="line">np.random模块组织和获取随机数据,以及numpy对文件数据的处理方法np.loadtxt()和np.savetxt()。了解微积</span><br><span class="line">分、线性代数、最优化等领域相关的scipy科学计算方法;</span><br><span class="line">2) pandas的数据结构:Series和DataFrame,以及相关数据探索分析方法;</span><br><span class="line">3) matplotlib画图:折线图、散点图、柱】状图、直方图、饼图,以及多子图布局方式。(注:请自学matplotlib</span><br><span class="line">绘图库,还可以包括seaborn)</span><br></pre></td></tr></table></figure><h2 id="实验题目"><a href="#实验题目" class="headerlink" title="实验题目"></a>实验题目</h2><h3 id="第-1-题"><a href="#第-1-题" class="headerlink" title="第(1)题"></a>第(1)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(1) 数组元素索引。利用numpy.random模块随机产生一个9行10列的二维数组,其元素要求服从标准正态分布。完成</span><br><span class="line">以下该数组的索引任务,打印输出相关结果:</span><br><span class="line"></span><br><span class="line">(a) 使用索引方式获取第2行第5列、第6行第3列的元素。</span><br><span class="line">(b) 使用切片方式获取第3行至第5行和第4列至第6列的数据。</span><br><span class="line">(c) 使用切片与整数序列索引混合的方式,获取第3行至第5行且为第1列、第2列和第4列的数据。</span><br><span class="line">(d) 使用布尔索引方法将数组中取值大于1的元素重新赋值为10.00,小于-1的元素重新赋值为-10.00,并打印输出这</span><br><span class="line"> 个新数组。</span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"></span><br><span class="line">arr = np.random.randn(<span class="number">9</span>,<span class="number">10</span>)</span><br><span class="line"><span class="built_in">print</span>(arr)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'第2行第5列: '</span>, arr[<span class="number">1</span>, <span class="number">4</span>])</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'第6行第3列: '</span>, arr[<span class="number">5</span>, <span class="number">2</span>])</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'第3行至第5行和第4列至第6列: '</span>, arr[<span class="number">2</span>:<span class="number">5</span>, <span class="number">3</span>:<span class="number">6</span>], sep=<span class="string">'\n'</span>)</span><br><span class="line">arr[arr > <span class="number">1</span>] = <span class="number">10.00</span></span><br><span class="line">arr[arr < <span class="number">1</span>] = -<span class="number">10.00</span></span><br><span class="line"><span class="built_in">print</span>(arr)</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-2-题"><a href="#第-2-题" class="headerlink" title="第(2)题"></a>第(2)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(2)利用numpy中相关模块,随机产生10000个服从 [-1,1]区间上均匀分布的实数,同时随机产生10000个服从标准正</span><br><span class="line">态分布的实数,由此获得两个一维数组,分别记为A和B。请计算下列式子的值:</span><br><span class="line"> (a) A+B</span><br><span class="line"> (b) A和B的乘积</span><br><span class="line"> (c) A/B</span><br><span class="line"> (d) exp(A)+exp(B)</span><br><span class="line"> (e) A和B的内积</span><br><span class="line"> (f)数组B全体元素的平均值,最大值,最小值。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">from</span> math <span class="keyword">import</span> e</span><br><span class="line"></span><br><span class="line">A = np.random.rand(<span class="number">10000</span>)</span><br><span class="line">A = A * <span class="number">2</span> - <span class="number">1</span></span><br><span class="line"></span><br><span class="line">B = np.random.randn(<span class="number">10000</span>)</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">'A + B = '</span>, A + B)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'A * B = '</span>, A * B)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'A / B = '</span>, A / B)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'exp(A) + exp(B) = '</span>, e ** A + e ** B)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'A与B的内积: '</span>, np.dot(A, B))</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'B的平均值: '</span>, np.<span class="built_in">sum</span>(B) / <span class="number">10000</span>)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'B的最大值: '</span>, np.<span class="built_in">max</span>(B))</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'B的最小值: '</span>, np.<span class="built_in">min</span>(B))</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-3-题"><a href="#第-3-题" class="headerlink" title="第(3)题"></a>第(3)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(3) 利用numpy.random模块,服从区间[10., 20.]上的均匀分布,随机生成一个10行5列的矩阵(二维数组)。通过</span><br><span class="line">Python编程依序完成下列任务,打印输出原数组和产生的新数组:</span><br><span class="line"></span><br><span class="line">(a)矩阵的每一行的元素都减去该行的平均值。</span><br><span class="line">(b)利用numpy.savetxt(),将经过(a)操作变换后的新数组数据保存至文本文件”dat.csv”, 保持10行5列不变,并</span><br><span class="line"> 要求小数点后保留3位,两个数据之间用逗号隔开。 </span><br><span class="line">(c)利用numpy.loadtxt()从“dat.csv”读取数组数据,原地交换当前数组的第一行和第二行数据。</span><br><span class="line">(d)要求按第2列数据对当前数组进行排序。例如,原数组为 </span><br><span class="line"> [[1 7 9]</span><br><span class="line"> [7 8 1]</span><br><span class="line"> [8 4 2]]</span><br><span class="line"> 若按第2列进行排序,结果如下:</span><br><span class="line"> [[8 4 2]</span><br><span class="line"> [1 7 9]</span><br><span class="line"> [7 8 1]]</span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"></span><br><span class="line">arr = np.random.rand(<span class="number">10</span>, <span class="number">5</span>)</span><br><span class="line">arr = arr * <span class="number">10</span> + <span class="number">10</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">'原数组: '</span>, arr, sep=<span class="string">'\n'</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">10</span>):</span><br><span class="line"> ave = np.<span class="built_in">sum</span>(arr[i, :] / <span class="number">5</span>)</span><br><span class="line"> arr[i, :] -= ave</span><br><span class="line">np.savetxt(<span class="string">"./dat.csv"</span>, arr, fmt=<span class="string">'%.3f'</span>, delimiter=<span class="string">','</span>)</span><br><span class="line"></span><br><span class="line">csv_arr = np.loadtxt(<span class="string">'./dat.csv'</span>, dtype=<span class="built_in">float</span>, delimiter=<span class="string">','</span>)</span><br><span class="line">temp = csv_arr[<span class="number">0</span>,:].copy()</span><br><span class="line">csv_arr[<span class="number">0</span>,:] = csv_arr[<span class="number">1</span>,:]</span><br><span class="line">csv_arr[<span class="number">1</span>,:] = temp</span><br><span class="line"><span class="built_in">print</span>(csv_arr, end=<span class="string">'\n\n'</span>)</span><br><span class="line"></span><br><span class="line">sorted_index=np.lexsort(csv_arr[:,<span class="number">1</span>:<span class="number">2</span>].T)</span><br><span class="line"><span class="built_in">print</span>(csv_arr[sorted_index])</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-4-题"><a href="#第-4-题" class="headerlink" title="第(4)题"></a>第(4)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(4)假设已有下列代码:</span><br><span class="line"> import numpy as np</span><br><span class="line"> import math</span><br><span class="line"> def myfun(x):</span><br><span class="line"> return math.cos(x)</span><br><span class="line"></span><br><span class="line">显而易见,函数myfun()还不是一个ufunc函数,请定义一个新函数umyfun(),使得 myfun成为一个ufunc函数。进一</span><br><span class="line">步,分别记录umyfun()和np.cos() 在计算1~100000之间共计10万个正整数的余弦值时所需的时间,比较两者的计算</span><br><span class="line">速度。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> math</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">myfun</span>(<span class="params">x</span>):</span><br><span class="line"> <span class="keyword">return</span> math.cos(x)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">umyfun</span>(<span class="params">x</span>):</span><br><span class="line"> <span class="keyword">return</span> np.cos(x)</span><br><span class="line"></span><br><span class="line">x = np.random.randint(<span class="number">1</span>, <span class="number">10</span>, <span class="number">100000</span>)</span><br><span class="line"></span><br><span class="line">start = time.time()</span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> x:</span><br><span class="line"> myfun(item)</span><br><span class="line">end = time.time()</span><br><span class="line">delta1 = end - start</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'myfun所用时间: '</span>, delta1)</span><br><span class="line"></span><br><span class="line">start = time.time()</span><br><span class="line">umyfun(x)</span><br><span class="line">end = time.time()</span><br><span class="line">delta2 = end - start</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'umyfun所用时间: '</span>, delta2)</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">'myfun用时是umyfun的 '</span>, delta1 / delta2, <span class="string">' 倍'</span>)</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-5-题"><a href="#第-5-题" class="headerlink" title="第(5)题"></a>第(5)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(5)利用scipy.integrate模块计算函数在区间[1,2]上的定积分。</span><br></pre></td></tr></table></figure><p><img src="https://s2.loli.net/2023/04/21/PugpK4s2ZGoQjyC.png" alt="1.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> scipy <span class="keyword">import</span> integrate</span><br><span class="line"><span class="keyword">from</span> math <span class="keyword">import</span> sin</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(integrate.quad(<span class="keyword">lambda</span> x : x**<span class="number">2</span> + sin(x) + x**<span class="number">0.5</span> + x**(<span class="number">1</span> / <span class="number">3</span>) + <span class="number">1</span>, <span class="number">1</span>, <span class="number">2</span>))</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-6-题"><a href="#第-6-题" class="headerlink" title="第(6)题"></a>第(6)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(6) 用pandas.DataFrame创建一个数据结构,数据结构内容如下:</span><br><span class="line"></span><br><span class="line">请编程完成以下练习:</span><br><span class="line">(a)打印出该数据结构.</span><br><span class="line">(b)用iloc()函数返回该数据结构第零排第零列([0, 0])的元素.</span><br><span class="line">(c)用head()函数输出数据结构前3行,并且打印输出。</span><br><span class="line">(d)用describe() 函数查看数据按列的统计信息,可显示数据的数量、缺失值、最小最大数、平均值、分位数,将其</span><br><span class="line"> 打印出来。</span><br><span class="line">(e)将该数据结构用values()函数转换成ndarray类型(numpy的 N 维数组对象),打印出转换好的数据。</span><br></pre></td></tr></table></figure><p><img src="https://s2.loli.net/2023/04/21/smuh3DIwzkJQvrT.png" alt="2.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"></span><br><span class="line">data = {<span class="string">'性别'</span>:[<span class="string">'男'</span>, <span class="string">'女'</span>, <span class="string">'女'</span>, <span class="string">'男'</span>, <span class="string">'男'</span>,],</span><br><span class="line"> <span class="string">'姓名'</span>:[<span class="string">'小明'</span>, <span class="string">'小红'</span>, <span class="string">'小芳'</span>, <span class="string">'大黑'</span>, <span class="string">'张三'</span>],</span><br><span class="line"> <span class="string">'年龄'</span>:[<span class="number">20</span>, <span class="number">21</span>, <span class="number">25</span>, <span class="number">24</span>, <span class="number">29</span>]}</span><br><span class="line">df = pd.DataFrame(data)</span><br><span class="line"><span class="built_in">print</span>(df, end=<span class="string">'\n\n'</span>)</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">'第零排第零列元素: '</span>, df.iloc[<span class="number">0</span>, <span class="number">0</span>], end=<span class="string">"\n\n"</span>)</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">'前三行元素: '</span>, df.head(<span class="number">3</span>), sep=<span class="string">'\n'</span>, end=<span class="string">'\n\n'</span>)</span><br><span class="line"></span><br><span class="line">desc = df.describe(include=<span class="string">'all'</span>) <span class="comment"># include='all',代表对所有列进行统计,如果不加这个参数,则只对数值列进行统计</span></span><br><span class="line"><span class="built_in">print</span>(desc, end=<span class="string">"\n\n"</span>)</span><br><span class="line"></span><br><span class="line">dataNd = df.values</span><br><span class="line"><span class="built_in">print</span>(dataNd)</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-7-题"><a href="#第-7-题" class="headerlink" title="第(7)题"></a>第(7)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(7) 利用pandas创建如下的数据框(DataFrame),完成以下问题:</span><br><span class="line"></span><br><span class="line">(a)将index为2和4的dataset值都改为II,并打印出修改后的数据框.</span><br><span class="line">(b)分别计算dataset为I和II时,x和y的平均值。</span><br><span class="line">(c)找出满足x>9.5的样本,并计算y值的平均值。</span><br></pre></td></tr></table></figure><p><img src="https://s2.loli.net/2023/04/21/j3gbcEFvr5ol2T1.png" alt="3.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"></span><br><span class="line">data = {<span class="string">'dataset'</span>:[<span class="string">'I'</span>, <span class="string">'I'</span>, <span class="string">'I'</span>, <span class="string">'I'</span>, <span class="string">'I'</span>,],</span><br><span class="line"> <span class="string">'x'</span>:[<span class="number">10.0</span>, <span class="number">8.0</span>, <span class="number">13.0</span>, <span class="number">9.0</span>, <span class="number">11.0</span>],</span><br><span class="line"> <span class="string">'y'</span>:[<span class="number">8.04</span>, <span class="number">6.95</span>, <span class="number">7.58</span>, <span class="number">8.81</span>, <span class="number">8.33</span>]}</span><br><span class="line">df = pd.DataFrame(data)</span><br><span class="line"><span class="built_in">print</span>(df, end=<span class="string">'\n\n'</span>)</span><br><span class="line"></span><br><span class="line">df.loc[<span class="number">2</span>, <span class="string">'dataset'</span>] = <span class="string">'II'</span></span><br><span class="line">df.loc[<span class="number">4</span>, <span class="string">'dataset'</span>] = <span class="string">'II'</span></span><br><span class="line"><span class="built_in">print</span>(df, end=<span class="string">'\n\n'</span>)</span><br><span class="line"></span><br><span class="line">df1 = df[[<span class="string">'x'</span>,<span class="string">'y'</span>]][df[<span class="string">'dataset'</span>] == <span class="string">'I'</span>]</span><br><span class="line">df2 = df[[<span class="string">'x'</span>,<span class="string">'y'</span>]][df[<span class="string">'dataset'</span>] == <span class="string">'II'</span>]</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'满足 dataset == I 的数据, x和y列的均值'</span>)</span><br><span class="line"><span class="built_in">print</span>(df1.mean(), end=<span class="string">"\n\n"</span>) </span><br><span class="line"><span class="built_in">print</span>(<span class="string">'满足 dataset == II 的数据, x和y列的均值'</span>)</span><br><span class="line"><span class="built_in">print</span>(df2.mean(), end=<span class="string">"\n\n"</span>) </span><br><span class="line"></span><br><span class="line">df3 = df[<span class="string">'y'</span>][df[<span class="string">'x'</span>] > <span class="number">9.5</span>]</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'满足 x > 9.5 的数据, y列的均值'</span>)</span><br><span class="line"><span class="built_in">print</span>(df3.mean(), end=<span class="string">"\n\n"</span>)</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-8-题"><a href="#第-8-题" class="headerlink" title="第(8)题"></a>第(8)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(8) 创建一个pandas的DataFrame,包含3个学生的姓名、年龄和成绩信息。计算该学生的平均成绩和年龄。用</span><br><span class="line">matplotlib分别画成绩图(并画一条平均成绩线)、年龄图(并画一条平均年龄线)。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"></span><br><span class="line">data = {<span class="string">'name'</span>:[<span class="string">'小明'</span>, <span class="string">'小红'</span>, <span class="string">'小芳'</span>, <span class="string">'大黑'</span>, <span class="string">'张三'</span>],</span><br><span class="line"> <span class="string">'age'</span>:[<span class="number">20</span>, <span class="number">21</span>, <span class="number">25</span>, <span class="number">24</span>, <span class="number">29</span>],</span><br><span class="line"> <span class="string">'score'</span>:[<span class="number">40</span>, <span class="number">76</span>, <span class="number">39</span>, <span class="number">56</span>, <span class="number">36</span>]}</span><br><span class="line">df = pd.DataFrame(data)</span><br><span class="line"><span class="built_in">print</span>(df, end=<span class="string">'\n\n'</span>)</span><br><span class="line"></span><br><span class="line">df1 = df[[<span class="string">'score'</span>]]</span><br><span class="line">df1[[<span class="string">'average score'</span>]] = df1.mean()</span><br><span class="line">df1.plot(kind=<span class="string">'line'</span>, title=<span class="string">'table1'</span>)</span><br><span class="line"></span><br><span class="line">df2 = df[[<span class="string">'age'</span>]]</span><br><span class="line">df2[[<span class="string">'average age'</span>]] = df2.mean()</span><br><span class="line">df2.plot(kind=<span class="string">'line'</span>, title=<span class="string">'table2'</span>)</span><br><span class="line"></span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-9-题"><a href="#第-9-题" class="headerlink" title="第(9)题"></a>第(9)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(9) 画一张图,包含5幅子图,布局为:第一行2幅,左边为柱状图(bar plot),右边为散点图(scatter plot);</span><br><span class="line">第二行2幅,左边为饼图(pie plot),右边为折线图(plot),第三行1幅子图,为直方图(histogram plot)。</span><br><span class="line">相关数据请自行随机创建或从网上采集。每幅子图要有相应的标题,表示什么类型的图。可参考的源文件包括:</span><br><span class="line">“histgram_plot.py”、“pie_plot.py”和“multiple_subplots.py”。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">import</span> seaborn <span class="keyword">as</span> sns</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"></span><br><span class="line">data = {<span class="string">'year'</span>:[<span class="number">1949</span>, <span class="number">1949</span>, <span class="number">1949</span>, <span class="number">1949</span>, <span class="number">1949</span>, <span class="number">1949</span>, <span class="number">1949</span>, <span class="number">1949</span>, <span class="number">1949</span>, <span class="number">1949</span>, <span class="number">1949</span>, <span class="number">1949</span>],</span><br><span class="line"> <span class="string">'month'</span>:[<span class="string">'Jan'</span>, <span class="string">'Feb'</span>, <span class="string">'Mar'</span>, <span class="string">'Apr'</span>, <span class="string">'May'</span>, <span class="string">'Jun'</span>, <span class="string">'Jul'</span>, <span class="string">'August'</span>, <span class="string">'Sep'</span>, <span class="string">'Oct'</span>, <span class="string">'Nov'</span>, <span class="string">'Dec'</span>],</span><br><span class="line"> <span class="string">'passengers'</span>:[<span class="number">10</span>, <span class="number">230</span>, <span class="number">170</span>, <span class="number">50</span>, <span class="number">90</span>, <span class="number">30</span>, <span class="number">130</span>, <span class="number">110</span>, <span class="number">70</span>, <span class="number">190</span>, <span class="number">150</span>, <span class="number">210</span>]}</span><br><span class="line">df = pd.DataFrame(data)</span><br><span class="line"><span class="built_in">print</span>(df, end=<span class="string">'\n\n'</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 柱状图</span></span><br><span class="line">plt.subplot(<span class="number">321</span>)</span><br><span class="line">x_data = df[<span class="string">'month'</span>].tolist()</span><br><span class="line">y_data = df[<span class="string">'passengers'</span>].tolist()</span><br><span class="line">plt.ylabel(<span class="string">"passengers"</span>, fontsize=<span class="number">15</span>)</span><br><span class="line">plt.xticks(rotation=<span class="number">90</span>)</span><br><span class="line">plt.bar(x_data, y_data)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 散点图</span></span><br><span class="line">plt.subplot(<span class="number">322</span>)</span><br><span class="line">plt.scatter(x_data, y_data)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 饼图</span></span><br><span class="line">plt.subplot(<span class="number">323</span>)</span><br><span class="line">x_data = df[<span class="string">'month'</span>].tolist()</span><br><span class="line">y_data = df[<span class="string">'passengers'</span>].tolist()</span><br><span class="line">plt.pie(y_data, labels=x_data, autopct=<span class="string">'%.1f%%'</span>,shadow=<span class="literal">False</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 折线图</span></span><br><span class="line">plt.subplot(<span class="number">324</span>)</span><br><span class="line">plt.plot(x_data, y_data)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 直方图</span></span><br><span class="line">plt.subplot(<span class="number">313</span>)</span><br><span class="line">x_value = np.random.randint(<span class="number">140</span>,<span class="number">180</span>,<span class="number">200</span>)</span><br><span class="line">x2_value = np.random.randint(<span class="number">140</span>,<span class="number">180</span>,<span class="number">200</span>)</span><br><span class="line">plt.hist(x_value, bins=<span class="number">10</span>,edgecolor=<span class="string">"r"</span>,histtype=<span class="string">"bar"</span>,alpha=<span class="number">0.5</span>)</span><br><span class="line"></span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-10-题"><a href="#第-10-题" class="headerlink" title="第(10)题"></a>第(10)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(10) 文件夹中的iris.csv数据集为鸢尾花数据集,内包含 3 类鸢尾花,共 150 条记录,每类各 50 个数据,每条</span><br><span class="line">记录都有 4 项特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度。程序代码iris_process.py旨在用seaborn库观察</span><br><span class="line">鸢尾花数据集内各个属性之间的关系,通过运行该代码,可以学习到seaborn创建散点图、折线图、柱状图、以及直方</span><br><span class="line">图的操作,请认真阅读代码,理解代码的含义(每运行一种类型图,需将其他类型图给注释掉),并要求在原代码的基</span><br><span class="line">础上画出花萼长度与花萼宽度之间关系的折线图。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># encoding:utf-8</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">import</span> seaborn <span class="keyword">as</span> sns</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置默认风格</span></span><br><span class="line">sns.<span class="built_in">set</span>(style=<span class="string">"darkgrid"</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 读入数据</span></span><br><span class="line">iris = pd.read_csv(<span class="string">'D:/Code/Python/Vscode/python与数据科学/第五次/iris.csv'</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置中文显示字体为黑体</span></span><br><span class="line"><span class="comment"># sns.set(font='c:/windows/fonts/simhei.ttf')</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 主题</span></span><br><span class="line"><span class="comment"># sns.set_style("whitegrid") # 白色网格背景</span></span><br><span class="line"><span class="comment"># sns.set_style("darkgrid") # 灰色网格背景</span></span><br><span class="line"><span class="comment"># sns.set_style("dark") # 灰色背景</span></span><br><span class="line"><span class="comment"># sns.set_style("white") # 白色背景</span></span><br><span class="line"><span class="comment"># sns.set_style("ticks") # 四周加边框和刻度</span></span><br><span class="line">sns.set_style(<span class="string">'whitegrid'</span>, {<span class="string">'font.sans-serif'</span>: [<span class="string">'simhei'</span>,<span class="string">'FangSong'</span>]})</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看数据大小</span></span><br><span class="line"><span class="built_in">print</span>(iris.shape)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看前十行数据</span></span><br><span class="line"><span class="built_in">print</span>(iris.head(<span class="number">10</span>))</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看数据信息</span></span><br><span class="line"><span class="built_in">print</span>(iris.info())</span><br><span class="line"><span class="comment"># 散点图</span></span><br><span class="line"><span class="comment"># ax = sns.scatterplot(x='花萼长度', y='花萼宽度', data=iris)</span></span><br><span class="line"><span class="comment"># 折线图</span></span><br><span class="line"><span class="comment"># ax = sns.lineplot(x=iris['叶片宽度'], y=iris['叶片长度'])</span></span><br><span class="line"><span class="comment"># 柱状图</span></span><br><span class="line"><span class="comment"># sns.barplot(x=iris['品种'].value_counts().index, y=iris['品种'].value_counts().values)</span></span><br><span class="line"><span class="comment"># 直方图</span></span><br><span class="line"><span class="comment"># ax = sns.distplot(iris['叶片长度'])</span></span><br><span class="line"><span class="comment"># 折线图</span></span><br><span class="line">sns.lineplot(x=<span class="string">"花萼长度"</span>, y=<span class="string">"花萼宽度"</span>, data=iris)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-11-题"><a href="#第-11-题" class="headerlink" title="第(11)题"></a>第(11)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(11) 现给你某个航班每个月份所搭载乘客数量详细数据,请你用matplotlib画出柱状图分析乘客在一年中各月份的分布:</span><br></pre></td></tr></table></figure><p><img src="https://s2.loli.net/2023/04/21/PhNRLDMHnfWXSip.png" alt="4.png"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"></span><br><span class="line">data = {<span class="string">'year'</span>:[<span class="number">1949</span>, <span class="number">1949</span>, <span class="number">1949</span>, <span class="number">1949</span>, <span class="number">1949</span>, <span class="number">1949</span>, <span class="number">1949</span>, <span class="number">1949</span>, <span class="number">1949</span>, <span class="number">1949</span>, <span class="number">1949</span>, <span class="number">1949</span>],</span><br><span class="line"> <span class="string">'month'</span>:[<span class="string">'Jan'</span>, <span class="string">'Feb'</span>, <span class="string">'Mar'</span>, <span class="string">'Apr'</span>, <span class="string">'May'</span>, <span class="string">'Jun'</span>, <span class="string">'Jul'</span>, <span class="string">'August'</span>, <span class="string">'Sep'</span>, <span class="string">'Oct'</span>, <span class="string">'Nov'</span>, <span class="string">'Dec'</span>],</span><br><span class="line"> <span class="string">'passengers'</span>:[<span class="number">112</span>, <span class="number">118</span>, <span class="number">132</span>, <span class="number">129</span>, <span class="number">121</span>, <span class="number">112</span>, <span class="number">96</span>, <span class="number">145</span>, <span class="number">111</span>, <span class="number">105</span>, <span class="number">106</span>, <span class="number">99</span>]}</span><br><span class="line">df = pd.DataFrame(data)</span><br><span class="line"><span class="built_in">print</span>(df, end=<span class="string">'\n\n'</span>)</span><br><span class="line"> </span><br><span class="line">x_data = df[<span class="string">'month'</span>].tolist()</span><br><span class="line">y_data = df[<span class="string">'passengers'</span>].tolist()</span><br><span class="line"></span><br><span class="line">plt.title(<span class="string">"the number of passengers in every month"</span>, fontsize=<span class="number">20</span>)</span><br><span class="line">plt.xlabel(<span class="string">"month"</span>, fontsize=<span class="number">15</span>)</span><br><span class="line">plt.ylabel(<span class="string">"passengers"</span>, fontsize=<span class="number">15</span>)</span><br><span class="line">plt.bar(x_data, y_data)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><hr>]]></content>
<categories>
<category> Python与数据科学 </category>
</categories>
<tags>
<tag> Python </tag>
<tag> 数据科学 </tag>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
</tags>
</entry>
<entry>
<title>模块与面向对象编程</title>
<link href="/2023/05/14/0003-06/"/>
<url>/2023/05/14/0003-06/</url>
<content type="html"><![CDATA[<h1 id="Python与数据科学实验4"><a href="#Python与数据科学实验4" class="headerlink" title="Python与数据科学实验4"></a>Python与数据科学实验4</h1><h2 id="实验目的"><a href="#实验目的" class="headerlink" title="实验目的"></a>实验目的</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">本次实验旨在了解Python的模块、包、类等概念,熟悉常用模块的用法,学会自定义模块,理解Python的</span><br><span class="line">程序组织方式,具备面向对象的编程能力。需掌握的相关知识点主要包括:</span><br><span class="line"></span><br><span class="line">1) 模块及其使用:为最高级别的程序组织单元,将程序代码和数据封装起来以便重用;具有一定功能的程</span><br><span class="line">序块,分别用不同的文件名(“*.py”文件)存放,使代码更容易维护和管理;导入模块的方式:import </span><br><span class="line">module_name 或 import module_name as * 或 from module_name import *…。</span><br><span class="line">常见模块包括:random、time、os、sys、math、string、re等</span><br><span class="line">另外,Python脚本和模块都是一个以.py扩展名文件,如何区分?很多脚本的最后都有一段类似下面的判</span><br><span class="line">断语句,限制只能以脚本方式运行,不作为模块使用:</span><br><span class="line">if __name__ == '__main__':</span><br><span class="line"> 执行语句… </span><br><span class="line"></span><br><span class="line">2) 包:Python文件的一种组织方式,就是将几个功能相近的模块可组成一个Python包,存放到一个目录</span><br><span class="line">结构中,通过输入包的路径来调用包中模块的相应对象,如变量,函数与类等等。要创建一个包,就要建</span><br><span class="line">一个与包名同名的目录,接着在该目录下创建“__init__. py”文件,该文件是包的初始化文件,可以为</span><br><span class="line">空,也可定义相关代码;接着将相关的模块放入这个目录下,这样就创建一个包,这个目录下的模块就属</span><br><span class="line">于这个包。</span><br><span class="line">常见的包(package)有:numpy、scipy、matplotlib、pandas、sklearn等</span><br><span class="line"></span><br><span class="line">3) 类与面向对象编程:类是一种描述相同属性与方法的对象的集合。类和对象是面向对象编程的两个主要</span><br><span class="line">方面,类创建一个数据结构新类型,而对象是这个类的实例。一个简单例子如下:</span><br><span class="line"></span><br><span class="line">Bird类的定义</span><br><span class="line">class Bird():</span><br><span class="line"> def __init__(self):</span><br><span class="line"> self.hungry = True</span><br><span class="line"> def eat(self):</span><br><span class="line"> if self.hungry:</span><br><span class="line"> print('Aaaah...')</span><br><span class="line"> self.hungry = False</span><br><span class="line"> else:</span><br><span class="line"> print('No,thanks!')</span><br><span class="line"></span><br><span class="line">类的实例化,即对象的创建</span><br><span class="line">>>> b1=Bird()</span><br><span class="line">>>> b1.eat ()</span><br><span class="line">Aaaah...</span><br><span class="line">>>> b1.eat ()</span><br><span class="line">No,thanks!</span><br><span class="line">>>> b1.eat ()</span><br><span class="line">No,thanks!</span><br><span class="line">>>> b1.hungry</span><br><span class="line">False</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="实验题目"><a href="#实验题目" class="headerlink" title="实验题目"></a>实验题目</h2><h3 id="第-1-题"><a href="#第-1-题" class="headerlink" title="第(1)题"></a>第(1)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(1) 了解时间模块time和datetime,在交互式环境中执行以下任务:</span><br><span class="line">(a) 利用time.time()获取当前的时间戳。</span><br><span class="line">(b) 用datetime.date.today()获取当前的日期。</span><br><span class="line">(c) 自行查询相关使用方法,利用datetime模块返回30天前的日期。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> datetime</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(time.time())</span><br><span class="line"><span class="built_in">print</span>(datetime.date.today())</span><br><span class="line"><span class="built_in">print</span>(datetime.date.today()-datetime.timedelta(days=<span class="number">30</span>))</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-2-题"><a href="#第-2-题" class="headerlink" title="第(2)题"></a>第(2)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(2) 数据随机存储,掌握os与random模块的用法以及文件读写方法。</span><br><span class="line">定义一个函数fs(dirname,s),其中参数dirname表示文件夹路径名,s为字符串,表示需要保存的数据。</span><br><span class="line">函数fs的功能是随机地将字符串s存储到dirname路径下某个文本文件(“*.txt”文件)中。假如dirname路</span><br><span class="line">径下已有”a.txt”、 ”b.txt”、 ”c.txt”三个或更多文本文件,字符串s可能被保存到”a.txt”,或”b.</span><br><span class="line">txt”,或 ”c.txt”,或其他文件,机会是相同的,并且不能覆盖原有的文本文件。如果dirname路径下不</span><br><span class="line">存在任何文本文件,则新创建“new.txt”文件来保存字符串s。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">fs</span>(<span class="params">dirname, s</span>):</span><br><span class="line"> all_txt = []</span><br><span class="line"> <span class="keyword">for</span> item <span class="keyword">in</span> os.listdir(dirname):</span><br><span class="line"> <span class="keyword">if</span> (os.path.basename(item)[-<span class="number">4</span>:] == <span class="string">'.txt'</span>):</span><br><span class="line"> all_txt.append(os.path.join(dirname, item))</span><br><span class="line"></span><br><span class="line"> pos = random.randint(<span class="number">0</span>, <span class="built_in">len</span>(all_txt) - <span class="number">1</span>)</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'随机到的文件名: '</span>, all_txt[pos])</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(all_txt[pos], <span class="string">'a'</span>, encoding=<span class="string">"utf-8"</span>) <span class="keyword">as</span> f:</span><br><span class="line"> f.write(s)</span><br><span class="line"></span><br><span class="line">fs(<span class="string">'D:/Code/Python/Vscode/python与数据科学/第四次/testdir'</span>, <span class="string">'Hello Coleduck'</span>)</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-3-题"><a href="#第-3-题" class="headerlink" title="第(3)题"></a>第(3)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(3) 类的定义以及实例化测试。</span><br><span class="line"></span><br><span class="line">要求定义一个学生类Student,含有下面的类属性:</span><br><span class="line">(a)姓名name</span><br><span class="line">(b)年龄age</span><br><span class="line">(c)成绩scores, 类型为列表或元组,形如(语文,数学,英语)</span><br><span class="line"></span><br><span class="line">类方法:</span><br><span class="line">(a)获取学生的姓名:get_name() </span><br><span class="line">(b)获取学生的年龄:get_age() </span><br><span class="line">(c)返回3门科目中最高的分数: get_course() </span><br><span class="line"></span><br><span class="line">写好类以后,给定1个同学进行实例化测试,例如:</span><br><span class="line">zm = Student('zhangming', 20, [69,88,100])</span><br><span class="line"></span><br><span class="line">返回结果:</span><br><span class="line">zhangming</span><br><span class="line">20</span><br><span class="line">100</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Student</span>:</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, name, age, scores</span>):</span><br><span class="line"> self.name = name</span><br><span class="line"> self.age = age</span><br><span class="line"> self.scores = scores</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">get_name</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">return</span> self.name</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">get_age</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">return</span> self.age</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">get_course</span>(<span class="params">self</span>):</span><br><span class="line"> maxScore = -<span class="number">1</span></span><br><span class="line"> <span class="keyword">for</span> item <span class="keyword">in</span> self.scores:</span><br><span class="line"> <span class="keyword">if</span> (item > maxScore):</span><br><span class="line"> maxScore = item</span><br><span class="line"> <span class="keyword">return</span> maxScore</span><br><span class="line"> </span><br><span class="line">zm = Student(<span class="string">'zhangming'</span>, <span class="number">20</span>, [<span class="number">69</span>, <span class="number">88</span>, <span class="number">100</span>])</span><br><span class="line"><span class="built_in">print</span>(zm.get_name())</span><br><span class="line"><span class="built_in">print</span>(zm.get_age())</span><br><span class="line"><span class="built_in">print</span>(zm.get_course())</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-4-题"><a href="#第-4-题" class="headerlink" title="第(4)题"></a>第(4)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(4) 通过Python包与模块的创建,理解Python项目的组织结构。</span><br><span class="line"> 创建一个包(Package),并命名为“mypack”,注意包的目录下需要包含“__init__. py”文件。在</span><br><span class="line"> “mypack”目录下创建“aa.py”文件以及一个名为“subpack”的子包,在子包“subpack”下创建“bb.</span><br><span class="line"> py”文件。最后创建一个和“mypack”同级的“test.py”文件。项目结构如下:</span><br><span class="line"> test.py</span><br><span class="line"> mypack</span><br><span class="line"> |-- __init__.py</span><br><span class="line"> |-- aa.py</span><br><span class="line"> |-- subpack</span><br><span class="line"> |-- __init__.py</span><br><span class="line"> |-- bb.py</span><br><span class="line">其中, 需将各个“*.py”源代码具体定义为:(i)在“aa.py”中定义一个函数add(x, y),该方法能够打印</span><br><span class="line">输出x、y的两数之和;(ii) 在“bb.py”中定义一个函数sub(x, y),该方法能够打印输出x、y的两数之</span><br><span class="line">差;(iii)在“mypack”的“__init__. py”文件中定义两个变量a和b,并为其赋值a=2, b=1;(iv)在</span><br><span class="line">“test.py”文件中定义两个变量m和n,并为其赋值m=4, n=3。且要求在“test.py”文件中,进行如下操作:</span><br><span class="line">(a)使用from ... import ...的方式导入模块“bb.py”中的sub(x, y)方法,将m、n传入sub(x,y)方法</span><br><span class="line">中,得到输出结果;</span><br><span class="line">(b)使用from ... import ...的方式导入模块“aa.py”中的add(x,y)方法,将m、n传入add(x,y)方法</span><br><span class="line">中,得到输出结果;</span><br><span class="line">(c)使用from ... import ...的方式导入“mypack”里“__init__. py”文件的a、b,将a、b传入add(x,y)</span><br><span class="line">方法中,得到输出结果。</span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># mypack -> __init__.py</span></span><br><span class="line"><span class="comment"># ---------------------- #-</span></span><br><span class="line">a = <span class="number">2</span></span><br><span class="line">b = <span class="number">1</span></span><br><span class="line"><span class="comment"># ---------------------- #-</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mypack -> aa.py</span></span><br><span class="line"><span class="comment"># ---------------------- #-</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">add</span>(<span class="params">x, y</span>):</span><br><span class="line"> <span class="keyword">return</span> x + y</span><br><span class="line"><span class="comment"># ---------------------- #-</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># subpack -> bb.py</span></span><br><span class="line"><span class="comment"># ---------------------- #-</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sub</span>(<span class="params">x, y</span>):</span><br><span class="line"> <span class="keyword">return</span> x - y</span><br><span class="line"><span class="comment"># ---------------------- #-</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># test.py</span></span><br><span class="line"><span class="comment"># ---------------------- #-</span></span><br><span class="line"><span class="keyword">from</span> mypack.aa <span class="keyword">import</span> add</span><br><span class="line"><span class="keyword">from</span> mypack.subpack.bb <span class="keyword">import</span> sub</span><br><span class="line"><span class="keyword">from</span> mypack <span class="keyword">import</span> a, b</span><br><span class="line"></span><br><span class="line">m = <span class="number">4</span></span><br><span class="line">n = <span class="number">3</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">'m - n = '</span>, sub(m, n))</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'m + n = '</span>, add(m, n))</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'a + b = '</span>, add(a, b))</span><br><span class="line"><span class="comment"># ---------------------- #-</span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-5-题"><a href="#第-5-题" class="headerlink" title="第(5)题"></a>第(5)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(5) 类成员的访问以及实例化测试。</span><br><span class="line"> 定义一个计数器类Counter,包括的变量及方法: (i)首先定义两个类变量,分别为:公开变量</span><br><span class="line"> publicCount,为其赋初始值0;私有变量secretCount(私有变量的命名方式为:</span><br><span class="line"> __variableName),为其赋初始值0;(ii)定义方法count():能够使得私有变量secretCount和共有</span><br><span class="line"> 变量publicCount都自增1,并打印输出私有变量secretCount的值。</span><br><span class="line">接下来,进行实例化测试,创建类的实例对象,形如counter = Counter(),并进行以下操作:</span><br><span class="line">(a)使用类对象调用count()方法;</span><br><span class="line">(b)尝试使用类对象直接调用私有变量secretCount。如果报错,思考如何使用类对象直接调用私有属性,并 </span><br><span class="line">打印输出结果。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Counter</span>:</span><br><span class="line"> secret = <span class="built_in">property</span>()</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self</span>):</span><br><span class="line"> self.public = <span class="number">0</span></span><br><span class="line"> self.__secret = <span class="number">0</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">count</span>(<span class="params">self</span>):</span><br><span class="line"> self.public += <span class="number">1</span></span><br><span class="line"> self.__secret += <span class="number">1</span></span><br><span class="line"> <span class="built_in">print</span>(self.__secret)</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">get_secret</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">return</span> self.__secret</span><br><span class="line"></span><br><span class="line">counter = Counter()</span><br><span class="line">counter.count()</span><br><span class="line"><span class="comment">#print(counter.__secret) #报错</span></span><br><span class="line"><span class="built_in">print</span>(counter.get_secret())</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-6-题"><a href="#第-6-题" class="headerlink" title="第(6)题"></a>第(6)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(6) 模块文件中定义类及其实例化。</span><br><span class="line"> 首先,创建一个名为“mc.py”的模块文件。在该模块文件中,编写一个通用的人员类(person),该类具</span><br><span class="line"> 有姓名(Name)、年龄(Age)、性别(Sex)等私有属性,如Name的私有属性可以写为“self.</span><br><span class="line"> __name”。为保护个人隐私,person类的所有数据属性均需定义为私有属性。然后,对person 类进行继</span><br><span class="line"> 承得到一个学生类(student),该类能够存放学生任意多门课的成绩(这里门数不定),并能求出平均</span><br><span class="line"> 成绩。最后,另外创建一个主文件“test.py”,以from…import…方式导入student类,并给出三位学生</span><br><span class="line"> 的student实例,要求他们的课程门数不同,在实例化测试中对student类的功能进行验证。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment"># mc.py</span></span><br><span class="line"><span class="comment"># ---------------------- #-</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">person</span>:</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, name, age, sex</span>):</span><br><span class="line"> self.__name = name</span><br><span class="line"> self.__age = age</span><br><span class="line"> self.__sex = sex</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">get_name</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">return</span> self.__name</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">get_age</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">return</span> self.__age</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">get_sex</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">return</span> self.__sex</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">student</span>(<span class="title class_ inherited__">person</span>):</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, name, age, sex, *scores</span>):</span><br><span class="line"> <span class="built_in">super</span>(student, self).__init__(name, age, sex)</span><br><span class="line"> self.scores = scores</span><br><span class="line"> self.ave = <span class="built_in">sum</span>(scores) / <span class="built_in">len</span>(scores)</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">info</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'姓名:'</span>, self.get_name())</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'年龄:'</span>, self.get_age())</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'性别:'</span>, self.get_sex())</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(self.scores)):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'第'</span>, i+<span class="number">1</span>, <span class="string">'门成绩:'</span>, self.scores[i])</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'平均成绩:'</span>, self.ave)</span><br><span class="line"><span class="comment"># ---------------------- #-</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># test.py</span></span><br><span class="line"><span class="comment"># ---------------------- #-</span></span><br><span class="line"><span class="keyword">from</span> mc <span class="keyword">import</span> student</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> stu1 = student(<span class="string">'coleduck1'</span>, <span class="number">18</span>, <span class="string">'男'</span>, <span class="number">59</span>, <span class="number">60</span>, <span class="number">61</span>)</span><br><span class="line"> stu2 = student(<span class="string">'coleduck2'</span>, <span class="number">19</span>, <span class="string">'男'</span>, <span class="number">49</span>, <span class="number">51</span>)</span><br><span class="line"> stu3 = student(<span class="string">'coleduck3'</span>, <span class="number">20</span>, <span class="string">'男'</span>, <span class="number">78</span>, <span class="number">79</span>, <span class="number">80</span>, <span class="number">81</span>, <span class="number">82</span>)</span><br><span class="line"> stu1.info()</span><br><span class="line"> stu2.info()</span><br><span class="line"> stu3.info()</span><br><span class="line"><span class="comment"># ---------------------- #-</span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-7-题"><a href="#第-7-题" class="headerlink" title="第(7)题"></a>第(7)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(7) 定义一个高维空间样本点集类HDPoints,须包含以下数据属性与方法属性:</span><br><span class="line"></span><br><span class="line">(a)数据属性self.points:类型为列表,由多个子列表构成,每个子列表表示高维空间中的一个数据点,且 </span><br><span class="line"> 数据维度可以任意,并通过初始化构造函数获得。</span><br><span class="line">(b)方法属性centerpoint(self):计算点集的中心点。</span><br><span class="line">(c)方法属性minkowski (self, x, y, p):计算两点x和y之间的闵可夫斯基距离,p为非负整数,用p=0情</span><br><span class="line"> 形表示切比雪夫距离。由此定义的距离称为p-闵氏距离,其数学定义如下:</span><br><span class="line">(d)方法属性farthestpoint(self, p):找出离中心点p-闵氏距离最远的点,返回在self.points中的下标</span><br><span class="line"> 以及最大距离。</span><br><span class="line">(e)方法属性farthest2points(self, p):找出点集self.points中p-闵氏距离最远的两点,返回两点在</span><br><span class="line"> self.points中的下标及其最大距离。</span><br><span class="line"></span><br><span class="line">接下来,实例化类HDPoints,利用random模块,随机产生至少50个高维空间数据点,样本点的维度至少在5以</span><br><span class="line">上,且每个分量取值服从区间[0,1]上的均匀分布。同时,随机产生一个0~5之间的一个非负整数,赋值传递</span><br><span class="line">给p-闵氏距离函数中的参数p,对HDPoints实例对象的全部自定义方法属性(即centerpoint()、minkowski</span><br><span class="line">()、farthestpoint()和farthest2points())进行功能测试。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> random</span><br><span class="line"></span><br><span class="line"><span class="comment"># 10维坐标点</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">HDPoints</span>:</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, points</span>):</span><br><span class="line"> self.points = points</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">centerpoint</span>(<span class="params">self</span>):</span><br><span class="line"> center_point = [<span class="number">10</span> <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">10</span>)]</span><br><span class="line"> tot = <span class="built_in">len</span>(self.points)</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> self.points:</span><br><span class="line"> center_point[<span class="number">0</span>] += i[<span class="number">0</span>]</span><br><span class="line"> center_point[<span class="number">1</span>] += i[<span class="number">1</span>]</span><br><span class="line"> center_point[<span class="number">2</span>] += i[<span class="number">2</span>]</span><br><span class="line"> center_point[<span class="number">3</span>] += i[<span class="number">3</span>]</span><br><span class="line"> center_point[<span class="number">4</span>] += i[<span class="number">4</span>]</span><br><span class="line"> center_point[<span class="number">5</span>] += i[<span class="number">5</span>]</span><br><span class="line"> center_point[<span class="number">6</span>] += i[<span class="number">6</span>]</span><br><span class="line"> center_point[<span class="number">7</span>] += i[<span class="number">7</span>]</span><br><span class="line"> center_point[<span class="number">8</span>] += i[<span class="number">8</span>]</span><br><span class="line"> center_point[<span class="number">9</span>] += i[<span class="number">9</span>]</span><br><span class="line"> center_point = [x / tot <span class="keyword">for</span> x <span class="keyword">in</span> center_point]</span><br><span class="line"> <span class="keyword">return</span> center_point</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">minkowski</span>(<span class="params">self, x, y, p</span>):</span><br><span class="line"> p_dist = <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span> (p == <span class="number">0</span>): <span class="comment">#切比雪夫距离</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">10</span>):</span><br><span class="line"> p_dist = <span class="built_in">max</span>(p_dist, <span class="built_in">abs</span>(x[i] - y[i]))</span><br><span class="line"> <span class="keyword">elif</span> (p > <span class="number">0</span>):</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">10</span>):</span><br><span class="line"> p_dist += <span class="built_in">abs</span>(x[i] - y[i]) ** p</span><br><span class="line"> p_dist ** (<span class="number">1</span> / p)</span><br><span class="line"> <span class="keyword">return</span> p_dist</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">farthestpoint</span>(<span class="params">self, p</span>):</span><br><span class="line"> max_dist = -<span class="number">1</span></span><br><span class="line"> center_point = self.centerpoint()</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(self.points)):</span><br><span class="line"> cur_dist = self.minkowski(self.points[i], center_point, p)</span><br><span class="line"> <span class="keyword">if</span> (cur_dist > max_dist):</span><br><span class="line"> max_dist = cur_dist</span><br><span class="line"> max_pos = i</span><br><span class="line"> <span class="keyword">return</span> max_pos, max_dist</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">farthest2points</span>(<span class="params">self, p</span>):</span><br><span class="line"> max_dist = -<span class="number">1</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(self.points)):</span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(i + <span class="number">1</span>, <span class="built_in">len</span>(self.points)):</span><br><span class="line"> cur_dist = self.minkowski(self.points[i], self.points[j], p)</span><br><span class="line"> <span class="keyword">if</span> (cur_dist > max_dist):</span><br><span class="line"> max_dist = cur_dist</span><br><span class="line"> pos1 = i</span><br><span class="line"> pos2 = j</span><br><span class="line"> <span class="keyword">return</span> pos1, pos2, max_dist</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line"> points = []</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">100</span>): <span class="comment"># 维度:10</span></span><br><span class="line"> point = []</span><br><span class="line"> <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">10</span>):</span><br><span class="line"> point.append(random.random())</span><br><span class="line"> points.append(point)</span><br><span class="line"></span><br><span class="line"> obj = HDPoints(points)</span><br><span class="line"> p = random.randint(<span class="number">0</span>, <span class="number">5</span>)</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'已生成100个10维的点的集合'</span>)</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'本次模拟随机产生的p-闵氏距离为:'</span>, p)</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'这组点集中的中心点是:'</span>, obj.centerpoint())</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'这组点集中离中心点p-闵氏距离最远的点的下标以及距离是:'</span>, obj.farthestpoint(p))</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'这组点集中p-闵氏距离最远的两点的下标以及距离是:'</span>, obj.farthest2points(p))</span><br><span class="line"></span><br><span class="line">main()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-8-题"><a href="#第-8-题" class="headerlink" title="第(8)题"></a>第(8)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(8) 请定义一个Cylinder类,具体要求为:</span><br><span class="line">(1)每个Cylinder类对象可以存储一个圆柱体(属性包括半径和高);</span><br><span class="line">(2)具有用于初始化半径和高的构造方法;</span><br><span class="line">(3)具有计算圆柱体体积的方法GetVolume。</span><br><span class="line">然后,进行实例化测试,输入输出格式要求</span><br><span class="line">(a)输入格式: 分两行分别输入半径和高;</span><br><span class="line">(b)输出格式:第一行输出半径和高,第二行输出体积。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Cylinder</span>:</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, radius, height</span>):</span><br><span class="line"> self.r = radius</span><br><span class="line"> self.h = height</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">GetVolume</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">return</span> <span class="number">3.1415926</span> * self.r ** <span class="number">2</span> * self.h</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">GetInfo</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'该圆柱体的底面半径为:'</span>, self.r, <span class="string">' 高为:'</span>, self.h)</span><br><span class="line"> <span class="built_in">print</span>(self.GetVolume())</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line"> test = Cylinder(<span class="built_in">float</span>(<span class="built_in">input</span>(<span class="string">'请输入圆柱体的底面半径r:'</span>)), </span><br><span class="line"> <span class="built_in">float</span>(<span class="built_in">input</span>(<span class="string">'请输入圆柱体的高h:'</span>)))</span><br><span class="line"> <span class="comment"># r = input('请输入圆柱体的底面半径r:')</span></span><br><span class="line"> <span class="comment"># h = input('请输入圆柱体的高h:')</span></span><br><span class="line"> test.GetInfo()</span><br><span class="line"></span><br><span class="line">main()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-9-题"><a href="#第-9-题" class="headerlink" title="第(9)题"></a>第(9)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(9) 创建SchoolPerson类,设置姓名、性别、年龄等三个属性;</span><br><span class="line">创建学生类Student,继承自SchoolPerson类,添加额外两个属性:班级class、学号sno。添加方法:打印</span><br><span class="line">学生的所有信息print_info方法。</span><br><span class="line">创建教师类Teacher,继承自SchoolPerson类,添加额外两个属性:部门department、工号cno。添加方</span><br><span class="line">法:打印教师的所有信息print_info方法。</span><br><span class="line">并定义学生类、教师类的对象,然后分别调用print_info方法,实现各自对象属性信息的输出。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">SchoolPerson</span>:</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, name, sex, age</span>):</span><br><span class="line"> self.name = name</span><br><span class="line"> self.sex = sex</span><br><span class="line"> self.age = age</span><br><span class="line"> </span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Student</span>(<span class="title class_ inherited__">SchoolPerson</span>):</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, name, sex, age, classroom, sno</span>):</span><br><span class="line"> <span class="built_in">super</span>(Student, self).__init__(name, sex, age)</span><br><span class="line"> self.classroom = classroom</span><br><span class="line"> self.sno = sno</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">print_info</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'姓名:'</span>, self.name)</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'性别:'</span>, self.sex)</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'年龄:'</span>, self.age)</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'班级:'</span>, self.classroom)</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'学号:'</span>, self.sno)</span><br><span class="line"> </span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Teacher</span>(<span class="title class_ inherited__">SchoolPerson</span>):</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, name, sex, age, department, cno</span>):</span><br><span class="line"> <span class="built_in">super</span>(Teacher, self).__init__(name, sex, age)</span><br><span class="line"> self.department = department</span><br><span class="line"> self.cno = cno</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">print_info</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'姓名:'</span>, self.name)</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'性别:'</span>, self.sex)</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'年龄:'</span>, self.age)</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'部门:'</span>, self.department)</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'工号:'</span>, self.cno)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line"> stu = Student(<span class="string">'柯尔鸭1'</span>, <span class="string">'男'</span>, <span class="number">19</span>, <span class="string">'计科2102'</span>, <span class="string">'2135020717'</span>)</span><br><span class="line"> tch = Teacher(<span class="string">'柯尔鸭2'</span>, <span class="string">'男'</span>, <span class="number">39</span>, <span class="string">'浙江工商大学'</span>, <span class="string">'C1122'</span>)</span><br><span class="line"> stu.print_info()</span><br><span class="line"> tch.print_info() </span><br><span class="line"></span><br><span class="line">main()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-10-题"><a href="#第-10-题" class="headerlink" title="第(10)题"></a>第(10)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(10) 创建类MyMath,计算分别定义求圆的周长、面积和球的表面积、体积的方法,结果保留两位小数。若输</span><br><span class="line">入的是非数字,则输出:请输入数字!可以导入math包。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> math <span class="keyword">import</span> pi</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MyMath</span>:</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, radius</span>):</span><br><span class="line"> self.r = radius</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">circumference</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">round</span>(<span class="number">2</span> * pi * self.r, <span class="number">2</span>)</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">area</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">round</span>(pi * self.r ** <span class="number">2</span>, <span class="number">2</span>)</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">surface</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">round</span>(<span class="number">4</span> * pi * self.r ** <span class="number">2</span>, <span class="number">2</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">volume</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">round</span>(<span class="number">4</span> * pi * self.r ** <span class="number">3</span> / <span class="number">3</span>, <span class="number">2</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">True</span>):</span><br><span class="line"> num = <span class="built_in">input</span>(<span class="string">'请输入半径r:'</span>)</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> f = <span class="built_in">float</span>(num)</span><br><span class="line"> obj = MyMath(f)</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'以r为半径的圆周长:'</span>, obj.circumference())</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'以r为半径的圆面积:'</span>, obj.area())</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'以r为半径的球表面积:'</span>, obj.surface())</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'以r为半径的球体积:'</span>, obj.volume())</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">except</span> ValueError:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"请输入数字!"</span>)</span><br><span class="line"></span><br><span class="line">main()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><hr>]]></content>
<categories>
<category> Python与数据科学 </category>
</categories>
<tags>
<tag> Python </tag>
<tag> 数据科学 </tag>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
</tags>
</entry>
<entry>
<title>Python文件操作与数据读取</title>
<link href="/2023/05/14/0003-05/"/>
<url>/2023/05/14/0003-05/</url>
<content type="html"><![CDATA[<h1 id="Python与数据科学实验3"><a href="#Python与数据科学实验3" class="headerlink" title="Python与数据科学实验3"></a>Python与数据科学实验3</h1><h2 id="实验目的"><a href="#实验目的" class="headerlink" title="实验目的"></a>实验目的</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">本次实验旨在了解Python的文件数据操作方法,理解和掌握数据存取的各种方式。需掌握的相关知识点主要包括:</span><br><span class="line">1) 文件数据读写:掌握文件的打开(open)以及打开模式(’r’,’w’和’a’)、读(read、readline、readlines)、</span><br><span class="line">写(write、writelines)方式,并学会with …. as句法,以及数据类型的转化、格式化处理和保存。</span><br><span class="line">2) 文件管理:学会应用python的os、os.path、shutil等模块进行文件批量管理。</span><br><span class="line">3) 数据永久存储:pickle模块的dump和load方法。注意此时文件对象的打开模式应为二进制形式(‘rb’或‘wb’).</span><br></pre></td></tr></table></figure><h2 id="实验题目"><a href="#实验题目" class="headerlink" title="实验题目"></a>实验题目</h2><h3 id="第-1-题"><a href="#第-1-题" class="headerlink" title="第(1)题"></a>第(1)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(1) 文本文件“info_stocks.txt”中每一行的name对应股票名称,shares对应多少股,price对应该只股票的单价。</span><br><span class="line"> (a) 请计算每只股票的总价,并按总价从大到小进行排序(程序中要求含lambda函数) ,将所有股票的名称、单</span><br><span class="line"> 价、总价依次打印输出。</span><br><span class="line"> (b) 要求使用Python内置函数filter过滤出单价大于80的股票有哪些? 并将符合条件的股票名称、单价、总价打</span><br><span class="line"> 印输出。</span><br><span class="line"></span><br><span class="line">info_stocks.txt:</span><br><span class="line"></span><br><span class="line">'name': 'IBM', 'shares': 100, 'price': 91.1</span><br><span class="line">'name': 'AAPL', 'shares': 50, 'price': 543.22</span><br><span class="line">'name': 'FB', 'shares': 200, 'price': 21.09</span><br><span class="line">'name': 'HPQ', 'shares': 35, 'price': 31.75</span><br><span class="line">'name': 'YHOO', 'shares': 45, 'price': 16.35</span><br><span class="line">'name': 'ACME', 'shares': 75, 'price': 115.65</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">'D:/Code/Python/Vscode/python与数据科学/第三次/info_stocks.txt'</span>, <span class="string">'r'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> data = f.read()</span><br><span class="line">data = data.split(<span class="string">'\n'</span>)</span><br><span class="line">data.remove(<span class="string">''</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> x <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(data)):</span><br><span class="line"> a = re.findall(<span class="string">"\d+\.?\d*"</span>, data[x]) <span class="comment"># 正则表达式</span></span><br><span class="line"> tot = <span class="built_in">float</span>(a[<span class="number">0</span>]) * <span class="built_in">float</span>(a[-<span class="number">1</span>])</span><br><span class="line"> data[x] = [data[x], <span class="string">", 'sum': "</span> , <span class="built_in">str</span>(<span class="built_in">round</span>(tot, <span class="number">2</span>))]</span><br><span class="line"></span><br><span class="line">data.sort(key = <span class="keyword">lambda</span> item: <span class="built_in">float</span>(item[-<span class="number">1</span>]), reverse = <span class="literal">True</span>)</span><br><span class="line">data = [<span class="string">''</span>.join(item) <span class="keyword">for</span> item <span class="keyword">in</span> data]</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> data:</span><br><span class="line"> <span class="built_in">print</span>(i)</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">'\n#####################\n'</span>)</span><br><span class="line"></span><br><span class="line">data_filiter = <span class="built_in">filter</span>(<span class="keyword">lambda</span> item: <span class="built_in">float</span>(re.findall(<span class="string">"\d+\.?\d*"</span>, item)[<span class="number">1</span>]) > <span class="number">80</span>, data)</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> data_filiter:</span><br><span class="line"> <span class="built_in">print</span>(i)</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-2-题"><a href="#第-2-题" class="headerlink" title="第(2)题"></a>第(2)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(2) 文件“points.txt”保存了三维空间中100个点的坐标信息。若以逗号为分隔符,第1列为数据点编号,最后3列数据</span><br><span class="line">依次为x、y、z轴坐标。请计算任意两点之间的欧氏距离、曼哈顿距离和切比雪夫距离,分别找出这三种距离最大值,以</span><br><span class="line">及达到最大值时对应的两点,并将距离最大值相关数据保存至一个新的文件中去(创建的新文件取名可为’result5.</span><br><span class="line">txt’)。</span><br><span class="line"></span><br><span class="line">注:以上三种距离的数学定义请自学(如:https://blog.csdn.net/XZHSakura/article/details/</span><br><span class="line">107694724)。编写Python代码时,要求利用def给出这三种距离的函数定义,且不能调用任何库函数进行直接计</span><br><span class="line">算。距离最大值保留小数点后3位,保存文件的格式参考如下:</span><br><span class="line"> 欧式距离最大值:xxx,距离最远的两个点:xxx,xxx</span><br><span class="line"> 曼哈顿距离最大值:xxx,距离最远的两个点:xxx,xxx</span><br><span class="line"> 切比雪夫距离最大值:xxx,距离最远的两个点:xxx,xxx</span><br><span class="line"></span><br><span class="line">points.txt(部分):</span><br><span class="line"></span><br><span class="line">P180, 4.2840, 41.6670, 58.8700</span><br><span class="line">P181, 7.8630, 40.4050, 59.1790</span><br><span class="line">P182, 8.7090, 42.3370, 62.3700</span><br><span class="line">P183, 5.5710, 41.0010, 64.1050</span><br><span class="line">P184, 6.5920, 37.4080, 63.5010</span><br><span class="line">P185, 10.1990, 38.1770, 64.4330</span><br><span class="line">P186, 9.1840, 39.3420, 67.9190</span><br><span class="line">P187, 7.0330, 36.2330, 68.4070</span><br><span class="line">P188, 9.7890, 34.0120, 67.0330</span><br><span class="line">P189, 12.4000, 35.5350, 69.3360</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> math <span class="keyword">import</span> sqrt</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">ouShi</span>(<span class="params">x1, y1, z1, x2, y2, z2</span>):</span><br><span class="line"> <span class="keyword">return</span> sqrt((x2-x1)**<span class="number">2</span> + (y2-y1)**<span class="number">2</span> + (z2-z1)**<span class="number">2</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">manHaDun</span>(<span class="params">x1, y1, z1, x2, y2, z2</span>):</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">abs</span>(x1-x2) + <span class="built_in">abs</span>(y1-y2) + <span class="built_in">abs</span>(z1-z2)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">qieBiXueFu</span>(<span class="params">x1, y1, z1, x2, y2, z2</span>):</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">max</span>(<span class="built_in">abs</span>(x1-x2), <span class="built_in">abs</span>(y1-y2), <span class="built_in">abs</span>(z1-z2))</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">'D:/Code/Python/Vscode/python与数据科学/第三次/points.txt'</span>, <span class="string">'r'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> data = f.read()</span><br><span class="line">data = data.split(<span class="string">'\n'</span>)</span><br><span class="line">data.remove(<span class="string">''</span>)</span><br><span class="line"></span><br><span class="line">data = [ item.split(<span class="string">','</span>) <span class="keyword">for</span> item <span class="keyword">in</span> data ]</span><br><span class="line">data = [ [subItem.strip() <span class="keyword">for</span> subItem <span class="keyword">in</span> item] <span class="keyword">for</span> item <span class="keyword">in</span> data ]</span><br><span class="line"></span><br><span class="line">ouShi_max, manHaDun_max, qieBiXueFu_max = <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(data)):</span><br><span class="line"> x1, y1, z1 = <span class="built_in">float</span>(data[i][<span class="number">1</span>]), <span class="built_in">float</span>(data[i][<span class="number">2</span>]), <span class="built_in">float</span>(data[i][<span class="number">3</span>])</span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(i + <span class="number">1</span>, <span class="built_in">len</span>(data)):</span><br><span class="line"> x2, y2, z2 = <span class="built_in">float</span>(data[j][<span class="number">1</span>]), <span class="built_in">float</span>(data[j][<span class="number">2</span>]), <span class="built_in">float</span>(data[j][<span class="number">3</span>])</span><br><span class="line"> <span class="keyword">if</span> (ouShi(x1,y1,z1,x2,y2,z2) > ouShi_max):</span><br><span class="line"> ouShi_max = ouShi(x1,y1,z1,x2,y2,z2)</span><br><span class="line"> ouShi_1 = data[i][<span class="number">0</span>]</span><br><span class="line"> ouShi_2 = data[j][<span class="number">0</span>]</span><br><span class="line"> <span class="keyword">if</span> (manHaDun(x1,y1,z1,x2,y2,z2) > manHaDun_max):</span><br><span class="line"> manHaDun_max = manHaDun(x1,y1,z1,x2,y2,z2)</span><br><span class="line"> manHaDun_1 = data[i][<span class="number">0</span>]</span><br><span class="line"> manHaDun_2 = data[j][<span class="number">0</span>]</span><br><span class="line"> <span class="keyword">if</span> (qieBiXueFu(x1,y1,z1,x2,y2,z2) > qieBiXueFu_max):</span><br><span class="line"> qieBiXueFu_max = qieBiXueFu(x1,y1,z1,x2,y2,z2)</span><br><span class="line"> qieBiXueFu_1 = data[i][<span class="number">0</span>]</span><br><span class="line"> qieBiXueFu_2 = data[j][<span class="number">0</span>]</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">'D:/Code/Python/Vscode/python与数据科学/第三次/points_res.txt'</span>, <span class="string">'w'</span>, encoding=<span class="string">"utf-8"</span>) <span class="keyword">as</span> f:</span><br><span class="line"> f.write(<span class="string">'欧氏距离最大值:{0},距离最远的两个点:{1},{2}\n'</span>.<span class="built_in">format</span>(<span class="built_in">round</span>(ouShi_max, <span class="number">3</span>), ouShi_1, ouShi_2))</span><br><span class="line"> f.write(<span class="string">'曼哈顿距离最大值:{0},距离最远的两个点:{1},{2}\n'</span>.<span class="built_in">format</span>(<span class="built_in">round</span>(manHaDun_max, <span class="number">3</span>), manHaDun_1, manHaDun_2))</span><br><span class="line"> f.write(<span class="string">'切比雪夫距离最大值:{0},距离最远的两个点:{1},{2}\n'</span>.<span class="built_in">format</span>(<span class="built_in">round</span>(qieBiXueFu_max, <span class="number">3</span>), qieBiXueFu_1, qieBiXueFu_2))</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">'欧氏距离最大值:{0},距离最远的两个点:{1},{2}'</span>.<span class="built_in">format</span>(<span class="built_in">round</span>(ouShi_max, <span class="number">3</span>), ouShi_1, ouShi_2))</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'曼哈顿距离最大值:{0},距离最远的两个点:{1},{2}'</span>.<span class="built_in">format</span>(<span class="built_in">round</span>(manHaDun_max, <span class="number">3</span>), manHaDun_1, manHaDun_2))</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'切比雪夫距离最大值:{0},距离最远的两个点:{1},{2}'</span>.<span class="built_in">format</span>(<span class="built_in">round</span>(qieBiXueFu_max, <span class="number">3</span>), qieBiXueFu_1, qieBiXueFu_2))</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-3-题"><a href="#第-3-题" class="headerlink" title="第(3)题"></a>第(3)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(3) 文件” seqs_fasta.txt”保存有符合fasta格式的100多个蛋白质氨基酸序列,截取部分如下图所示:</span><br><span class="line"> </span><br><span class="line">>6ONBB</span><br><span class="line">GSGAPPTIQQPSMSSAVALLGQDVDFTCIVNDLGSHMVAFVKADSPPRLLSFDEKVFRRRNKYELKPRIGDLHNEWVLTI</span><br><span class="line">KNVQESDRGNYSCQINTEPITLSTGELDVKVPHHHHHH</span><br><span class="line">>6ONAA</span><br><span class="line">GSDTICIGYHANNSTDTVDTVLEKNVTVTHSVNLLEDSHNGKLCRLKGIAPLQLGKCNIAGWILGNPECESLLSKRSWSY</span><br><span class="line">IAETPNSENGTCYPGDFADYEELREQLSSVSSFERFEIFPKERSWPNHNINIGVTAACSHAGKSSFYKNLLWLTEKDGSY</span><br><span class="line">PNLNKSYVNKKEKEVLVLWGVHHPSNIENQKTLYRKENAYVSVVSSNYNRRFTPEIAERPKVRGQAGRMNYYWTLLEPGD</span><br><span class="line"></span><br><span class="line">其中每条序列以“>”开头,紧接的“6ONBB”表示蛋白质序列ID,两行“>6ONBB”与“>6ONAA”之间展示的是ID为6ONBB的氨</span><br><span class="line">基酸序列。</span><br><span class="line"></span><br><span class="line">自然界中,任何天然蛋白质主要由20种标准的氨基酸构成,可与字母表aa20={'A', 'R', 'N', 'D', 'C', 'Q', </span><br><span class="line">'E', 'G', 'H', 'I', 'L', 'K', 'M', 'F', 'P', 'S', 'T', 'W', 'Y', 'V'}中的英文字母一一对应。同一种</span><br><span class="line">氨基酸在一条蛋白质序列中可能出现多次。</span><br><span class="line"></span><br><span class="line">请计算文件“seqs_fasta.txt”中每条蛋白质序列的氨基酸组分,即字母表aa20中的每个英文字母在该蛋白质序列中出</span><br><span class="line">现的频率(百分比%),并将统计结果保存至一个新的文件(创建的新文件可取名为’result6.txt’)。注:要求氨基酸</span><br><span class="line">出现的频率值保留小数点后1位,且每个氨基酸所在列的频率值数据右对齐保存,保存文件的格式参考如下:</span><br><span class="line"></span><br><span class="line">ID A R N D C Q E G H I L K M F P S T W Y</span><br><span class="line">6ONBB 4.2 5.1 5.1 6.8 1.7 4.2 5.1 5.9 6.8 5.1 8.5 5.1 1.7 3.4 6.8 8.5 5.1 0.8 1.7</span><br><span class="line">6ONAA 5.2 4.1 8.9 3.7 2.2 2.8 7.6 8.4 3.3 5.6 7.8 6.5 1.3 3.7 4.1 7.6 5.2 2.0 4.6</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">aa20 = [<span class="string">'A'</span>, <span class="string">'R'</span>, <span class="string">'N'</span>, <span class="string">'D'</span>, <span class="string">'C'</span>, <span class="string">'Q'</span>, <span class="string">'E'</span>, <span class="string">'G'</span>, <span class="string">'H'</span>, <span class="string">'I'</span>, <span class="string">'L'</span>, <span class="string">'K'</span>, <span class="string">'M'</span>, <span class="string">'F'</span>, <span class="string">'P'</span>, <span class="string">'S'</span>, <span class="string">'T'</span>, <span class="string">'W'</span>, <span class="string">'Y'</span>, <span class="string">'V'</span>]</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">'D:/Code/Python/Vscode/python与数据科学/第三次/seqs_fasta.txt'</span>, <span class="string">'r'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> data = f.read()</span><br><span class="line">data = data.split(<span class="string">'\n'</span>)</span><br><span class="line">data.remove(<span class="string">''</span>)</span><br><span class="line"></span><br><span class="line">s = <span class="string">''</span></span><br><span class="line">temp = []</span><br><span class="line">data_solve = []</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(data)):</span><br><span class="line"> data[i] = data[i].rstrip()</span><br><span class="line"> <span class="keyword">if</span> (data[i][<span class="number">0</span>] == <span class="string">'>'</span>):</span><br><span class="line"> <span class="keyword">if</span> (s):</span><br><span class="line"> temp.append(s)</span><br><span class="line"> s = <span class="string">''</span></span><br><span class="line"> <span class="keyword">if</span> (temp):</span><br><span class="line"> data_solve.append(temp)</span><br><span class="line"> temp = []</span><br><span class="line"> temp.append(data[i][<span class="number">1</span>:])</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> s += data[i];</span><br><span class="line"></span><br><span class="line">res = [[<span class="string">'ID'</span>, <span class="string">'A'</span>, <span class="string">'R'</span>, <span class="string">'N'</span>, <span class="string">'D'</span>, <span class="string">'C'</span>, <span class="string">'Q'</span>, <span class="string">'E'</span>, <span class="string">'G'</span>, <span class="string">'H'</span>, <span class="string">'I'</span>, <span class="string">'L'</span>, <span class="string">'K'</span>, <span class="string">'M'</span>, <span class="string">'F'</span>, <span class="string">'P'</span>, <span class="string">'S'</span>, <span class="string">'T'</span>, <span class="string">'W'</span>, <span class="string">'Y'</span>, <span class="string">'V'</span>]]</span><br><span class="line">temp = [<span class="number">0.0</span> <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(aa20) + <span class="number">1</span>)]</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(data_solve)):</span><br><span class="line"> seq = <span class="built_in">list</span>(data_solve[i][-<span class="number">1</span>])</span><br><span class="line"> tot = <span class="built_in">len</span>(seq)</span><br><span class="line"> <span class="comment"># print(tot)</span></span><br><span class="line"> temp[<span class="number">0</span>] = data_solve[i][<span class="number">0</span>]</span><br><span class="line"> <span class="keyword">for</span> index <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(aa20)):</span><br><span class="line"> temp[index + <span class="number">1</span>] = <span class="built_in">str</span>(<span class="built_in">round</span>(seq.count(aa20[index]) * <span class="number">100</span> / tot, <span class="number">1</span>))</span><br><span class="line"> <span class="comment"># print(seq.count(aa20[index]), end = ' ')</span></span><br><span class="line"> <span class="comment"># print('\n')</span></span><br><span class="line"> res.append(temp)</span><br><span class="line"> temp = [<span class="number">0.0</span> <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(aa20) + <span class="number">1</span>)]</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">'D:/Code/Python/Vscode/python与数据科学/第三次/result6.txt'</span>, <span class="string">'w'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> res:</span><br><span class="line"> f.write(<span class="string">'{:<7}{:>7}{:>7}{:>7}{:>7}{:>7}{:>7}{:>7}{:>7}{:>7}{:>7}{:>7}{:>7}{:>7}{:>7}{:>7}{:>7}{:>7}{:>7}{:>7}\n'</span>.<span class="built_in">format</span>(</span><br><span class="line"> i[<span class="number">0</span>],i[<span class="number">1</span>],i[<span class="number">2</span>],i[<span class="number">3</span>],i[<span class="number">4</span>],i[<span class="number">5</span>],i[<span class="number">6</span>],i[<span class="number">7</span>],i[<span class="number">8</span>],i[<span class="number">9</span>],i[<span class="number">10</span>],i[<span class="number">11</span>],i[<span class="number">12</span>],i[<span class="number">13</span>],i[<span class="number">14</span>],i[<span class="number">15</span>],i[<span class="number">16</span>],i[<span class="number">17</span>],i[<span class="number">18</span>],i[<span class="number">19</span>],i[<span class="number">20</span>]))</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-4-题"><a href="#第-4-题" class="headerlink" title="第(4)题"></a>第(4)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(4) 首先,定义一个名为“wordcount”的函数,功能为统计中文文本中某个关键字出现的次数,函数原型如下:</span><br><span class="line"> def wordcount(w, txtfile):</span><br><span class="line"> 函数体</span><br><span class="line"> return 词w在txtfile中出现的次数</span><br><span class="line">其中w和txtfile均为字符串。</span><br><span class="line"></span><br><span class="line">其次,在存放本次实验材料的文件夹中,利用os.mkdir()创建一个新的文件夹,取名“mydir”;同时,自动识别出以</span><br><span class="line">“news_”开头的所有文本文件,利用shutil模块将其移动至新建的文件目录“mydir”中(注:需编程自动实现文件的移</span><br><span class="line">动,不是手工拷贝或移动)。</span><br><span class="line"></span><br><span class="line">进一步,利用pickle模块将函数wordcount以及识别出的以“news_”开头的所有文本文件名组合成一个列表,永久保存</span><br><span class="line">至文件“wc.pkl”,并存储在文件夹“mydir”中。</span><br><span class="line"></span><br><span class="line">最后,再次利用pickle模块将保存在“wc.pkl”中的列表数据载入,获得函数wordcount,并调用wordcount计算四个关</span><br><span class="line">键字“中国”、“美国”、“科技”和“芯片”在以“news_”开头的所有文本文件中出现的次数,打印输出,格式参考如下:</span><br><span class="line"> 中国 美国 科技 芯片</span><br><span class="line"> news_XXX.txt 10 10 10 10</span><br><span class="line"> news_YYY.txt 10 10 10 10</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> os, shutil</span><br><span class="line"><span class="keyword">import</span> pickle</span><br><span class="line"><span class="keyword">from</span> pprint <span class="keyword">import</span> pprint</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">workcount</span>(<span class="params">w, txtfile</span>):</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(new_dir + txtfile, <span class="string">'r'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> data = f.read()</span><br><span class="line"> data = data.split(<span class="string">'\n'</span>)</span><br><span class="line"> txt = <span class="string">''</span>.join(data)</span><br><span class="line"> <span class="keyword">return</span> txt.count(w)</span><br><span class="line"></span><br><span class="line">cur_dir = <span class="string">'D:/Code/Python/Vscode/python与数据科学/第三次/'</span></span><br><span class="line">new_dir = cur_dir + <span class="string">'mydir/'</span></span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">not</span> os.path.exists(new_dir)):</span><br><span class="line"> os.mkdir(new_dir)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> os.listdir(cur_dir):</span><br><span class="line"> <span class="keyword">if</span> (os.path.basename(item)[<span class="number">0</span>:<span class="number">5</span>] == <span class="string">'news_'</span>):</span><br><span class="line"> <span class="built_in">print</span>(item)</span><br><span class="line"> side = os.path.join(cur_dir, item)</span><br><span class="line"> shutil.move(side, new_dir) <span class="comment"># 移动到另外一个文件夹中</span></span><br><span class="line"></span><br><span class="line">fil = <span class="built_in">open</span>(<span class="string">'D:/Code/Python/Vscode/python与数据科学/第三次/wc.pkl'</span>, <span class="string">'wb'</span>)</span><br><span class="line">file_list = []</span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> os.listdir(new_dir):</span><br><span class="line"> file_list.append(item)</span><br><span class="line">pickle.dump(file_list, fil)</span><br><span class="line">fil.close()</span><br><span class="line"></span><br><span class="line">fie = <span class="built_in">open</span>(<span class="string">'D:/Code/Python/Vscode/python与数据科学/第三次/wc.pkl'</span>, <span class="string">'rb'</span>)</span><br><span class="line">t = pickle.load(fie)</span><br><span class="line"><span class="comment"># pprint(t)</span></span><br><span class="line"></span><br><span class="line">res = [[<span class="string">''</span>, <span class="string">'中国'</span>, <span class="string">'美国'</span>, <span class="string">'科技'</span>, <span class="string">'芯片'</span>]]</span><br><span class="line"><span class="keyword">for</span> f <span class="keyword">in</span> t:</span><br><span class="line"> <span class="comment"># print(f)</span></span><br><span class="line"> a = workcount(<span class="string">'中国'</span>, f)</span><br><span class="line"> b = workcount(<span class="string">'美国'</span>, f)</span><br><span class="line"> c = workcount(<span class="string">'科技'</span>, f)</span><br><span class="line"> d = workcount(<span class="string">'芯片'</span>, f)</span><br><span class="line"> res.append([f, <span class="built_in">str</span>(a), <span class="built_in">str</span>(b), <span class="built_in">str</span>(c), <span class="built_in">str</span>(d)])</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> res:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'{0:<25}\t{1}\t{2}\t{3}\t{4}'</span>.<span class="built_in">format</span>(i[<span class="number">0</span>], i[<span class="number">1</span>], i[<span class="number">2</span>], i[<span class="number">3</span>], i[<span class="number">4</span>]))</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-5-题"><a href="#第-5-题" class="headerlink" title="第(5)题"></a>第(5)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(5) 应用os和os.path模块,列出指定目录下所有的.py 文件,并以列表形式打印输出全部.py文件名。然后,利用</span><br><span class="line">shutil模块将全部.py文件复制至另一指定目录,并利用shutil模块压缩此目录文件夹,压缩格式为zip。注:目录名</span><br><span class="line">称及指定目录下包含的.py文件名称请自己手工创建,也可以在代码中随机创建。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> os, shutil</span><br><span class="line"><span class="keyword">import</span> pickle</span><br><span class="line"></span><br><span class="line">path = <span class="string">'D:/Code/Python/Vscode/python与数据科学/'</span></span><br><span class="line">cur_dir = path + <span class="string">'test/'</span></span><br><span class="line">moveto_dir = path + <span class="string">'another/'</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> os.listdir(cur_dir):</span><br><span class="line"> <span class="keyword">if</span> (os.path.basename(item)[-<span class="number">3</span>:] == <span class="string">'.py'</span>):</span><br><span class="line"> <span class="built_in">print</span>(item)</span><br><span class="line"> side = os.path.join(cur_dir, item)</span><br><span class="line"> shutil.move(side, moveto_dir)</span><br><span class="line"></span><br><span class="line">new_path = shutil.make_archive(path, <span class="string">'zip'</span>, moveto_dir)</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-6-题"><a href="#第-6-题" class="headerlink" title="第(6)题"></a>第(6)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(6) 在实验材料的文件夹内,存在compare1.txt和compare2.txt两个文件,现要求写一个程序,比较这两个文本文件</span><br><span class="line">的内容。如果文件完全相同,输出“OK!”,否则输出“NO!”。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">'D:/Code/Python/Vscode/python与数据科学/第三次/compare1.txt'</span>, <span class="string">'r'</span>, encoding=<span class="string">'utf-8'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> data1 = f.read()</span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">'D:/Code/Python/Vscode/python与数据科学/第三次/compare2.txt'</span>, <span class="string">'r'</span>, encoding=<span class="string">'utf-8'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> data2 = f.read()</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (data1 == data2):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'OK!'</span>)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'NO!'</span>)</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-7-题"><a href="#第-7-题" class="headerlink" title="第(7)题"></a>第(7)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(7) 使用python的os模块,执行以下操作:创建oldfilename.txt文件,并重命名为newfilename.txt;判断folder</span><br><span class="line">文件夹是否存在,不存在则创建,并将newfilename.txt文件放入该文件夹中。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> os, shutil</span><br><span class="line"><span class="keyword">import</span> pickle</span><br><span class="line"></span><br><span class="line">fa_dir = <span class="string">'D:/Code/Python/Vscode/python与数据科学/第三次/'</span></span><br><span class="line">file_name = fa_dir + <span class="string">'oldfilename.txt/'</span></span><br><span class="line">file_new_name = fa_dir + <span class="string">'newfilename.txt/'</span></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(file_name, mode = <span class="string">'w'</span>, encoding = <span class="string">'utf-8'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line"> os.rename(file_name, file_new_name)</span><br><span class="line"><span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'rename dir fail'</span>)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'rename dir success'</span>)</span><br><span class="line"></span><br><span class="line">new_dir = fa_dir + <span class="string">'folder/'</span></span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">not</span> os.path.exists(new_dir)):</span><br><span class="line"> os.mkdir(new_dir)</span><br><span class="line"></span><br><span class="line">shutil.move(file_new_name, new_dir)</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-8-题"><a href="#第-8-题" class="headerlink" title="第(8)题"></a>第(8)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(8) 附件中有一名为 ‘data.csv’ 的 CSV 文件,其中每一行都是一个学生的信息,格式为:姓名,性别,年龄,成绩。</span><br><span class="line">请编写一个 Python 程序,读取 data.csv 文件中的所有数据,并计算所有学生的平均年龄和平均成绩。</span><br><span class="line"></span><br><span class="line">data.csv:</span><br><span class="line"></span><br><span class="line">小明男18岁90</span><br><span class="line">小红女20岁85</span><br><span class="line">张三男22岁78</span><br><span class="line">李四男19岁92</span><br><span class="line">王五男21岁89</span><br><span class="line">刘六女23岁91</span><br><span class="line">赵七男20岁84</span><br><span class="line">周八女19岁87</span><br><span class="line">陈九男22岁88</span><br><span class="line">郑十女21岁93</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> csv</span><br><span class="line"></span><br><span class="line">csv_reader = csv.reader(<span class="built_in">open</span>(<span class="string">"D:/Code/Python/Vscode/python与数据科学/第三次/data.csv"</span>))</span><br><span class="line"></span><br><span class="line">data = []</span><br><span class="line">tot_cnt = <span class="number">0</span></span><br><span class="line">tot_age = <span class="number">0</span></span><br><span class="line">tot_grade = <span class="number">0</span></span><br><span class="line"><span class="keyword">for</span> row <span class="keyword">in</span> csv_reader:</span><br><span class="line"> tot_cnt += <span class="number">1</span></span><br><span class="line"> tot_age += <span class="built_in">eval</span>(row[-<span class="number">2</span>][:-<span class="number">1</span>])</span><br><span class="line"> tot_grade += <span class="built_in">eval</span>(row[-<span class="number">1</span>])</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'学生平均年龄:{0:.2f}\n学生平均成绩:{1:.2f}'</span>.<span class="built_in">format</span>(tot_age / tot_cnt, tot_grade / tot_cnt))</span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-9-题"><a href="#第-9-题" class="headerlink" title="第(9)题"></a>第(9)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(9) 创建一个叮咚客服管理系统的界面,每次登录时,将用户的登录日志写入文件中(包含登录时间),并且在程序中</span><br><span class="line">查看用户的登录日志。假定系统中只有一个用户(用户名: "张三" ,密码"123456")可以登录成功;请记录用户是否</span><br><span class="line">登录成功以及登录时间。</span><br><span class="line"> </span><br><span class="line"> 下图为系统的主函数,请写出login()函数和look_log()函数,实现上述要求。</span><br><span class="line"> </span><br><span class="line"> if __name__ == "__main__":</span><br><span class="line"> while True:</span><br><span class="line"> sel = input('请输入你的操作:1--登录,2--查看日志,其他--退出:')</span><br><span class="line"> if sel == str(1) :</span><br><span class="line"> login()</span><br><span class="line"> elif sel == str(2) :</span><br><span class="line"> look_log()</span><br><span class="line"> else:</span><br><span class="line"> break</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">data = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">login</span>():</span><br><span class="line"> user_name = <span class="built_in">input</span>(<span class="string">'请输入用户名:'</span>)</span><br><span class="line"> user_pwd = <span class="built_in">input</span>(<span class="string">'请输入密码:'</span>)</span><br><span class="line"> <span class="keyword">if</span> (user_name != <span class="string">'张三'</span> <span class="keyword">or</span> user_pwd != <span class="string">'123456'</span>):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'用户名或密码错误,登录失败'</span>)</span><br><span class="line"> data.append([user_name, user_pwd, <span class="string">'登录失败'</span>])</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'登录成功!'</span>)</span><br><span class="line"> data.append([user_name, user_pwd, <span class="string">'登录成功'</span>])</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">look_log</span>():</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> data:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'用户名:{0},密码:{1},状态:{2}'</span>.<span class="built_in">format</span>(i[<span class="number">0</span>], i[<span class="number">1</span>], i[<span class="number">2</span>]))</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'\n\n'</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">"__main__"</span>:</span><br><span class="line"> <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line"> sel = <span class="built_in">input</span>(<span class="string">'请输入你的操作:1--登录,2--查看日志,其他--退出:'</span>)</span><br><span class="line"> <span class="keyword">if</span> sel == <span class="built_in">str</span>(<span class="number">1</span>) :</span><br><span class="line"> login()</span><br><span class="line"> <span class="keyword">elif</span> sel == <span class="built_in">str</span>(<span class="number">2</span>) :</span><br><span class="line"> look_log()</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">break</span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><hr>]]></content>
<categories>
<category> Python与数据科学 </category>
</categories>
<tags>
<tag> Python </tag>
<tag> 数据科学 </tag>
<tag> 作业 </tag>
<tag> 专业课 </tag>
<tag> 实验报告 </tag>
</tags>
</entry>
<entry>
<title>Python基础语法实践</title>
<link href="/2023/05/14/0003-04/"/>
<url>/2023/05/14/0003-04/</url>
<content type="html"><![CDATA[<p>Python与数据科学实验2</p><h2 id="实验目的"><a href="#实验目的" class="headerlink" title="实验目的"></a>实验目的</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">本次实验旨在了解Python基础语法知识,掌握Python3的基本数据结构、控制结构、函数等,具备数学计算和字符</span><br><span class="line">串/文本处理的能力。相关知识点包括:</span><br><span class="line">1) 数据结构:列表、元组、字符串、字典、集合;</span><br><span class="line">2) 控制结构:条件语句以及条件表达式、while/for循环、break和continue语句、try-except语句</span><br><span class="line">3) 函数:函数的定义、函数的参数形式、函数的调用、lambda函数,以及map、filter等内置函数的用法</span><br></pre></td></tr></table></figure><h2 id="实验题目"><a href="#实验题目" class="headerlink" title="实验题目"></a>实验题目</h2><h3 id="第-1-题"><a href="#第-1-题" class="headerlink" title="第(1)题"></a>第(1)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(1) 编写函数,接收一个字符串,分别统计大写字母、小写字母、数字、其他字符的个数,并以元组的形式返回结</span><br><span class="line">果。字符串通过input输入,然后调用该函数,并打印出函数的返回值。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">function</span>(<span class="params">s</span>):</span><br><span class="line"> cnt_upper = <span class="number">0</span></span><br><span class="line"> cnt_lower = <span class="number">0</span></span><br><span class="line"> cnt_digit = <span class="number">0</span></span><br><span class="line"> cnt_other = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> s:</span><br><span class="line"> <span class="keyword">if</span> (<span class="string">'A'</span> <= i <= <span class="string">'Z'</span>):</span><br><span class="line"> cnt_upper += <span class="number">1</span></span><br><span class="line"> <span class="keyword">elif</span> (<span class="string">'a'</span> <= i <= <span class="string">'z'</span>):</span><br><span class="line"> cnt_lower += <span class="number">1</span></span><br><span class="line"> <span class="keyword">elif</span> (<span class="string">'0'</span> <= i <= <span class="string">'9'</span>):</span><br><span class="line"> cnt_digit += <span class="number">1</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> cnt_other += <span class="number">1</span></span><br><span class="line"> <span class="keyword">return</span> (cnt_upper, cnt_lower, cnt_digit, cnt_other)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line"> s = <span class="built_in">input</span>()</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'(大写字母,小写字母,数字,其他字符)'</span>)</span><br><span class="line"> <span class="built_in">print</span>(function(s))</span><br><span class="line"></span><br><span class="line">main()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-2-题"><a href="#第-2-题" class="headerlink" title="第(2)题"></a>第(2)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(2) 正整数的质因子分解。要求编写自定义函数实现该功能。例如,给定10,打印出结果:[[2,5],[1,1]],表示</span><br><span class="line">10 = 2^1 * 5^1;给定200,打印出结果:[[2,5],[3,2]],表示200 = 2^3 * 5^2.</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">isprime</span>(<span class="params">num</span>):</span><br><span class="line"> <span class="keyword">if</span> (num == <span class="number">1</span>):</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">2</span>, num):</span><br><span class="line"> <span class="keyword">if</span> (num % i == <span class="number">0</span>):</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">False</span></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">def</span> <span class="title function_">function</span>(<span class="params">x</span>):</span><br><span class="line"> temp = x</span><br><span class="line"> list1 = []</span><br><span class="line"> list2 = []</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>, x + <span class="number">1</span>):</span><br><span class="line"> <span class="keyword">if</span> (isprime(i)):</span><br><span class="line"> cnt = <span class="number">0</span></span><br><span class="line"> <span class="keyword">while</span> (temp % i == <span class="number">0</span>):</span><br><span class="line"> cnt += <span class="number">1</span></span><br><span class="line"> temp //= i</span><br><span class="line"> <span class="keyword">if</span> (cnt > <span class="number">0</span>):</span><br><span class="line"> list1.append(i)</span><br><span class="line"> list2.append(cnt)</span><br><span class="line"> <span class="keyword">if</span> (temp == <span class="number">1</span>):</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">return</span> [list1, list2]</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line"> x = <span class="built_in">int</span>(<span class="built_in">input</span>())</span><br><span class="line"> <span class="built_in">print</span>(function(x))</span><br><span class="line"></span><br><span class="line">main()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-3-题"><a href="#第-3-题" class="headerlink" title="第(3)题"></a>第(3)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(3) 编写一个函数,参数为a、b、c,要求计算如下数学公式的值。</span><br><span class="line">e^(b^√(π/2)) + (-b+√(b^2-4ac))/2a + (log_10(|a+b|)+a/b)/(ln(a^b+100))</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> math <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">function</span>(<span class="params">a, b, c</span>):</span><br><span class="line"> num1 = e ** (b ** sqrt(pi / <span class="number">2</span>))</span><br><span class="line"> <span class="keyword">if</span> (b * b - <span class="number">4</span> * a * c < <span class="number">0</span>):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"sqrt()发生错误,算术平方根无意义"</span>)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> num2 = (sqrt(b * b - <span class="number">4</span> * a * c) - b) / <span class="number">2</span> / a</span><br><span class="line"> num3 = (log10(<span class="built_in">abs</span>(a + b)) + a / b) / log(a ** b + <span class="number">100</span> - <span class="number">1</span>)</span><br><span class="line"> <span class="keyword">return</span> num1 + num2 + num3</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"请输入第一个参数a: "</span>)</span><br><span class="line"> a = <span class="built_in">float</span>(<span class="built_in">input</span>())</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"请输入第二个参数b: "</span>)</span><br><span class="line"> b = <span class="built_in">float</span>(<span class="built_in">input</span>())</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"请输入第三个参数c: "</span>)</span><br><span class="line"> c = <span class="built_in">float</span>(<span class="built_in">input</span>())</span><br><span class="line"> <span class="built_in">print</span>(function(a, b, c))</span><br><span class="line"></span><br><span class="line">main()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-4-题"><a href="#第-4-题" class="headerlink" title="第(4)题"></a>第(4)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">(<span class="number">4</span>) 运行以下代码,截图粘贴运行结果,并说明函数func的功能:</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">func</span>(<span class="params">*list_args</span>):</span><br><span class="line"> all_list = []</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> list_args:</span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">isinstance</span>(i, <span class="built_in">list</span>):</span><br><span class="line"> all_list.extend(i)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="string">'列表参数有错误,请重新输入列表:'</span></span><br><span class="line"> all_list.sort()</span><br><span class="line"> <span class="keyword">return</span> all_list[-<span class="number">1</span>]</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(func([<span class="number">678</span>,<span class="number">29</span>,<span class="number">579</span>,<span class="number">13</span>], [<span class="number">900</span>,<span class="number">454</span>,<span class="number">65</span>,<span class="number">445</span>], [<span class="number">12</span>,<span class="number">54</span>,<span class="number">2980</span>,<span class="number">72</span>]))</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">这段代码定义了一个函数,名为func,它接受任意数量的参数,并把这些参数放进list_args作为函数形参。For循</span><br><span class="line">环则是遍历list_args里的元素,if isinstance(i, list)的作用是判断当前被遍历到的元素i是不是列表类型,如</span><br><span class="line">果是列表,则把当前列表i里的元素扩展到all_list里,如果用户调用函数时输入了非列表元素,那么程序会返回一</span><br><span class="line">段提示信息:'列表参数有错误,请重新输入列表:'。最后,对all_list列表排序并返回最后一个元素,也就是该函</span><br><span class="line">数返回了所有实参列表中最大的元素,即2980。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-5-题"><a href="#第-5-题" class="headerlink" title="第(5)题"></a>第(5)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(5) 现有一个整数列表ls=[11,22,33,44,55,66,77,88,99,100,110,200,230,330], 将ls中所有大于66的元素保</span><br><span class="line">存至字典的第一个key ’k1’,将小于等于66的元素保存至字典的第二个key ’k2’, 以及将ls中的全部奇数保存至字</span><br><span class="line">典的第三个key ’k3’. 打印出这个字典,并通过key访问字典元素,计算ls中所有奇数的平方和。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line"> ls=[<span class="number">11</span>,<span class="number">22</span>,<span class="number">33</span>,<span class="number">44</span>,<span class="number">55</span>,<span class="number">66</span>,<span class="number">77</span>,<span class="number">88</span>,<span class="number">99</span>,<span class="number">100</span>,<span class="number">110</span>,<span class="number">200</span>,<span class="number">230</span>,<span class="number">330</span>]</span><br><span class="line"> dict1 = {}</span><br><span class="line"> list1 = []</span><br><span class="line"> list2 = []</span><br><span class="line"> list3 = []</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> ls:</span><br><span class="line"> <span class="keyword">if</span> (i > <span class="number">66</span>):</span><br><span class="line"> list1.append(i)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> list2.append(i)</span><br><span class="line"> <span class="keyword">if</span> (i % <span class="number">2</span>):</span><br><span class="line"> list3.append(i)</span><br><span class="line"></span><br><span class="line"> dict1[<span class="string">'k1'</span>] = list1</span><br><span class="line"> dict1[<span class="string">'k2'</span>] = list2</span><br><span class="line"> dict1[<span class="string">'k3'</span>] = list3</span><br><span class="line"> <span class="built_in">print</span>(dict1)</span><br><span class="line"> </span><br><span class="line"> Sum = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> dict1[<span class="string">'k3'</span>]:</span><br><span class="line"> Sum += i * i</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'所有奇数平方和为:'</span>, Sum)</span><br><span class="line"></span><br><span class="line">main()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-6-题"><a href="#第-6-题" class="headerlink" title="第(6)题"></a>第(6)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(6) 请利用map和reduce函数编写一个str2float函数, 把字符串’123.456’转换成浮点数123.456. 此题不允许直</span><br><span class="line">接使用float()对字符串进行直接转换。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> functools <span class="keyword">import</span> reduce</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">str2float</span>(<span class="params">s</span>):</span><br><span class="line"> depart = s.split(<span class="string">'.'</span>)</span><br><span class="line"> num1 = reduce(<span class="keyword">lambda</span> a, b : a * <span class="number">10</span> + b, <span class="built_in">map</span>(<span class="built_in">int</span>, depart[<span class="number">0</span>]))</span><br><span class="line"> num2 = reduce(<span class="keyword">lambda</span> a, b : a * <span class="number">10</span> + b, <span class="built_in">map</span>(<span class="built_in">int</span>, depart[<span class="number">1</span>])) / <span class="number">10</span> ** <span class="built_in">len</span>(depart[<span class="number">1</span>])</span><br><span class="line"> <span class="keyword">return</span> num1 + num2</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line"> s = <span class="built_in">input</span>()</span><br><span class="line"> res = str2float(s)</span><br><span class="line"> <span class="built_in">print</span>(<span class="built_in">type</span>(res), res)</span><br><span class="line"></span><br><span class="line">main()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-7-题"><a href="#第-7-题" class="headerlink" title="第(7)题"></a>第(7)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(7) craps 赌博游戏</span><br><span class="line">游戏规则:玩家掷两个骰子,每个骰子点数为1-6,如果第一次点数和为7或11,则玩家胜;如果点数和为2、3或12,</span><br><span class="line">则玩家输庄家胜。若和为其他点数,则记录第一次的点数和,玩家继续掷骰子,直至点数和等于第一次掷出的点数和</span><br><span class="line">则玩家胜;若掷出的点数和为7则庄家胜。编写一个python程序,按以上规则实现游戏,random.randint(low, </span><br><span class="line">high),可以实现随机生成[low,high]之间的整数。</span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> random</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">game</span>(): </span><br><span class="line"> num1 = random.randint(<span class="number">1</span>, <span class="number">6</span>)</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'你掷出了第一个筛子,点数是:'</span>, num1)</span><br><span class="line"> num2 = random.randint(<span class="number">1</span>, <span class="number">6</span>)</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'你掷出了第二个筛子,点数是:'</span>, num2)</span><br><span class="line"> tot = num1 + num2</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'两个筛子点数和是:'</span>, tot)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (tot <span class="keyword">in</span> [<span class="number">7</span>, <span class="number">11</span>]):</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line"> <span class="keyword">elif</span> (tot <span class="keyword">in</span> [<span class="number">2</span>, <span class="number">3</span>, <span class="number">12</span>]):</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> pre = tot</span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">True</span>):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'未分出胜负,进行下一轮掷筛'</span>)</span><br><span class="line"> num1 = random.randint(<span class="number">1</span>, <span class="number">6</span>)</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'你掷出了第一个筛子,点数是:'</span>, num1)</span><br><span class="line"> num2 = random.randint(<span class="number">1</span>, <span class="number">6</span>)</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'你掷出了第二个筛子,点数是:'</span>, num2)</span><br><span class="line"> <span class="keyword">if</span> (num1 + num2 == pre):</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line"> <span class="keyword">elif</span> (num1 + num2 == <span class="number">7</span>):</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">def</span> <span class="title function_">main</span>():</span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">True</span>):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'输入1开始模拟游戏,输入0退出游戏'</span>)</span><br><span class="line"> op = <span class="built_in">int</span>(<span class="built_in">input</span>())</span><br><span class="line"> <span class="keyword">if</span> (op == <span class="number">1</span>):</span><br><span class="line"> <span class="keyword">if</span> (game()):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'玩家赢得了比赛\n\n\n'</span>)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'庄家赢得了比赛\n\n\n'</span>)</span><br><span class="line"> <span class="keyword">elif</span> (op == <span class="number">0</span>):</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"></span><br><span class="line">main()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-8-题"><a href="#第-8-题" class="headerlink" title="第(8)题"></a>第(8)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(8) 编写一个python程序,计算指定年月日是这一年的第几天。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'请输入年:'</span>, end = <span class="string">''</span>)</span><br><span class="line"> year = <span class="built_in">int</span>(<span class="built_in">input</span>())</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'请输入月:'</span>, end = <span class="string">''</span>)</span><br><span class="line"> month = <span class="built_in">int</span>(<span class="built_in">input</span>())</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'请输入日:'</span>, end = <span class="string">''</span>)</span><br><span class="line"> day = <span class="built_in">int</span>(<span class="built_in">input</span>())</span><br><span class="line"> leap = <span class="keyword">lambda</span> x : <span class="keyword">not</span> x % <span class="number">4</span> <span class="keyword">and</span> x % <span class="number">100</span> <span class="keyword">or</span> <span class="keyword">not</span> x % <span class="number">400</span></span><br><span class="line"> m = [<span class="number">31</span>, <span class="number">28</span>, <span class="number">31</span>, <span class="number">30</span>, <span class="number">31</span>, <span class="number">30</span>, <span class="number">31</span>, <span class="number">31</span>, <span class="number">30</span>, <span class="number">31</span>, <span class="number">30</span>, <span class="number">31</span>]</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 判断日期是否合法</span></span><br><span class="line"> flag = <span class="literal">False</span></span><br><span class="line"> <span class="keyword">if</span> (year >= <span class="number">2023</span> <span class="keyword">and</span> month <span class="keyword">in</span> [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">6</span>,<span class="number">7</span>,<span class="number">8</span>,<span class="number">9</span>,<span class="number">10</span>,<span class="number">11</span>,<span class="number">12</span>]):</span><br><span class="line"> temp = <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span> (leap(year)):</span><br><span class="line"> temp = <span class="number">1</span></span><br><span class="line"> <span class="keyword">if</span> (<span class="number">1</span> <= day <= m[month - <span class="number">1</span>] + temp):</span><br><span class="line"> flag = <span class="literal">True</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (flag):</span><br><span class="line"> tot = day</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>, month - <span class="number">1</span>):</span><br><span class="line"> tot += m[i]</span><br><span class="line"> <span class="keyword">if</span> (i == <span class="number">2</span> <span class="keyword">and</span> leap(year)):</span><br><span class="line"> tot += <span class="number">1</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'{0}-{1}-{2}是{0}年的第{3}天'</span>.<span class="built_in">format</span>(year, month, day, tot))</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'您输入的日期不合法'</span>)</span><br><span class="line"></span><br><span class="line">main()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-9-题"><a href="#第-9-题" class="headerlink" title="第(9)题"></a>第(9)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(9) 编写一个python程序,给你两个二进制字符串a和b,以二进制字符串的形式返回它们的和。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line"> a = <span class="built_in">list</span>(<span class="built_in">map</span>(<span class="built_in">int</span>, <span class="built_in">input</span>()))</span><br><span class="line"> b = <span class="built_in">list</span>(<span class="built_in">map</span>(<span class="built_in">int</span>, <span class="built_in">input</span>()))</span><br><span class="line"> len_max = <span class="built_in">max</span>(<span class="built_in">len</span>(a), <span class="built_in">len</span>(b))</span><br><span class="line"></span><br><span class="line"> a.reverse()</span><br><span class="line"> b.reverse()</span><br><span class="line"> <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(a), len_max):</span><br><span class="line"> a.append(<span class="number">0</span>)</span><br><span class="line"> <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(b), len_max):</span><br><span class="line"> b.append(<span class="number">0</span>)</span><br><span class="line"></span><br><span class="line"> c = []</span><br><span class="line"> ci = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>, len_max):</span><br><span class="line"> n3 = a[i] + b[i] + ci</span><br><span class="line"> ci = <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span> (n3 >= <span class="number">2</span>):</span><br><span class="line"> n3 %= <span class="number">2</span></span><br><span class="line"> ci = <span class="number">1</span></span><br><span class="line"> c.append(n3)</span><br><span class="line"> <span class="keyword">if</span> (ci):</span><br><span class="line"> c.append(ci)</span><br><span class="line"> c.reverse()</span><br><span class="line"> c = <span class="string">''</span>.join(<span class="built_in">list</span>(<span class="built_in">map</span>(<span class="built_in">str</span>, c)))</span><br><span class="line"> <span class="built_in">print</span>(c)</span><br><span class="line"> </span><br><span class="line">main()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-10-题"><a href="#第-10-题" class="headerlink" title="第(10)题"></a>第(10)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(10) 编写函数实现pow(x,n),即计算x的整数n次幂函数(即x^n)。注意:不得直接调用python的x**n计算方式或</span><br><span class="line">其它库函数。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">myPow</span>(<span class="params">x, n</span>):</span><br><span class="line"> <span class="keyword">if</span> (n == <span class="number">0</span>):</span><br><span class="line"> <span class="keyword">return</span> <span class="number">1</span></span><br><span class="line"> res = <span class="number">1</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">abs</span>(n)):</span><br><span class="line"> res *= x</span><br><span class="line"> <span class="keyword">if</span> (n > <span class="number">0</span>):</span><br><span class="line"> <span class="keyword">return</span> res</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">1</span> / res</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'请输入第一个参数(底数x):'</span>, end = <span class="string">''</span>)</span><br><span class="line"> x = <span class="built_in">int</span>(<span class="built_in">input</span>())</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'请输入第二个参数(指数n):'</span>, end = <span class="string">''</span>)</span><br><span class="line"> n = <span class="built_in">int</span>(<span class="built_in">input</span>())</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'pow({0}, {1}) = {2}'</span>.<span class="built_in">format</span>(x, n, myPow(x, n)))</span><br><span class="line"></span><br><span class="line">main()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="第-11-题"><a href="#第-11-题" class="headerlink" title="第(11)题"></a>第(11)题</h3><div class="tabs" id=""><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#-1">题目</button></li><li class="tab"><button type="button" data-href="#-2">解答</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">(11) 请计算出1~10000中平方根是整数的数,要求使用filter函数来处理该问题,并输出结果。</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="built_in">print</span>(<span class="built_in">list</span>(<span class="built_in">filter</span>(<span class="keyword">lambda</span> x : <span class="built_in">int</span>(x ** <span class="number">0.5</span>) * <span class="built_in">int</span>(x ** <span class="number">0.5</span>) == x, <span class="built_in">range</span>(<span class="number">1</span>, <span class="number">10001</span>))))</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><hr>]]></content>
<categories>
<category> Python与数据科学 </category>