Pocket PC/Smartphone软件安装包之制作DIY

Pocket PC/Smartphone软件安装包之制作DIY<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


  当我们开发完Pocket PC或者Smartphone的软件后,都需要考虑如何制作给最终用户使用的软件安装包。专门用于制作安装包的软件有很多,如Install Shield等。但在许多情况下,我们仅仅需要一些比较简单的安装过程,这时候我们完全可以利用SDK中提供的工具和一些免费的软件来制作安装包。另外,我们制作的软件经常会需要在不同的平台下运行,例如笔者开发的一个软件同时支持HPCPPCSmartphone等平台,HPCPPC平台上还有3CPU类型。如果每一步操作完成后都需要人工介入进行操作的话,每一次构建过程都会相当的繁琐和耗时。所以我们会考虑如何将一系列的操作采用脚本串接起来,只需要运行一个命令就能够生成最终需要的所有安装包。

用命令行编译链接程序

  虽然EVC里提供了Batch Build的功能,但该功能只能用于同一平台的不同CPU版本的编译链接操作。在切换不同平台进行编译时,需要在GUI环境中手工执行,无法达到我们要求。所以我们需要研究如何在命令行状态下进行程序的编译运行。实际上EVC程序本身是提供了一系列的命令可以用于命令行编译的。

D:\Program Files\Microsoft eMbedded Tools\Common\EVC\Bin>evc /?
Usage:
    EVC [myprj.vcp|mywksp.vcw] - load project/workspace
    [<filename>] - load source file
        /? - display usage information
        /EX <macroname> - execute a VBScript macro
        /OUT <filename> - redirect command line output to a file
        /USEENV - ignore tools.options.directories settings
        /MAKE [<target>] [...] - build specified target(s)
            [<project> - <platform> <configname>]
            [[<project>|ALL] - [DEBUG|RELEASE|ALL]]
        /CLEAN - delete intermediate files but don't build
        /REBUILD - clean and build
        /NORECURSE - don't build dependent projects
        /CECONFIG [<configuration>] - use specified configuration

  其中主要是运用MAKE命令。假设我们需要编译的程序名叫做Demo,工作环境文件名为demo.vcwPPC版的工程项目文件为Demo.vcpSmartphone版本的项目文件为DemoSP.vcp.我们为EVC3编写好的批处理文件build.bat如下:

REM @echo off
set EVC="D:\Program Files\Microsoft eMbedded Tools\Common\EVC\Bin\EVC.EXE" <-
指向EVC 3.0程序所在目录
set CFG=
set CECONFIG=

%EVC% Demo.vcw /make "%CFG%" /CEConfig=%CECONFIG% /rebuild <-
执行编译并生成目标可执行文件
if errorlevel 1 goto :eof <-
如果编译失败则终止批处理

:pocketpc
set CFG=Demo - Win32 (WCE ARM) Release<-
将要进行编译的项目名称和编译出来的目标代码的平台和CPU类型。其中“-”前面的是项目名称,“-”后面的部分是平台和CPU类型以及编译的是Release版还是Debug版。格式可以参照在EVCBuild->Configurations中的写法, EVC3 EVC4的表达方式略有不同。
set CECONFIG="Pocket PC" <-
编译PPC平台版本
%EVC% Demo.vcw /make "%CFG%" /CEConfig=%CECONFIG% /rebuild
if errorlevel 1 goto :eof

set CFG=Demo - Win32 (WCE MIPS) Release
%EVC% Demo.vcw /make "%CFG%" /CEConfig=%CECONFIG% /rebuild
if errorlevel 1 goto :eof

set CFG=Demo - Win32 (WCE SH3) Release
%EVC% Demo.vcw /make "%CFG%" /CEConfig=%CECONFIG% /rebuild
if errorlevel 1 goto :eof

:sp2002
set CFG=DemoSP - Win32 (WCE ARM) Release
set CECONFIG="Smartphone 2002" <-
编译Smartphone平台版本
%EVC% Demo.vcw /make "%CFG%" /CEConfig=%CECONFIG% /rebuild
if errorlevel 1 goto :eof

echo build successfully finished!!
pause

  根据上面的代码,现在我们只需要运行一次build.bat文件即可编译生成PPCSmartphone等不同平台的目标文件。

