zzm99


  • Home

  • Tags

  • Categories

  • Archives

  • Search

C/C++调用DOS命令

Posted on 2019-05-29 | In C++ , 其他 |
Words count in article: 146 | Reading time ≈ 1

C/C++调用DOS命令

使用system(“…”);
C要#include <stdlib.h>
C++直接(只要iostream

C:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <stdlib.h>
int main(){
//显示当前文件夹内容
system("dir");
//创建目录
system("mkdir philippian_test");
//在该目录中创建hehe.txt文件
system("touch philippian_test/hehe.txt");
return 0;
}
1
2
3
4
5
6
7
该程序,

1. 显示当前文件夹内容

2. 创建名字为“philippian_test”的文件夹(目录)

3. 在该目录里面创建文件“hehe.txt”

C++:

1
2
3
4
5
6
#include <iostream>
using namespace std;
int main(int argc, char *argv[]){
system("date");
return 0;
}
1
用date命令显示当前日期:

bat(批处理文件类型)

Posted on 2019-05-29 | In 其他 |
Words count in article: 417 | Reading time ≈ 1

bat(批处理文件类型)

批处理文件,在DOS和Windows(任意)系统中,.bat文件是可执行文件,由一系列命令构成,其中可以包含对其他程序的调用。这个文件的每一行都是一条DOS命令(大部分时候就好像我们在DOS提示符下执行的命令行一样),你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件。

作用编辑

简单的说,批处理的作用就是自动的连续执行多条命令。

这里先讲一个最简单的应用:在启动wps软件时,每次都必须执行(>前面内容表示DOS提示符):

1
2
3
4
5
C:\>cd wps
C:\WPS>spdos
C:\WPS>py
C:\WPS>wbx
C:\WPS>wps

如果每次用WPS之前都这样执行一遍,您是不是觉得很麻烦呢?
好了,用批处理,就可以实现将这些麻烦的操作简单化,首先我们编写一个runwps.bat批处理文件,内容如下:

1
2
3
4
5
6
7
8
@echo off
c:
cd\wps
spdos
py
wbx
wps
cd\

以后,我们每次进入wps,只需要运行runwps这个批处理文件即可。

.bat文件下批量执行python脚本

bat文件包含以下内容:
1)注明echo

1
2
3
echo off 
C:
cd C:\Users\Desktop

2)设置参数变量
3) 执行python文件
eg:
test.bat

1
2
3
4
5
6
echo off
C:
cd C:\Users\Desktop
set a=1
set b=2
call python python.py %a% %b%

//等号左右不能有空格

python.py

1
2
3
4
5
6
7
8
9
10
import sys

def test(a,b):
print(a+b)

if __name__ == "__main__":
test(sys.argv[1],sys.argv[2])
print(sys.argv[0])
print(sys.argv[1])
print(sys.argv[2])

输出结果:

1
2
3
4
12 
python.py
1
2

sys.argv[0]为shell 本身。

绝对路径与相对路径

Posted on 2019-05-29 | In 其他 |
Words count in article: 474 | Reading time ≈ 1

绝对路径

绝对路径是指目录下的绝对位置,直接到达目标位置,通常是从盘符开始的路径。

完整的描述文件位置的路径就是绝对路径,以web站点根目录为参考基础的目录路径。绝对路径名的指定是从树型目录结构顶部的根目录开始到某个目录或文件的路径,由一系列连续的目录组成,中间用斜线分隔,直到要指定的目录或文件,路径中的最后一个名称即为要指向的目录或文件。之所以称为绝对,意指当所有网页引用同一个文件时,所使用的路径都是一样的。

Ex:

windows:
c:/website/img/photo.jpg

linux:
LINUX系统中 绝对路径 以“/”为起始
/home/user1/abc.txt

相对路径

相对路径就是指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。使用相对路径可以为我们带来非常多的便利。

下面举实例详解:

一、例如在本地硬盘有如下两文件,它们要互做超链接

1
2
G:\site\other\index.htm
G:\site\web\article\01.htm

index.htm要想链接到01.htm这个文件,正确的链接应该是:

../web\article\01.htm或者../web/article/01.htm

