以前PHP被认为只能用来编写服务器端的CGI程序, 如果说PHP能够开发Windows下的GUI(图形用户界面) 程序,你相信吗?最近, PHP的开发小组成功开发出了捆绑GTK+的PHP, 那么就可以开发Windows下的GUI程序了。
一、建立PHP/GTK运行环境:
其实GUI程序和普通的PHPCGI程序没有什么区别, 不过是PHP/GTK程序由GTK的类来生成GUI界面而已, 他们同样是开放源代码,靠PHP来解析建立窗口。 如果你已经建立好了PHP的调试环境,那么安装PHP/ GTK环境比较简单:
1、下载php_gtk.dll( 这个dll文件用于解析PHP源程序里面的GTK代码), 下载后将其解压到PHP的扩展(extension)目录中;
2、下载其他PHP/GTK的dll文件(一共6个), 将他们解压缩到Windows的system32目录里面;
3、打开php.ini,在扩展设置部分“Windows Extensions”最下面加入“extension= php_gtk.dll”的语句,建议先备份php.ini, 避免修改失败使得建立好的PHP运行环境作废;
现在就建立好了PHP/GTK的运行环境了。当然, 你也可以不作第二步,而改为在每个PHP/ GTK程序源代码的第一行加入“dl(’php_gtk. dll’)”来动态加载GTK的支持。
如果你还没有建立PHP运行环境,那么安装要更加简单:
1、下载整个PHP/GTK的捆绑支持包, 然后将他们解压缩到c盘的PHP4目录下面;
2、 将winnt目录下面的dll文件拷贝到Windows的sys tem32目录中,将php. ini文件拷贝到Windows的目录中;
建 立好了PHP/GTK的运行后, 可以用命令行模式的PHP来运行一个PHP/GTK程序: 在运行中输入“c:\php4\php -q gtkprogrampath”,其中“c:\php4\ php”改为PHP.EXE的路径,“ gtkprogrampath”就是PHP/GTK程序的 路径。比如:“c:\php4\php -q c:\php4\samples\hello.php” 将会运行PHP/GTK运行包中附带的例子“hello world”程序。
二、编译PHP/GTK程序:
如果你作出一个PHP/GTK的应用程序, 还需要对方的电脑建立PHP的运行环境并且使用PHP命令行模式 来解析才可以执行的话,那就过于复杂了。 那么怎么样才可以编译一个PHP/GTK的程序呢? 经过一番搜索,笔者发现了PHPCompiler这个软件。
PHPCompiler由 www.deskcode.com 开发 ( http://www.deskcode.com/ phpcompiler ), 可以将PHP编译成为EXE可执行文件,内置了PHP的支持, 如果你要编译一个PHP/GTK程序,必须建立PHP/ GTK的运行环境(参照前面的步骤)。要编译一个PHP/ GTK程序的步骤如下:
1、打开PHPCompiler,在“Script to”选择希望编译的PHP程序源代码,在“ Destination”处选择编译成功后的EXE文件的路径;
2、点击“Compile”按钮, 会弹出一个对话框询问使用的编译模式(如果是PHP/ GTK程序就选择no,是单纯的PHPCGI程序就选择yes) ;
3、然后又会弹出一个对话框询问是否拷贝php4ts. dll文件到编译后的EXE文件的目录,选择yes。
经过上面的步骤,一个PHP/GTK程序就成功编译了, 但是对于编译PHP/GTK程序还有几个需要注意的地方:
1、编译完成后的可执行文件如果需要执行, PC机上面必须具有GTK运行环境所需的几个dll文件( 就是前面下载的那几个),如果需要作成应用程序, 可以在安装的时候将几个dll文件拷贝到system32目录中 (不过这样子程序也就不是“绿色软件”了^_^)。
2、 PHPCompiler本身对于PHP的支持非常好, 但是有些人试过用一些需要扩展支持的函数,比如“gzopen” 等等,在编译之前还好好的,编译完毕 后就不能用了。其实编译完成后的可执行文件, 相当于了只有默认的PHP支持(连GTK支持都没有了), 所以如果在程序中应用了任何需要扩展支持的函数,都 必须动态的加载支持函数的dll文件,比如“dl(’php_ gtk.dll’)”,这样子编译完成后才不会出错。
3、运行一个编译后的可执行文件,都会先弹出一个DOS窗口, 然后自动关闭,因为每个GUI窗口都是通过GTK来“绘制” 出来的,所以必须会有那个窗口。
4、或许以前PHP还不能说是真正的OOP(面向对象程序) 语言,但是到了PHP/GTK,任何一个窗口都由GTK对象来“ 绘制”,如果没有过硬的OOP功底,是很难写出GUI程序的。
三、PHP/GTK资源:
1、 http://gtk.php.net :PHP/ GTK的官方网站;虽然说是官方网站,但是确简陋的很, 出了一个FAQ和邮件列表,几乎找不到任何有用的东西了,
2、 http://www.phpgtk.com : 一个界面比较好的PHP/GTK网站,有最新的版本信息。
3、 http://developer.gnome.org/ doc/API/gtk/gtkobjects.html : PHP/GTK函数和类的大全/手册网站, 里面有十分丰富的PHP/GTK资料。
4、 http://www.phpuk.org/gtk/ : 非官方版本的GTK手册网站,简单易懂。
如果大家认为E文比较难看,也可以来zphp.com [url] http://dl.itbulo.com/’[/url] > 下载最新的PHP/GTK运行环境和支持包。
PHP-GTK 开发入门全集 (1)
1. PHP-GTK介绍
1.1 PHP-GTK
PHP-GTK是PHP的延伸模组, 它可以让程序设计师写出在客户端执行的、且独立的GUI的程序。 这个模 组不允许在浏览器上显视 GTK+ 的程序, 它一开始就是开发来写独立的 GUI 程序的。
1.2 GTK
GTK原本是为GIMP,一个GUI的影像处理软体而开发的。 GTK+是GIMP的套装工具。GTK+从这里开始发展, 直到现在已经成为Gnome的中心 (Gnome是一个桌面环境)。后来GTK+ 也已经被推广到BeOS和Win32, 使得它成为PHP延伸模组的最佳选择, 维持PHP可以跨平台并可以用 PHP为Linux,BeOS, Windows等平台开发视窗接口的程序。
2. PHP-GTK概念
2.1 前言
接下来就要教各位一点点比较观念性的东西罗┅ 因为这章的概念都是非常重要的,所以就算不懂, 也还是要慢慢的看懂它,不然┅以后就┅。还有,接下来的内容不 建议没有程序设计经验的读者阅读, 因为有很多的观念很容易会搞不清楚。还有, 接下来该用英文的部分我都会用英文, 这样大家在看国外文件的时候才不会不知所 措,加油吧 !! 如果对本章有任何不懂之处,请自行查阅
PHP-GTK Manual: http://gtk.php.net/ manual/en/
2.2 Widget(s)
Widget是一个GUI程序中基本的functions和fo rms。最常用的几个Widget是:label、 button、window、 frame和text box。 所有的widget都是来自于一个抽象的基本class─ GtkWidget。每个widget都是一个class
一个Widget一生大概都有五个时期:
1. 建立(Creation):宣告一个对象(declaring an object)
2. 放置(Placement):将它加入一个 容器中 (adding it to a container)
3. 信号连接(Signal Connection):接收信号以及进行动作(the action it will perform)
4. 显示(Display):它是否是可见的(whether it is viewable or not)
5. 删除(Destruction):关闭程序(closing of a program)
2.3 Container(s)
Container是一个可以包含其它widget的widge t。大部分的widget 都是 container ,例如: Gtk Window 、 GtkTable 和 GtkBox 。除了这点之外, contain er 跟其它的 widget 没两样,也可以被放到其它 contai ner 去。而所有的 container 都是来自于一个 class─ GtkContainer ,本身来自于 GtkWidget 的 cl ass 。所以 container 也是 widget 的一种。
2.4 Signal(s)
当程序设计师在程序中做了一个动作时, 程序需要有一个动作来回应使用者的动作。 Signals使程序可以知道使用者做了动作并可以触发适合的回 应。
例如,当使用者按了一个可以开新视窗的按钮( GtkButton),程序认出这个请求, 于是就开了一个新的视窗。这件事可以经由signal来做到。 当按 钮按下去之后,会使widget发出一个signal, 接着再由该signal触发callbacks, 产生一个新的视窗(GtkWindow)。
2.5 Callback(s)
Callback就是当signal送出之后, 被signal唤起的function。 Callback会执行function传回一个值或是做一个动 作。Callback就是signa l 的 handler funciton 。它可以是该 signal 的预设 handler 或着是程序设计师定义的function 。要建立一个 callb ack ,就必须把 function connect 到 signal 。
2.6 Signal Inheritance(继承)
和methods一样,signals可以被对象继承。 一个widget可以送出任何它的parent widget可以送出的还有它自己特有的signal。
2.7 Connecting Signals
你必须为PHP-GTK指定一个callbac k function 当 signal 送出时来对 signal 做回应。 把一个 signal 连接到一个 function 可以用 conne ct() 这个 object 方法达成。
如下:
$window = & new GtkWindow();
$window ->connect( "destroy" , "shutdown" );
$button = & new GtkButton( "按我" );
$button ->connect( "clicked" , "you_clicked" );
$window ->add( $button );
$window ->show_all();
gtk::main();
?>
//建立一个GtkWindow $window = &new GtkWindow(); //将"destroy" signal用connect() 方法连接到shutdown函式 $window->connect("destroy", "shutdown"); //建立一个GtkButton,按钮文字为"按我" $button = &new GtkButton("按我"); $button->connect("clicked", "you_clicked"); //把GtkButton放到是container的GtkWindow中 $window->add($button); //显示$window以及它的所有child widget $window->show_all(); //进入程序主回圈(即程序启动之意) gtk::main(); ?>
执行它的话,就会出现一个视窗,里面有一个写着"按我"的按钮, 按下按钮程序就会执行you_clicked 函式。 在这个程序中, $window 对象的 "destroy" signal 是在使用者按下视窗右上角的 "X" 时会送出的;而 $ button 对象的 "clicked" signal 是在使用者按下该按钮的时候会送出的。最后那一行的 gtk::main() 是一定要执行的,这样才能告诉电脑要开始执行程序, 既然有开始执行,那就一定有停止吧 ? 没错,用 gtk::main_quit() 就可以停止程序了。
看完了以上的范例,有些读者可能会有疑问「 如果我想执行送出signal的widget之外的widget 的meth od 怎么办 ? 」,这时候,就要用另一 个 method 了 a connect_object() , 它可以跨对象呼叫方法或是传递其它对象做为 function 的叁 数。跨对象呼叫方法如下:
$window->connect_object(" destroy", array("gtk","main_quit"))
如此,在$window对象的"destroy" signal送出的时候就会唤起gtk::main_quit( )这个方法,程序就会终指执行。
在介绍连接方法的最后,再提一下connect() 和 connec t_object() 的自订增加要传给 callback function 的叁数的办法。见例子:
$parameter = "新超人" ;
$button1 = & new GtkButton( "测试" );
$button1 ->connect( "clicked" , "who_are_you" , $parameter );
$button2 = & new GtkButton( "测试二" );
$button2 ->connect_object( "clicked" , "kill_the_button1" , $button1 );
function who_are_you( $widget , $parameter ){
echo $parameter ;
}
function kill_the_button( $button ){
$button ->destroy();
}
?>
$parameter="新超人"; $button1 = &new GtkButton("测试"); //将"clicked" signal连接到who_are_you函式,附加叁数$parameter $button1->connect("clicked","who_are_you",$parameter); $button2 = &new GtkButton("测试二"); //将"clicked" signal连接到kill_the_button1函式,附加叁数$button1 $button2->connect_object("clicked","kill_the_button1",$button1); function who_are_you($widget,$parameter){ echo $parameter; } function kill_the_button($button){ $button->destroy(); } ?>
注意那两个function,who_are_ you有两个叁数对 吧 ? 第一个是做什么用的呢 ? 为什么它会自动出现 ?? 因为,每个 signal 的 callback function 都会因为 signal 的不同而加上一些内定一定 会传入 callback function 的叁数,而基本上所有的 signal 都至少会传 给 callback function 一个叁数 a 产生该 signal 的物件。所以 wh o_are_you 的第一个叁数就是 $button1 , 而第二个就是 $ parameter ,也就是新超人。那 kill_the_ button 函式就不一样罗 ~ 因为 connect_object() 函式会呼略原本 signa l 的 callback function 的预设叁数,所以 kill_the_ button 就只有附加在 connect_object 最后的 $ button1 叁数了,如此, kill_the_button 就可以呼叫 $button1 的方 法或是取得它的属性,这里呼叫了 $button1 的 destro y 方法,于是 $ button1 就会被消灭。
2.8 Event(s)
Event是signal的一种, 但是它的用途还有功能都非常强大。就signal来说, signal这种东西都是内建在widget上的,所以,例如 GtkWindow 没有 "clicked"signal , 那么在不用 event signal 的情况下, GtkWindow 是决对不可能送出 cl icked 之类的 signal 的。那如果用了 event signal 呢 ? Event signal 是可以允许被加到任何的 widget 上的, 所以就算这个 widget 本来没有发出 "clicked" signal 的功能,你也可以用 add_events() 来为它加上按了它之后 event signal 会做什么样的反应。而 event signal 中包含的资讯比较多,比如说当你在使用 "key- press-event" 这个 event signal 的时候,同时也会记录到你按下的是什么按键, 于是通常 event signal 的 callback function 格式内定会有两个叁数,第一个依然是送出 sig nal 的 widget ,而第二个就是 $event ,这个 $ event 是一个 class ,里 面的属性和方法会因为送过来的 event signal 种类而不同。就 "key-press-event" 传回的$event class 来说,里面有一个属性是 keyval , 内容就是使用者按的是哪一个键。 这些对于一个程序设计师来说常常是很有用的资讯。所以 event 的重要性 是不可忽视的,就算刚开始会有点不懂,也要慢慢的融入才行。 这一节也非常重要。
PHP-GTK 开发入门全集 (2)
3. 安装PHP-GTK
3.1 在Windows系统下安装
首先要从 http://gtk.php.net/ download.php 下载 …HP-GTK 的 window s binary 档案 ( 本文撰写时为 0.5.1 版 ) 。
接着来看看PHP-GTK 0.5.1 binary档的内容:
\php4 → php 和 php-gtk binary 档案
\w innt → 预设的 php.ini 档案
\winnt\system32 → gtk binaries used by extension
\test → 几个测试用的档案
\README.txt → 安装说明档
开始安装:
1. 复制 \php4 的内容到你的php安装目录下(例C:\php)。
2. 复制 \winnt 的内容到你的winnt资料夹。在Windows NT或Windows2000上是C:\winnt, 在Window95、98、xp上是C:\windows。 如果该资料夹里已经有 php.i ni ,那就不用做这个动作。
3. 复制 \winnt\system32 的内容到你的winnt\system32资料夹。 在Windows NT或Windows2000上是C:\winnt\ system32,在Window95、98、xp上是C:\ windows\system32。
4. 复制 \test 的内容到你想要执行你的script的地方(此步骤非必要)。
如何执行PHP-GTK程序:
PHP-GTK程序可以在「开始」-「执行」下输入指令( 或是建立捷径)来启动,如:C:\php\php -q c:\ php\test\gtk.php ## 表示不送印出 HTTP Header ,但一直使用这个视窗,直到关闭程序。
C:\php\php -q -c php.ini c:\gtk.php ## 同上,但执行指定的php.ini设定。
C:\php\php C:\php\test\gtk.php ## 表示会送印出 HTTP Header,但一直使
用这个视窗,直到关闭程序
C:\php\php_win C:\php\test\gtk.php ## 表示不使用视窗,执行后独立一个执行程序,他是使用 php -q模式,但是只要 output 出任何字符,例如错误讯息, 就会停止执行。
3.2 在UNIX系统下安装
Debian的使用者可以在 http://www.debian.org 下载 PHP-GTK 的 binary 档。系统需求须已安装下列 pa ckage :
PHP 4.1.0 或之后的版本,必须是编为CGI binary(command-line) 版本,包含所有的header files和devlement scri pts 。
PHP-GTK支持GTK+ v1.2而需要安装1.2.6以上版本的GTK+。GTK+ v2.0还未被支持, 必须等到它开发完成并且普及了之后才会被支持。 你可以从下面的网址取得GTK+ v1.2.X的最新版本: ftp://ftp.gtk.org/ pub/gtk/v1.2/
在将取得的档案解压缩或是由 CVS 中 check out 出来之后,切换到该目录下,开始进行安装 ( 打指令罗 ~) :
取得 CVS 版本,执行
cvs -d server:cvsread@cvs.php.net:/ repository co php-gtk
或下载最新版本
http://gtk.php.net/download. php
1. ./buildconf
2. ./configure (想要加装extensions的话请输任./ configure –help看说明)
3. make(如果看到"Could not write ┅ " ,只是代表该 GTK+ object 还没被支持,不算是什么错误讯息 )
4. make install
执行看看test/资料夹中的范例scripts来测试, 特别是gtk.php,这些都是展示如何使用的好例子。
4. 第一支程序
4.1 前言
本章会教导各位一些常用的GtkClass(widget), 还有运用这些来做出你的第一支PHP-GTK程序, 如果概念那章不是很熟的话,这章可以给你一个练习的机会喔! 如果对本章的内容有不懂或是想要深入了解其它的widget, 可以到 http://gtk.php.net/manual/ en/ 看手册,手册里面有不少范例程序。
4.2 会用到的widgets
在开始写程序之前,先来对等一下会用到的widget class们做一个overview。
GtkWindow()
GtkWindow()建立一个视窗,里面有很多方法可以使用, 如:set_title,set_name,
connect,set_border_width等┅。
GtkFrame()
GtkFrame()纯粹建立一个好Border, 你可以设定它的label name,alignment,
shadow(用英文,读Manual的时候会比较方便)。
GtkVBox()
GtkVBox() 建立一个直立的container来放入widgets。
GtkLabel()
GtkLabel()可以建立一个label, 内容文字可以建立时设定也可以建立后用方法来设定, 如果没有设定内容文字,将会建立一个空的label(这是废话吗 ┅?) 。
GtkHSeparator()
GtkH separator() 建立一个水平线。
GtkEntry()
GtkEntry()建立一个textbox供使用者输入资讯。
GtkHButtonBox()
GtkHButtonBox() 建立一个以水平方式排列Button的container。
GktBtton()
GtkButton() 或许可以说是GUI程序中最常用的widget了, 它建立一个可以让使用者按的按钮。
4.3 开始
If(!class_exist( "gtk" ))
{
dl("php_gtk." .( strstr (PHP_OS, "WIN" ) ? "dll" : "so" ));
}
If(!class_exist("gtk")) { dl("php_gtk.".(strstr(PHP_OS,"WIN") ? "dll" : "so")); }
这段程序码会判断PHP-GTK延伸模组是否已启动,如果没有, 它就会读取适当的档案。在上面的范例中, 是靠判断执行的作业系统是Windows还是其它来判断要载入p hp_gtk.dll还是php_gtk.so 。
Function delete_event()
{
return false;
}
Function delete_event() { return false; }
这里建立了一个名为delete_ event的function, 这个function是等会儿delete-event signal发出时的callback function。内 容传回 false 会告诉 PHP-GTK 用预 设的 signal handler 来处理,而预设的 handler 会关闭视窗 ( 同时 会呼叫该视窗的 destroy() 函式 ) ,在这里,它会关闭程序 ( 因为这个范例程序只有一个主视窗 ,一旦关闭就会关闭程序 )
Function destroy()
{
Gtk::main_quit();
}
Function destroy() { Gtk::main_quit(); }
这里建立了一个函式,destroy()。在这个程序中, 这个函式是很重要的,因为我们在关闭程序的时候会连接到它。 之前说过,Gtk:: main_quit()会关闭程序, 如果我们在这个程序中没有定义这个 function 或是这个 fu nction 里面没有 Gtk::main_quit () 这行,那么这个程序就不会关闭了。 以上一段程序码说明里提到的 delete-event 来说, re turn false 之后预设会执行关闭视窗的动作,还会呼叫 destro y() 函式,如果这里没有定义或是没有 Gtk::main_ quit() 这段的话,主视窗 的确会关闭,可是程序并不会结束,因为主程序回圈 aGtk:: main() 还在跑。
$window = & new GtkWindow();
$window ->set_name( ‘main window’ );
$window ->set_title( ‘对PHP-GTK的介绍’ );
$window ->set_usize(160, 120);
$window ->connect( ‘destroy’ , ‘destroy’ );
$window ->connect( ‘delete-event’ , ‘delete_event’ );
$window ->set_border_width(10);
$window ->set_position(GTK_WIN_POS_CENTER);
$window ->show_all();
Gtk::main();
?>
$window = &new GtkWindow(); //设定名字以辨别各个视窗 $window->set_name(’main window’); //设定视窗的标题 $window->set_title(’对PHP-GTK的介绍’); //设定视窗的大小 $window->set_usize(160, 120); //呼叫destroy()函式来结束程序 $window->connect(’destroy’, ‘destroy’); //呼叫delete_event()函式来关闭视窗 $window->connect(’delete-event’, ‘delete_event’); //设定视窗的边框宽度 $window->set_border_width(10); //设定视窗的位置 $window->set_position(GTK_WIN_POS_CENTER); //显示视窗和所有child widget (不显示就看不到) //最后这两行一定要放在程序码的最后,否则什么都看不到 $window->show_all(); Gtk::main(); ?>
执行程序可以看到如下的图:
$frame " = & new GtkFrame( ‘经过简易修改的程序’ );
$window ->add( $frame );
//建立一个GtkFrame $frame" = &new GtkFrame(’经过简易修改的程序’); //把GtkFrame放到GtkWindow里 $window->add($frame); //最下面两行不要动
结果如下图:
下面这段建立一个 GtkVBox 作为 container ,并把 G tkEntry 、 GtkHSeperator 、 GtkLabel 和 GtkButtonBox 都 pack 进去,所谓 pack ,是 Gt kBox 底下的 container 们特别加入的放入 widget 的方法,就类似于add () ,而 pack 用的方法一般是 pack_start() 和 pa ck_end() ,比 add() 好的地方是可以控制将 widge t 增加进去之后 widget 的位置 ( 不过只要是 container 就会有 add () 方法 ) ,欲查询详细资料请至
http://gtk.php.net/manual/en 。
$box1 " = & new GtkVBox();
$frame ->add( $box1 );
$label = & new GtkLabel();
$box1 ->pack_start( $label );
$separator = & new GtkHSeparator();
$box1 ->pack_start( $separator );
$entry = & new GtkEntry();
$box1 ->pack_start( $entry );
$box2 = & new GtkHButtonBox();
$box1 ->add( $box2 );
//建立一个GtkVBox,为常用的container $box1" = &new GtkVBox(); //把GtkVBox放到GtkFrame里面 $frame->add($box1); //建立一个GtkLabel并将它pack到GtkVBox里 $label = &new GtkLabel(); $box1->pack_start($label); //建立一个GtkHSeparator并将它pack到GtkVBox里 $separator = &new GtkHSeparator(); $box1->pack_start($separator); //建立一个GtkEntry并将它pack到GtkVBox里 $entry = &new GtkEntry(); $box1->pack_start($entry); //建立一个GtkButtonBox并将它add到GtkVBox里 //因为GtkButtonBox也是一个无形的container,位置不重要,所以用add() $box2 = &new GtkHButtonBox(); $box1->add($box2);
执行如下图:
最后这段程序码会建立两个 GtkButton 并 pack 到 Gtk ButtonBox 里去,还有为两个按钮加上连接, 使它们起作用,并建立一个函式,只要按下 GtkButton 就会 将 GtkLabel 的内容换成 GtkEntry 中的文字。
$button " = & new GtkButton( ‘显示输入的字’ );
$button ->connect_object( ‘clicked’ , ’set_name’ , $label , $entry );
$box2 ->pack_start( $button );
$button = & new GtkButton( ‘离开程序’ );
$button ->connect( ‘clicked’ , ‘destroy’ );
$box2 ->pack_start( $button );
function set_name( $label , $entry )
{
$gettext = $entry ->get_text();
$label ->set_text( $gettext );
}
$window ->show_all();
Gtk::main();
$button" = &new GtkButton(’显示输入的字’); //连接"clicked" signal到set_name()函式,附加$label和$entry两个widget $button->connect_object(’clicked’,’set_name’,$label,$entry); $box2->pack_start($button); $button = &new GtkButton(’离开程序’); //连接"clicked" signal到destroy()函式,将会关闭程序 $button->connect(’clicked’,'destroy’); $box2->pack_start($button); function set_name($label,$entry) { //用GtkEntry的get_text()方法从取得文字方块内容 $gettext=$entry->get_text(); //用GtkLabel的set_text()方法设定新的文字 $label->set_text($gettext); } //最后再提一下那两行┅. $window->show_all(); Gtk::main();
写到这里,整个程序就算是完成了,来看看执行的结果吧~