制作cab文件

  生成目标文件后,我们就需要考虑如何将程序安装到设备上。cab文件是一种压缩并且带有各种安装信息的打包文件,所有的安装软件实际上都是将软件的cab文件拷贝到相应设备上,然后利用设备上的wceload程序进行最后的设备安装步骤。我们可以使用PocketPC或者Smartphone SDK中附带的cabwiz.exe (在Smartphone上是CabWizSP.exe)对程序进行打包生成cab文件。

  在制作cab文件之前,我们通常需要做好以下的规划:

·    程序的详细信息,例如公司名称,程序名称等等

·    目标的硬件平台,如PPC还是Smartphone,什么类型的CPU

·    有哪些源文件,源文件存放在PC机上面的什么目录中

·    拷贝到设备上的文件存放在什么路径下

·    是否需要创建快捷方式,快捷方式到什么文件,图标是什么

·    是否需要修改注册表,修改项目和内容是什么

  cab文件的生成需要制作一个.inf文件作为cabwiz程序的输入。当我们做好计划之后就可以动手编写这个.inf文件。这个文件是整个制作过程中最关键的一步,也是最困难的一步。.inf文件与windows里的ini文件十分相似,都是用文本方式保存的,里面包含若干的段(Section), 关键字(Key)和值(Value)组成的描述信息。我们同样是采用对例子进行解释说明的方式进行介绍。

  一般来说,inf文件都有四个主要组成部分,PPC的写法和Smartphone的写法略有不同,我们先介绍PPC的写法。

  inf文件的第一部分是一些全局信息的定义:

[Version] <-版本信息,必须有该段
Signature = "$Windows NT$" <-
必须是$Windows NT$或者$Windows 98$, 不要改动
Provider = "Demo Soft" <-
提供商, 完整的程序名字会是"<Provider> <AppName>"
CESignature = "$Windows CE$" <-
必须是该值

[CEStrings] <-
该段主要是定义安装程序用到的一些字符串,必须有该段
AppName = "DemoApp" <-
程序的名字
InstallDir = “%CE1%\Octopus Studio\%AppName%” <-
定义程序在目标设备中的安装目录

[Strings] <-
该段用于用户自己定义的字符串, 该段可选
ExeBaseDir = "C:\ProjectHome\demo\Release\platform" <-
和平台相关的文件放在这个目录下
CommonDir = "C:\ProjectHome\demo\Release" <-
与平台无关的文件放在这个目录里

  其中InstallDir中出现的“%CE1%”inf文件定义的系统目录标记,下面列出的是PPC 2002Smartphone 2002下可以使用的目录宏:

目录标记

目录路径

%CE1%

\Program Files

%CE2%

\Windows

%CE4%

\Windows\StartUp

%CE5%

\My Documents

%CE8%

\Program Files\Games

%CE11%

\Windows\Start Menu\Programs

%CE14%

\Windows\Start Menu\Programs\Games

%CE15%

\Windows\Fonts

%CE17%

\Windows\Start Menu

%CE19%

\Application Data(仅用于Smartphone)

  这些目录标记在进行安装的时候会替换成相应的系统目录路径。此外这些系统目录在安装过程中会自动根据需要进行自动调节。例如%CE1%是指系统缺省的程序安装目录,指向“\Program Files”。而当用户选择程序安装在存储卡中时,该目录也会做相应改变。

  [CEString][Strings]中定义的变量以及上面提到的目录标记可以用于替换inf文件中的任意部分。下面的说明中会有使用的例子。

  第二部分是用来声明支持的设备CPU类型,操作系统类型和版本号要求:

[CEDevice.ARM] <-目标设备声明,如果支持多种设备/CPU就会有多个CEDevice段,并且在用设备标号作为后缀表示。如果只支持一种设备,可以直接用[CEDevice]表示
ProcessorType = 2577 <-
该目标设备是StrongARM CPU
UnsupportedPlatforms = “Smartphone”,"HPC","Jupiter","Palm PC2" <-
不支持smarthphoneHPC等旧设备
VersionMin = 3.00 <-
对应设备德操作系统的最低版本号要求是3.0,版本号说明见下面的说明
VersionMax = 5.00 <-
假设我们的程序要求的操作系统最高版本号是5.0