在超链接中../可以省略,在dos,或windows文件路径中../不可以省略。

反过来,01.htm要想链接到index.htm这个文件,在01.htm文件里面应该写上这句:
1

../../other/index.htm

这里的 ../ 表示向上一级。

注意:相对路径的文件夹符号是斜杠:/

链接文字这样的链接,在href后面的第一个斜杠表示根目录,通常我们要特别慎用这种方式。


1
2
3
4
5
./ 表示当前目录

../ 表示父级目录

/ 表示根目录

DOS命令学习

Posted on 2019-05-29 | In 其他 |
Words count in article: 3.2k | Reading time ≈ 11

DOS命令学习

color/dir/copy/shutdown/mkdir(md)/rmdir(rd)/attrib/cd/

color命令:

作用:

设置默认的控制台前景和背景颜色。

COLOR [attr]

attr 指定控制台输出的颜色属性

颜色属性由两个十六进制数字指定 – 第一个为背景,第二个则为
前景。每个数字可以为以下任何值之一:

1
2
3
4
5
6
7
8
0 = 黑色       8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 浅绿色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色

如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时
的颜色。这个值来自当前控制台窗口、/T 命令行开关或
DefaultColor 注册表值。

如果用相同的前景和背景颜色来执行 COLOR 命令,COLOR 命令
会将 ERRORLEVEL 设置为 1。

例如: “COLOR fc” 在亮白色上产生亮红色

注:前一个数字是更改dos的背景的,后一个数字是改变字母颜色的。

dir

作用:

1.dir dir是英文单词directory(目录)的缩写,主要用来显示一个目录下的文件和子目录。

[功能] 显示指定磁盘、目录中的文件和子目录信息,包括文件及子目录所在磁盘的卷标、文件与子目录的名称、每个文件的大小、文件及目录建立的日期时间,以及文件子目录的个数、所占用总字节数以及磁盘上的剩余总空间等信息。

[格式] dir [C:][path][filename][.ext][/o][/s][/p][/w][/a]

[说明] dir是DOS命令中最常用的一个。斜杠表示后面的内容是参数。

DOS参数最常用的是以下四个:

/p 显示信息满一屏时,暂停显示,按任意键后显示下一屏

/o 排序显示。o后面可以接不同意义的字母

/w 只显示文件名目录名,每行五个文件名。即宽行显示

/s 将目录及子目录的全部目录文件都显示

mkdir(md)

作用:

md是英文make directory(创建目录)的缩写

[功能] 创建一个子目录

[格式] md [C:]path

[举例] 我们在C盘建立一个叫123的文件夹:md c:\123

cd命令:

作用:

cd是英文change directory(改变目录)的缩写

[功能] 改变或显示当前目录

[格式] cd [C:][path]

[说明] 路径可以使用绝对路径和相对路径两种。如果只有cd而没有参数,则只显示当前路径。 注意:子目录中一定有两个”特殊目录”,即”.””..”,其中一点表示当前目录,两点表示上一层目录。从简单实用的角度来看,我们只要学会逐层进入(cd 下一层某目录名),和逐层退出(cd..)就可以解决所有问题。当然也可以用绝对路径的办法。

[举例] 进入我们刚才建立的123目录:cd c:\123

rmdir

功能:删除空目录。

语法:rmdir [选项] dirname

说明:dirname表示目录名。该命令从一个目录中删除一个或多个子目录项。需要特别注意的是,一个目录被删除之前必须是空的。(注意,rm - r dir命令可代替rmdir,但是有很大危险性。)删除某目录时也必须具有对父目录的写权限。

命令中各选项的含义为:
-p 递归删除目录dirname,当子目录删除后其父目录为空时,也一同被删除。如果整个路径被删除或者由于某种原因保留部分路径,则系统在标准输出上显示相应的信息。
例如:
$ rmdir -p /usr/xu/txt
将/usr/xu/txt目录删除。

copy命令:

作用:

[功能] 复制一个或一组文件到指定的磁盘或目录中

[格式] copy [C:][path][filename.ext] [C:][path]filename.ext

