<?xml version="1.0" encoding="gb2312"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="zh"> 
<title>unanao</title> 
<link rel="alternate" type="text/html" href="http://oss.lzu.edu.cn/modules/lifetype/index.php?blogId=1" /> 
	 
	<modified>2010-01-22T00:44:48+1600</modified> 
<tagline>&lt;p&gt;持久的激情是一种财富&lt;/p&gt;
</tagline> 
<generator url="http://www.lifetype.net/" version="1.2">LifeType</generator> 
 
<copyright>Copyright (c) unanao</copyright> 
  
 <entry> 
 <id>tag:oss.lzu.edu.cn,2010-01-22:1256</id>
 <title>为网络启动设置PXE服务器</title> 
 <link rel="alternate" type="text/html" href="http://oss.lzu.edu.cn/modules/lifetype/index.php?op=ViewArticle&amp;articleId=1256&amp;blogId=1" /> 
  
 <modified>2010-01-22T00:44:48+1600</modified> 
 <issued>2010-01-22T00:44:48+1600</issued> 
 <created>2010-01-22T00:44:48+1600</created> 
 <summary type="text/plain"> 
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ...</summary> 
 <author> 
  
 <name>unanao</name> 
 <url>http://oss.lzu.edu.cn/modules/lifetype/index.php?blogId=1</url> 
</author> 
<dc:subject>
服务搭建 
</dc:subject> 
 <content type="text/html" mode="escaped" xml:lang="zh" xml:base="http://oss.lzu.edu.cn/modules/lifetype/index.php?blogId=1"> 
 &lt;p&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 如果你的系统完全崩溃掉了，不想刻盘，不想USB安装。又或是你需要给一个机房所有的机器安装系统。那么如果硬件支持，你应该试试网络安装。下面仅以debian为例介绍一下如何网络安装系统。&lt;br /&gt;