[CEDevice.MIPS]
ProcessorType = 4000 <-CPU
要求是 MIPS_R4000
UnsupportedPlatforms = “Smartphone”,"HPC","Jupiter","Palm PC2"
VersionMin = 3.00
VersionMax = 5.00

[CEDevice.SH3]
ProcessorType = 10003 <- CPU
要求是 Hitachi_SH3
UnsupportedPlatforms = “Smartphone”,"HPC","Jupiter","Palm PC2"
VersionMin = 3.00
VersionMax = 5.00

  WinCE各个平台的表示法和相应的版本号如下表,UnsupportedPlatformVersionMin/VersionMax的值可以参考该表进行填写。

Platform

Platform type

Windows CE version

Smartphone 2003

Smartphone

4.2

Smartphone 2002

Smartphone

3.0

Pocket PC 2003

Pocket PC

4.2

Pocket PC 2002

Pocket PC

3.0

Pocket PC 2000

Palm PC2

3.0

Palm Size PC v2

Palm PC

2.11

Palm Size PC v1

Palm PC

2.1

Handheld PC 2000

Jupiter

3.0

Handheld PC Pro

Jupiter

2.11

Handheld PC

HPC

2.0

  inf文件的第三部分是定义源文件的组成和其在桌面机器的目录:

[SourceDisksNames] <-源文件所在目录,段名称不加后缀表示与平台无关的文件所在目录.必须有该段
1=, "SourceDisk01",,%CommonDir% <-
格式为 <source ID> = ,<label>,,<source directory>其中Source ID用来在后续内容中指定源文件目录用,label只是说明,无用处。Source directory则是指源文件在PC系统中的所在目录。

[SourceDisksNames.ARM] <-
段名称的后缀与前面的CEDevice段相对应
2=, "SourceDisk02",,%ExeBaseDir%\ppc\arm

[SourceDisksNames.MIPS]
2=, "SourceDisk03",,%ExeBaseDir%\ppc\mips

[SourceDisksNames.SH3]
2=, "SourceDisk04",,%ExeBaseDir%\ppc\sh3

[SourceDisksFiles] <-
说明源文件分别放在什么目录下,必须有该段
"demo.htm" = 1 <-
格式为<filename> = <source ID>,其中filename是文件名,Source ID是指上面SourceDiskName中定义的源目录ID.“demo.htm”=1表示demo.htm文件是放在SourceDiskNames里定义的%CommonDir%目录里。
"demo.exe" = 2
"demo.dll" = 2

  inf文件的第四部分是定义安装的操作

[DefaultInstall] <-指明安装包需要进行的操作,例如文件拷贝,快捷方式创建等。必须有该段
CopyFiles = Files.InstallDir, Files.Windows <-
指明需要进行文件拷贝的说明段,参看下面的说明
CEShortcuts = Links <-
指定需要生成的快捷方式定义. 除了这连个安装操作外,开发人员还可以指定注册表修改(AddReg), 自定的安装/卸载时的可执行代码(CESetupDLL), 注册DLL文件(CESelfRegister).具体可以参考SDK帮助文件

[Files.InstallDir] <-
文件拷贝操作中指明的文件拷贝操作定义,用于定义每个文件如何被拷贝到设备上
"demo.htm",,,0x40000001 <-
格式为<dest filename>,<source filename>,,<copy flags>, 其中dest filename 表示拷贝到目标设备后文件名; source filename源文件的文件名,如果为空则dest filename用来表示源文件文件名;copy flags表示拷贝文件时的方式,该值是一些标志位的组合,可用的标志如下:

标志

含义

0x00000001

警告用户如果在拷贝该文件时发生错误, 而用户采用跳过操作的话

0x00000002

不允许用户在拷贝该文件时发生错误才取跳过操作

0x00000010

当目标目录中有同名文件存在时不进行覆盖操作

0x00000400

当目标目录存在同名文件时才进行拷贝(覆盖)操作

0x20000000

如果目标文件比该文件新则不进行拷贝操作

0x40000000

拷贝文件时不检查文件日期

0x80000000

创建一个对该文件的链接,主要是用于共享dll文件

"demo.exe",,,0x40000003

[Files.Windows] <-
同上,用户定义文件拷贝操作
"demo.dll",,,0x80000013