[说明] 复制文件命令基本用法是:”复制 源文件名 目标文件名”。如果只写目标路径而不写目标文件名,表示同名复制;否则称为换名复制。注意换名复制一般不要更改文件扩展名。 [举例] 将C:\123目录的所有文件复制到E盘,可以打如下命令,请注意当前盘与当前路径不同: copy c:\123 e:\ 如果目标盘上已有同名文件,会出现如下提示,”Overwrite xxxx(Yes/No/All)”此时回答Y则覆盖当前文件,N则保留,A则覆盖此后的所有文件而不再提问

shutdown [-i -l -s -r -a] [-f] [-m [\ComputerName]] [-t xx] [-c “message”] [-d[u][p]:xx:yy]

其中,各参数的含义为:

-i 显示图形界面的对话框。

-l 注销当前用户,这是默认设置。

-m ComputerName 优先。

-s 关闭计算机。

-r 关闭之后重新启动。

-a 中止关闭。除了 -l 和 ComputerName 外,系统将忽略其它参数。在超时期间,您只可以使用 -a。

-f 强制运行要关闭的应用程序。

-m [\ComputerName] 指定要关闭的计算机。

-t xx 将用于系统关闭的定时器设置为 xx 秒。默认值是 20 秒。

-c “message” 指定将在“系统关闭”窗口中的“消息”区域显示的消息。最多可以使用 127 个字符。引号中必须包含消息。

-d [u][p]:xx:yy 列出系统关闭的原因代码。

首先,我们来看一下该命令的一些基本用法:

1、注销当前用户 shutdown - l 该命令只能注销本机用户,对远程计算机不适用。

2、关闭本地计算机 shutdown - s

3、重启本地计算机 shutdown - r

4、定时关机 shutdown - s -t 30 指定在30秒之后自动关闭计算机。