首先你的主板要支持网络启动，具体可以看bios。同时你需要设置一台 TFTP 服务器，并且对于很多机器来说，还需要一台 DHCP 服务器 ，或 BOOTP 服务器。BOOTP 是一种 IP 协议，用来告诉一台计算机它自己 IP 地址以及从网络何处获得启动映像。 DHCP (Dynamic Host Configuration Protocol) 是一个更灵活，向后兼容的 BOOTP 扩展。有些系统只能通过 DHCP 来配置。这里只介绍如何通过dhcp和tftp完成网络安装。&lt;br /&gt;
&lt;br /&gt;
1、安装、配置tftp&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.1 安装&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;# aptitude install tftpd-hpa&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.2 配置&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;$ vim /etc/inetd.conf&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 写入一下内容(lenny中默认已经设置好了)：&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tftp dgram udp wait root /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在较新版本的系统中(lenny中需要)，还需要将/etc/default/tftpd-hpa中的RUN_DAEMON置为yes。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.3 启动tftp服务（始配置生效）&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; #/etc/init.d/tftp-hda start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2、安装、配置dhcp服务器&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.1 安装：&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ apt-get install dhcp3-server&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.2 配置&amp;nbsp; &amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $ vim /etc/dhcp3/dhcpd.conf&lt;br /&gt;
加入如下内容：&lt;br /&gt;
# the configuration file for dhcpd when &amp;quot;Network boot linux via PXE&amp;quot;&lt;br /&gt;
# configure the ipaddress range, here is needded ***&lt;br /&gt;
subnet 192.168.1.0 netmask 255.255.255.0 {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; range 192.168.1.2 192.168.1.254;&lt;br /&gt;
}&lt;br /&gt;
# configure the ipaddress of the tftp server and the default file name&lt;br /&gt;
# please setup tftpd and put pxelinux.0 in the root directory of it&lt;br /&gt;
next-server 192.168.1.1;&lt;br /&gt;
filename &amp;quot;pxelinux.0&amp;quot;;&lt;br /&gt;
# configure the ipaddress of the tftp server as 192.168.1.1 to avoid it getting&lt;br /&gt;
# a dynamical one, you&#039;d modify the ethernet to your own before you using this&lt;br /&gt;
# configuration file&lt;br /&gt;
host server {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # ensure the ip address of tftp&lt;br /&gt;
&amp;nbsp; hardware ethernet 00:e0:b0:f5:82:61;&amp;nbsp;&amp;nbsp; #&lt;br /&gt;
&amp;nbsp; fixed-address 192.168.1.1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
range指定了客户机可以得到的ip的范围；next-server指定tftp服务器的ip地址；filename指定所启动的文件，这里注意，路径为相对于/etc/inetd.conf －s 后所指定的路径，一定不能写成绝对路径！！hardware ethernet 指定服务器的网卡地址，将服务器ip绑定为192.168.1.1避免服务器ip发生变化，使客户机不能tftp到指定的文件。至此，dhcp服务器配置完毕，现在一定不能在一个局域网里面启动，否则整个网络会出现问题。&lt;br /&gt;
下面通过交叉线(当然也可以通过交换机)将欲装系统的客户机和配置好的服务器相连。&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.3 配置ip 与指定的fixed-address相同&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; #ifconfig eth0 192.168.1.1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.4 重启使配置生效&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #/etc/init.d/dhcp3-server start&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.5 若无法启动dhcp服务。&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 若无法启动，看看自己ip与fixed-address是否一样，不一样则无法启动。&lt;br /&gt;
&lt;br /&gt;
3、配置PXE&lt;br /&gt;
只需要vmlinuz(or linux) 和initrd这两个文件就可以了。&lt;br /&gt;
3.1 充分利用debian的netboot.tar.gz来配置PXE&lt;br /&gt;
到http://http.us.debian.org/debian/dists/lenny/main/installer-i386/current/images/netboot/netboot.tar.gz (或者其它镜像站下载)下载netboot.tar.gz并解压到/var/lib/tftpboot.当然如果inetd.conf中你指定是别的路径，就解压到相应的地方,解压后得到debian-installer目录。&lt;br /&gt;
&lt;br /&gt;
3.2 在/var/lib/tftpboot目录下，利用debian-installer目录下的boot-screens创建menu目录，用于在进入安装之前，设置选择安装哪个发行版&lt;br /&gt;
#cd /var/lib/tftpboot&lt;br /&gt;
#mv debian-installer/i386/boot-screens menu　&lt;br /&gt;
其实只要保留 menu.cfg&amp;nbsp; syslinux.cfg&amp;nbsp; txt.cfg　vesamenu.c32　这四个文件就可以了，但是全部保留也没关系，可以只删掉*.txt文件（rm *.txt）&lt;br /&gt;
&lt;br /&gt;
3.3 &lt;br /&gt;
# cp -a /var/lib/tftpboot/debian-installer/i386/pxelinux.* /var/lib/tftpboot&lt;br /&gt;
修改default文件为： &lt;br /&gt;
# D-I config version 1.0&lt;br /&gt;
include menu/menu.cfg&lt;br /&gt;
default menu/vesamenu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
timeout 0&lt;br /&gt;
&lt;br /&gt;
3.4 添加一个需要安装的发行版&lt;br /&gt;
3.4.1 添加debian的网络安装&lt;br /&gt;
3.4.1.1 以安装debian　lenny　i386为例:&lt;br /&gt;
准备linux和initrd.gz&lt;br /&gt;
#mkdir /var/lib/tftpboot/debian_lenny_i386&lt;br /&gt;
#cp /var/lib/tftpboot/debian-installer/i386/linux /var/lib/tftpboot/debian_lenny_i386&lt;br /&gt;
#cp /var/lib/tftpboot/debian-installer/i386/initrd.gz /var/lib/tftpboot/debian_lenny_i386&lt;br /&gt;
3.4.1.2 配置新加入的网络安装的发行版，使之可以显示&lt;br /&gt;
#cd /var/lib/tftpboot/menu/&lt;br /&gt;
#cp txt.cfg lenny_i386.cfg&lt;br /&gt;
修改lenny_i386.cfg 为&lt;br /&gt;
label install&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;menu label ^Install lenny i386&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;menu default&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;kernel debian_lenny_i386/linux&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;append vga=normal initrd=debian_lenny_i386/initrd.gz -- quiet &lt;br /&gt;
(命名根据自己的习惯命就可以了)&lt;br /&gt;
最后，&lt;br /&gt;
unanao:/var/lib/tftpboot/menu#cat menu.cfg&lt;br /&gt;
menu hshift 13&lt;br /&gt;
menu width 49&lt;br /&gt;
&lt;br /&gt;
menu title Installer boot menu&lt;br /&gt;
include debian-install/i386/boot-screens/stdmenu.cfg&lt;br /&gt;
include menu/lenny_i386.cfg&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --这里加入include lenny_i386.cfg&amp;nbsp;&amp;nbsp;&amp;nbsp; （写的时候不要加--后面的内容）&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;
include menu/centos.cfg&lt;br /&gt;
include debian-install/i386/boot-screens/amdtxt.cfg&lt;br /&gt;
include debian-installer/i386/boot-screens/gtk.cfg&lt;br /&gt;
include debian-installer/i386/boot-screens/amdgtk.cfg&lt;br /&gt;
menu begin advanced&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;menu title Advanced options&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;include debian-installer/i386/boot-screens/stdmenu.cfg&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;label mainmenu&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;menu label ^Back..&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;menu exit&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;include debian-installer/i386/boot-screens/adtxt.cfg&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;include debian-installer/i386/boot-screens/amdadtxt.cfg&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;include debian-installer/i386/boot-screens/adgtk.cfg&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;include debian-installer/i386/boot-screens/amdadgtk.cfg&lt;br /&gt;
menu end&lt;br /&gt;
label help&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;menu label ^Help&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;text help&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Display help screens; type &#039;menu&#039; at boot prompt to return to this menu&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;endtext&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;config debian-installer/i386/boot-screens/prompt.cfg&lt;br /&gt;
(其实这个配置文件里面好多都没有用了，不过懒着删了呵呵)&lt;br /&gt;
一个debian　lenny　i386 的网络启动就做好了，其它的发行版也大同小异。&lt;br /&gt;
3.4.2 添加centos的网络安装&lt;br /&gt;
准备：vmlinuz 和initrd.img两个文件&lt;br /&gt;
#cd /var/lib/tftpboot/&lt;br /&gt;
#mkdir /var/lib/tftpboot/centos_i386&lt;br /&gt;
#wget http://centos.ustc.edu.cn/centos/5.4/isos/i386/CentOS-5.4-i386-netinstall.iso&lt;br /&gt;
将vmlinuz 和initrd.img 拖出放入 centos_i386目录中&lt;br /&gt;
&lt;br /&gt;
3.4.1.2 配置新加入的网络安装的发行版，使之可以显示&lt;br /&gt;
#cd /var/lib/tftpboot/menu/&lt;br /&gt;
#cp txt.cfg centos_i386.cfg&lt;br /&gt;
修改centos_i386.cfg 为&lt;br /&gt;
label install&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;menu label ^Install centos i386&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;menu default&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;kernel centos_i386/linux&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;append vga=normal initrd=centos_i386/initrd.gz -- quiet &lt;br /&gt;
(命名根据自己的习惯命就可以了)&lt;br /&gt;
最后，&lt;br /&gt;
unanao:/var/lib/tftpboot/menu#cat menu.cfg&lt;br /&gt;
menu hshift 13&lt;br /&gt;
menu width 49&lt;br /&gt;
&lt;br /&gt;
menu title Installer boot menu&lt;br /&gt;
include debian-install/i386/boot-screens/stdmenu.cfg&lt;br /&gt;
include menu/lenny_i386.cfg&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --这里加入include lenny_i386.cfg&amp;nbsp;&amp;nbsp; （写的时候不要加--后面的内容）&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;
include menu/centos.cfg&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --这里加入include centos_i386.cfg 　（写的时候不要加--后面的内容）&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;
include debian-install/i386/boot-screens/amdtxt.cfg&lt;br /&gt;
include debian-installer/i386/boot-screens/gtk.cfg&lt;br /&gt;
include debian-installer/i386/boot-screens/amdgtk.cfg&lt;br /&gt;
menu begin advanced&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;menu title Advanced options&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;include debian-installer/i386/boot-screens/stdmenu.cfg&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;label mainmenu&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;menu label ^Back..&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;menu exit&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;include debian-installer/i386/boot-screens/adtxt.cfg&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;include debian-installer/i386/boot-screens/amdadtxt.cfg&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;include debian-installer/i386/boot-screens/adgtk.cfg&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;include debian-installer/i386/boot-screens/amdadgtk.cfg&lt;br /&gt;
menu end&lt;br /&gt;
label help&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;menu label ^Help&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;text help&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Display help screens; type &#039;menu&#039; at boot prompt to return to this menu&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;endtext&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;config debian-installer/i386/boot-screens/prompt.cfg&lt;br /&gt;
(其实这个配置文件里面好多都没有用了，不过懒着删了呵呵)&lt;br /&gt;
一个cenos　i386 的网络启动就做好了，其它的发行版也大同小异。&lt;br /&gt;
在centos安装的时候有一个地方　Installation Method&lt;br /&gt;
选择 HTTP &lt;br /&gt;
&lt;br /&gt;
Web site name:centos.ustc.edu.cn&lt;br /&gt;
CentOS directory: centos/5.4/os/i386&lt;br /&gt;
3.4.3 网络安装arch&lt;br /&gt;
下载的vmlinuz和initrd.img的地址：&lt;br /&gt;
ftp://mirror.lzu.edu.cn/archlinux/iso/archboot/2009.08/archlinux-2009.08-1-archboot.iso&lt;br /&gt;
在isolinux目录里面的vmlinuz和initrd.img的两个文件。&lt;br /&gt;
其它的方法同上面两个发行版的安装。&lt;br /&gt;
&lt;br /&gt;
4、安装系统&lt;br /&gt;
启动客户机，进bios设为从网络启动。等待一会儿，熟悉的安装界面出来了，可以开始安装了。&lt;br /&gt;
（注意在获取ip之前，请将server的dhcp服务停掉）&lt;br /&gt;
然后本本从PXE启动就可以了，进入安装后到了选择DEBIAN安装镜像那一步时候由于台式机和本本组成的小局域网和外界隔离所以无法找到镜像，这个时候可以拔下本本的网线然后直接插到可以可以连到外面的交换机上（就是大局域网上），运行一把dhcpclient 就可以(让本本在不重新启动的情况下在新网络里通过DHCP重新分配IP,如果你的台式机没有和外界隔离并且提供DNS和网关服务就不需要这样插拔网线啦)。这样就完成了安装。&lt;br /&gt;
&lt;br /&gt;
5、参考资料：&lt;br /&gt;
http://oss.lzu.edu.cn/modules/newbb/viewtopic.php?topic_id=1437&amp;amp;forum=6
&lt;/p&gt;
&lt;p&gt;
http://www.thusa.co.za/blog/warwick-chapman/howto-pxe-boot-menu-both-debian-50-lenny-and-40-etch-network-installs&lt;br /&gt;
http://www.chrisgountanis.com/technical/45-centos-netinstall.html
&lt;/p&gt; 
</content> 
</entry> 
 
 <entry> 
 <id>tag:oss.lzu.edu.cn,2009-12-19:1241</id>
 <title>Linux忘记密码，利用single-user mode重新设定密码</title> 
 <link rel="alternate" type="text/html" href="http://oss.lzu.edu.cn/modules/lifetype/index.php?op=ViewArticle&amp;articleId=1241&amp;blogId=1" /> 
  
 <modified>2009-12-19T06:11:59+1600</modified> 
 <issued>2009-12-19T06:11:59+1600</issued> 
 <created>2009-12-19T06:11:59+1600</created> 
 <summary type="text/plain">进入GRUB后（如果默认不进入grub，直接启动系统，按&amp;ldquo;Esc&amp;rdquo;键进入）: 
1、移动到有&amp;ldquo;（single-user mode）&amp;rdquo;的那一行。 
2、按&amp;ldquo;e&amp;rdquo;键 ...</summary> 
 <author> 
  
 <name>unanao</name> 
 <url>http://oss.lzu.edu.cn/modules/lifetype/index.php?blogId=1</url> 
</author> 
<dc:subject>
Debian 
</dc:subject> 
 <content type="text/html" mode="escaped" xml:lang="zh" xml:base="http://oss.lzu.edu.cn/modules/lifetype/index.php?blogId=1"> 
 进入GRUB后（如果默认不进入grub，直接启动系统，按&amp;ldquo;Esc&amp;rdquo;键进入）:&lt;br /&gt;
1、移动到有&amp;ldquo;（single-user mode）&amp;rdquo;的那一行。&lt;br /&gt;
2、按&amp;ldquo;e&amp;rdquo;键&lt;br /&gt;
3、移动到有&amp;ldquo;kernel&amp;rdquo;的那一行，,&lt;br /&gt;
4、按&amp;ldquo;e&amp;rdquo;键，&lt;br /&gt;
把&amp;ldquo;ro single&amp;rdquo; 修改成&amp;ldquo;ro init=/bin/bash&amp;rdquo;&lt;br /&gt;
5、按&amp;ldquo;回车&amp;rdquo;键&lt;br /&gt;
6、按 &amp;ldquo;b&amp;rdquo;键&lt;br /&gt;
7、mount -o remount,rw /&lt;br /&gt;
8、使用&amp;ldquo;passwd&amp;rdquo;修改忘记的密码就可以了&lt;br /&gt;
9、reboot 
</content> 
</entry> 
 
 <entry> 
 <id>tag:oss.lzu.edu.cn,2009-12-19:1239</id>
 <title>Debian 下写 kernel module--/proc 文件系统</title> 
 <link rel="alternate" type="text/html" href="http://oss.lzu.edu.cn/modules/lifetype/index.php?op=ViewArticle&amp;articleId=1239&amp;blogId=1" /> 
  
 <modified>2009-12-19T05:00:08+1600</modified> 
 <issued>2009-12-19T05:00:08+1600</issued> 
 <created>2009-12-19T05:00:08+1600</created> 
 <summary type="text/plain"> 
By unanao 
&amp;lt;sunjianjiao@gmail.com&amp;gt; 
 
一、linux内核模块 
&amp;nbsp;&amp;nbsp;&amp;nbsp; Linux ...</summary> 
 <author> 
  
 <name>unanao</name> 
 <url>http://oss.lzu.edu.cn/modules/lifetype/index.php?blogId=1</url> 
</author> 
<dc:subject>
嵌入式 
</dc:subject> 
 <content type="text/html" mode="escaped" xml:lang="zh" xml:base="http://oss.lzu.edu.cn/modules/lifetype/index.php?blogId=1"> 
 &lt;p&gt;
By unanao&lt;br /&gt;
&amp;lt;sunjianjiao@gmail.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一、linux内核模块&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Linux 内核具有模块化设计，提供了可伸缩的、动态的内核。在引导时，只有少量的驻留内核被载入内存。这之后，无论何时用户要求使用驻留内核中没有的功能，某内核模块（kernel module），有时又称驱动程序（driver）。就会被动态地载入内存。 通过 Linux 内核模块（LKM）可以在运行时动态地更改 Linux。可动态更改 是指可以将新的功能加载到内核、从内核去除某个功能，甚至添加使用其他 LKM 的新 LKM。LKM 的优点是可以最小化内核的内存占用，只加载需要的元素（这是嵌入式系统的重要特性）。&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Linux 的众多优良特性之一就是可以在运行时扩展由内核提供的特性的能力. 这意味着你可以在系统正在运行着的时候增加内核的功能( 也可以去除 ).每块可以在运行时添加到内核的代码, 被称为一个模块. Linux 内核提供了对许多模块类型的支持, 包括但不限于, 设备驱动. 每个模块由目标代码组成( 没有连接成一个完整可执行文件 ), 可以动态连接到运行中的内核中, 通过 insmod 程序, 以及通过 rmmod 程序去连接.&amp;ldquo;图内核的划分&amp;rdquo;表示了负责特定任务的不同类别的模块, 一个模块是根据它提供的功能来说它属于一个特别类别的. &amp;ldquo;图内核的划分&amp;rdquo;中模块的安排涵盖了最重要的类别, 但是远未完整, 因为在 Linux 中越来越多的功能被模块化了.
&lt;/p&gt;
&lt;p&gt;
&lt;a id=&quot;res_85&quot; href=&quot;http://oss.lzu.edu.cn/modules/lifetype/gallery/1/kernel_feature.png&quot;&gt;&lt;img src=&quot;http://oss.lzu.edu.cn/modules/lifetype/gallery/1/previews-med/kernel_feature.png&quot; border=&quot;0&quot; alt=&quot;内核的划分&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 图 内核的划分&lt;br /&gt;
二、在Debian下编译内核需要安装内核头文件： &lt;br /&gt;
#aptitude install linux-headers-`uname -r` &lt;br /&gt;
(把目前所使用的内核的头文件安装上，也同样会安装上build-essential,linux-kbuild等包，如果之前没安装过的话。然后在/usr/src下会出现一个linux-header-xxxxx的目录，这个目录里就是当前使用的内核的头文件以及build模块的时候所需要用到的scripts和Makefile，这些scripts是linux-kbuild中提供的。)&lt;br /&gt;
&lt;br /&gt;
三、简单的hello world 内核模块&lt;br /&gt;
（先写一个简单的hello world 模块，熟悉linux内核模块编程，为procfs做准备）&lt;br /&gt;
unanao@debian:~/programming/modules/hello$ cat hello.c
&lt;br /&gt;
#include &amp;lt;linux/init.h&amp;gt; &lt;br /&gt;
#include &amp;lt;linux/module.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
static int hello_init(void)//void can&#039;t be abbreviation,or we will get a warning &lt;br /&gt;
{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(KERN_EMERG &amp;quot;hello, world\n&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0 &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
static void hello_exit(void) &lt;br /&gt;
{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(KERN_ALERT &amp;quot;Goodbye!\n&amp;quot;); &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
module_init(hello_init);//There is no &amp;quot;&amp;quot;,This is not a string &lt;br /&gt;
module_exit(hello_exit); &lt;br /&gt;
&lt;br /&gt;
MODULE_LICENSE(&amp;quot;Dual BSD/GPL&amp;quot;);&lt;br /&gt;
MODULE_AUTHOR(&amp;quot;unanao&amp;quot;); &lt;br /&gt;
MODULE_DESCRIPTION(&amp;quot;simple module ,just output some words\n&amp;quot;); &lt;br /&gt;
MODULE_ALIAS(&amp;quot;hello&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; 这个模块定义了两个函数, 一个在模块加载到内核时被调用( hello_init )以及一个在模块被去除时被调用( hello_exit ). moudle_init 和 module_exit 这几行使用了特别的内核宏来指出这两个函数的角色. 另一个特别的宏 (MODULE_LICENSE) 是用来告知内核, 该模块带有一个自由的许可证; 没有这样的说明, 在模块加载时内核会抱怨.&lt;br /&gt;
&lt;br /&gt;
四、编写Makefile&lt;br /&gt;
unanao@debian:~/programming/modules/hello$ cat Makefile &lt;br /&gt;
ifneq ($(KERNELRELEASE),) # after ifneq ,there is a space! or,will get an error&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; obj-m := hello.o &lt;br /&gt;
else &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; KERNELDIR := /lib/modules/$(shell uname -r)/build &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; PWD := $(shell pwd) &lt;br /&gt;
default: &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$(MAKE) -C $(KERNELDIR) M=$(PWD) modules &lt;br /&gt;
clean: &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; rm -rf *.o *.ko *mod.c [mM]odule* .*.cmd *.o.d .tmp_versions &lt;br /&gt;
endif &lt;br /&gt;
&lt;br /&gt;
详细的信息参考linux内核源代码中&amp;ldquo;Documentation/kbuild/modules.txt&amp;rdquo;文件&lt;br /&gt;
&lt;br /&gt;
五、内核模块的编译，插入，查看，卸载&lt;br /&gt;
debian:/home/unanao/hello$make&lt;br /&gt;
debian:/home/unanao/hello# insmod hello.ko &lt;br /&gt;
debian:/home/unanao/hello# lsmod&lt;br /&gt;
Module&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Size&amp;nbsp; Used by&lt;br /&gt;
hello&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1344&amp;nbsp; 0 &lt;br /&gt;
procfs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2096&amp;nbsp; 0 &lt;br /&gt;
ipv6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 235396&amp;nbsp; 10 &lt;br /&gt;
ppdev&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6468&amp;nbsp; 0 &lt;br /&gt;
lp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8164&amp;nbsp; 0 &lt;br /&gt;
vboxvfs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 29536&amp;nbsp; 0 &lt;br /&gt;
nls_base&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6820&amp;nbsp; 1 vboxvfs&lt;br /&gt;
loop&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12748&amp;nbsp; 0 &lt;br /&gt;
parport_pc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 22500&amp;nbsp; 0 &lt;br /&gt;
parport&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 30988&amp;nbsp; 3 ppdev,lp,parport_pc&lt;br /&gt;
ac&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4196&amp;nbsp; 0 &lt;br /&gt;
serio_raw&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4740&amp;nbsp; 0 &lt;br /&gt;
battery&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10180&amp;nbsp; 0 &lt;br /&gt;
psmouse&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 32336&amp;nbsp; 0 &lt;br /&gt;
button&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6096&amp;nbsp; 0 &lt;br /&gt;
i2c_piix4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7216&amp;nbsp; 0 &lt;br /&gt;
pcspkr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2432&amp;nbsp; 0 &lt;br /&gt;
i2c_core&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 19828&amp;nbsp; 1 i2c_piix4&lt;br /&gt;
vboxadd&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 47008&amp;nbsp; 4 vboxvfs&lt;br /&gt;
evdev&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8000&amp;nbsp; 3 &lt;br /&gt;
ext3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 105576&amp;nbsp; 1 &lt;br /&gt;
jbd&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 39476&amp;nbsp; 1 ext3&lt;br /&gt;
mbcache&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7108&amp;nbsp; 1 ext3&lt;br /&gt;
ide_cd_mod&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 27684&amp;nbsp; 0 &lt;br /&gt;
cdrom&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 30176&amp;nbsp; 1 ide_cd_mod&lt;br /&gt;
ide_disk&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10496&amp;nbsp; 3 &lt;br /&gt;
floppy&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 47716&amp;nbsp; 0 &lt;br /&gt;
piix&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6568&amp;nbsp; 0 [permanent]&lt;br /&gt;
ide_pci_generic&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3908&amp;nbsp; 0 [permanent]&lt;br /&gt;
ide_core&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 96168&amp;nbsp; 4 ide_cd_mod,ide_disk,piix,ide_pci_generic&lt;br /&gt;
ata_generic&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4676&amp;nbsp; 0 &lt;br /&gt;
libata&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 140448&amp;nbsp; 1 ata_generic&lt;br /&gt;
pcnet32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 27396&amp;nbsp; 0 &lt;br /&gt;
mii&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4896&amp;nbsp; 1 pcnet32&lt;br /&gt;
scsi_mod&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 129548&amp;nbsp; 1 libata&lt;br /&gt;
dock&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8304&amp;nbsp; 1 libata&lt;br /&gt;
thermal&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 15228&amp;nbsp; 0 &lt;br /&gt;
processor&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 32576&amp;nbsp; 1 thermal&lt;br /&gt;
fan&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4196&amp;nbsp; 0 &lt;br /&gt;
thermal_sys&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10856&amp;nbsp; 3 thermal,processor,fan&lt;br /&gt;
debian:/home/unanao/hello# rmmod hello&lt;br /&gt;
&lt;br /&gt;
六、查看内核的输出&lt;br /&gt;
6.1、使用dmesg查看：&lt;br /&gt;
debian:/home/unanao/hello# dmesg |tail -2&lt;br /&gt;
[ 9344.308292] hello, world&lt;br /&gt;
[ 9389.298477] Goodbye, I will Come to a more beautiful word&lt;br /&gt;
&lt;br /&gt;
6.2、直接通过pritk输出到终端:&lt;br /&gt;
6.2.1在xwindow环境下开的终端窗口,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(KERN_EMERG &amp;quot;hello, world\n&amp;quot;); //输出&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(KERN_ALERT &amp;quot;Goodbye,I will Come to a more beautiful word\n&amp;quot;);//不输出 &lt;br /&gt;
6.2.2在黑屏的Linux控制台模式(Ctrl+Alt+(F1~F6))两个都可以显示输出。&lt;br /&gt;
&lt;br /&gt;
6.3、printk()函数的总结 &lt;br /&gt;
我们在使用printk()函数中使用日志级别为的是使编程人员在编程过程中自定义地进行信息的输出，更加容易地掌握系统当前的状况,对程序的调试起到了很重要的作用。 &lt;br /&gt;
（下文中的日志级别和控制台日志控制级别是一个意思） &lt;br /&gt;
&lt;br /&gt;
printk(日志级别 &amp;quot;消息文本&amp;quot;)；这里的日志级别通俗的说指的是对文本信息的一种输出范围上的指定。 &lt;br /&gt;
日志级别一共有8个级别，printk的日志级别定义如下（在linux26/includelinux/kernel.h中）： &lt;br /&gt;
#defineKERN_EMERG&amp;quot;&amp;lt;0&amp;gt;&amp;quot;/*紧急事件消息，系统崩溃之前提示，表示系统不可用*/ &lt;br /&gt;
#defineKERN_ALERT&amp;quot;&amp;lt;1&amp;gt;&amp;quot;/*报告消息，表示必须立即采取措施*/ &lt;br /&gt;
#defineKERN_CRIT&amp;quot;&amp;lt;2&amp;gt;&amp;quot;/*临界条件，通常涉及严重的硬件或软件操作失败*/ &lt;br /&gt;
#defineKERN_ERR&amp;quot;&amp;lt;3&amp;gt;&amp;quot;/*错误条件，驱动程序常用KERN_ERR来报告硬件的错误*/ &lt;br /&gt;
#defineKERN_WARNING&amp;quot;&amp;lt;4&amp;gt;&amp;quot;/*警告条件，对可能出现问题的情况进行警告*/ &lt;br /&gt;
#defineKERN_NOTICE&amp;quot;&amp;lt;5&amp;gt;&amp;quot;/*正常但又重要的条件，用于提醒。常用于与安全相关的消息*/ &lt;br /&gt;
#defineKERN_INFO&amp;quot;&amp;lt;6&amp;gt;&amp;quot;/*提示信息，如驱动程序启动时，打印硬件信息*/ &lt;br /&gt;
#defineKERN_DEBUG&amp;quot;&amp;lt;7&amp;gt;&amp;quot;/*调试级别的消息*/ &lt;br /&gt;
&lt;br /&gt;
没有指定日志级别的printk语句默认采用的级别是 DEFAULT_ MESSAGE_LOGLEVEL（这个默认级别一般为&amp;lt;4&amp;gt;,即与KERN_WARNING在一个级别上），其定义在linux26/kernel/printk.c中可以找到。 &lt;br /&gt;
下面是一个比较简单的使用 &lt;br /&gt;
printk(KERN_INFO &amp;quot;INFO\n&amp;quot;); //这里可以使用数字代替 KERN_INFO，即可以写成printk(&amp;quot;&amp;lt;6&amp;gt; INFO\n&amp;quot;); &lt;br /&gt;
在这个格式的定义中，日志级别和信息文本之间不能够使用逗号隔开，因为系统在进行编译的时候，将日志级别转换成字符串于后面的文本信息进行连接。 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
七、/proc文件系统&amp;nbsp;
&lt;br /&gt;
&amp;nbsp;/proc 文件系统在linux 内核中是一个特殊的文件系统。他是一个许你的文件系统，它不和块设备联系，仅仅在内存中存在。/proc 文件系统包含目录（作为组织信息的方式）和虚拟文件虚拟文件可以表示内核到用户的信息，并作为从用户发送信息到内核的手段。
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
八、利用procfs实现&amp;ldquo;数据从用户空间--&amp;gt;内核空间--&amp;gt;用户空间&amp;rdquo;
&lt;br /&gt;
8.1 源代码：
&lt;br /&gt;
unanao@debian:~/programming/modules/read_write$ cat procfs.c
&lt;br /&gt;
#include &amp;lt;linux/module.h&amp;gt;
&lt;br /&gt;
#include &amp;lt;linux/kernel.h&amp;gt;
&lt;br /&gt;
#include &amp;lt;linux/proc_fs.h&amp;gt; //如果要使用procfs的函数，需要包含头文件：
&lt;br /&gt;
#include &amp;lt;linux/string.h&amp;gt;
&lt;br /&gt;
#include &amp;lt;linux/vmalloc.h&amp;gt;
&lt;br /&gt;
#include &amp;lt;asm/uaccess.h&amp;gt;
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
#define MAX_LENGTH PAGE_SIZE
&lt;br /&gt;
static struct proc_dir_entry *proc_entry;
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
static char *buf; //space where in the kernel sapce for input data
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
/*function to write the data*/
&lt;br /&gt;
int data_write(struct file *filp,const char __user *buff,unsigned long len, void *data)
&lt;br /&gt;
{
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(len &amp;gt;MAX_LENGTH){
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; printk(KERN_EMERG &amp;quot;virtual_proc:buf is full&amp;quot;);
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return -ENOSPC;//no space left on device
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Copy buffer to kernel-space from user-space function:&amp;nbsp;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*unsigned long copy_from_user( void *to, const void __user *from,\
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*unsigned long n );
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(copy_from_user(buf,buff,len)){
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return -EFAULT;&amp;nbsp;&amp;nbsp;&amp;nbsp; //asm-generic/errno-bash.h ,bad address&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return len;
&lt;br /&gt;
}
&lt;br /&gt;
/* Function to read a fortune*/
&lt;br /&gt;
int data_read(char *page,char **start,off_t off,int count,int *eof,void *data)
&lt;br /&gt;
{
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int len;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(off &amp;gt; 0){
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; *eof=1;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /*wrap around*/
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; len=sprintf(page,&amp;quot;%s\n&amp;quot;,buf);
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return len;
&lt;br /&gt;
}
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
int init_virtual_proc(void)
&lt;br /&gt;
{
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int ret=0;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /*
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; *when vmalloc come across the error return 0(NULL address)
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; *success return back a pointer
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; buf=(char *)vmalloc(MAX_LENGTH);
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!buf){
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return -ENOMEM;//out of memory
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; else{
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; memset(buf,0,MAX_LENGTH);
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; /*
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; *create_proc_entry function. This function accepts a file name, a&amp;nbsp;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; *set of permissions, and a location in the /proc filesystem in&amp;nbsp;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; *which the file is to reside. The return value of&amp;nbsp;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; *create_proc_entry is a proc_dir_entry pointer (or NULL,indicating&amp;nbsp;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; *an error in create). You can then use the return pointer to&amp;nbsp;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; *configure other aspects of the virtual file, such as the function&amp;nbsp;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; *to call when a read is performed on the file
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; proc_entry=create_proc_entry(&amp;quot;virtual_proc&amp;quot;,0644,NULL);
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if(proc_entry==NULL){
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ret=-ENOMEM;//no memory
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; vfree(buf);
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; printk(KERN_EMERG &amp;quot;virtual_proc:couldn&#039;t create virtual_proc entry\n&amp;quot;);
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else{
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; /*
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; *use the read_proc and write_proc commands to plug in functions&amp;nbsp;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; *forreading and writing the virtual file.&amp;nbsp;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; proc_entry-&amp;gt;read_proc=data_read;//proc read function
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; proc_entry-&amp;gt;write_proc=data_write;//proc write function
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; proc_entry-&amp;gt;owner=THIS_MODULE;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; proc_entry-&amp;gt;mode=S_IRWXU|S_IRGRP|S_IROTH|S_IWOTH;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; printk(KERN_EMERG &amp;quot;virtual_proc :Module loaded\n&amp;quot;);
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return ret;
&lt;br /&gt;
}
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
void cleanup_virtual_proc(void)
&lt;br /&gt;
{
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; remove_proc_entry(&amp;quot;virtual_proc&amp;quot;,NULL);
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; vfree(buf);
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(KERN_EMERG &amp;quot;virtual:module unloaded\n&amp;quot;);
&lt;br /&gt;
}
&lt;br /&gt;
module_init(init_virtual_proc);
&lt;br /&gt;
module_exit(cleanup_virtual_proc);
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
MODULE_LICENSE(&amp;quot;Dual BSD/GPL&amp;quot;);
&lt;br /&gt;
MODULE_DESCRIPTION(&amp;quot;ProcFileSystem&amp;quot;);
&lt;br /&gt;
MODULE_AUTHOR(&amp;quot;unanao&amp;lt;sunjianjiao@gmail.com&amp;gt;&amp;quot;);
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
8.2 Makefile 文件
&lt;br /&gt;
unanao@debian:~/programming/modules/read_write$ cat Makefile&amp;nbsp;
&lt;br /&gt;
ifneq ($(KERNELRELEASE),)
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; obj-m := procfs.o
&lt;br /&gt;
else
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; KERNELDIR ?=/lib/modules/$(shell uname -r)/build
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; PWD := $(shell pwd)
&lt;br /&gt;
default:
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
&lt;br /&gt;
clean:
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; rm -rf *.o *.ko *.mod.c [mM]odule* .*.cmd .tmp_versions
&lt;br /&gt;
endif
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
九、编译、插入，执行
&lt;br /&gt;
编译：
&lt;br /&gt;
debian:/home/unanao/programming/modules/read_write$ make
&lt;br /&gt;
插入模块：
&lt;br /&gt;
debian:/home/unanao/programming/modules/read_write# insmod procfs.ko&amp;nbsp;
&lt;br /&gt;
在用户空间写入数据：
&lt;br /&gt;
unanao@debian:~/programming/modules/read_write$ echo &amp;quot;jianjiao&amp;quot; &amp;gt;/proc/virtual_proc&amp;nbsp;
&lt;br /&gt;
在用户空间读出数据：
&lt;br /&gt;
unanao@debian:~/programming/modules/read_write$ cat /proc/virtual_proc&amp;nbsp;
&lt;br /&gt;
jianjiao
&lt;br /&gt;
写在模块：
&lt;br /&gt;
debian:/home/unanao/programming/modules/read_write# rmmod procfs
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
十、模块一些函数的解释
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
struct proc_dir_entry 配置虚拟文件的其它方面，如：调用一个read函数。
&lt;br /&gt;
struct proc_dir_entry {
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; const char *name;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // virtual file name
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; mode_t mode;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // mode permissions
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; uid_t uid;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // File&#039;s user id
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; gid_t gid;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // File&#039;s group id
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; struct inode_operations *proc_iops;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Inode operations functions
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; struct file_operations *proc_fops;&amp;nbsp;&amp;nbsp;&amp;nbsp; // File operations functions
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; struct proc_dir_entry *parent;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // Parent directory
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; read_proc_t *read_proc;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // /proc read function
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; write_proc_t *write_proc;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // /proc write function
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void *data;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // Pointer to private data
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; atomic_t count;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // use count
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
&lt;br /&gt;
};
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
如果procfs只是被一个模块使用，一定要把struct proc_dir_entry 中的owner设为THIS_MODULE。
&lt;br /&gt;
struct proc_dir_entry* entry;
&lt;br /&gt;
entry-&amp;gt;owner = THIS_MODULE;
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
设置procfs的权限为和属主，如：
&lt;br /&gt;
struct proc_dir_entry* entry;
&lt;br /&gt;
entry-&amp;gt;mode = S_IWUSR |S_IRUSR | S_IRGRP | S_IROTH;
&lt;br /&gt;
entry-&amp;gt;uid = 0;
&lt;br /&gt;
entry-&amp;gt;gid = 100;
&lt;br /&gt;
（上面只是例子，可以根据需要进行自己的设置）
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
struct proc_dir_entry* create_proc_entry(const char* name, mode_t mode, struct proc_dir_entry* parent);
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
该函数创建一个名为&amp;ldquo;name&amp;rdquo;普通文件，在父目录中文件的模式是&amp;ldquo;mode&amp;rdquo;。在procfs的根目录创建文件，使用NULL作为&amp;ldquo;parent&amp;rdquo;的参数。当成功，函数将返回一个struct proc_dir_entry指针，否则将返回NULL。
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
移除一个入口(entry)
&lt;br /&gt;
void remove_proc_entry(const char* name, struct proc_dir_entry* parent);
&lt;br /&gt;
从procfs中，删除在&amp;ldquo;parent&amp;rdquo;目录中的&amp;ldquo;name&amp;rdquo;文件。entry是通过名字删除的，而不是由create_proc_entry 创建时返回的struct proc_dir_entry 的类型的变量。请注意，此功能不递归删除项目。
&lt;br /&gt;
在remove_proc_entry之前，一定要释放data （即：如果有一些数据分配了内存）。
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
和用户空间通信
&lt;br /&gt;
create_proc_entry 的返回值struct proc_dir_entry* 的read_proc 和 write_proc 用来初始化read和write函数。
&lt;br /&gt;
struct proc_dir_entry* entry;
&lt;br /&gt;
entry-&amp;gt;read_proc = read_proc_foo;
&lt;br /&gt;
entry-&amp;gt;write_proc = write_proc_foo;
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
read 函数负责把它的信息写入buffer,read函数的格式为：
&lt;br /&gt;
int read_func(char* buffer, char** start, off_t off, int count,int* peof, void* data);
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
peof:当到达文件末尾时写&amp;ldquo;1&amp;rdquo;
&lt;br /&gt;
data：很少使用，用于回调函数
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
write 函数用于将用户空间的数据写入内核空间，write函数的格式：
&lt;br /&gt;
int write_func(struct file* file, const char* buffer, unsigned long count, void* data);
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
其它一些函数：
&lt;br /&gt;
* Create a directory in the proc filesystem */
&lt;br /&gt;
struct proc_dir_entry *proc_mkdir( const char *name,struct proc_dir_entry *parent );
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
/* Create a symlink in the proc filesystem */
&lt;br /&gt;
struct proc_dir_entry *proc_symlink( const char *name,struct proc_dir_entry *parent,const char *dest );
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
/* Create a proc_dir_entry with a read_proc_t in one call */
&lt;br /&gt;
struct proc_dir_entry *create_proc_read_entry( const char *name,mode_t mode,struct proc_dir_entry *base, read_proc_t *read_proc,void *data );
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
/* Copy buffer to user-space from kernel-space */
&lt;br /&gt;
unsigned long copy_to_user( void __user *to,const void *from,unsigned long n );
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
/* Copy buffer to kernel-space from user-space */
&lt;br /&gt;
unsigned long copy_from_user( void *to,const void __user *from,unsigned long n );
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
/* Allocate a &#039;virtually&#039; contiguous block of memory */
&lt;br /&gt;
void *vmalloc( unsigned long size );
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
/* Free a vmalloc&#039;d block of memory */
&lt;br /&gt;
void vfree( void *addr );
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
/* Export a symbol to the kernel (make it visible to the kernel) */
&lt;br /&gt;
EXPORT_SYMBOL( symbol );
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
/* Export all symbols in a file to the kernel (declare before module.h) */
&lt;br /&gt;
EXPORT_SYMTAB&lt;br /&gt;
&lt;br /&gt;
十一、参考资料：&lt;br /&gt;
11.1 http://linux.ctocio.com.cn/153/8627653.shtml&lt;br /&gt;
11.2 Jonathan Corbet, Alessandro Rubini 和 Greg Kroah-Hartman&lt;br /&gt;
《Linux 设备驱动》(第三版)&lt;br /&gt;
11.3 Linux 可加载内核模块剖析&lt;br /&gt;
http://www.ibm.com/developerworks/cn/linux/l-lkm/&lt;br /&gt;
11.4 Erik (J.A.K.) Mouw 《Linux Kernel Procfs Guide》&lt;br /&gt;
&lt;/p&gt; 
</content> 
</entry> 
 
 <entry> 
 <id>tag:oss.lzu.edu.cn,2009-12-10:1231</id>
 <title>Debian 下用c语言写 cgi 程序</title> 
 <link rel="alternate" type="text/html" href="http://oss.lzu.edu.cn/modules/lifetype/index.php?op=ViewArticle&amp;articleId=1231&amp;blogId=1" /> 
  
 <modified>2009-12-10T00:05:37+1600</modified> 
 <issued>2009-12-10T00:05:37+1600</issued> 
 <created>2009-12-10T00:05:37+1600</created> 
 <summary type="text/plain"> 
By unanao 
&amp;lt;sunjianjiao＠gmail.com&amp;gt; 
2009年12月9日 
 
&amp;nbsp;&amp;nbsp; CGI全称 Common Gateway Interface ...</summary> 
 <author> 
  
 <name>unanao</name> 
 <url>http://oss.lzu.edu.cn/modules/lifetype/index.php?blogId=1</url> 
</author> 
<dc:subject>
程序设计 
</dc:subject> 
 <content type="text/html" mode="escaped" xml:lang="zh" xml:base="http://oss.lzu.edu.cn/modules/lifetype/index.php?blogId=1"> 
 &lt;p&gt;
By unanao&lt;br /&gt;
&amp;lt;sunjianjiao＠gmail.com&amp;gt;&lt;br /&gt;
2009年12月9日&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; CGI全称 Common Gateway Interface （共同编程接口），是一种编程接口，不论什么语言，只要按照该接口的标准编写出来的程序，即可叫做 CGI 程序。CGI 程序的输入/输出是使用编程语言的标准输入/标准输出，所以用 C/C++ 来写 CGI 程序就好象写普通程序一样，不过还有一些东西需要注意的。&lt;br /&gt;
&lt;br /&gt;
一、为什么要进行CGI编程? &lt;br /&gt;
在HTML中，当客户填写了表单，并按下了发送（submit）按钮后，表单的内容被发送到了服务器端，一般的，这时就需要有一个服务器端脚本来对表单的内容进行一些处理，或者是把它们保存起来，或者是按内容进行一些查询，或者是一些别的什么。&lt;br /&gt;
有的人认为可以用JavaScript来代替CGI程序，这其实是一个概念上的错误。JavaScript只能够在客户浏览器中运行，而CGI却是工作在服务器上的。他们所做的工作有一些交集，比如表单数据验证一类的，但是JavaScript是绝对无法取代CGI的。但可以这样说，如果一项工作即能够用 JavaScript来做，又可以用CGI来做，那么绝对要使用JavaScript，在执行的速度上JavaScript比CGI有着先天的优势。只有那些在客户端解决不了的问题，比如和某个远程数据库交互，这时就应该使用CGI了。 &lt;br /&gt;
简单的说来，CGI是用来沟通HTML表单和服务器端程序的接口（interface）。说它是接口，也就是说CGI并不是一种语言，而是可以被其他语言所应用的一个规范集。理论上讲，你可以用任何的程序语言来编写CGI程序，只要在编程的时候符合CGI规范所定义的一些东西就可以了。&lt;br /&gt;
&lt;br /&gt;
二、CGI 程序的通信方式和数据接收 &lt;br /&gt;
&amp;nbsp;&amp;nbsp; 当有数据从浏览器传到 Web 服务器后，该服务器会根据传送的类型（基本有二类：GET/POST），将这些接收到的数据传入 QUERY_STRING 或变量中，CGI 程序可以通过标准输入，在程序中接收这些数据。当要向浏览器发送信息时，只要向 Web 服务器发送特定的文件头信息，即可通过标准输出将信息发往 Web 服务器，Web 服务器处理完这些由 CGI 程序发来的信息后就会将这些信息发送给浏览器。这样就是 CGI 程序的通信方式了。 &lt;br /&gt;
&amp;nbsp; 用 GET 方式接收到的数据保存在 Web 服务器的 QUERY_STRING 变量里，而通过 POST 方式接收到的数据是保存在这个 Web 服务器变量里。它们的唯一区别就是：以 GET 方式接收的数据是有长度限制，而用 POST 方式接收的数据是没有长度限制的。并且，以 GET 方式发送数据，可以通过 URL 的形式来发送，但 POST方式发送的数据必须要通过 Form 才到发送。&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
三、编写一个cgi程序的一般步骤： &lt;br /&gt;
&amp;nbsp;1、像平常一样编译和测试C程序。 &lt;br /&gt;
&amp;nbsp;2、进行被用于作为CGI脚本使用的一些更改。&lt;br /&gt;
&amp;nbsp;3、重新编译和测试。在此测试阶段，您可能设置环境变量QUERY_STRING中，使其包含测试，因为它将为表单中的数据发送的数据。例如，如果您打算使用其中一个字段名为foo包含输入数据的格式，你可以把命令 &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setenv QUERY_STRING中以&amp;ldquo;foo = 42&amp;rdquo;（当使用tcsh的外壳） &lt;br /&gt;
或 &lt;br /&gt;
&amp;nbsp; QUERY_STRING中=&amp;ldquo;foo= 42&amp;rdquo;（当使用bash shell的）。 &lt;br /&gt;
&amp;nbsp;4、检查的编译版本的格式，是否可以工作在服务器上。可能需要重新编译。您可能需要登录到服务器计算机上（使用Telnet，SSH或其他终端仿真器），以便您可以使用服务器上的编译器。 &lt;br /&gt;
&amp;nbsp;5、将二进制可执行程序（和任何需要在服务器上的数据和文件）放到study（我的实验放到了study目录下，根据需要，可以放到cgi-bin目录下的任何一个目录及其子目录，包括cgi-bin目录本身。）目录下。 &lt;br /&gt;
&amp;nbsp;6、建立一个简单的包含表单的HTML文件，以便测试脚本。 &lt;br /&gt;
&lt;br /&gt;
四、创建实验目录及一些默认的命名规则&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 在/var/www/目录下建立cgi目录，用来存放html文件&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 在/usr/lib/cgi-bin目录下建立study目录，用来存放可执行文件，为了很容易区分这是用于cgi的，都是以.cgi结尾的（当然不以.cgi结尾也是可以的）。&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 编译的名称都是在原来的名字基础上变为.cgi,例如，example.c编译成的可执行文件名字为：example.cgi&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果没有安装 apache的话需要安装apache:#aptitude install apache2&lt;br /&gt;
&lt;br /&gt;
五、用C语言写一个cgi程序，在浏览器上打印 hello world&lt;br /&gt;
unanao@debian:/usr/lib/cgi-bin/study$&amp;nbsp; cat hello.c &lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
int main() &lt;br /&gt;
{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;Content-Type:text/plain;charset=utf8\n\n&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;hello world\n&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return&amp;nbsp; 0; &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
解释：程序中的printf(&amp;ldquo;Content-Type:text/html\n\&amp;rdquo;),&amp;ldquo;Content-Type&amp;rdquo;:头信息,将输出信息的格式告诉Web服务器;&lt;br /&gt;
prinft (&amp;ldquo;Content-Type :text/plain\n\n&amp;rdquo;); 第一行的输出内容是必须的，也是一个CGI程序所特有的，这个输出是作为HTML的文件头。&lt;br /&gt;
此行通过标准输出将字符串&amp;Prime;Content type :text/plain\n\n&amp;Prime;传送给Web服务器。它是一个MIME头信息,它告诉Web服务器随后的输出是以纯ASCII文本的形式。请注意在这个头信息中有两个新行符,这是因为Web服务器需要在实际的文本信息开始之前先看见一个空行。&lt;br /&gt;
（前往不要少写一个&amp;ldquo;\n&amp;rdquo;,否则在/var/log/apache2/error.log中会提示&amp;ldquo;malformed header ......&amp;rdquo;的错误） &lt;br /&gt;
例如shell要写成：echo Content-type: text/plain &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; echo &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;c语言要写成这样printf(&amp;quot;Content-Type: text/html\n\n&amp;quot;); &lt;br /&gt;
对于text/plain和text/html这两种形式，text/plian是純文本的形式，&amp;ldquo;\n&amp;rdquo;可以换行的；而text/html可以嵌入html标记，比如printf(&amp;ldquo;&amp;lt;BR&amp;gt;hello&amp;lt;BR&amp;gt;&amp;rdquo;)实现了换行的功能，而&amp;ldquo;\n&amp;rdquo;不能达到效果的。&lt;br /&gt;
&lt;br /&gt;
六、编译访问&lt;br /&gt;
6.1编译：&lt;br /&gt;
$gcc -o hello.cgi hello.c&lt;br /&gt;
可以直接在/usr/lib/cgi-bin/study/hello.c目录下直接编译，或者在其它位置编译好的可执行文件移动到/usr/lib/cgi-bin/study/目录。&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
6.2将该程序放在 Web 服务器的 cgi-bin 目录下，然后通过以下方式访问： &lt;br /&gt;
http://127.0.0.1/cgi-bin/study/hello.cgi &lt;br /&gt;
会在浏览器里打印出 Hello,World! &lt;br /&gt;
&lt;br /&gt;
七、GET表单的处理 &lt;br /&gt;
对于那些使用了属性&amp;ldquo;METHOD=GET&amp;rdquo;的表单（或者没有METHOD属性，这时候GET是其缺省值），GET方法中，数据被保存在服务器上一个叫做QUERY_STRING的环境变量中，可以从这里面把内容读出。这种表单的处理相对简单，只要读取环境变量就可以了。在C语言中，你可以用库函数getenv（定义在标准库函数stdlib中）来把环境变量的值作为一个字符串来存取。你可以在取得了字符串中的数据后，运用一些小技巧进行类型的转换，这都是比较简单的了。在CGI程序中的标准输出（output）（比如在C中的printf函数）也是经过重定义了的。它并没有在服务器上产生任何的输出内容，而是被重定向到客户浏览器。这样，如果编写一个C的CGI程序的时候，把一个HTML文档输出到它的 stdout上，这个HTML文档会被在客户端的浏览器中显示出来。这也是CGI程序的一个基本原理。 &lt;br /&gt;
&lt;br /&gt;
一个具体的程序实现，把表单中输入的数值乘起来，然后输出结果。&lt;br /&gt;
HTML表单包含两个文本框（输入两个数字）和一个提交按钮；&lt;br /&gt;
处理程序，用来做两个数字的乘积，并且输出结果。 &lt;br /&gt;
表单：&lt;br /&gt;
unanao@debian:/var/www/cgi$ cat multi.html &lt;br /&gt;
&amp;lt;html&amp;gt; &lt;br /&gt;
&amp;lt;form action=&amp;quot;/cgi-bin/study/mult.cgi&amp;quot;&amp;gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&amp;lt;label&amp;gt;multi 1:&amp;lt;input name=&amp;quot;m&amp;quot; size=&amp;quot;5&amp;quot;&amp;gt; &amp;lt;/label&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&amp;lt;label&amp;gt;multi 2:&amp;lt;input name=&amp;quot;n&amp;quot; size=&amp;quot;5&amp;quot;&amp;gt; &amp;lt;/label&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Multiply&amp;quot;&amp;gt; &amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;/form&amp;gt; &lt;br /&gt;
&amp;lt;/html&amp;gt; &lt;br /&gt;
&lt;br /&gt;
下面就是处理这个表单的CGI程序，对应于FORM标签中的ACTION属性值。 &lt;br /&gt;
unanao@debian:/usr/lib/cgi-bin/study$&amp;nbsp; cat mult.c &lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
int main() &lt;br /&gt;
{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;&amp;lt;TITLE&amp;gt;multiply Result&amp;lt;/TITLE&amp;gt;\n&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; long m,n; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; char *data; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;Content-Type: text/html\n\n&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(getenv(&amp;quot;QUERY_STRING&amp;quot;)) &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; data=getenv(&amp;quot;QUERY_STRING&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; else{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; perror(&amp;quot;get the data error\n&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; exit(1); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /*sscanf 的用法，在&amp;ldquo;十、参考资料&amp;rdquo;3中有比较详细的讲述*/ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; sscanf(data,&amp;quot;m=%ld &amp;amp; n=%ld&amp;quot;,&amp;amp;m,&amp;amp;n); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;&amp;lt;p&amp;gt;m=%ld,n=%ld,Mutiply result:\n%ld\n&amp;quot;,m,n,m*n); &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
程序在后面调用了用了库函数getevn来得到QUERY_STRING的内容，然后使用sscanf函数把每个参数值取出来，sscanf函数的用法在&amp;ldquo;十、参考资料&amp;rdquo;3中有比较详细的讲述。 &lt;br /&gt;
把程序编译后，将mult.cgi放在action指定的cgi-bin的目录下面，就可以被表单调用了。&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 首先输入：http://127.0.0.1/cgi/multi.html&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 然后在表单中输入数字，确定后就回得到两数的乘积。&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;br /&gt;
八、POST表单的处理&lt;br /&gt;
GET是默认的方式，所以如果使用PSOT方式，不要忘method=&amp;rdquo;POST&amp;rdquo;！ &lt;br /&gt;
看起来这个问题和上面讲的内容很相近，仅仅是用不同的表单和不同的脚本（程序）而已。但实际上，这中间是有一些区别的。在上面的例子中，GET的处理方法可以看作是&amp;ldquo;纯查询（pure query）&amp;rdquo;类型的，也就是说，它与状态无关。同样的数据可以被提交任意的次数，而不会引起任何的问题（除了服务器的一些小小的开销）。但是现在的任务就不同了，至少它要改变一个文件的内容。因而，可以说它是与状态有关的。这也算是POST和GET的区别之一。而且，GET对于表单的长度是有限制的，而 POST则不然，这也是在这个任务中选用POST方法的主要原因。但相对的，对GET的处理速度就要比POST快一些。&lt;br /&gt;
在CGI的定义中，对于POST类型的表单，其内容被送到CGI程序的标准输入（在C语言中是stdin），而被传送的长度被放在环境变量 CONTENT_LENGTH中。因而我们要做的就是，在标准输入中读入CONTENT_LENGTH长度的字符串。从标准输出读入数据听起来似乎要比从环境变量中读数据来的要容易一些，其实则不然,有一些细节地方要注意，这在下面的程序中可以看到。特别要注意的一点就是：CGI程序和一般的程序有所不同，一般的程序在读完了一个文件流的内容之后，会得到一个EOF的标志。但在CGI程序的表单处理过程中，EOF是永远不会出现的，所以千万不要读多于 CONTENT_LENGTH长度的字符，否这会有什么后果，谁也不知道（CGI规范中没有定义，一般根据服务器不同而有不同得处理方法）。&lt;br /&gt;
&lt;br /&gt;
下面的程序实现了，在form表单中把读取的内容，显示到网页上面：&lt;br /&gt;
html表单：&lt;br /&gt;
unanao@debian:/var/www/cgi$ cat string.html &lt;br /&gt;
&amp;lt;html&amp;gt; &lt;br /&gt;
&amp;lt;form action=&amp;quot;/cgi-bin/study/readoutput.cgi&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;div&amp;gt; Your input (80 chars max.):&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;input name=&amp;quot;data&amp;quot; size=&amp;quot;60&amp;quot; maxlength=&amp;quot;80&amp;quot;&amp;gt; &amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;send&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;/form&amp;gt; &lt;br /&gt;
&amp;lt;/html&amp;gt; &lt;br /&gt;
&lt;br /&gt;
读取输出程序：&lt;br /&gt;
unanao@debian:/usr/lib/cgi-bin/study$&amp;nbsp; cat readoutput.c &lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt; &lt;br /&gt;
#define MAXLEN 80 &lt;br /&gt;
#define EXTRA 5 &lt;br /&gt;
/* 4 for field name &amp;quot;data&amp;quot;, 1 for &amp;quot;=&amp;quot; */ &lt;br /&gt;
#define MAXINPUT MAXLEN+EXTRA+2 &lt;br /&gt;
/* 1 for added line break, 1 for trailing NUL */ &lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
*uncode的作用，因为如果输入的是 &amp;ldquo;Hello there!&amp;rdquo;&lt;br /&gt;
*但是传给程序的数据被编码为：&amp;ldquo;data=Hello+there%21&amp;rdquo;&lt;br /&gt;
*所以要uncode函数就是用来进行解码的&lt;br /&gt;
*/&lt;br /&gt;
void unencode(char *src, char *last, char *dest) &lt;br /&gt;
{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /*对所有的数据进行遍历*/ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(; src != last; src++, dest++){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; /*+在传输过程中,是两个word之间的连接符--空格*/ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if(*src == &#039;+&#039;) &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; *dest = &#039; &#039;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /*如果发现以%开头的，则为特殊字符的编码，检查%后的两位十六进制是否是特殊 &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* 符号编码，如果是则将取符号的ASCII值，比如！被编码为%21， &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* 其ASCII值为21，dest中将保存值21 &lt;br /&gt;
*%xx:用其十六进制ASCII码值表示的特殊字符。根据值xx将其转换成相&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*应的ASCII字符。&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else if(*src == &#039;%&#039;) { &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; int code; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; /*jump %,then read two bits to code*/ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if(sscanf(src+1, &amp;quot;%2x&amp;quot;, &amp;amp;code) != 1) &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; code = &#039;?&#039;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; *dest = code; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; src +=2; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; /*非特殊字符直接保存*/ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; *dest = *src; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /*最后加上换行和字符串结束符*/ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; *dest = &#039;\n&#039;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; *++dest = &#039;&#039;; &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
int main(void) &lt;br /&gt;
{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; char *lenstr; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; char input[MAXINPUT], data[MAXINPUT]; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; long len; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;%s%c%c\n\n&amp;quot;,&amp;quot;Content-Type:text/html;charset=iso-8859-1&amp;quot;,13,10); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;&amp;lt;TITLE&amp;gt;Response&amp;lt;/TITLE&amp;gt;\n&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; lenstr = getenv(&amp;quot;CONTENT_LENGTH&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(lenstr == NULL || sscanf(lenstr,&amp;quot;%ld&amp;quot;,&amp;amp;len)!=1 || len &amp;gt; MAXLEN) &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;&amp;lt;P&amp;gt;Error in invocation - wrong FORM probably.&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; else { &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; /* &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*fetts从指定输入流读取字符串,原型为:char *fgets(char *s,int n,FILE * &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*stream)从stream读入字符串到s中,当读入n-1个字符或换行符时函数停止操作, &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*改函数在s的末尾增加一个NULL字符表明串的结束.&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*成功返回指向s的指针,&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*遇到文件结束或出错返回EOF对于POST类型的表单，&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*其内容被送到CGI程序的标准输入（在C语言中是stdin）， &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*而被传送的长度被放在环境变量 CONTENT_LENGTH中。因而我们要做的就是， &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*在标准输入中读入CONTENT_LENGTH长度的字符串。 &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;len=%d&amp;lt;br&amp;gt;&amp;quot;,len); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fgets(input, len+1, stdin); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; /*+EXTRA:传过去的地址后移5位,跳过data= &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*+len:&amp;nbsp;&amp;nbsp;&amp;nbsp; 将input的指针移到最后 &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*data:解码后的数据 &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; unencode(input+EXTRA, input+len, data); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;data=%s\n&amp;quot;,data); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0; &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
下面的程序把表单中输入的一段文本内容添加到服务器上的一个fifo文件中，然后再从这个fifo文中读出。表单和回显的页面用frame放到同一个页面中。&lt;br /&gt;
HTML 表单：&lt;br /&gt;
together.html将input.html和output.html显示在同一个页面，input.html用于调用read.cgi将内容存入data fifo文件，output.html用于调用output.cgi文件，将写入的文件读出。&lt;br /&gt;
unanao@debian:/usr/lib/cgi-bin/study$&amp;nbsp; cat together.html &lt;br /&gt;
&amp;lt;html&amp;gt; &lt;br /&gt;
&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Qemu Arm&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt; &lt;br /&gt;
&amp;lt;frameset rows=&amp;quot;%50,%50&amp;quot;&amp;gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;frame src=&amp;quot;./input.html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;frame src=&amp;quot;./output.html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;/frameset&amp;gt; &lt;br /&gt;
&amp;lt;html&amp;gt; &lt;br /&gt;
&lt;br /&gt;
unanao@debian:/usr/lib/cgi-bin/study$&amp;nbsp; cat input.html &lt;br /&gt;
&amp;lt;html&amp;gt; &lt;br /&gt;
&amp;lt;body&amp;gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DIV&amp;gt; Input must less than 80 chars: &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;form method=&amp;quot;POST&amp;quot; action=&amp;quot;/cgi-bin/study/read.cgi&amp;quot;&amp;gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input name=&amp;quot;data&amp;quot; width=&amp;quot;60&amp;quot; maxlength=&amp;quot;70&amp;quot;&amp;gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;send&amp;quot;&amp;gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/DIV&amp;gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/form&amp;gt; &lt;br /&gt;
&amp;lt;/body&amp;gt; &lt;br /&gt;
&amp;lt;/html&amp;gt; &lt;br /&gt;
unanao@debian:/usr/lib/cgi-bin/study$&amp;nbsp; cat output.html &lt;br /&gt;
&amp;lt;/html&amp;gt; &lt;br /&gt;
&amp;lt;body&amp;gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Please press the &amp;quot;view&amp;quot; button ,to see the result: &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;form method=&amp;quot;POST&amp;quot; action=&amp;quot;/cgi-bin/study/output.cgi&amp;quot;&amp;gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;View&amp;quot;&amp;gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/form&amp;gt; &lt;br /&gt;
&amp;lt;/body&amp;gt; &lt;br /&gt;
&amp;lt;/html&amp;gt; &lt;br /&gt;
&lt;br /&gt;
内容储存和内容读出程序：&lt;br /&gt;
unanao@debian:/usr/lib/cgi-bin/study$&amp;nbsp; cat read.c &lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
#define DATAFILE &amp;quot;./data&amp;quot; &lt;br /&gt;
#define MAXLEN 80 &lt;br /&gt;
#define EXTRA 5 &lt;br /&gt;
#define MAXINPUT MAXLEN+EXTRA+2 //1 for line break,1 for traling NULL &lt;br /&gt;
&lt;br /&gt;
void uncode(char *src,char *last,char *dest) &lt;br /&gt;
{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int code; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(;src!=last;src++,dest++){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if(*src==&#039;+&#039;) &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; *dest=&#039; &#039;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else if (*src==&#039;%&#039;){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if(sscanf(src+1,&amp;quot;%2x&amp;quot;,&amp;amp;code)!=1) &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; code=&#039;?&#039;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; *dest = code; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; src+=2; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; *dest=*src; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; *dest=&#039;\n&#039;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; *++dest=&#039;&#039;; &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
int main() &lt;br /&gt;
{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; char *lenstr; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; char input[MAXINPUT],data[MAXINPUT]; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; long len; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;Content-Type:text/html;charset=utf8\n\n&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; lenstr=getenv(&amp;quot;CONTENT_LENGTH&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(lenstr == NULL || sscanf(lenstr,&amp;quot;%ld&amp;quot;,&amp;amp;len)!=1 || len&amp;gt;MAXLEN) &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;Error in invocation -wrong form probably\n&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; else{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FILE * fp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fgets(input,MAXLEN,stdin); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; uncode(input+EXTRA,input+len,data); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fp=fopen(&amp;quot;data&amp;quot;,&amp;quot;a&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if(NULL==fp){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; perror(&amp;quot;open data error\n&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; exit(1); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fputs(data,fp); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fclose(fp); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;&amp;lt;a href=&#039;/cgi/input.html&#039;&amp;gt; Return Back &amp;lt;/a&amp;gt;&amp;quot;); &lt;br /&gt;
} &lt;br /&gt;
debian:/usr/lib/cgi-bin/study# cat output.c &lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt; &lt;br /&gt;
#define DATAFILE &amp;quot;./data&amp;quot; &lt;br /&gt;
#define MAXLEN 80 &lt;br /&gt;
&lt;br /&gt;
int main() &lt;br /&gt;
{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; char c; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; FILE * fp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;Content-Type:text/html\n\n&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; fp=fopen(DATAFILE,&amp;quot;r&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(NULL==fp){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;can&#039;t open the file &amp;lt;br&amp;gt;&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; exit(1); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while (EOF!=(c=getc(fp))){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; putchar(c); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;&amp;lt;br&amp;gt;&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;&amp;lt;a href=/cgi/output.html&amp;gt;Return Back&amp;lt;/a&amp;gt;&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0; &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
从本质上来看，程序先从CONTENT_LENGTH环境变量中得到数据的字长，然后读取相应长度的字符串。因为数据内容在传输的过程中是经过了编码的，所以必须进行相应的解码。编码的规则很简单，主要的有这几条: &lt;br /&gt;
1. 表单中每个每个字段用字段名后跟等号，再接上上这个字段的值来表示，每个字段之间的内容用&amp;amp;连结； &lt;br /&gt;
2.所有的空格符号用加号代替，所以在编码码段中出现空格是非法的；&lt;br /&gt;
&lt;br /&gt;
九、产生HTML输出&lt;br /&gt;
CGI程序产生的输出由两部分组成:MIME头信息和实际的信息。两部分之间以一个空行分开。我们已经看到怎样使用MIME头信息&amp;Prime;Content type :text/plain\n\n&amp;Prime;和printf()、put char()等函数调用来输出纯ASCII文本给Web服务器。实际上,我们也可以使用MIME头信息&amp;Prime;Content type :text/html\n\n&amp;Prime;来输出HTML源代码给Web服务器。请注意任何MIME头信息后必须有一个空行。一旦发送这个MIME头信息给We b服务器后,Web浏览器将认为随后的文本输出为HTML源代码,在HTML源代码中可以使用任何HTML结构,如超链、图像、Form,及对其他CGI 程 序的调用。也就是说,我们可以在CGI程序中动态产生HTML源代码输出 ,下面是一个简单的例子。 &lt;br /&gt;
&lt;br /&gt;
unanao@debian:/usr/lib/cgi-bin/study$&amp;nbsp; cat html.c &lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
int main() &lt;br /&gt;
{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;Content-Type:text/html\n\n&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;&amp;lt;html&amp;gt;&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;&amp;lt;body&amp;gt;&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Cgi Html&amp;lt;title&amp;gt;&amp;lt;/head&amp;gt;&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;&amp;lt;H2&amp;gt;&amp;lt;b&amp;gt;hello Cgi in c &amp;lt;/b&amp;gt;&amp;lt;/H2&amp;gt;&amp;lt;br&amp;gt;&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;&amp;lt;a href=\&amp;quot;/cgi/together.html\&amp;quot;&amp;gt; Jump to hello.html&amp;lt;/a&amp;gt;&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;&amp;lt;/body&amp;gt;&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;&amp;lt;/html&amp;gt;&amp;quot;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0; &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
上面的CGI程序简单地用printf()函数来产生HTML源代码。请注意在输出的字符串中如果有双引号,在其前面必须有一个后斜字符\,这是因为整个HTML代码串已经在双引号内,所以HTML代码串中的双引号符必须用一个后斜字符\来转义。 或者写成单引号，或者干脆不写单引号和双引号。&lt;br /&gt;
&lt;br /&gt;
十、参考资料：&lt;br /&gt;
Getting Started with CGI Programming in C： http://www.cs.tut.fi/~jkorpela/forms/cgic.html&lt;br /&gt;
用c写CGI 程序简要指南：&lt;br /&gt;
http://www.programfan.com/article/2858.html&lt;br /&gt;
sscanf的用法（百度百科）：&lt;br /&gt;
http://baike.baidu.com/view/1364018.htm&amp;nbsp;
&lt;/p&gt; 
</content> 
</entry> 
 
 <entry> 
 <id>tag:oss.lzu.edu.cn,2009-11-22:1211</id>
 <title>IT工程师必看的十条建议(转)</title> 
 <link rel="alternate" type="text/html" href="http://oss.lzu.edu.cn/modules/lifetype/index.php?op=ViewArticle&amp;articleId=1211&amp;blogId=1" /> 
  
 <modified>2009-11-22T02:44:43+1600</modified> 
 <issued>2009-11-22T02:44:43+1600</issued> 
 <created>2009-11-22T02:44:43+1600</created> 
 <summary type="text/plain"> 
我并不是全部认同，但是大部分还是认同的。 
 
 
[1]好好规划自己的路，不要跟着感觉走！根据个人的理想决策安排，绝大部分人并不指望成为什么院士或教授，而是希望活得滋润一些，爽一些。那么，就需要 ...</summary> 
 <author> 
  
 <name>unanao</name> 
 <url>http://oss.lzu.edu.cn/modules/lifetype/index.php?blogId=1</url> 
</author> 
<dc:subject>
人生哲理 
</dc:subject> 
 <content type="text/html" mode="escaped" xml:lang="zh" xml:base="http://oss.lzu.edu.cn/modules/lifetype/index.php?blogId=1"> 
 &lt;p&gt;
我并不是全部认同，但是大部分还是认同的。&lt;img src=&quot;http://oss.lzu.edu.cn/modules/lifetype/js/tinymce/plugins/emotions/images/smiley-laughing.gif&quot; border=&quot;0&quot; alt=&quot;Laughing&quot; title=&quot;Laughing&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;
[1]好好规划自己的路，不要跟着感觉走！根据个人的理想决策安排，绝大部分人并不指望成为什么院士或教授，而是希望活得滋润一些，爽一些。那么，就需要
慎重安排自己的轨迹。从哪个行业入手，逐渐对该行业深入了解，不要频繁跳槽，特别是不要为了一点工资而转移阵地，从长远看，这点钱根本不算什么，当你对一
个行业有那么几年的体会，以后钱根本不是问题。频繁地动荡不是上策，最后你对哪个行业都没有摸透，永远是新手！ &lt;br /&gt;
  &lt;br /&gt;
 &amp;nbsp; &amp;nbsp;
[2]可以做技术，切不可沉湎于技术。千万不可一门心思钻研技术！给自己很大压力，如果你的心思全部放在这上面，那么注定你将成为孔乙己一类的人物！适可
而止为之，因为技术只不过是你今后前途的支柱之一，而且还不是最大的支柱，除非你只愿意到老还是个工程师！ &lt;br /&gt;
  &lt;br /&gt;
 &amp;nbsp; &amp;nbsp;
[3]不要去做技术高手，只去做综合素质高手！在企业里混，我们时常瞧不起某人，说他&amp;ldquo;什么都不懂，凭啥拿那么多钱，凭啥升官！&amp;rdquo;这是普遍的典型的工程师
的迂腐之言。8051很牛吗？人家能上去必然有他的本事，而且是你没有的本事。你想想，老板搞经营那么多年，难道见识不如你这个新兵？人家或许善于管理，
善于领会老板意图，善于部门协调等等。因此务必培养自己多方面的能力，包括管理，亲和力，察言观色能力，攻关能力等，要成为综合素质的高手，则前途无量，
否则只能躲在角落看示波器！技术以外的技能才是更重要的本事！！从古到今，美国*本，一律如此！ &lt;br /&gt;
  &lt;br /&gt;
 &amp;nbsp; &amp;nbsp;
[4]多交社会三教九流的朋友！不要只和工程师交往，认为有共同语言，其实更重要的是和其他类人物交往，如果你希望有朝一*当老板或高层管理，那么你整*
面对的就是这些人。了解他们的经历，思维习惯，爱好，学习他们处理问题的模式，了解社会各个角落的现象和问题，这是以后发展的巨大的本钱，没有这些以后就
会笨手笨脚，跌跌撞撞，遇到重重困难，交不少学费，成功的概率大大降低！ &lt;br /&gt;
  &lt;br /&gt;
 &amp;nbsp; &amp;nbsp; [5]知识涉猎不一定专，但一定要广！多看看其他方面的书，金融，财会，进出口，税务，法律等等，为以后做一些积累，以后的用处会更大！会少交许多学费！！  &lt;br /&gt;
  &lt;br /&gt;
&amp;nbsp; &amp;nbsp;
[6]抓住时机向技术管理或市场销售方面的转变！要想有前途就不能一直搞开发，适当时候要转变为管理或销售，前途会更大，以前搞技术也没有白搞，以后还用
得着。搞管理可以培养自己的领导能力，搞销售可以培养自己的市场概念和思维，同时为自己以后发展积累庞大的人脉！应该说这才是前途的真正支柱！！！ &lt;br /&gt;
  &lt;br /&gt;
&amp;nbsp; &amp;nbsp;
[7]逐渐克服自己的心里弱点和性格缺陷！多疑，敏感，天真（贬义，并不可爱），犹豫不决，胆怯，多虑，脸皮太薄，心不够黑，教条式思维。。。这些工程师
普遍存在的性格弱点必须改变！很难吗？只在床上想一想当然不可能，去帮朋友守一个月地摊，包准有效果，去实践，而不要只想！不克服这些缺点，一切不可能，
甚至连项目经理都当不好--尽管你可能技术不错！ &lt;br /&gt;
  &lt;br /&gt;
 &amp;nbsp; &amp;nbsp;
[8]工作的同时要为以后做准备！建立自己的工作环境！及早为自己配置一个工作环境，装备电脑，示波器（可以买个二手的），仿真器，编程器等，业余可以接
点活，一方面接触市场，培养市场感觉，同时也积累资金，更重要的是准备自己的产品，咱搞技术的没有钱，只有技术，技术的代表不是学历和证书，而是产品，拿
出象样的产品，就可技术转让或与人合作搞企业！先把东西准备好，等待机会，否则，有了机会也抓不住！ &lt;br /&gt;
  &lt;br /&gt;
 &amp;nbsp; &amp;nbsp;
[9]要学会善于推销自己！不仅要能干，还要能说，能写，善于利用一切机会推销自己，树立自己的品牌形象，很必要！要创造条件让别人了解自己，不然老板怎
么知道你能干？外面的投资人怎么相信你？提早把自己推销出去，机会自然会来找你！搞个个人主页是个好注意！！特别是培养自己在行业的名气，有了名气，高薪
机会自不在话下，更重要的是有合作的机会...&amp;nbsp; &lt;br /&gt;
  &lt;br /&gt;
 &amp;nbsp; &amp;nbsp;
[10]该出手时便出手！永远不可能有100%把握！！！条件差不多就要大胆去干，去闯出自己的事业，不要犹豫，不要彷徨，干了不一定成功，但至少为下一
次冲击积累了经验，不干永远没出息，而且要干成必然要经历失败。不经历风雨，怎么见彩虹，没有人能随随便便成功。 &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
 转载：http://blog.csdn.net/Mac_cm/archive/2009/11/12/4803281.aspx 
&lt;/p&gt; 
</content> 
</entry> 
 
 <entry> 
 <id>tag:oss.lzu.edu.cn,2009-11-03:1181</id>
 <title>(转)辞职也需要辞得帅，辞得大家都开心</title> 
 <link rel="alternate" type="text/html" href="http://oss.lzu.edu.cn/modules/lifetype/index.php?op=ViewArticle&amp;articleId=1181&amp;blogId=1" /> 
  
 <modified>2009-11-03T18:38:30+1600</modified> 
 <issued>2009-11-03T18:38:30+1600</issued> 
 <created>2009-11-03T18:38:30+1600</created> 
 <summary type="text/plain"> 
（还没找到工作呢，不是说想着跳槽，感觉写的蛮好的，收藏一下，说不定以后用的着） &amp;nbsp; 
 
 
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...</summary> 
 <author> 
  
 <name>unanao</name> 
 <url>http://oss.lzu.edu.cn/modules/lifetype/index.php?blogId=1</url> 
</author> 
<dc:subject>
人生哲理 
</dc:subject> 
 <content type="text/html" mode="escaped" xml:lang="zh" xml:base="http://oss.lzu.edu.cn/modules/lifetype/index.php?blogId=1"> 
 &lt;p&gt;
（还没找到工作呢，不是说想着跳槽，感觉写的蛮好的，收藏一下，说不定以后用的着） &amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 请大家允许我跑个题，投简历时，恳求大家不要将自己的简历命名为&amp;ldquo;简历&amp;rdquo;，真是要命啊，我每年都收到很多叫&amp;ldquo;简历&amp;rdquo;的附件，每个都需要修改文
件名才能正确保存，很闹心啊不是一般的闹心，若我们公司是大牛公司，就干脆直接删除了这样的邮件，看都不看了，两人过招、第一招不就败了。
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp; 诚恳建议大家简历命名为&amp;ldquo;某某的个人简历&amp;rdquo;等等，都区别开来，若你现在的简历还没更改文件名，请您马上动手更改，否则成千上万人的简历，都叫&amp;ldquo;简历&amp;rdquo;，你说这是猪脑袋还是？若换成你是招聘官员，是不是想骂人了？
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp; 这个&amp;ldquo;简历&amp;rdquo;很像是&amp;ldquo;不要随地吐痰&amp;rdquo;一样的感觉了，编写软件程序，有一句很重要的行内词汇叫&amp;ldquo;&lt;span style=&quot;color: red&quot;&gt;&lt;strong&gt;换位思考&lt;/strong&gt;&lt;/span&gt;&amp;rdquo;，
就是把你自己放在不同的角色上思考问题，例如我们开发软件中不能总想着某一个角色，你要想，老板用软件？财务总监用软件？普通员工用？客户用？大家的立足
点不一样境界不一样，考虑的问题重点也不一样，你需要针对这些角色，都需要进行换位思考，老板重视的事情员工未必重视，老板更重视宏观的统计数据，员工更
重视自己的门前雪，当然在日常管理上经常需要换位思考。
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;
我以前脾气很大，很容易骂人，也很容易把不该说的话直接就说出来了，这几年学会了换位思考后，我很少骂
&lt;/p&gt; 
</content> 
</entry> 
 
 <entry> 
 <id>tag:oss.lzu.edu.cn,2009-11-02:1177</id>
 <title>迭代跟递归算法详解</title> 
 <link rel="alternate" type="text/html" href="http://oss.lzu.edu.cn/modules/lifetype/index.php?op=ViewArticle&amp;articleId=1177&amp;blogId=1" /> 
  
 <modified>2009-11-02T19:13:35+1600</modified> 
 <issued>2009-11-02T19:13:35+1600</issued> 
 <created>2009-11-02T19:13:35+1600</created> 
 <summary type="text/plain"> !--
@page { size: 21cm 29.7cm; margin: 2cm }
P { margin-bottom: 0.21cm }
-- ...</summary> 
 <author> 
  
 <name>unanao</name> 
 <url>http://oss.lzu.edu.cn/modules/lifetype/index.php?blogId=1</url> 
</author> 
<dc:subject>
程序设计 
</dc:subject> 
 <content type="text/html" mode="escaped" xml:lang="zh" xml:base="http://oss.lzu.edu.cn/modules/lifetype/index.php?blogId=1"> 
 &lt;style type=&quot;text/css&quot;&gt;!--
@page { size: 21cm 29.7cm; margin: 2cm }
P { margin-bottom: 0.21cm }
--
&lt;/style&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点，让计算机对一组指令（或一定步骤）进行重复执行，在每次执行这组指令（或这些步骤）时，都从变量的原值推出它的一个新值。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;利用迭代算法解决问题，需要做好以下三个方面的工作：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;一、确定迭代变量。在可以用迭代算法解决的问题中，至少存在一个直接或间接地不断由旧值递推出新值的变量，这个变量就是迭代变量。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;二、建立迭代关系式。所谓迭代关系式，指如何从变量的前一个值推出其下一个值的公式（或关系）。迭代关系式的建立是解决迭代问题的关键，通常可以使用递推或倒推的方法来完成。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;三、对迭代过程进行控制。在什么时候结束迭代过程？这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制通常可分为两种
情况：一种是所需的迭代次数是个确定的值，可以计算出来；另一种是所需的迭代次数无法确定。对于前一种情况，可以构建一个固定次数的循环来实现对迭代过程
的控制；对于后一种情况，需要进一步分析出用来结束迭代过程的条件。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;例
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;：
一个饲养场引进一只刚出生的新品种兔子，这种兔子从出生的下一个月开始，每月新生一只兔子，新生的兔子也如此繁殖。如果所有的兔子都不死去，问到第
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;12
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;个月时，该饲养场共有兔子多少只？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;分析：
这是一个典型的递推问题。我们不妨假设第 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;个月时兔子的只数为
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;u 1 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，第
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;个月时兔子的只数为
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;u 2 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，第
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;3 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;个月时兔子的只数为
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;u 3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，&amp;hellip;&amp;hellip;根据题意，&amp;ldquo;这种兔子从出生的下一个月开始，每月新生一只兔子&amp;rdquo;，则有
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
u 1 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;＝
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;u 2 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;＝
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;u 1 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;＋
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;u 1 &amp;times; 1 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;＝
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;u 3 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;＝
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;u 2 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;＋
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;u 2 &amp;times; 1 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;＝
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;4 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，&amp;hellip;&amp;hellip;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;根据这个规律，可以归纳出下面的递推公式：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
u n &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;＝
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;u n &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;－
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1 &amp;times; 2 (n &amp;ge;
2) &lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;对应
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;u n &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;和
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;u n &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;－
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，定义两个迭代变量
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;y &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;和
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，可将上面的递推公式转换成如下迭代关系：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
y=x*2
&lt;br /&gt;
&lt;br /&gt;
x=y &lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;让计算机对这个迭代关系重复执行
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;11 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;次，就可以算出第
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;12
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;个月时的兔子数。参考程序如下：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
#include
&amp;lt;stdio.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;int
main()
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;{
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;int
x=1,y,i;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;	for(i=1;i&amp;lt;12;i++){
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;		y=2*x;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;		x=y;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;	}
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;	printf(&amp;quot;There
are %d rabbit\n&amp;quot;,y);
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;}
&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;例
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;：
阿米巴用简单分裂的方式繁殖，它每分裂一次要用 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;分钟。将若干个阿米巴放在一个盛满营养参液的容器内，
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;45
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;分钟后容器内充满了阿米巴。已知容器最多可以装阿米巴
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2 20
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;个。试问，开始的时候往容器内放了多少个阿米巴？请编程序算出。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;分析：
根据题意，阿米巴每 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;分钟分裂一次，那么从开始的时候将阿米巴放入容器里面，到
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;45 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;分钟后充满容器，需要分裂
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;45/3=15
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;次。而&amp;ldquo;容器最多可以装阿米巴
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2 20 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;个&amp;rdquo;，即阿米巴分裂
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;15 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;次以后得到的个数是
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2 20
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;。题目要求我们计算分裂之前的阿米巴数，不妨使用倒推的方法，从第
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;15 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;次分裂之后的
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2 20 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;个，倒推出第
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;15 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;次分裂之前（即第
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;14
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;次分裂之后）的个数，再进一步倒推出第
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;13 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;次分裂之后、第
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;12 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;次分裂之后、&amp;hellip;&amp;hellip;第
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;次分裂之前的个数。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;设第
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;次分裂之前的个数为
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x 0 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、第
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;次分裂之后的个数为
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x 1 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、第
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;次分裂之后的个数为
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x 2 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&amp;hellip;&amp;hellip;第
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;15 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;次分裂之后的个数为
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x 15 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，则有
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
x 14 =x
15 /2 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x
13 =x 14 /2 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&amp;hellip;&amp;hellip;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x n-1 =x n /2
(n &amp;ge; 1) &lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;因为第
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;15 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;次分裂之后的个数
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x 15
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;是已知的，如果定义迭代变量为
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，则可以将上面的倒推公式转换成如下的迭代公式：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
x=x/2 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;（
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;的初值为第
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;15 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;次分裂之后的个数
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2 20 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;让这个迭代公式重复执行
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;15 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;次，就可以倒推出第
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;次分裂之前的阿米巴个数。因为所需的迭代次数是个确定的值，我们可以使用一个固定次数的循环来实现对迭代过程的控制。参考程序如下：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
#include
&amp;lt;stdio.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;#include
&amp;lt;math.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;int
main()
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;{
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;	int
x=pow(2,20);
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;	int
i;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;	for(i=0;i&amp;lt;15;i++){
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;		x=x/2;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;	}
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;	printf(&amp;quot;base
bacteria:%d\n&amp;quot;,x);
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;}
&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;例
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;3 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;：
验证谷角猜想。日本数学家谷角静夫在研究自然数时发现了一个奇怪现象：对于任意一个自然数
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，若
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;为偶数，则将其除以
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;；若
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;为奇数，则将其乘以
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;3 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，然后再加
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;。如此经过有限次运算后，总可以得到自然数
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;。人们把谷角静夫的这一发现叫做&amp;ldquo;谷角猜想&amp;rdquo;。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;要求：编写一个程序，由键盘输入一个自然数
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，把
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;经过有限次运算后，最终变成自然数
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;的全过程打印出来。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;分析：
定义迭代变量为 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，按照谷角猜想的内容，可以得到两种情况下的迭代关系式：当
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;为偶数时，
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n=n/2 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;；当
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;为奇数时，
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n=n*3+1 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;。用
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;QBASIC
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;语言把它描述出来就是：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
if n
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;为偶数 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;then
&lt;br /&gt;
&lt;br /&gt;
n=n/2 &lt;br /&gt;
&lt;br /&gt;
else &lt;br /&gt;
&lt;br /&gt;
n=n*3+1 &lt;br /&gt;
&lt;br /&gt;
end if
&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;这就是需要计算机重复执行的迭代过程。这个迭代过程需要重复执行多少次，才能使迭代变量
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;最终变成自然数
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，这是我们无法计算出来的。因此，还需进一步确定用来结束迭代过程的条件。仔细分析题目要求，不难看出，对任意给定的一个自然数
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，只要经过有限次运算后，能够得到自然数
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，就已经完成了验证工作。因此，用来结束迭代过程的条件可以定义为：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n=1 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;。参考程序如下：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
#include
&amp;lt;stdio.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;int
main()
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;{
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;	int
input;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;	scanf(&amp;quot;%d&amp;quot;,&amp;amp;input);
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;	while(1
!= input){
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;		if(input
% 2 == 0){
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;			input=input/2;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;		}
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;		else{
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;			input=input*3+1;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;		}
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;	}
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;	printf(&amp;quot;%d\n&amp;quot;,input);
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;	return
0;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=&quot;left&quot; style=&quot;margin-bottom: 0cm&quot;&gt;
&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;}
&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;迭代法
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。设方程为&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;f(x)=0&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，用某种数学方法导出等价的形式&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x=g(x)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，然后按以下步骤执行：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;（&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;）
选一个方程的近似根，赋给变量&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x0&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;；
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;（&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;）
将&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x0&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;的值保存于变量&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x1&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，然后计算&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;g(x1)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，并将结果存于变量&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x0&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;；
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;（&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;）
当&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x0&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;与&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x1&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;的差的绝对值还小于指定的精度要求时，重复步骤（&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;）的计算。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;若方程有根，并且用上述方法计算出来的近似根序列收敛，则按上述方法求得的&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x0&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;就认为是方程的根。上述算法用&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;C&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;程序的形式表示为：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;【算法】迭代法求方程的根
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
{ x0=&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;初始近似根；
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
do {
&lt;br /&gt;
x1=x0&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;；
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
x0=g(x1)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;；
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;按特定的方程计算新的近似根&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;*/
&lt;br /&gt;
} while ( fabs(x0-x1)&amp;gt;Epsilon)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;；
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
printf(&amp;ldquo;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;方程的近似根是&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;%f\n&amp;rdquo;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x0)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;；
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
}
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;迭代算法也常用于求方程组的根，令
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
X=&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;（&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x0&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x1&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，&amp;hellip;，&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;xn-1&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;设方程组为：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
xi=gi(X)
(I=0&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，&amp;hellip;，&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n-1)
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;则求方程组根的迭代算法可描述如下：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;【算法】迭代法求方程组的根
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
{ for
(i=0;i &lt;br /&gt;
x=&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;初始近似根&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;;
&lt;br /&gt;
do { &lt;br /&gt;
for (i=0;i &lt;br /&gt;
y=x; &lt;br /&gt;
for (i=0;i &lt;br /&gt;
x=gi(X); &lt;br /&gt;
for
(delta=0.0,i=0;i &lt;br /&gt;
if (fabs(y-x)&amp;gt;delta) delta=fabs(y-x)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;；
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
} while
(delta&amp;gt;Epsilon)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;；
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
for (i=0;i
&lt;br /&gt;
printf(&amp;ldquo;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;变量&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x[%d]&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;的近似根是
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;%f&amp;rdquo;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;I&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;x)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;；
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
printf(&amp;ldquo;\n&amp;rdquo;)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;；
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
}
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;具体使用迭代法求根时应注意以下两种可能发生的情况：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;（&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;）
如果方程无解，算法求出的近似根序列就不会收敛，迭代过程会变成死循环，因此在使用迭代算法前应先考察方程是否有解，并在程序中对迭代的次数给予限制；
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;（&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;）
方程虽然有解，但迭代公式选择不当，或迭代的初始近似根选择不合理，也会导致迭代失败。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;递归
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;递归是设计和描述算法的一种有力的工具，由于它在复杂算法的描述中被经常采用，为此在进一步介绍其他算法设计方法之前先讨论它。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;能采用递归描述的算法通常有这样的特征：为求解规模为&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;N&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;的问题，设法将它分解成规模较小的问题，然后从这些小问题的解方便地构造出大问题的解，并且这些规
模较小的问题也能采用同样的分解和综合方法，分解成规模更小的问题，并从这些更小问题的解构造出规模较大问题的解。特别地，当规模&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;N=1&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;时，能直接得解。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;【问题】
编写计算斐波那契（&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;Fibonacci&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;）数列的第&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;项函数&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;fib&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;（&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;）。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;斐波那契数列为：&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;0&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&amp;hellip;&amp;hellip;，即：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
fib(0)=0;
&lt;br /&gt;
fib(1)=1; &lt;br /&gt;
fib(n)=fib(n-1)+fib(n-2) &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;（当&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n&amp;gt;1&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;时）。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;写成递归函数有：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
int fib(int
n) &lt;br /&gt;
{ if (n==0) return 0; &lt;br /&gt;
if (n==1) return 1; &lt;br /&gt;
if (n&amp;gt;1)
return fib(n-1)+fib(n-2); &lt;br /&gt;
}
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;递归算法的执行过程分递推和回归两个阶段。在递推阶段，把较复杂的问题（规模为&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;）的求解推到比原问题简单一些的问题（规模小于&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;）的求解。例如上例中，
求解&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;fib(n)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，把它推到求解&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;fib(n-1)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;和&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;fib(n-2)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;。也就是说，为计算&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;fib(n)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，必须先计算&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;fib(n-1)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;和&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;fib(n-
2)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，而计算&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;fib(n-1)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;和&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;fib(n-2)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，又必须先计算&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;fib(n-3)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;和&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;fib(n-4)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;。依次类推，直至计算&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;fib(1)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;和&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;fib(0)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，分
别能立即得到结果&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;和&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;0&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;。在递推阶段，必须要有终止递归的情况。例如在函数&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;fib&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;中，当&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;为&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;和&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;0&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;的情况。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;在回归阶段，当获得最简单情况的解后，逐级返回，依次得到稍复杂问题的解，例如得到&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;fib(1)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;和&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;fib(0)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;后，返回得到&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;fib(2)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;的结果，&amp;hellip;&amp;hellip;，在得到了&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;fib(n-1)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;和&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;fib(n-2)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;的结果后，返回得到&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;fib(n)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;的结果。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;在编写递归函数时要注意，函数中的局部变量和参数知识局限于当前调用层，当递推进入&amp;ldquo;简单问题&amp;rdquo;层时，原来层次上的参数和局部变量便被隐蔽起来。在一系列&amp;ldquo;简单问题&amp;rdquo;层，它们各有自己的参数和局部变量。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;由于递归引起一系列的函数调用，并且可能会有一系列的重复计算，递归算法的执行效率相对较低。当某个递归算法能较方便地转换成递推算法时，通常按递推算法
编写程序。例如上例计算斐波那契数列的第&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;项的函数&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;fib(n)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;应采用递推算法，即从斐波那契数列的前两项出发，逐次由前两项计算出下一项，直至计算出要
求的第&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;项。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;【问题】
组合问题 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;问题描述：找出从自然数&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&amp;hellip;&amp;hellip;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;中任取&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;r&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;个数的所有组合。例如&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n=5&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;r=3&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;的所有组合为：
（&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;）&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;（&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;）&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;（&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;）&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;（&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;）&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;（&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;）&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;（&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;6&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;）&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;（&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;7&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;）&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;（&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;8&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;）&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;（&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;9&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;）&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;（&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;10&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;）&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;分析所列的&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;10&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;个组合，可以采用这样的递归思想来考虑求组合函数的算法。设函数为&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;void
comb(int m,int
k)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;为找出从自然数&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&amp;hellip;&amp;hellip;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;m&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;中任取&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;k&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;个数的所有组合。当组合的第一个数字选定时，其后的数字是从余下的&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;m-1&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;个数中取&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;k-1&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;数的组合。这就将求&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;个数中取&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;k&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;个数的组合问题转化成求&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;m-1&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;个数中取&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;k-1&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;个数的组合问题。设函数引入工作数组&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;a[
]&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;存放求出的组合的数字，约定函数将确定的&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;k&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;个数字组合的第一个数字放在&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;a[k]&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;中，当一个组合求出后，才将&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;a[
]&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;中的一个组合输出。第一个数可以是&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;m&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;m-1&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;、&amp;hellip;&amp;hellip;、&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;k&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;，函数将确定组合的第一个数字放入数组后，有两种可能的选择，因还未去顶组合的其余元素，继续递
归去确定；或因已确定了组合的全部元素，输出这个组合。细节见以下程序中的函数&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;comb&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;【程序】
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
# include
&lt;br /&gt;
# define MAXN 100 &lt;br /&gt;
int a[MAXN]; &lt;br /&gt;
void comb(int m,int k) &lt;br /&gt;
{
int i,j; &lt;br /&gt;
for (i=m;i&amp;gt;=k;i--) &lt;br /&gt;
{ a[k]=i; &lt;br /&gt;
if (k&amp;gt;1)
&lt;br /&gt;
comb(i-1,k-1); &lt;br /&gt;
else &lt;br /&gt;
{ for (j=a[0];j&amp;gt;0;j--)
&lt;br /&gt;
printf(&amp;ldquo;%4d&amp;rdquo;,a[j]); &lt;br /&gt;
printf(&amp;ldquo;\n&amp;rdquo;); &lt;br /&gt;
} &lt;br /&gt;
} &lt;br /&gt;
}
&lt;br /&gt;
&lt;br /&gt;
void main() &lt;br /&gt;
{ a[0]=3; &lt;br /&gt;
comb(5,3); &lt;br /&gt;
} &lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;【问题】
背包问题
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;问题描述：有不同价值、不同重量的物品&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;件，求从这&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UKai CN&quot;&gt;&lt;span style=&quot;font-size: medium&quot;&gt;件物品中选取一部分物品的选择方案，使选中物品的总重量不超过指定的限制重量，但选中物品的价值之和最大。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AR PL UK 
</content> 
</entry> 
 
 <entry> 
 <id>tag:oss.lzu.edu.cn,2009-10-27:1164</id>
 <title>给中国学生的第四封信——大学四年应该这么度过</title> 
 <link rel="alternate" type="text/html" href="http://oss.lzu.edu.cn/modules/lifetype/index.php?op=ViewArticle&amp;articleId=1164&amp;blogId=1" /> 
  
 <modified>2009-10-27T04:43:41+1600</modified> 
 <issued>2009-10-27T04:43:41+1600</issued> 
 <created>2009-10-27T04:43:41+1600</created> 
 <summary type="text/plain"> 
 
 
（大学都要结束了，感觉大学过得不是很充实，但是无论走到哪里，都可以把那里看作大学，还没晚，加油！）  
 
 
 摘要: ...</summary> 
 <author> 
  
 <name>unanao</name> 
 <url>http://oss.lzu.edu.cn/modules/lifetype/index.php?blogId=1</url> 
</author> 
<dc:subject>
人生哲理 
</dc:subject> 
 <content type="text/html" mode="escaped" xml:lang="zh" xml:base="http://oss.lzu.edu.cn/modules/lifetype/index.php?blogId=1"> 
 &lt;div class=&quot;article-section-container&quot; style=&quot;padding: 0pt 20px&quot;&gt;
&lt;div class=&quot;article-list&quot;&gt;
&lt;div class=&quot;article-summary&quot;&gt;
（大学都要结束了，感觉大学过得不是很充实，但是无论走到哪里，都可以把那里看作大学，还没晚，加油！） &lt;br /&gt;
&lt;/div&gt;
&lt;div class=&quot;article-summary&quot;&gt;
&lt;span&gt;摘要:&lt;/span&gt;&lt;span&gt;&amp;ldquo;第四封信&amp;rdquo;是写给那些希望早些从懵懂中警醒过来的大学生，那些从未贪睡并希望把握自己的前途和命运的大学生以及那些即将迈进大学门槛的未来大学生们的。&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;article-section article-body&quot;&gt;
&lt;div class=&quot;article-text&quot;&gt;
给中国学生的第四封信&amp;mdash;&amp;mdash;大学四年应该这么度过&lt;br /&gt;
&lt;br /&gt;
2005年2月&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
今天，我回复了&amp;ldquo;开复学生网&amp;rdquo;开通以来的第1000个问题。关掉电脑后，始终有一封学生来信萦绕在我的脑海里，挥之不去：&lt;br /&gt;
开复老师：&lt;br /&gt;
就要毕业了。&lt;br /&gt;
回头看自己所谓的大学生活，&lt;br /&gt;
我想哭，不是因为离别，而是因为什么都没学到。&lt;br /&gt;
我不知，简历该怎么写，若是以往我会让它空白。&lt;br /&gt;
最大的收获也许是&amp;hellip;&amp;hellip;对什么都没有的忍耐和适应&amp;hellip;&amp;hellip;&lt;br /&gt;
这
封来信道出了不少大三、大四学生的心声。大学期间，有许多学生放任自己、虚度光阴，还有许多学生始终也找不到正确的学习方向。当他们被第一次补考通知唤醒
时，当他们收到第一封来自应聘企业的婉拒信时，这些学生才惊讶地发现，自己的前途是那么渺茫，一切努力似乎都为时已晚&amp;hellip;&amp;hellip;&lt;br /&gt;
这&amp;ldquo;第四封信&amp;rdquo;是写给那些希望早些从懵懂中警醒过来的大学生，那些从未贪睡并希望把握自己的前途和命运的大学生以及那些即将迈进大学门槛的未来大学生们的。在这封信中，我想对所有同学说：&lt;br /&gt;
大
学是人一生中最为关键的阶段。从入学的第一天起，你就应当对大学四年有一个正确的认识和规划。为了在学习中享受到最大的快乐，为了在毕业时找到自己最喜爱
的工作，每一个刚进入大学校园的人都应当掌握七项学习：学习自修之道、基础知识、实践贯通、培养兴趣、积极主动、掌控时间、为人处事。只要做好了这七点，
大学生临到毕业时的最大收获就绝不会是&amp;ldquo;对什么都没有的忍耐和适应&amp;rdquo;，而应当是&amp;ldquo;对什么都可以有的自信和渴望&amp;rdquo;。只要做好了这七点，你就能成为一个有潜
力、有思想、有价值、有前途的快乐的毕业生。&lt;br /&gt;
&lt;br /&gt;
大学：人生的关键&lt;br /&gt;
&lt;br /&gt;
大学是人生的关键阶段。这是因为，进入大学是你一生中第一
次放下高考的重担，开始追逐自己的理想、兴趣。这是你第一次离开家庭生活，独立参与团体和社会生活。这是你第一次不再单纯地学习或背诵书本上的理论知识，
而是有机会在学习理论的同时亲身实践。这是你第一次不再由父母安排生活和学习中的一切，而是有足够的自由处置生活和学习中遇到的各类问题，支配所有属于自
己的时间。&lt;br /&gt;
大学是人生的关键阶段。这是因为，这是你一生中最后一次有机会系统性地接受教育。这是你最后一次能够全心建立你的知识基础。这可能是你
最后一次可以将大段时间用于学习的人生阶段，也可能是最后一次可以拥有较高的可塑性、可以不断修正自我的成长历程。这也许是你最后一次能在相对宽容的，可
以置身其中学习为人处世之道的理想环境。&lt;br /&gt;
大学是人生的关键阶段。在这个阶段里，所有大学生都应当认真把握每一个&amp;ldquo;第一次&amp;rdquo;，让它们成为未来人生道
路的基石；在这个阶段里，所有大学生也要珍惜每一个&amp;ldquo;最后一次&amp;rdquo;，不要让自己在不远的将来追悔莫及。在大学四年里，大家应该努力编织自己的梦想，明确自己
的方向，奠定自己的基础。&lt;br /&gt;
我们可以用下图来描述大学四年在人一生中的地位和价值：&lt;br /&gt;
&lt;br /&gt;
我们可以看出，大学是一生中学习能力转变最大的时候，是把&amp;ldquo;基础学习&amp;rdquo;和&amp;ldquo;进入社会&amp;rdquo;这两个阶段衔接起来的重要时期。因此，在大学四年中，要努力培养自己的学习能力，提高自己的学习境界，让自己成为一个擅长终身学习的人。&lt;br /&gt;
大学四年每个人都只有一次，大学四年应该这么度过&amp;hellip;&amp;hellip;&lt;br /&gt;
自修之道：从举一反三到无师自通&lt;br /&gt;
记得我在哥伦比亚大学任助教时，曾有位中国学生的家长向我抱怨说：&amp;ldquo;你们大学里到底在教些什么？我孩子读完了大二计算机系，居然连VisiCalc 都不会用。&amp;rdquo;&lt;br /&gt;
我
当时回答道：&amp;ldquo;电脑的发展日新月异。我们不能保证大学里所教的任何一项技术在五年以后仍然管用，我们也不能保证学生可以学会每一种技术和工具。我们能保证
的是，你的孩子将学会思考，并掌握学习的方法，这样，无论五年以后出现什么样的新技术或新工具，你的孩子都能游刃有余。&amp;rdquo;&lt;br /&gt;
她接着问：&amp;ldquo;学最新的软件不是教育，那教育的本质究竟是什么呢？&amp;rdquo;&lt;br /&gt;
我回答说：&amp;ldquo;如果我们将学过的东西忘得一干二净时，最后剩下来的东西就是教育的本质了。&amp;rdquo;&lt;br /&gt;
我
当时说的这句话来自教育家B. F.
Skinner的名言。所谓&amp;ldquo;剩下来的东西&amp;rdquo;，其实就是自学的能力，也就是举一反三或无师自通的能力。大学不是&amp;ldquo;职业培训班&amp;rdquo;，而是一个让学生适应社会，
适应不同工作岗位的平台。在大学期间，学习专业知识固然重要，但更重要的还是要学习思考的方法，培养举一反三的能力，只有这样，大学毕业生才能适应瞬息万
变的未来世界。&lt;br /&gt;
上中学时，老师会一次又一次重复每一课里的关键内容。但进了大学以后，老师只会充当引路人的角色，学生必须自主地学习、探索和实
践。走上工作岗位后，自学能力就显得更为重要了。微软公司曾做过一个统计：在每一名微软员工所掌握的知识内容里，只有大约10%是员工在过去的学习和工作
中积累得到的，其他知识都是在加入微软后重新学习的。这一数据充分表明，一个缺乏自学能力的人是难以在微软这样的现代企业中立足的。&lt;br /&gt;
自学能力必须
在大学期间开始培养。许多同学总是抱怨老师教得不好，懂得不多，学校的课程安排也不合理。我通常会劝这些学生说：&amp;ldquo;与其诅咒黑暗，不如点亮蜡烛&amp;rdquo;。
大学生不应该只会跟在老师的身后亦步亦趋，而应当主动走在老师的前面。例如，大学老师在一个课时里通常要涵盖课本中几十页的信息内容，仅仅通过课堂听讲是
无法把所有知识学通、学透的。最好的学习方法是在老师讲课之前就把课本中的相关问题琢磨清楚，然后在课堂上对照老师的讲解弥补自己在理解和认识上的不足之
处。&lt;br /&gt;
中学生在学习知识时更多地是追求&amp;ldquo;记住&amp;rdquo;知识，而大学生就应当要求自己&amp;ldquo;理解&amp;rdquo;知识并善于提出问题。对每一个知识点，都应当多问几个&amp;ldquo;为什么&amp;rdquo;。一旦真正理解了理论或方法的来龙去脉，大家就能举一反三地学习其他知识，解决其他问题，甚至达到无师自通的境界。&lt;br /&gt;
事实上，很多问题都有不同的思路或观察角度。在学习知识或解决问题时，不要总是死守一种思维模式，不要让自己成为课本或经验的奴隶。只有在学习中敢于创新，善于从全新的角度出发思考问题，学生潜在的思考能力、创造能力和学习能力才能被真正激发出来。&lt;br /&gt;
《礼
记&amp;bull;学记》上讲：&amp;ldquo;独学而无友，则孤陋而寡闻&amp;rdquo;。也就是说，大学生应当充分利用学校里的人才资源，从各种渠道吸收知识和方法。如果遇到好的老师，你可以主
动向他们请教，或者请他们推荐一些课外的参考读物。除了资深的教授以外，大学中的青年教师、博士生、硕士生乃至自己的同班同学都是最好的知识来源和学习伙
伴。每个人对问题的理解和认识都不尽相同，只有互帮互学，大家才能共同进步。&lt;br /&gt;
有些同学曾告诉我说，他们很羡慕我在读书时能有一位获得过图灵奖的大
师传道授业。其实，虽然我非常推崇我的老师，但他在大学期间并没有教给我多少专业知识。他只是给我指明了大方向，让我分享他的经验，给我提供研究的资源，
并教我做人的方法。他没有时间也没有必要指导我学习具体的专业知识。我在大学期间积累的专业知识都是通过自学获得的。刚入门时，我曾多次红着脸向我的师兄
请教最基本的知识内容，开会讨论时我曾问过不少肤浅的问题，课余时间我还主动与同学探讨、切磋。&amp;ldquo;三人行必有我师&amp;rdquo;，大学生的周围到处是良师益友。只要珍
惜这些难得的机会，大胆发问，经常切磋，我们就能学到最有用的知识和方法。&lt;br /&gt;
大学生应该充分利用图书馆和互联网，培养独立学习和研究的本领，为适应
今后的工作或进一步的深造做准备。首先，除了学习老师规定的课程以外，大学生一定要学会查找书籍和文献，以便接触更广泛的知识和研究成果。例如，当我们在
一门课上发现了自己感兴趣的课题，就应当积极去图书馆查阅相关文献，了解这个课题的来龙去脉和目前的研究动态。熟练和充分地使用图书馆资源，这是大学生特
别是那些有志于科学研究的大学生的必备技能之一。读书时，应尽量多读一些英文原版教材。有些原版教材写得深入浅出，附有大量实例，比中文教材还适于自学。
其次，在书本之外，互联网也是一个巨大的资源库，大学生们可以借助搜索引擎在网上查找各类信息。&amp;ldquo;开复学生网&amp;rdquo;开通半年以来，我发现很多同学其实并没有很
好地掌握互联网的搜索技巧，有时他们提出的问题只要在搜索引擎中简单检索一下，就能轻易找到答案。还有些同学很容易相信网上的谣言，而不会利用搜索引擎自
己查考、求证。除了搜索引擎以外，网上还有许多网站和社区也是很好的学习园地。&lt;br /&gt;
自学时，不要因为达到了学校的要求就沾沾自喜，也不要认为自己在大
学里功课好就足够了。在二十一世纪的今天，人才已经变成了一个国际化的概念。当你对自己的成绩感到满意时，我建议你开始自学一些国际一流大学的课程。例
如，美国麻省理工学院（MIT）的开放式课程已经在网上无偿发布出来，大家不妨去看看MIT的网上课程，做做MIT的网上试题。当你可以自如地掌握MIT
课程时，你就可以更加自信地面对国际化的挑战了。&lt;br /&gt;
总之，善于举一反三，学会无师自通，这是大学四年中你可以送给自己的最好的礼物。&lt;br /&gt;
&lt;br /&gt;
基础知识：数学、英语、信息技术、专业基础课&lt;br /&gt;
&lt;br /&gt;
我
曾经说过，中国学生的一大优势是扎实的基础知识，如数学、物理等。但是，最近几年，同学们在目睹了很多速成的例子（如丁磊、陈天桥等）之后，也迫切希望能
驶上成功的快车道。这渐渐形成了一种追求速成的浮躁风气。有许多大学生梦想在毕业后就立即能做&amp;ldquo;经理&amp;rdquo;、&amp;ldquo;老板&amp;rdquo;，还有许多大学生入学时直接选择了&amp;ldquo;管理
&amp;rdquo;专业，因为他们认为从这样的专业毕业后马上就可以成为企业的管理者。可不少学生进入了管理专业后，才发现自己对本专业的学习毫无兴趣。其实，管理专业和
其他专业一样，都是传授基础知识和基本方法的地方，没有哪个专业可以保证学生在毕业时就能走上领导岗位。无论同学们所学的是哪个专业，大学毕业才是个人事
业的真正开始。想做企业领导或想做管理工作的同学也必须从基层做起，必须首先在人品方面学会做人，在学业方面打好基础。&lt;br /&gt;
如果说大学是一个学习和进
步的平台，那么，这个平台的地基就是大学里的基础课程。在大学期间，同学们一定要学好基础知识（数学、英语、计算机和互联网的使用，以及本专业要求的基础
课程，如商学院的财务、经济等课程）。在科技发展日新月异的今天，应用领域里很多看似高深的技术在几年后就会被新的技术或工具取代。只有对基础知识的学习
才可以受用终身。另一方面，如果没有打下好的基础，大学生们也很难真正理解高深的应用技术。最后，在许多的中国大学里，教授对基础课程也比对最新技术有更
丰富的教学经验。&lt;br /&gt;
数学是理工科学生必备的基础。很多学生在高中时认为数学是最难学的，到了大学里，一旦发现本专业对数学的要求不高，就会彻底放松
对数学知识的学习，而且他们看不出数学知识有什么现实的应用或就业前景。但大家不要忘记，绝大多数理工科专业的知识体系都建立在数学的基石之上。例如，要
想学好计算机工程专业，那至少要把离散数学（包括集合论、图论、数理逻辑等）、线性代数、概率统计和数学分析学好；要想进一步攻读计算机科学专业的硕士或
博士学位，可能还需要更高的数学素养。同时，数学也是人类几千年积累的智慧结晶，学习数学知识可以培养和训练人的思维能力。通过对几何的学习，我们可以学
会用演绎、推理来求证和思考的方法；通过学习概率统计，我们可以知道该如何避免钻进思维的死胡同，该如何让自己面前的机会最大化。所以，大家一定要用心把
数学学好，不能敷衍了事。学习数学也不能仅仅局限于选修多门数学课程，而是要知道自己为什么学习数学，要从学习数学的过程中掌握认知和思考的方法。&lt;br /&gt;
二
十一世纪里最重要的沟通工具就是英语。有些同学在大学里只为了考过四级、六级而学习英语，有的同学仅仅把英语当作一种求职必备的技能来学习，甚至还有人认
为学习和使用英语等于崇洋媚外。其实，学习英语的根本目的是为了掌握一种重要的学习和沟通工具。在未来的几十年里，世界上最全面的新闻内容，最先进的思想
和最高深的技术，以及大多数知识分子间的相互交流都将用英语进行。因此，英语学习是至关重要的，除非你想做一个与国际脱节的人。在软件行业里，不但编程语
言是以英语为基础设计出来的，最重要的教材、论文、参考资料、用户手册等资源也大多是用英语写就的。学英语绝不等于崇洋媚外。中国正在走向世界，中国需要
学习西方的先进思想和先进科学技术，学好英语才是真正的爱国。&lt;br /&gt;
很多中国留学生的英语考试成绩不错，也高分考过四级、六级、托福，但是留学美国后上
课时却很难听懂课程内容，和外国同学交流时就更加困难。我们该如何学好英语呢？既然英语是最重要的沟通工具，那么，最重要的学习方法就是尽量与实践结合起
来，不能只&amp;ldquo;学&amp;rdquo;不&amp;ldquo;用&amp;rdquo;，更不能只靠背诵的方式学习英语。读书时，大家尽量阅读原版的专业教材（如果英语不够好，可以先从中英对照的教材看起），并适当
地阅读一些自己感兴趣的专业论文，这可以同时提高英语和相关专业的知识水平。其次，提高英语听说能力的最好方法是直接与那些以英语为母语的外国人对话。现
在有很多在中国学习和工作的外国人，他们中的不少人为了学中文，很愿意与中国学生对话、交流，这是很好的学习机会。此外，大家不要把学英语当作一件苦差
事，完全可以用有趣的方法学习英语。例如，可以多看一些名人的对话或演讲，多看一些小说、戏剧甚至漫画。初学者可以找英文原版的教学节目和录像来学习，有
一定基础的则应该看英文电视或电影。看一部英文电影时，最好先在有字幕的时候看一遍，同时查考生词、熟悉句式，然后在不加字幕的情况下再看一遍，仅靠耳朵
去听。听英文广播也是很好的练习英文听力的方法，大家每天最好能抽出半小时到一小时的时间收听广播并尽量理解其中的内容，有必要的话还可以录下来反复收
听。在互联网上也有许多互动式的英语学习网站，大家可以在网站上用游戏、自我测试、双语阅读等方式提升英语水平。总之，勇于实践、持之以恒是学习英语的必
由之路。&lt;br /&gt;
信息时代已经到来，大学生在信息科学与信息技术方面的素养也已成为他们进入社会的必备基础之一。虽然不是每个大学生都需要懂得计算机原理
和编程知识，但所有大学生都应能熟练地使用计算机、互联网、办公软件和搜索引擎，都应能熟练地在网上浏览信息和查找专业知识。在二十一世纪里，使用计算机
和网络就像使用纸和笔一样是人人必备的基本功。不学好计算机，你就无法快捷全面地获得自己需要的知识或信息。&lt;br /&gt;
最后，每个特定的专业也有它自己的基
础课程。以计算机专业为例，许多大学生只热衷于学习最新的语言、技术、平台、标准和工具，因为很多公司在招聘时都会要求这些方面的基础或经验。这些新技术
虽然应该学习，但计算机基础课程的学习更为重要，因为语言和平台的发展日新月异，但只要学好基础课程（如数据结构、算法、编译原理、计算机原理、数据库原
理等）就可以万变不离其宗。有位同学生动地把这些基础课程比拟为计算机专业的内功，而把新的语言、技术、平台、标准和工具比拟为外功。那些只懂得追求时髦
的学生最终只知道些招式的皮毛，而没有内功的积累，他们是不可能成为真正的高手的。&lt;br /&gt;
虽然我一向鼓励大家追寻自己的兴趣，但在这里仍需强调，生活中
有些事情即便不感兴趣也是必须要做的。例如，打好基础，学好数学、英语和计算机的使用就是这一类必须做的事情。如果你对数学、英语和计算机有兴趣，那你是
幸运儿，可以享受学习的乐趣；但就算你没有兴趣，你也必须把这些基础打好。打基础是苦功夫，不愿吃苦是不能修得正果的。&lt;br /&gt;
&lt;br /&gt;
实践贯通：&amp;ldquo;做过的才真正明白&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
上高中时，许多学生会向老师提出&amp;ldquo;为什么？有什么用？&amp;rdquo;的问题，通常，老师给出的答案都是&amp;ldquo;不准问&amp;rdquo;。进入大学后，这些问题的答案应该是&amp;ldquo;不准不问&amp;rdquo;。在大学里，同学们应该懂得每一个学科的知识、理论、方法与具体的实践、应用如何结合起来，尤其是工科的学生更是如此。&lt;br /&gt;
有一句关于实践的谚语是这样说的：&amp;ldquo;我听到的会忘掉，我看到的能记住，我做过的才真正明白。&amp;rdquo;&lt;br /&gt;
无
论学习何种专业、何种课程，如果能在学习中努力实践，做到融会贯通，我们就可以更深入地理解知识体系，可以牢牢地记住学过的知识。因此，我建议同学们多选
些与实践相关的专业课。实践时，最好是几个同学合作，这样，既可经过实践理解专业知识，也可以学会如何与人合作，培养团队精神。如果有机会在老师手下做些
实际的项目，或者走出校门打工，只要不影响课业，这些做法都是值得鼓励的。外出打工或做项目时，不要只看重薪酬待遇（除非生活上确实有困难），有时候，即
便待遇不满意，但有许多培训和实践的机会，我们也值得一试。&lt;br /&gt;
以计算机专业为例，实践经验对于软件开发来说更是必不可少的。微软公司希望应聘程序员
的大学毕业生最好有十万行的编程经验。理由很简单：实践性的技术要在实践中提高。计算机归根结底是一门实践的学问，不动手是永远也学不会的。因此，最重要
的不是在笔试中考高分，而是实践能力。但是，在与中国学生的交流过程中，我很惊讶地发现，中国某些学校计算机系的学生到了大三还不会编程。这些大学里的教
学方法和课程的确需要更新。如果你不巧是在这样的学校中就读，那你就应该从打工、自学或上网的过程中寻求学习和实践的机会。在网上可以找到许多实践项目，
例如，有一批爱好编程的学生建立了一个讨论软件技术的网站（ &lt;a href=&quot;http://www.diyinside.com/&quot; target=&quot;_blank&quot; title=&quot;www.diyinside.com&quot;&gt;www.diyinside.com&lt;/a&gt; ），在其中共享他们的知识和实践经验，并成功举办了很多次活动（如在各大高校举办校园技术教育会议），还出版了帮助学生提高技术、解答疑难方面的图书，该网站有多位成员获得了&amp;ldquo;微软最有价值的专家&amp;rdquo;的称号。&lt;br /&gt;
&lt;br /&gt;
培养兴趣：开拓视野，立定志向&lt;br /&gt;
&lt;br /&gt;
孔
子说：&amp;ldquo;知之者不如好之者，好之者不如乐之者。&amp;rdquo;我在&amp;ldquo;给中国学生的第三封信&amp;rdquo;中曾深入论述了快乐和兴趣是一个人成功的关键。如果你对某个领域充满激情，
你就有可能在该领域中发挥自己所有的潜力，甚至为它而废寝忘食。这时候，你已经不是为了成功而学习，而是为了&amp;ldquo;享受&amp;rdquo;而学习了。在&amp;ldquo;第三封信&amp;rdquo;中，我也曾
谈到我自己是如何在大学期间放弃了我不感兴趣的法律专业而进入我所热爱的计算机专业学习的。&lt;br /&gt;
有些同学问我，如何像我一样能找到自己的兴趣呢？我觉
得，首先要客观地评估和寻找自己的兴趣所在：不要把社会、家人或朋友认可和看重的事当作自己的爱好；不要以为有趣的事就是自己的兴趣所在，而是要亲身体验
它并用自己的头脑做出判断；不要以为有兴趣的事情就可以成为自己的职业，例如，喜欢玩网络游戏并不代表你会喜欢或有能力开发网络游戏；不要以为有兴趣就意
味着自己有这方面的天赋，不过，你可以尽量寻找天赋和兴趣的最佳结合点，例如，如果你对数学有天赋但又喜欢计算机专业，那么你完全可以做计算机理论方面的
研究工作。&lt;br /&gt;
最好的寻找兴趣点的方法是开拓自己的视野，接触众多的领域。唯有接触你才能尝试，唯有尝试你才能找到自己的最爱。而大学正是这样一个可
以让你接触并尝试众多领域的独一无二的场所。因此，大学生应当更好地把握在校时间，充分利用学校的资源，通过使用图书馆资源、旁听课程、搜索网络、听讲
座、打工、参加社团活动、与朋友交流、使用电子邮件和电子论坛等不同方式接触更多的领域、更多的工作类型和更多的专家学者。当年，如果我只是乖乖地到法律
系上课，而不去尝试旁听计算机系的课程，我就不会去计算机中心打工，也不去找计算机系的助教切磋，就更不会发现自己对计算机的浓厚兴趣。&lt;br /&gt;
通过开拓
视野和接触尝试，如果你发现了自己真正的兴趣爱好，这时就可以去尝试转系的可能性、尝试课外学习、选修或旁听相关课程；你也可以去找一些打工或假期实习的
机会，进一步理解相关行业的工作性质；或者，努力去考自己感兴趣专业的研究生，重新进行一次专业选择。其实，本科读什么专业并不能完全决定毕业后的工作方
向，正如我所强调的那样，大学期间的学习过程培养的是你的学习能力，只要具备了这种能力，即使从事的是全新的工作，你也能在边做边学的过程中获取足够的知
识和经验。&lt;br /&gt;
除了&amp;ldquo;选你所爱&amp;rdquo;，大家也不妨试试&amp;ldquo;爱你所选&amp;rdquo;。有些同学后悔自己在入学时选错了专业，以至于对所学的专业缺乏兴趣，没有学习动力；有
些同学则因为追寻兴趣而&amp;ldquo;走火入魔&amp;rdquo;，毕业后才发现荒废了本专业的课程；另一些同学因为在学习上遇到了困难或对本专业抱有偏见，就以兴趣为借口，不愿意面
对自己的专业。这些做法都是不正确的。在大学中，转系可能并不容易，所以，大家首先应尽力试着把本专业读好，并在学习过程中逐渐培养自己对本专业的兴趣。
此外，一个专业里可能有很多不同的领域，也许你对专业里的某一个领域会有兴趣。现在，有很多专业发展了交叉学科，两个专业的结合往往是新的增长点。因此，
只要多接触、多尝试，你也许就会碰到自己真正感兴趣的方向。&amp;ldquo;数字笔&amp;rdquo;的发明人王坚博士在微软亚洲研究院负责用户界面的研究，可是谁又能想到他从本科到博
士所学的都是心理学专业，而用户界面又正是计算机和心理学专业的最佳结合点。另一方面，就算你毕业后要从事其他的行业，你依然可以把自己的专业读好，这同
样能成为你在新行业中的优势。例如，有一位同学不喜欢读工科，想毕业后进入服务业发展，我就建议他先把工科读好，将来可以在服务业中以精通技术作为自己的
特长。&lt;br /&gt;
人生的路很长，每个人都可以有很多不同的兴趣爱好。在追寻兴趣之外，更重要的是要找寻自己终身不变的志向。有一本书的作者曾访问了几百个成
功者，问他们有哪件事是他们今天已经懂得，但在年轻时却留下了遗憾的事情。在受访者的回答中，最多的一种是：&amp;ldquo;希望在年轻时就有前辈告诉我、鼓励我去追寻
自己的理想和志向。&amp;rdquo;相比之下，兴趣固然关键，但志向更为重要。例如，我的志向是&amp;ldquo;使影响力最大化&amp;rdquo;，多年以来，我有许多兴趣爱好，如语音识别、对弈软
件、多媒体、研究到开发的转换、管理学、满足用户的需求、演讲和写作、帮助中国学生等等，兴趣可以改变，但我的志向是始终不渝的。因此，大家不必把某种兴
趣当作自己最后的目标，也不必把任何一种兴趣的发展道路完全切断，在志向的指引下，不同的兴趣完全可以平行发展，实在必要时再做出最佳的抉择。志向就像罗
盘，兴趣就像风帆，两者相辅相成、缺一不可，它们可以让你驶向理想的港湾。&lt;br /&gt;
&lt;br /&gt;
积极主动：果断负责，创造机遇 &lt;br /&gt;
&lt;br /&gt;
创立&amp;ldquo;开复学
生网&amp;rdquo;时，我的初衷是&amp;ldquo;帮助学生帮助自己&amp;rdquo;。但让我很惊讶的是，更多的学生希望我直接帮他们做出决定，甚至仅在简短的几句自我介绍后就直接对我说：&amp;ldquo;只有
你能告诉我，我该怎么做&amp;rdquo;。难道一个陌生人会比你更知道自己该怎么做吗？我慢慢认识到，这种被动的思维方式是从小在中国的教育环境中培养出来的。被动的人
总是习惯性地认为他们现在的境况是他人和环境造成的，如果别人不指点，环境不改变，自己就只有消极地生活下去。持有这种态度的人，事业还没有开始，自己就
已经被击败，我从来没见过这样消极的人可以取得持续的成功。&lt;br /&gt;
从大学的第一天开始，你就必须从被动转向主动，你必须成为自己未来的主人，你必须积极
地管理自己的学业和将来的事业，理由很简单：因为没有人比你更在乎你自己的工作与生活。&amp;ldquo;让大学生活对自己有价值&amp;rdquo;是你的责任。许多同学到了大四才开始做
人生和职业规划，而一个主动的学生应该从进入大学时就开始规划自己的未来。&lt;br /&gt;
积极主动的第一步是要有积极的态度。大家可以用我在&amp;ldquo;第三封信&amp;rdquo;里推荐的方法，积极规划自己的人生目标，追寻兴趣并尝试新的知识和领域。纳粹德国某集中营的一位幸存者维克托&amp;bull;弗兰克尔曾说过：&amp;ldquo;在任何特定的环境中，人们还有一种最后的自由，就是选择自己的态度。&amp;rdquo;&lt;br /&gt;
积
极主动的第二步是对自己的一切负责，勇敢面对人生。不要把不确定的或困难的事情一味搁置起来。比如说，有些同学认为英语重要，但学校不考试就不学英语；或
者，有些同学觉得自己需要参加社团磨练人际关系，但是因为害羞就不积极报名。但是，我们必须认识到，不去解决也是一种解决，不做决定也是一个决定，这样的
解决和决定将使你面前的机会丧失殆尽。对于这种消极、胆怯的作风，你终有一天会付出代价的。&lt;br /&gt;
积极主动的第三步是要做好充分的准备：事事用心，事事
尽力，不要等机遇上门；要把握住机遇，创造机遇。中国科技大学校长朱清时院士在大三时被分配到青海做铸造工人。但他不像其他同学那样放弃学习，整天打扑
克、喝酒。他依然终日钻研数理化和英语。六年后，中国科学院要在青海做一个重要的项目，这时朱校长就脱颖而出，开始了他辉煌的事业。很多人可能说他运气
好，被分配到缺乏人才的青海，才有这机会。但是，如果他没有努力学习，也无法抓住这个机遇。所以，做好充分的准备，当机遇来临时，你才能抓住它。&lt;br /&gt;
积
极主动的第四步是&amp;ldquo;以终为始&amp;rdquo;，积极地规划大学四年。任何规划都将成为你某个阶段的终点，也将成为你下一个阶段的起点，而你的志向和兴趣将为你提供方向和
动力。如果不知道自己的志向和兴趣，你应该马上做一个发掘志向和兴趣的计划；如果不知道毕业后要做什么，你应该马上制定一个尝试新领域的计划；如果不知道
自己最欠缺什么，你应该马上写一份简历，找你的老师、朋友打分，或自己审阅，看看哪里需要改进；如果毕业后想出国读博士，你应该想想如何让自己在申请出国
前有具体的研究经验和学术论文；如果毕业后想进入某个公司工作，你应该收集该公司的招聘广告，以便和你自己的履历对比，看自己还欠缺哪些经验。只要认真制
定、管理、评估和调整自己的人生规划，你就会离你自己的目标越来越近。&lt;br /&gt;
&lt;br /&gt;
掌控时间：事分轻重缓急，人应自控自觉&lt;br /&gt;
&lt;br /&gt;
除了积极主动的态度，大学生还要学会安排自己的时间，管理自己的事务。一位同学是这么描述大学生活的：&lt;br /&gt;
&amp;ldquo;大学和高中相比似乎没有什么太大的区别，每天依旧是学习，每次考试后依旧是担心考试成绩&amp;hellip;&amp;hellip;不同的只是大学里上网的时间和睡觉的时间多了很多，压力也小了很多。&amp;rdquo;&lt;br /&gt;
这位同学并不明白，&amp;ldquo;时间多了很多&amp;rdquo;正是大学与高中之间巨大的差别。时间多了，就需要自己安排时间、计划时间、管理时间。&lt;br /&gt;
安
排时间出了做一个时间表外，更重要的是&amp;ldquo;事分轻重缓急&amp;rdquo;。在《高效能人士的七个习惯》一书中，作者史蒂芬&amp;bull;柯维提出，&amp;ldquo;重要事&amp;rdquo;和&amp;ldquo;紧急事&amp;rdquo;的差别是人们
浪费时间的最大理由之一。因为人的惯性是先做最紧急的事，但这么做会导致一些重要的事被荒废掉。例如，我认为这篇文章里谈到的各种学习都是&amp;ldquo;重要的&amp;rdquo;，但
它们不见得都是老师布置的必修课业，采纳我的建议的同学们依然会因为考试、交作业等紧急的事情而荒废了打好基础、学习做人等重要的事情。因此，每天管理时
间的一种好方法是，早上确定今天要做的紧急事和重要事，睡前回顾一下，这一天有没有做到两者的平衡。&lt;br /&gt;
每个人都有许多&amp;ldquo;紧急事&amp;rdquo;和&amp;ldquo;重要事&amp;rdquo;，想把
每件事都做到最好是不切实际的。我建议大家把&amp;ldquo;必须做的事&amp;rdquo;和&amp;ldquo;尽量做的事&amp;rdquo;分开。必须做的事要做到最好，但尽量做的事尽力而为即可。建议大家用良好的态
度和宽广的胸怀接受那些你暂时不能改变的事情，多关注那些你能够改变的事情。此外，还要注意生物钟的运行规律，按时作息，劳逸结合，这样才能在学习时有最
好的状态。&lt;br /&gt;
大学四年是最容易迷失方向的时期。大学生必须有自控的能力，让自己交些好朋友，学些好习惯，不要沉迷于对自己无益的习惯（如网络游戏）
里。一位积极、主动的中国学生在&amp;ldquo;开复学生网&amp;rdquo;上劝告其他同学：&amp;ldquo;不要玩游戏，至少不要玩网络游戏。我所认识的专业水平比较高的大学朋友中没有一个玩网络
游戏的。沉迷于网络游戏是对于现实的逃避，是不愿面对自己不足的一面。我认为，要脱离网络游戏，就得珍惜自己宝贵的大学时间，找到自己感兴趣的方向，做一
些有意义并能给自己带来满足感的事情。&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
为人处事：培养友情，参与群体&lt;br /&gt;
&lt;br /&gt;
很多大学生入校时都是第一次离开父母，离开自己生
长的环境。进入校园开始集体生活后，如何与同学、朋友以及社团的同事相处就成为了大学生学习内容的一部分。大学是大家最后一次可以在相对宽松的环境中学
习、培养、训练如何与人相处的机会。在未来，人们在社会里、在工作中与人相处的能力会变得越来越重要，甚至超过了工作本身。所以，大学生要好好把握机会，
培养自己的交流意识和团队精神。&lt;br /&gt;
&amp;ldquo;人际交往能力不够强，人际圈子不够广，但又没有什么特长可以引起大家的注意，在社团里也不知道怎么和其他人有效地建立联系。&amp;rdquo;这是一些大学生在人际交往方面经常遇到的困惑。对于如何在大学期间提高人际交往能力，我的建议是：&lt;br /&gt;
第
一，以诚待人，以责人之心责己、以恕己之心恕人。对别人要抱着诚挚、宽容的胸襟，对自己要怀着自我批评、有过必改的态度。与人交往时，你怎样对待别人，别
人也会怎样对待你。这就好比照镜子一样，你自己的表情和态度，可以从他人对你流露出的表情和态度中一览无遗。你若以诚待人，别人也会以诚待你。你若敌视别
人，别人也会敌视你。最真挚的友情和最难解的仇恨都是由这种&amp;ldquo;反射&amp;rdquo;原理逐步造成的。因此，当你想修正别人时，你应该先修正自己。你想别人怎么对你，你就
应该怎么对人。你想他人理解你，你就要首先理解他人。&lt;br /&gt;
第二，培养真正的友情。如果能做到第一点，很多大学时的朋友就会成为你一辈子的知己。在一起
求学和寻求自身发展的道路上，这样的友谊弥足珍贵。交朋友时，不要只去找与你性情相近或只会附和你的人做朋友。好朋友有很多种：乐观的朋友、智慧的朋友、
脚踏实地的朋友、幽默风趣的朋友、激励你上进的朋友、提升你能力的朋友、帮你了解自己的朋友、对你说实话的朋友等等。此外，大学时谈恋爱也可以教你如何照
顾别人，增进同理心和自控力，但恋爱这件事要一切随缘，不必为了谈恋爱而谈恋爱。&lt;br /&gt;
第三，学习团队精神和沟通能力。社团是微观的社会，参与社团是步
入社会前最好的磨练。在社团中，可以培养团队合作的能力和领导才能，也可以发挥你的专业特长。但更重要的是，你要做一个诚心诚意的服务者和志愿者，或在担
任学生工作时主动扮演同学和老师之间沟通桥梁的角色，并以此锻炼自己的沟通能力，为同学和老师服务。这样的学习过程也不会很轻松，挫折是肯定有的，但是不
要灰心，大学社团里的人际交往是一种不用&amp;ldquo;付学费&amp;rdquo;的学习，犯了错误也可以重头来过。&lt;br /&gt;
第四，从周围的人身上学习。在班级里、社团中，多观察周围的
同学，特别是那些你觉得交往能力和沟通能力特别强的同学，看他们是如何与人相处的。比如，看他们如何处理交往中的冲突、如何说服他人和影响他人、如何发挥
自己的合作和协调能力、如何表达对他人的尊重和真诚、如何表示赞许或反对，如何在不冒犯他人的情况下充分展示个性等等。通过观察和模仿，你渐渐地会发现，
自己的人际交往能力会有意想不到的改进。在学校里，每一个朋友都可以成为你的良师，他们的热心、幽默、机智、博学、正直、沟通、礼貌等品德都可以成为你的
学习对象。当然，你也应当慷慨地帮助每一个朋友，试着做他们的良师和模范。&lt;br /&gt;
第五，提高自身修养和人格魅力。如果觉得没有特长、没有爱好可能会成为
自己人际交往能力提高的一个障碍，那么，你可以有意识地去选择和培养一些兴趣爱好。共同的兴趣和爱好也是你与朋友建立深厚感情的途径之一。很多在事业上有
所建树的人都不是只会闭门苦读的书呆子，他们大多都有自己的兴趣和爱好。我在微软亚洲研究院的同事中就有绘画、桥牌和体育运动方面的高手。业余爱好不仅是
人际交往的一种方式，还可以让大家发掘出自己在读书以外的潜能。例如，体育锻炼既可以发挥你的运动潜能，也可以培养你的团队合作精神。如果真的没有什么兴
趣爱好，那么，多读些好书丰富自己的知识也可以改进自己的人际交往能力，因为没有什么比智慧和渊博更能体现一个人的人格魅力了。&lt;br /&gt;
所以，学会与人相处，这也是大学中的一门&amp;ldquo;必修课&amp;rdquo;。&lt;br /&gt;
&lt;br /&gt;
对大学生们的期望&lt;br /&gt;
&lt;br /&gt;
踏入大学校门时，你还是一个忙碌的、青涩的、被动的、为分数读书的、被家庭呵护着的中学毕业生。&lt;br /&gt;
就读大学时，你应当掌握七项学习，学好自修之道、基础知识、实践贯通、培养兴趣、积极主动、掌控时间、为人处事。&lt;br /&gt;
经过大学四年，你会从思考中确立自我，从学习中寻求真理，从独立中体验自主，从计划中把握时间，从表达中锻炼口才，从交友中品味成熟，从实践中赢得价值，从兴趣中攫取快乐，从追求中获得力量。&lt;br /&gt;
离开大学时，只要做到了这些，你最大的收获将是&amp;ldquo;对什么都可以拥有的自信和渴望&amp;rdquo;。你就能成为一个有潜力、有思想、有价值、有前途的中国未来的主人翁。&lt;br /&gt;
所以，大学四年应该这么度过。
&lt;/div&gt;
&lt;/div&gt; 
</content> 
</entry> 
 
 <entry> 
 <id>tag:oss.lzu.edu.cn,2009-10-20:1150</id>
 <title>李开复与大学生分享人生启发:自信谦虚居首</title> 
 <link rel="alternate" type="text/html" href="http://oss.lzu.edu.cn/modules/lifetype/index.php?op=ViewArticle&amp;articleId=1150&amp;blogId=1" /> 
  
 <modified>2009-10-20T17:24:16+1600</modified> 
 <issued>2009-10-20T17:24:16+1600</issued> 
 <created>2009-10-20T17:24:16+1600</created> 
 <summary type="text/plain"> 
 
10月17日,创新工场董事长兼首席执行官李开复来到浙江大学紫荆港校区举行专题报告会,以成长中的十个启发为题,与浙大学子一同分享成长中的得与失、苦与乐,为其创业引路. ...</summary> 
 <author> 
  
 <name>unanao</name> 
 <url>http://oss.lzu.edu.cn/modules/lifetype/index.php?blogId=1</url> 
</author> 
<dc:subject>
人生哲理 
</dc:subject> 
 <content type="text/html" mode="escaped" xml:lang="zh" xml:base="http://oss.lzu.edu.cn/modules/lifetype/index.php?blogId=1"> 
 &lt;div id=&quot;vogate_ad_area&quot;&gt;
&lt;p&gt;
10月17日,创新工场董事长兼首席执行官李开复来到浙江大学紫荆港校区举行专题报告会,以成长中的十个启发为题,与浙大学子一同分享成长中的得与失、苦与乐,为其创业引路.
&lt;/p&gt;
&lt;p&gt;
李开复,一年面对十万学生演讲,作为学界、商界的传奇人物,今天将自己人生中的十个启发和大家一一分享.
&lt;/p&gt;
&lt;p&gt;
一,自信不失谦虚,谦虚不失自信;二兴趣就是天赋,天赋就是兴趣,三,思考比传道更重要,观点比解惑更重要;四,我不同意你,但是我支持你;五,挫
折不是惩罚,而是学习的机会;六,创新不重要,有用的创新才重要;七,用勇气改变可以改变的事情,用胸怀接受不能接受的事情,用智慧分辨两者的不同;八,
求知若饥,虚心若愚;九,追随你的心,用它引领你的一生,其他的一切都是次要的;十,你的价值不是你拥有了多少,而是你留下多少.
&lt;/p&gt;
&lt;p&gt;
一直以来,我对于人生的选择都追随着自己的心.李开复娓娓道来,从主修政治到主修计算机,听博导的话到跟博导挑战,从保守留校到挑战苹果,从硅谷创
业到回到中国,从留在微软到加入谷歌,到最后自己的创新工场,一部鲜为人知的成长史、风雨兼程的成功史和烛照人生的心灵史呈现在浙大学子面前.
&lt;/p&gt;
&lt;p&gt;
他说,他希望正面地帮助中国学生,虽然我不可能改变教育,但是我可以影响学生.当天,李开复先生还被聘请为杭州市大学生创业特别顾问.
&lt;/p&gt;
&lt;p&gt;
烧一把火到大学生创业中去,点燃其创业热情,这是请李先生来杭做报告的初衷.杭州市市长蔡奇说,杭州40万的在校学生是杭州最珍贵的资源,是杭州未来发展的需要,人才和资本的集聚度,缺一不可.要积极构建 &#039;3+1&#039;的现代产业体系,把杭州打造成天堂硅谷.
&lt;/p&gt;
&lt;/div&gt; 
</content> 
</entry> 
 
 <entry> 
 <id>tag:oss.lzu.edu.cn,2009-09-28:1146</id>
 <title>网管安全日志 DDoS攻击的监测</title> 
 <link rel="alternate" type="text/html" href="http://oss.lzu.edu.cn/modules/lifetype/index.php?op=ViewArticle&amp;articleId=1146&amp;blogId=1" /> 
  
 <modified>2009-09-28T18:33:46+1600</modified> 
 <issued>2009-09-28T18:33:46+1600</issued> 
 <created>2009-09-28T18:33:46+1600</created> 
 <summary type="text/plain"> 
当有一天你发现自己的网站已经无法正常访问，服务器远程连接不上，数据中心机房那边通知你服务器流量非常大，那你可要做好心理准备了。这会可能已经有人盯上你的服务器上的业务了，如：大型商业网站，游戏等 ...</summary> 
 <author> 
  
 <name>unanao</name> 
 <url>http://oss.lzu.edu.cn/modules/lifetype/index.php?blogId=1</url> 
</author> 
<dc:subject>
安全 
</dc:subject> 
 <content type="text/html" mode="escaped" xml:lang="zh" xml:base="http://oss.lzu.edu.cn/modules/lifetype/index.php?blogId=1"> 
 &lt;div class=&quot;introduce&quot;&gt;
当有一天你发现自己的网站已经无法正常访问，服务器远程连接不上，数据中心机房那边通知你服务器流量非常大，那你可要做好心理准备了。这会可能已经有人盯上你的服务器上的业务了，如：大型商业网站，游戏等 ...
&lt;/div&gt;
&lt;div class=&quot;content_text&quot;&gt;
当有一天你发现自己的网站已经无法正常访问，服务器远程连接不上，数据中心机房那边通知你服务器流量非常大，那你可要做好心理准备了。这会可能已经有
人盯上你的服务器上的业务了，如：大型商业网站，游戏等。在你获得一定利润的时候，那些&amp;ldquo;黑客&amp;rdquo;也可能想从你那里捞一笔&amp;ldquo;保护费&amp;rdquo;。可能是你服务器被人
DoS/DDoS攻击了。&lt;br /&gt;
&lt;br /&gt;
让我们先了解一下DoS和DdoS相关的知识吧。&lt;br /&gt;
&lt;br /&gt;
一、DoS/DDoS的介绍&lt;br /&gt;
&lt;br /&gt;
1、什么是拒绝服务攻击(DoS)&lt;br /&gt;
&lt;br /&gt;
DoS是Denial of
Service的简称，即拒绝服务，造成DoS的攻击行为被称为DoS攻击，其目的是使计算机或网络无法提供正常的服务。最常见的DoS攻击有计算机网络
带宽攻击和连通性攻击。带宽攻击指以极大的通信量冲击网络，使得所有可用网络资源都被消耗殆尽，最后导致合法的用户请求就无法通过。连通性攻击指用大量的
连接请求冲击计算机，使得所有可用的操作系统资源都被消耗殆尽，最终计算机无法再处理合法用户的请求。&lt;br /&gt;
&lt;br /&gt;
2、什么是分布式拒绝服务攻击(DDoS)&lt;br /&gt;
&lt;br /&gt;
分布式拒绝服务(DDoS：Distributed Denial of
Service)攻击指借助于客户/服务器技术，将多台傀儡机联合起来作为攻击平台(傀儡机，一般为黑客所控制的&amp;ldquo;肉鸡&amp;rdquo;)，对一个或多个目标发动DoS
攻击，从而成倍地提高拒绝服务攻击的威力。通常，攻击者通过入侵一台服务器，在得到该服务器一定的权限以后，将DDoS主控程序安装在这台服务器上，在一
个设定的时间主控程序将与大量代理程序通讯，代理程序已经被安装在黑客所控制的许多服务器上(包括通过其他途径获取的大量个人PC)。代理程序收到指令时
就发动攻击。利用客户/服务器技术，主控程序能在几秒钟内激活成百上千次代理程序的运行。&lt;br /&gt;
&lt;br /&gt;
黑客通过控制傀儡机中的某一台(或他自
己的计算机，为安全起见，一般他会选择一台傀儡机来控制其他的傀儡机)，再利用这台傀儡机来指挥其余的傀儡机向目标服务器发动攻击。当然，这只是一个简单
的示意图，还可以把上图想得更加复杂：黑客控制手中的十台、二十台傀儡机，再分别通过被这十台、二十台中的傀儡机去控制成千、上万乃至数十万的傀儡机对目
标发动毁灭性的攻击。&lt;br /&gt;
&lt;br /&gt;
打个形象而又不太恰当的比喻：两个人打架，其中某一个人对付不了对方，于是他把他的朋友全都叫来，多个对付一个，一个人面对那么多个人，你怎么也对付不了。&lt;br /&gt;
&lt;br /&gt;
拒绝服务就是用超出被攻击目标处理能力的海量数据包消耗可用系统，带宽资源，致使正常的网络服务瘫痪的一种攻击手段。拒绝服务攻击采用的是单一的一对一的攻击手段，当CPU处理速度低、内存小及网络带宽小等，拒绝服务攻击的效果就很明显。&lt;br /&gt;
&lt;br /&gt;
但是，随着互联网技术及硬件技术的飞速发展，现在的带宽都是以百兆、千兆为单位来计算，CPU多数亦是双核或四核的，内存现在也可以说是白菜价了。在这种环境下，使得拒绝服务的攻击的困难程度就加大了。&lt;br /&gt;
&lt;br /&gt;
这样，分布式拒绝服务(DDoS)攻击就出现了。如果你理解了拒绝服务(DoS)攻击的话，在它的基础上，分布式拒绝服务攻击就不难理解了。如果说计算
机与网络的处理攻击的能力加大了10倍，用一台傀儡机来攻击不再能起作用的话，攻击者使用10台傀儡机同时攻击呢?用100台呢?DDoS就是利用更多的
傀儡机来发起进攻，以比从前更大的规模来进攻受害者。&lt;br /&gt;
&lt;br /&gt;
二、DoS/DDoS攻击的现象&lt;br /&gt;
&lt;br /&gt;
那么，服务器被DoS/DDoS攻击会是怎样的现象呢?&lt;br /&gt;
&lt;br /&gt;
1、被攻击主机上有大量等待的TCP连接;&lt;br /&gt;
&lt;br /&gt;
2、网络中充斥着大量的无用的数据包，源地址为假地址或私网中才可能出现的地址;&lt;br /&gt;
&lt;br /&gt;
3、制造高流量无用数据，造成网络拥塞，使受害主机无法正常和外界通讯;&lt;br /&gt;
&lt;br /&gt;
4、利用受害主机提供的服务或传输协议上的缺陷，反复高速的发出特定的服务请求，使受害主机无法及时处理所有正常请求;&lt;br /&gt;
&lt;br /&gt;
5、严重时会造成系统运行缓慢或假死、甚至死机;&lt;br /&gt;
&lt;br /&gt;
三、DoS/DdoS攻击的类型：&lt;br /&gt;
&lt;br /&gt;
1、Synflood：该攻击以多个随机的源主机地址向目的主机发送SYN包，而在收到目的主机的SYN
ACK后并不回应，这样，目的主机就为这些源主机建立了大量的连接队列，而且由于没有收到ACK一直维护着这些队列，造成了资源的大量消耗而不能向正常请
求提供服务。&lt;br /&gt;
&lt;br /&gt;
2、Smurf：该攻击向一个子网的广播地址发一个带有特定请求(如ICMP回应请求)的包，并且将源地址伪装成想要攻击的主机地址。子网上所有主机都回应广播包请求而向被攻击主机发包，使该主机受到攻击。&lt;br /&gt;
&lt;br /&gt;
3、Land-based：攻击者将一个包的源地址和目的地址都设置为目标主机的地址，然后将该包通过IP欺骗的方式发送给被攻击主机，这种包可以造成被攻击主机因试图与自己建立连接而陷入死循环，从而很大程度地降低了系统性能。&lt;br /&gt;
&lt;br /&gt;
4、Ping of
Death：根据TCP/IP的规范，一个包的长度最大为65536字节。尽管一个包的长度不能超过65536字节，但是一个包分成的多个片段的叠加却能
做到。当一个主机收到了长度大于65536字节的包时，就是受到了Ping of Death攻击，该攻击会造成主机的宕机。&lt;br /&gt;
&lt;br /&gt;
5、Teardrop：IP数据包在网络传递时，数据包可以分成更小的片段。攻击者可以通过发送两段(或者更多)数据包来实现TearDrop攻击。第一
个包的偏移量为0，长度为N，第二个包的偏移量小于N。为了合并这些数据段，TCP/IP堆栈会分配超乎寻常的巨大资源，从而造成系统资源的缺乏甚至机器
的重新启动。&lt;br /&gt;
&lt;br /&gt;
6、PingSweep：使用ICMP Echo轮询多个主机。&lt;br /&gt;
&lt;br /&gt;
7、Pingflood：该攻击在短时间内向目的主机发送大量ping包，造成网络堵塞或主机资源耗尽。&lt;br /&gt;
&lt;br /&gt;
四、如何防御DoS/DdoS攻击&lt;br /&gt;
&lt;br /&gt;
当某一天，你登陆服务器时，感觉服务器运行缓慢，甚至是根本就远程连接不上，数据中心机房工作人员通知你服务器流量非常大。这时候，你得分析是不是一定是受到了DoS/DDoS攻击。&lt;br /&gt;
&lt;br /&gt;
那么在此告诉你们一条简单且易懂的命令就可以判定服务器是否真的受到了DoS/DdoS攻击：&lt;br /&gt;
&lt;br /&gt;
在命令提示符下执行netstat &amp;ndash;an，查看当前务器对外的所有连接，如果发现有大量的SYN_RECEIVED、TIME_WAIT、FIN_WAIT_1等状态存在，而ESTABLISHED很少，则可判定肯定是遭受了资源耗尽攻击。&lt;br /&gt;
&lt;br /&gt;
如果你的服务器托管在一家比较有条件的数据中心机房里，同时这一家公司又有抗DoS/DdoS攻击设备，不过，目前市面上大部分数据中心机房里的抗DoS/DDoS攻击设备不是无偿使用的。&lt;br /&gt;
&lt;br /&gt;
具体怎么得到抗DoS/DDoS攻击设备在此不详细描述，可能是用数据中心机房的设备，有条件的单位也可以自己购买设备。&lt;br /&gt;
&lt;br /&gt;
这种方法只能够抵抗一小部分的攻击，由于DoS/DDoS攻击的类型很多，加上新的变种攻击手段也层出不穷。&lt;br /&gt;
&lt;br /&gt;
当你的抗DoS/DDoS攻击设备无法识别那些新的DoS/DDoS攻击，或由于攻击力度太大，抗DoS/DdoS攻击设备自身已经无法正常影响了，甚至攻击的带宽已经远远超出数据中心机房出口的总带宽，这时候安装什么抗攻击设备都是无能为力的。&lt;br /&gt;
&lt;br /&gt;
这个时候你得让数据中心机房通知上级ISP运营商，在他们上级路由上将你的服务器IP地址临时过滤掉。并且你需要与数据中心机房实时保持联系，让他们及时在上级ISP运营商那里得到最新的消息，以便第一时间内将你服务器IP地址予以解封。
&lt;/div&gt;
&lt;div class=&quot;content_text&quot;&gt;
&amp;nbsp;
&lt;/div&gt;
&lt;div class=&quot;content_text&quot;&gt;
转自：&lt;br /&gt;
&lt;/div&gt;
&lt;div class=&quot;content_text&quot;&gt;
http://www.hackbase.com/tech/2009-09-11/55931_1.html &lt;br /&gt;
&lt;/div&gt; 
</content> 
</entry> 
 
</feed>