[DestinationDirs] <-
定义设备上的目标文件目录
Files.InstallDir = 0,%InstallDir% <-
格式为<section name> = 0,<dest directory>, 其中section name 对应[DefaultInstall] CopyFiles中的值。dest directory则是目标设备上的目的目录。例如Files.InstallDir里列出的文件将会拷贝到目标设备的%InstallDir%目录下。
Files.Windows = 0, %CE2%
Links = 0, %CE11%

[Links] <-
该段对应[DefaultInstall]CEShortcuts的定义,用来说明需要创建的快捷方式
%AppName%,0,"demo.exe",%CE11% <-
格式为<shortcut filename>,<shortcut type>,<target file/path>,<standard dest path>。其中 shortcut filename是指生成的快捷方式的文件名; shortcut type 指明链接的是文件名还是目录,0表示文件,非0表示目录; target file/path 是指被链接的文件的文件名或者目录路径; standard dest path 指快捷方式存放在那个目录下。

  以上是针对PPCinf文件写法。由于PPC支持多种的CPU所以比较复杂一些,而Smartphone目前实际上目前只支持一种CPU类型,所以我们可以对inf文件进行简化。其中文件的第1和第4部分的内容还是和PPC一样。而第2和第3部分则可以简化成:

[CEDevice]
ProcessorType = 2577
UnsupportedPlatforms = “Pocket PC“,"HPC","Jupiter","Palm PC2" <-
不支持PPCHPC等设备
VersionMin = 3.00
VersionMax = 5.00

[SourceDisksNames]
1=, "SourceDisk01",,%CommonDir%
2=, "SourceDisk02",,%ExeBaseDir%\sp

[SourceDisksFiles]
"demo.htm" = 1
"demo.exe" = 2
"demo.dll" = 2

  把以上四个部分拼成一个文件就是一个完整的inf文件了。制作完inf文件后,我们就可以使用cabwiz.exe文件来生成.cab文件。该命令的语法如下:

cabwiz.exe "inf_file"
[/dest dest_directory]
[/err error_file]
[/cpu cpu_type [cpu_type]]

  参数的含义为:

inf_file – 指向inf文件的全路径
dest_directory –
生成的cab文件的存放路径,如不指定则生成在inf文件所在目录
error_file –
错误报告文件,将所有的执行信息都输出到该文件。不指定该参数时,所有的错误信息都会用消息框来显示。该参数主要用于自动化构建
cpu_type –
指定需要生成的CPU类型,需要与inf文件中定义的CEDevice段的后缀一致。可以同时指定多个CPU类型

  假设我们前面例子中的inf文件名为demo.inf文件。则对应的执行命令为:

cabwiz demo.inf /err buildppc.err /cpu ARM MIPS SH3

  这样就会生成 demo.arm.cab, demo.mips.cab, demo.sh3.cab 三个文件,分别对应3种不同的CPU(平台)的安装文件。

制作自动安装执行文件

  生成了cab文件并不意味着大功告成。虽然用户可以手工将cab文件拷贝到设备上安装,但这样需要用户自己懂得区分CPU类型等许多的专业知识。所以我们通常都会进一步生成一个可执行的自动化安装包,达到傻瓜化安装的目的。如果你的安装过程比较简单的话,可以使用Spb Software Househttp://www.spbsoftwarehouse.com)公司提供的免费软件ezsetup进行可执行安装文件的制作。该软件生的安装程序功能比较简单:显示产品信息和软件授权协议,然后安装cab文件。虽然功能比较少,但大部分的PPC/Smartphone软件的安装过程也只需要这几个功能就足够了。

  首先我们需要制作一个demo.ini文件。该文件的格式很简单,PPCSmartphone对应的格式都一样。例子如下:

[CEAppManager]
Version = 1.0 <-
这个是CeAppMgr程序的版本号,不是要安装的软件的版本号,不必修改
Component = Demo <-
软件的模块,与下面的段的名称一致

[Demo]
Description = Demo App For PPC <-
软件的描述
CabFiles = demo.arm.cab,demo.mips.cab,demo.sh3.cab <-
列出需要所有的cab文件,注意文件名之间不要有空格

  ezsetup程序是一个命令行运行的程序,这可以方便我们进行自动化构建。命令的使用方法如下:

ezsetup <-l language> <-i inifilename> <-r readme.txt>
<-e eula.txt> <-o outputexe>