5、中止计算机的关闭 有时我们设定了计算机定时关机后,如果出于某种原因又想取消这次关机操作,就可以用 shutdown - a 来中止。如: shutdown -s – t 300 设定计算机在5分钟后关闭。 Shutdown – a 取消上述关机操作。 以上是shutdown命令在本机中的一些基本应用。前面我们已经介绍过,该命令除了关闭、重启本地计算机外,更重要的是它还能对远程计算机进行操作,但是如何才能实现呢? 在该命令的格式中,有一个参数[-m [\ComputerName],用它可以指定将要关闭或重启的计算机名称,省略的话则默认为对本机操作。于是,我用以下命令试了一下: shutdown –s –m \netproxy -t 30 (在30秒内关闭计算机名为netproxy的机器;注:netproxy为局域网内一台同样装有Windows XP的电脑) 但该命令执行后,计算机netproxy一点反应都没有,我的屏幕上却返回这样一句话:Access is denied (拒绝访问)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
为什么会出现这种情况呢?发现,在Windows XP默认的安全策略中,只有管理员组的用户才有权从远端关闭计算机,而一般情况下我们从局域网内的其他电脑来访问该计算机时,则只有guest用户权限,所以当我们执行上述命令时,便会出现“拒绝访问”的情况。    找到问题的根源之后,解决的办法也很简单,只要在客户计算机(能够被远程关闭的计算机,如上述的netproxy)中赋予guest用户远程关机的权限即可。这可利用Windows XP的“组策略”或“管理工具”中的“本地安全策略”来实现。
下面以“组策略”为例进行介绍:   

1、单击“开始”按钮,选择“运行”,在对话框中输入“gpedit.msc”,然后单击“确定”,打开“组策略编辑器”。   

2、在“组策略”窗口的左窗格中打开“计算机配置”—“Windows 设置”—“安全设置”—“本地策略”—“用户权利指派”。(如图)   

3、在“组策略”窗口的右窗格中选择“Force shutdown from a remote system (从远端系统强制关机)”,双击。   

4、在弹出的对话框中显示目前只有“Administrators”组的成员才有权从远程关机;单击对话框下方的“添加用户或组”按钮,然后在新弹出的对话框中输入“guest”,再单击“确定”。   

5、这时在“从远端系统强制关机”的属性中便添加了一个“guest”用户,单击“确定”即可。   

6、关闭“组策略”窗中。    通过上述操作后,我们便给计算机netproxy的guest用户授予了远程关机的权限。以后,我们要远程关闭计算机netproxy,只要在网络中其他装有Windows XP 的电脑中输入以下命令即可:    shutdown -s –m \\netproxy -t 30 (其他参数用法同上)    这时,在netproxy计算机的屏幕上将显示一个“系统关机”的对话框,提示“系统即将关机。请保存所有正在运行的工作,然后注销。未保存的改动将会丢失。关机是由netproxy\guest初始的。”在对话框下方还有一个计时器,显示离关机还有多少时间。在等待关机的时间里,用户还可以执行其他的任务,如关闭程序、打开文件等,但无法关闭该对话框,除非你用shutdown –a命令来中止关机任务。    最后,有一点要说明的是,shutdown命令不但可以远程关闭装有Windows XP系统的计算机,它还可以远程关闭装有Windows 2000系统的计算机(对于Win9X嘛,好像不适用)。有关Windows 2000客户计算机上的一些设置,操作方法同上,这里就不再多说了。 另外shutdown作为一个外部命令(其对应文件为\Windows\system32文件夹下的shutdown.exe),我们还可将它复制到Windows 2000的机器上,这样,在装有Windows 2000系统的机器之间便也能相互实现远程关机

attrib

attrib指令用于修改文件的属性·文件的常见属性有:只读·存档·隐藏和系统·

attrib指令的格式和常用参数为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ATTRIB [+R | -R] [+A | -A ] [+S | -S] [+H | -H] [[drive:] [path] filename] [/S [/D]]

+ 设置属性。
- 清除属性。
R 只读文件属性。
A 存档文件属性。
S 系统文件属性。
H 隐藏文件属性。
I 无内容索引文件属性。
[drive:][path][filename]
指定要处理的文件属性。
/S 处理当前文件夹及其子文件夹中的匹配文件。
/D 处理文件夹。
/L 处理符号链接和符号链接目标的属性。

1
2
3
4
5
6
7
8
9
10
attrib的用途不是很广泛.不过有的时候可以利用它来做一些方便的文件处理.比如U盘中感染了病毒.会在U盘的驱动器里建立多个隐藏的文件.其中会有一个名为autorun.inf的文件.这个文件会为U盘添加一个自动运行的菜单.如果把默认打开操作改成关联病毒程序.那么在你双击U盘的时候.就会感染U盘所带的病毒.通常情况下无法看到这些文件就没办法删除.可以用下面的步骤来清除.
以下假设我的U盘驱动器的盘符是L:."/*"与"*/"之间的内容为注释.在运行中敲入CMD确定便可以快速打开系统的命令提示符.运行的快捷键为"WIN"+"R".
C:\Documents and Settings\Administrator>L: /*进入L盘目录*/
L:\>dir/a /*这个指令是查看当前目录全部的文件.包括有隐藏属性的.可以用来查看是否有autorun.inf等文件.*/
L:\>attrib autorun.inf -a -s -r -h /*去掉autorun.inf的四种属性*/
L:\>del autorun.inf /*删除autorun.inf*/
然后拔掉U盘.再一次连接的时候U盘的自动运行菜单就没有了.当然.其他的病毒程序也可以如此操作.如果把autorun.inf换成*.*就可以一次对当前目录下全部文件进行操作了.如:
L:\>attrib *.* -a -s -r -h
进入E盘 然后输入命令还恢复显示文件
attrib /d /s +a -s -h -r 这条命令可以恢复U盘所有文件夹

病毒的原理编辑
把所有文件夹设置为隐藏的系统文件 然后复制出病毒样本 他们都是文件夹图标
名字都是被隐藏的正常文件夹 这样就造成一种假象 当你运行正常的文件夹时就会无法打开
因为他就是一个设计好的病毒 正常文件夹都无法显示 一旦中了U盘病毒就没办法再恢复了,
但是病毒清除后仍可用attrib进行恢复。

stl容器erase删除元素后iterator迭代器出错

Posted on 2019-05-29 | In C++ , 其他 |
Words count in article: 532 | Reading time ≈ 2

stl容器erase删除元素后iterator迭代器出错

erase容器中元素的时候,迭代器会失效

对于关联容器(如map, set, multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前iterator即可。这是因为map之类的容器,使用了红黑树来实现,插入、删除一个结点不会对其他结点造成影响。

其实就是没有影响

1
2
3
4
5
6
7
8
for (iter = cont.begin(); it != cont.end();)
{
(*iter)->doSomething();
if (shouldDelete(*iter))
cont.erase(iter++);
else
++iter;
}

对于序列式容器(如vector,deque),删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。还好erase方法可以返回下一个有效的iterator。

就是有影响

1
2
3
4
5
6
7
8
for (iter = cont.begin(); iter != cont.end();)
{
(*it)->doSomething();
if (shouldDelete(*iter))
iter = cont.erase(iter); //erase方法可以返回下一个有效的iterator
else
++iter;
}

对于list来说,它使用了不连续分配的内存,并且它的erase方法也会返回下一个有效的iterator,因此上面两种方法都可以使用。

例子

删除数组中某个元素后连续重复的元素,例如 1,1,2,3,3,1,1,1,4,0 —> 1, 2,3,1,4,0。

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
#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char* argv[])
{
int a[] = {1, 1, 3, 3, 3, 2, 4, 1, 1, 1, 0};
int size = sizeof(a)/sizeof(a[0]);

vector<int> vec(a, a+size);

vector<int>::iterator iter = vec.begin();
int previous = *iter;
++iter;
for (; iter != vec.end();)
{
if(*iter == previous)
{
iter = vec.erase(iter);
}
else
{
previous = *iter;
++iter;
}
}

for(iter = vec.begin(); iter != vec.end(); ++iter)
{
cout << *iter << endl;
}

return 0;
}

不过实际上这个问题,用vector来实现不是很适合,因为每次删除一个元素,都会引起vector的一个resize操作。resize的时间复杂度是O(n),整个的resize操作要花费O(n^2)。最好是选择list最为容器,list最适合那些需要在容器中间做插入、删除的例子。

队列

Posted on 2019-05-29 | In C++ , 数据结构 |
Words count in article: 928 | Reading time ≈ 5
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
#include <vector>
#include <iostream>

using namespace std;

template <typename T> class Queue{
private:
vector<T> qqueue;
int size;
public:
Queue();
~Queue();
void push(T e);
T pop();
int getSize()const;
int isEmpty()const;
T getFront();
T getBack();
};

template <typename T>
Queue<T>::Queue(){
this->size = 0;
}

template <typename T>
Queue<T>::~Queue(){

}

template <typename T>
void Queue<T>::push(T e){
this->qqueue.push_back(e);
this->size++;
}

template <typename T>
T Queue<T>::pop(){
if(this->size == 0)
{
cout << "isEmpty Wrong" << endl;
return -1;
}
T ret = this->qqueue[0];
for(int i=0; i<this->size-1; i++)
this->qqueue[i] = this->qqueue[i+1];
this->qqueue.erase(this->qqueue.begin() + this->size - 1);
this->size --;
return ret;
}

template <typename T>
int Queue<T>::getSize()const{
return this->size;
}

template <typename T>
int Queue<T>::isEmpty()const{
return (this->size == 0);
}

template <typename T>
T Queue<T>::getFront(){
if(this->size == 0)
{
cout << "isEmpty Wrong" << endl;
return -1;
}
return this->qqueue[0];
}

template <typename T>
T Queue<T>::getBack(){
if(this->size == 0)
{
cout << "isEmpty Wrong" << endl;
return -1;
}
return this->qqueue[this->size-1];
}


int main(){
Queue<int> test;
cout << "The size: " << test.getSize() << endl;
cout << "Is Empty? " << test.isEmpty() << endl;
for(int i=0; i<10; i++)
{
cout << "Push: " << i << endl;
test.push(i);
}
cout << "The size: " << test.getSize() << endl;
for(int i=0; i<5; i++)
cout << "Pop: " << test.pop() << endl;
cout << "The size: " << test.getSize() << endl;
cout << "Is Empty? " << test.isEmpty() << endl;
cout << "Now the front: " << test.getFront() << endl;
cout << "Now the back: " << test.getBack() << endl;
return 0;
}
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
#include <iostream>
using namespace std;

template <typename T>
struct Node
{
T data;
Node<T>* next;
};


template <typename T> class LinkedQueue{
private:
int size;
Node<T>* QueueHead;
public:
LinkedQueue();
~LinkedQueue();
int getSize()const;
bool isEmpty()const;
T getFront()const;
T getBack()const;
void push(T e);
T pop();
};

template <typename T>
LinkedQueue<T>::LinkedQueue(){
this->size = 0;
this->QueueHead = new Node<T>;
this->QueueHead->next = NULL;
}

template <typename T>
LinkedQueue<T>::~LinkedQueue(){
while(this->size > 0)
{
this->pop();
}
delete this->QueueHead;
}


template <typename T>
int LinkedQueue<T>::getSize()const{
return this->size;
}

template <typename T>
bool LinkedQueue<T>::isEmpty()const{
return (this->size == 0);
}

template <typename T>
T LinkedQueue<T>::getFront()const{
if(this->size == 0)
{
cout << "isEmpty Wrong" << endl;
return -1;
}
return this->QueueHead->next->data;
}

template <typename T>
T LinkedQueue<T>::getBack()const{
if(this->size == 0)
{
cout << "isEmpty Wrong" << endl;
return -1;
}
Node<T>* cur = this->QueueHead;
while(cur->next != NULL)
{
cur = cur->next;
}
return cur->data;
}


template <typename T>
void LinkedQueue<T>::push(T e){
Node<T>* cur = this->QueueHead;
while(cur->next != NULL)
{
cur = cur->next;
}
Node<T>* ans = new Node<T>;
ans->data = e;
ans->next = NULL;
cur->next = ans;
this->size++;
}

template <typename T>
T LinkedQueue<T>::pop(){
if(this->size == 0)
{
cout << "isEmpty Wrong" << endl;
return -1;
}
Node<T>* delNode = this->QueueHead->next;
this->QueueHead->next = delNode->next;
T retdata = delNode->data;
delete delNode;
this->size--;
return retdata;
}


int main(){
LinkedQueue<int> test;
cout << "The size: " << test.getSize() << endl;
cout << "Is Empty? " << test.isEmpty() << endl;
for(int i=0; i<10; i++)
{
cout << "Push: " << i << endl;
test.push(i);
}
cout << "The size: " << test.getSize() << endl;
for(int i=0; i<5; i++)
cout << "Pop: " << test.pop() << endl;
cout << "The size: " << test.getSize() << endl;
cout << "Is Empty? " << test.isEmpty() << endl;
cout << "Now the front: " << test.getFront() << endl;
cout << "Now the back: " << test.getBack() << endl;
return 0;
}

栈

Posted on 2019-05-29 | In C++ , 数据结构 |
Words count in article: 3k | Reading time ≈ 16

栈

栈是按后进先出的原则进行处理的。
栈也分为顺序存储和链式存储两种结构,分别称为顺序栈和链栈。若事先知道栈顶元素的范围,可以使用顺序栈结构,若栈中元素的数目变化范围很大,就要考虑使用链式存储结构。

Read more »

Pygame色彩与绘图机制

Posted on 2019-05-29 | In python , python游戏开发 |
Words count in article: 1.2k | Reading time ≈ 6

Pygame色彩与绘图机制

Read more »

Pygame事件处理机制

Posted on 2019-05-29 | In python , python游戏开发 |
Words count in article: 711 | Reading time ≈ 3

Pygame事件处理机制

事件处理需求

  • • 响应用户键盘、鼠标等外设操作
  • • 响应屏幕尺寸和模式变化
  • • 响应游戏情节的特定触发条件
  • • 产生一些触发条件
Read more »

Pygame屏幕绘制机制与窗口感知和刷新运用

Posted on 2019-05-29 | In python , python游戏开发 |
Words count in article: 1.2k | Reading time ≈ 6

Pygame屏幕绘制机制

Read more »
1…252627…38
zzm99

zzm99

372 posts
40 categories
3 tags
GitHub
0%
© 2020 zzm99 | Site words total count: 409.1k
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4