-l language
是指定安装过程中使用的语言,暂时不支持中文,所以我们选English
-i inifilename ini
文件的全路径
-r readme.txt readme
文件的全路径,用于在安装过程中显示给用户
-e eula.txt
最终用户授权协议文件的全路径,用于安装过程中授权协议界面的显示
-o outputexe
生成的exe文件的名称

  我们可以用下面的命令来生成可执行安装文件:

ezsetup -l english -i demo.ini -r Readme.txt -e License.txt -o demo_setup.exe

自动化构建

  前面分别介绍了如何在命令行编译链接目标程序,制作cab文件,以及生成自动化安装程序。这些步骤都是可以通过命令行方式执行的,所以我们可以把这些命令在批处理脚本中串接起来制作自动化构建脚本。这样我们就可以一键完成从代码编译到生成最终可执行安装包的全过程。

 

 

转载于:https://www.cnblogs.com/yuanermen/archive/2006/11/02/547822.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机启动和linux启动

计算机是如何启动的 http://www.ruanyifeng.com/blog/2013/02/booting.html Linux 的启动流程 http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html

编辑器

1.FCKeditor 编辑器 FCKeditor is compatible with most internet browsers which include: IE 5.5 (Windows), Firefox 1.0, Mozilla 1.3 and Netscape 7. 最新版本:FCKeditor 2.0 语言环境:多国语言特性功能:所见所得,支持平台众多,支持XHTML 1.0,文本格式设置,常见的编辑,复…

uva 10271——Chopsticks

题意&#xff1a;有n只筷子&#xff0c;然后选出来k8套&#xff08;一套有三只&#xff0c;分别ABC&#xff09;&#xff0c;一套筷子质量为最小的两只的平方&#xff0c;选出的使得总的质量和最小。 思路&#xff1a;01背包。dp[i][j]表示j套利选出来i套的最优解&#xff0c;每…

VSTO---excel编程 [待续] [12月5日更新,详见文档下面]

最近比较闲了&#xff0c;考试也快要到了。但是编程技术方面还是不能掉啊.现在开始VSTO编程之旅了。这个话题是连Blog的。所以有兴趣的Blog之友&#xff0c;技术之士&#xff0c;可以匿名或者非匿名的评论&#xff0c;交流。对了&#xff0c;下面的代码都是本人写的&#xff0c…

uva 1630——Folding

题意&#xff1a;给出一个由大写字母组成的长度为n的串&#xff0c;然后尽量折叠成一个尽量短的串&#xff0c;折叠可以嵌套。 思路&#xff1a;区间dp&#xff0c;dp&#xff08;i&#xff0c;j&#xff09;表示区间&#xff08;i&#xff0c;j&#xff09;的最短的串的长度&a…

uva 1433——Garlands

题意&#xff1a;给定n个值&#xff0c;然后把这n个值分为m-1段&#xff0c;每段的一半长度不超过k&#xff0c;求分得的的段中&#xff0c;最大的半段的最小值。 思路&#xff1a;二分dp&#xff0c;dp&#xff08;i&#xff0c;0&#xff09;表示前i个不超过x的最小段数&…

今天开始学C#.NET

因项目需要&#xff0c;今天开始接触C#.NET。从Java到C#&#xff0c;真的是比较简单&#xff0c;先学会了VS2003。本来想用VS2005&#xff0c;但项目上要求用VS2003&#xff0c;也就是.NET Framework1.1&#xff0c;所以就打算从VS2003入手&#xff0c;先在公司 的笔记本上装好…

VS.NET提示试图运行项目时出错:无法启动调试。绑定句柄无效解决办法

也许是我迟发现了&#xff0c;总之我是刚刚才遇到这个问题的&#xff0c;挺不爽的&#xff0c;从模板新建的项目&#xff0c;未添加一行代码却出现了调试错误。&#xff08;不用调试倒没事&#xff09;有点郁闷。还好&#xff0c;&#xff08;感谢一下发明搜索引擎的人&#xf…

CodeForces 560A,B,C

CodeForces 560A 题意&#xff1a;给定一个货币系统&#xff0c;问不能组成的最小的钱数是多少。 思路&#xff1a;水&#xff0c;只要检查有没有出现1即可&#xff0c;有则输出-1&#xff0c;否则1. code&#xff1a; #include <iostream> #include <cstdio> #in…

WINFORM應用程式的主進入點和清除資源

///<summary>///應用程式的主進入點。 ///</summary>[STAThread] staticvoidMain() { Application.Run(newForm1()); }///<summary>///清除任何使用中的資源。 ///</summary>protectedoverridevoidDis…

CodeForces 558A,B

CodeForces 558A 题意&#xff1a;给定一些苹果树的位置和树上的苹果数&#xff0c;然后一个人站在原点&#xff0c;每次碰到苹果就往相反的方向走&#xff0c;问能得到的最大苹果数。 思路&#xff1a;直接模拟即可。先假设往左走&#xff0c;然后再假设往右走。遍历一遍即可…

生活!

如果未来是可以被看见的&#xff0c;或许就不会有那么多遗憾了。 可惜现实是残酷的。 跌倒了受伤了&#xff0c;无论再怎么痛再怎么难过&#xff0c;只要你还活着还呼吸着&#xff0c;就得拍拍屁股自己爬起来。 所以&#xff0c;生谁的气呢&#xff1f; 向谁祈求原谅呢&…

uva 10559——Blocks

题意&#xff1a;有n个带颜色的方块&#xff0c;同种颜色的方块连成一个区域&#xff0c;每次可以消除一个区域的方块x&#xff0c;然后得到分数x2&#xff0c;右边的方块左移&#xff0c;然后问求最大的分数。 思路&#xff1a;区间dp&#xff0c;dp&#xff08;i&#xff0c;…

uva 12222——Mountain Road

题意&#xff1a;有一个狭窄的山路&#xff0c;两辆车不能同时相向而行&#xff0c;并且同向的车的间隔不能小于10秒&#xff0c;给定一些车的起始时间&#xff0c;求最后一辆车离开的最短时间。 思路&#xff1a;递推&#xff0c;dp&#xff08;i&#xff0c;j&#xff0c;k&a…

取消XP和2000专业版的IIS的用户数量限制

我们知道Windows 2000专业版或Windows XP专业版操作系统中IIS最多允许10个客户端的连接&#xff0c;在Windows 2000服务器版或Windows 2003服务器版操作系统中不存在这种连接限制问题。 将常用的几种办法综合了一下&#xff0c;帖出来方便各位查询&#xff01; 一、MtaEdt22.ex…

uva 10037——Bridge

题意&#xff1a;有一个桥&#xff0c;每次只能两个人拿着手电筒通过然后一个人拿着电筒回来&#xff0c;然后让新人过去&#xff0c;给出每个人的过桥时间&#xff0c;问最后总的最小时间。 思路&#xff1a;贪心。1个人2个人好考虑&#xff0c;排好序&#xff0c;三个人是13&…

Rose与PowerDesigner:两款建模工具对比分析比较

一、 二者的出身 作为世界最著名的两大CASE工具&#xff0c;Rational Rose和PowerDesigner的名声可谓如雷贯耳。Rose是当时全球最大的CASE工具提供商Rational的拳头产品&#xff0c;UML建模语言就是由Rational公司的三位巨头Booch、Rumbaugh和Jacobson发明的&#xff0c;后来R…

uva 11714——Blind Sorting

题意&#xff1a;给定n&#xff0c;在1-n中的范围里何以询问任意两个数的大小&#xff0c;问查找最大和次大至少需要多少次询问。 思路&#xff1a;寻找最大需要n-1次&#xff0c;寻找次大需要不断二分区间&#xff0c;log2&#xff08;n-1&#xff09;的算法。 code&#xff1…

XHTML基础问答

< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> HTML语言是我们建立网页的工具&#xff0c;从它出现发展到现在&#xff0c;规范不断完善&#xff0c;功能越来越强。但是依然有缺陷和不足&#xff0c;人们仍在不断的改进它&#xf…

uva 10602——Editor Nottoobad

题意&#xff1a;给定一些单词&#xff0c;然后让打印这些单词&#xff0c;复制前一个单词和删除当前的最后一个字母没有花费&#xff0c;问最小的打印花费。 思路&#xff1a;贪心。排序后&#xff0c;检查当前和上一个单词有多少一样的&#xff0c;这部分的花费可以为0.也就是…