CTSC2004 2_3 公式编辑器
- 格式:doc
- 大小:136.00 KB
- 文档页数:11
装订线第一节AutoCAD2004基础知识一、 A utoCAD 的界面1、标题栏:显示软件名称和当前打开的文件名2、菜单栏:提供AutoCAD 所有的菜单文件3、工具栏:常用工具栏、实体属性、绘图工具栏和个性工具栏隐藏显示工具栏:视图/工具栏4、绘图区:视窗中有十字光标和用户坐标图标,视窗在下方即图纸空间与模型空间的切换 (1)改变十字光标的长度:工具/选项/显示/十字光标的大小 (2)改变绘图窗口的颜色:工具/选项/显示/窗口元素/“颜色”按钮 ○注:模型空间:是针对绘制与编辑图形空间,是完成设计图形最初的地方 布局空间:是针对图纸布局而言的,是模拟图纸的平面空间,其最终的目的是用于打印出最 后效果图。
5、命令窗口:它由命令行和命令历史窗口共同组成,命令行显示的是用户从键盘上输入的命令信息,而命令历史窗口中含有AutoCAD 启动后的所有信息中的最新信息,F2切换。
(1)命令窗口的大小(2)命令窗口的位置(3)F2可以将命令栏独立成窗口方式显示6、状态栏:它显示当前十字光标的三维从标和AutoCAD 绘图辅助工具的切换按钮二、界面定制1、定制快捷键: 工具/自定义/键盘2、定制工具栏/从菜单向工具栏添加按钮: 工具/自定义/工具栏/命令三、AutoCAD 常规操作装订线1、新建文件: 命令:NEW菜单:文件/新建 快捷键:Ctrl+N2、打开文件:命令:OPEN 菜单:文件/打开 快捷键:Ctrl+O3、保存文件: 命令:SAVE菜单:文件/保存、另存为 快捷键:Ctrl+S四、改变文件输出格式 (文件/输出)1、WMF:格式是AutoCAD 默认格式,在Word 文档中插入,WMF 文件后可以通过双击手稿的图片进行编辑,但利用WMF 格式保存的AutoCAD 图形在Word 中无法打印出图形的线宽。
2、BMP:格式就是将AutoCAD 绘制的图形保存为图片格式,在Word 中插入,BMP 格式AutoCAD图形可以表示出线的宽度,但对于分辨率较高的图形而言就不适合了3、JPEG :文件/打印/打印机配置(publishtoweb.jpeg )注:设置输出纸张选“特性”按钮五、图形属性:可以在不打开图形的条件下了解该图形文件中所包含的有关的信息。
公式编辑器(Equation 3.0)使用简介公式编辑器是Microsoft Office 中的通用工具,利用它可以在Word 、PowerPoint 等字处理软件中输入非常漂亮的数学公式,使我们的文章更符合科技排版的要求。
要说明的是:一般的Microsoft Office 的安装,甚至是“最大安装”也不包括公式编辑器。
它的安装须由用户自定义安装才能完成,它被归类在Microsoft Office 的工具中,详细安装过程就不叙述了。
我们这里主要仅以Office97中的Equation 3.0为例,简要介绍公式编辑器的使用方法。
其它版本的公式编辑器的使用方法大同小异,读者可以类比使用。
一、快速入门(1)公式的插入现以公式2e x y =为例,说明如何在word 中插入公式。
首先,选择“插入”→“对象”,打开“对象”对话框,如图1所示;说明:如何使其中的字母e 变为正体字(而非默认的斜体字)的方法,可参见后面的“应用举例”中的例1的说明部分。
图1然后在“新建”选项卡的“对象类型”中选择“Microsoft Equation 3.0”, 然后按“确定”即可打开公式编辑器,其界面如图2。
图2图2 中大的方框包围的区域是公式编辑器的工作区,是公式对象完成后在文档中占据的区域。
小的虚线框是初始插槽,也就是进行公式输入的地方。
公式编辑器中的光标形状是一条闪烁的竖线和一条闪烁的横线, 光标所在的位置称为插入点。
右边长条状的是公式编辑器的工具栏,我们可以利用它来输入各种符号以及使用各种样板。
现在开始输入,首先输入“y=e”, 这时光标位于“e”的右侧及底部,然后在工具栏上点击第二行的“上标和下标样板”,选择其中的第一种样板,即上标样板,这时在输入区我们可以看到“e”的右上方出现了一个小虚线框,这就是应用上标样板所产生的插槽,在其中输入“x”, 然后再选择一次上标样板,在“x”的右上方又出现一个新的插槽,在其中输入“2”即可。
YX-2004C多功能编程器YX-2004C多功能编程器是我们根据国外资料仿制的一种廉价、功能繁多的普及型编程器。
YX-2004C多功能编程器通过并口与PC连接,支持Win9x、Me、XP、NT以及2000操作系统;英文软件(性能稳定),适合电脑公司、电子爱好者、电子产品维修等工作人员使用。
使用前只需要将“YX-2004C程序”复制到电脑硬盘中即可。
打开文件夹“YX-2004C程序”,双击“EpromM51.exe”一、软件运行窗口如下:二、菜单栏:1、File(文件):下拉菜单中Load打开需要编程的文件。
下拉菜单中Save as‥另存为编程器读入文件作为备用。
下拉菜单中Exit为退出程序。
2、Edit(编辑):编辑数据。
3、Device(选择元件):选择芯片类型。
4、Action(操作):对芯片进行操作,如:读写、编程/RAM测试、比较/校验、空白检查、擦除芯片、获取ID、清空缓存、颠倒数据、交换字节等。
5、Help(帮助):联机测试等。
6、主窗口介绍:三、工具栏:1、打开文件。
把编译好的数据调入编程器中。
可以打开的文件类型为:二进制(*.BIN)、十六进制(*.HEX)等。
2、另存为一个文件。
把正在编辑中的数据另外保存为一个*.bin文件。
3、清除缓存。
4、读取芯片数据。
5、校验数据。
6、空白测试。
检测芯片存储器是否为空。
7、获取芯片ID。
8、芯片编程。
9、擦除(清空)芯片。
四、支持芯片列表EPROM :27C16、27C32、27C64、27C128、27C256、27C512、27C010、27C020、27C040、27C1001 M27C1001、M27C2001、M27C400127C080,M27C801,M87C2572716(Vpp25V)、2732、2764、27128、27256、27512、27010FLASH Memory :28F64、 28F128、 28F256、 28F512、28F010、 28F020MX26C1000、 MX26C2000、 MX28F1000、 MX28F2000Am28F256A、 Am28F512A、 Am28F010A、 Am28F020AIntel:i28F001BX、 28F004、 28F008、 28F016SST28SF040A 、LE28F400129F64、 29F128、 29F256、 29F512、29F010、 29F020、 29F040、 29F08029F001、29F002、 29F004、 29F008、 29F016、 29F032AT29C256、 AT29C512、AT29C010A、 AT29C020、 AT29C040、AT29C040AW29EE512、W29EE011、 W29EE012、 W29C020(128)、W29C040PH29EE010(W29EE011)ASD AE29F1008 (AT29C010)、 AE29F2008 (AT29C020)AT49F512、 AT49F010、 AT49F020、 AT49F040SST39SF010、 SST3S9F020 、SST39SF040AT49F001、AT49F002 、 AT49F008AAm29F512、 Am29F010、 Am29F020、 Am29F040、HY29F08029F002、 29F002T、 Pm29F002TEEPROM :28C65、28C64、 28C128、 28C256、28C512、 28C010、 28C020、 28C040M28C16A/17A (DIP28)28C16、XLS2816 (DIP24)AT28C64B、AT28C256、AT28C512、AT28C010、AT28C020、AT28C040电擦 EPROM :W27E512、 W27E010、 W27C010、 W27C020、 W27C040SST27SF256、 SST27SF512、 SST27SF010、 SST27SF020MX26C4000Vcc = 3.3-3.6V SST37VF512、 SST37VF010、 SST37VF020、 SST37VF040串行(I2C) EEPROM :24C02、24C04、24C08、24C16、 85C72、 85C82、 85C9224C32、24C64、24C128、24C256、24C512 (全部C、LC系列)PCF8572 或8572,PCF8582或8582,PCF8592或8592Microwire EEPROM :8位模式:93C06、 93C46、 93LC46、 93C56、 93C57、93C66、 93C76、 93C86、93C13、93C1416位模式:AT59C11、 AT59C22、 AT59C13CAT35C102、 CAT35C104、 CAT35C10893C06A 、93C46X、93C56、93C66、93C76、93C86 (NS)SPI EEPROM :Atmel:AT25010、020、 040 (A8-A0)AT25080、 160、 320、 640、 128、 256 (A15-A0)ST:W95010....256、 Microchip 25x010 - 25x64025010、25020、2504025C080、25C160、25C320、25C640、25C128、25C256、25C512AT25HP256、AT25HP512AT25HP1024CAT64LCxxx (16位数据I/O)CAT64LC010、 CAT64LC020、 CAT64LC040PIC单片机:17XXX、18XXX系列16C84, 16F84, 16F84A ,16F627/16F62812C508/A, 12C509/A, 12CE518, 12CE519, 16C50516C620 16C621, 16C622, 16CE623, 16CE624, 16CE625, 16C710/71151系列单片机(需要51AVR适配器) :AT89C51、52、55、 AT89LV51、52、55AT89S51、AT89S52、AT89S53、AT89LS51、AT89LS52、AT89SL53AT89S8252 (8K+2K)、AT89LS8252、AT89LS53AT89C1051、AT89C2051、AT89C4051 (20pin)AT89C51RC (32KB)、 AT89C55WD (6.2V)AT89LV52,AT89C55,AT89LV55 AT89S8252,AT89LS8252,AT89S53,AT89LS53 AT87F51,AT87F52 i87C51、 i87C51FA、 i87C51FBi8xC51、i8xC52、i8xC54、i8xC58i87C51,i87C51FA,i87C51FB,i87C51FC,i87C52,i87C54,i87C58 AT89C51RC (32KB), AT89C55WD等AT90S1200、AT90S231390S2333、 90S4433、 90S4414、 90S8515、 90S4434、 90S8535,AT90S2313四、举例操作说明使用编程器对W27C020进行读、擦除和写1、打开文件夹“YX-2004C程序”,双击“EpromM51.exe”操作软件运行窗口如下:2、用鼠标点击“Device”,在下拉菜单中点击“EPROM Electrical Erase”,再在下拉菜单中点击“Winboad 27E/27C”,最后在下拉菜单中点击“W27x020 (Vpe=14V)”。
autocad2004中文版应用实例与技巧Autocad 2004是一款经典的CAD软件,下面是一些使用Autocad 2004中文版的应用实例和技巧:1. 绘制平面图:使用Autocad 2004可以方便地绘制各种平面图,如建筑平面图、机械零件图等。
可以使用线段、多边形、圆弧等基本绘图命令进行绘制,并通过修改对象属性来调整图形的大小和位置。
2. 创建3D模型:Autocad 2004支持创建三维模型,并提供了丰富的三维建模工具。
可以使用盒子、圆柱体、球体等基本几何体创建简单的三维模型,也可以通过拉伸、旋转、倾斜等命令对二维图形进行三维化处理。
3. 应用图层管理:Autocad 2004中的图层功能非常强大,可以将不同的图形元素分别放置在不同的图层上,并通过控制图层的显示和隐藏来方便地管理和编辑图形。
可以使用图层管理器来创建、删除、重命名图层,并设置图层的属性。
4. 使用块和外部引用:块是Autocad中的一种特殊对象,可以将一组图形元素组合成一个整体,并多次重复使用。
在Autocad 2004中,可以创建块并保存到块库中,然后在绘图过程中多次插入使用。
外部引用是指将其他Autocad文件中的图形元素链接到当前绘图中,使得可以实时更新外部文件的内容。
5. 使用命令别名和快捷键:Autocad 2004支持自定义命令别名和快捷键,可以大大提高工作效率。
通过设置命令别名,可以将常用的命令缩短为简单的几个字符,而快捷键则可以直接通过键盘按键触发命令,避免频繁点击菜单或输入命令名称。
6. 利用自动捕捉和对象追踪:Autocad 2004中的自动捕捉和对象追踪功能可以帮助用户更精确地绘制和编辑图形。
自动捕捉可以吸附到特定的点、线、圆等几何元素上,方便进行精确定位;对象追踪可以根据已有的图形元素来绘制新的图形,例如在两个线段的交点处绘制一个圆心。
以上是一些使用Autocad 2004中文版的应用实例和技巧,希望对您有所帮助!。
CTSC2004零件装配解题报告河北唐山一中鬲融题目大意要加工n个产品,每个零件有m个部分组成。
每一部分都有n种零件,每种只有一个。
每个零件都需要一定的加工时间。
现在要安排这n个产品的生产,要求最慢的产品尽量快的完成。
解法分析这个题显然是背包问题的扩展,因而是NP完全的,而规模又很大,因此我们可以采用随机化的手段来处理。
完全随机生成的一个解肯定会很差,这是因为其中包含了许多“不合理”的因素。
我们就来考虑这些不合理因素,把它们消除,从而得到一个比较“合理”的解。
首先一个不合理因素就是:产品i的第k个零件需要的时间比产品j的长,同时产品i的总时间也比产品j的长,这时我们交换产品i和j的第k个零件就可能可以得到一个较优的解。
这是一个很有效的调整,但是我们还要考虑到调整的代价。
这样的调整每次只交换两个元素,影响的范围较小,因此就需要进行很多次。
所以我们可以进行一下扩展,每次考虑一个部分。
一个部分的零件怎样分配才是最合理呢?答案是很显然的。
首先先不考虑这部分的零件,把产品按时间长短排序。
然后再把零件按时间长短排序。
把用时长的零件放到总时间短的产品中。
这样这一行就处理完了。
当然处理了其他行以后这一部分还可能需要再次调整,我们可以规定一个调整次数的上限,每次随机的找到一部分进行调整,直到调整的次数达到上界为止。
经过实验,调整的次数是部分数的10倍就足够了。
复杂度分析和测试显然每次调整的复杂度是O(nlogn)的,如果调整次数取10m的话,总的复杂度就是O(nmlogn)的。
对所有数据都能较快的求出一组解。
由于这个算法去掉了解中的不合理因素,所以实际运行效果还是很好的,下1的解,效果是很好的。
这题的数据没有太多的特点,只有第3个数据包含两个产品,因此可以使用动态规划求出最优解。
最突出的特点就是所有数据的最优解都是理论下界。
由于使用了随机化的因素,这个算法重复运行后可以提高解的质量。
随机运1当然这个分数应该是不稳定的,这里指的是概率较大的分数这样只有4,5,7三个测试点没有达到最优解,而且这三个数据的解也已经和最优很接近了,所以这个方法还是比较优秀的。
数学公式编辑器的安装与使用授课教师:向东长建议各位老师就使用office自带的数学公式编辑器。
一、数学公式编辑器的安装:第一步:打开WORD或者PPT第二步:若尚未安装公式编辑器,则点击右上角的工具栏选项,打开并移至添加或删除按钮点击自定义,出现:第三步:在类别中点击插入,再在命令栏中下拉出现公式编辑器,按住公式编辑器不放并拖至WORD的主页面的工具栏即可,如图一。
二、如何使用数学公式编辑器1、双击公式编辑器,在鼠标位置出现数学公式编辑器的数学公式编辑框,可进行数学公式的编辑,如编辑椭圆的标准方程:12222=+by a x 如下图,编辑前的样式:编辑中的样式:2、公式的使用,图形很直观,要哪个公式就点相关公式即。
例如要编辑一个方程组⎩⎨⎧=+-=-+02032y x y x ,第一步打开公式编辑器,第二步点围栏模板中的大括号,第三步矩阵模板中的两行模式,进行编辑即可。
如何将数学教学案和课件上传至自己的空间因为数学教学案和课件大多带有一些公式,无法直接上传至个人空间或学校网站,因此需对WORD或PPT格式转换为Flash格式,这里介绍打印文档转换Swf PDF《Macromedia FlashPaper 2.2绿色版》的使用方法。
第一步,软件安装1、解压《Swf PDF Macromedia FlashPaper 2.2》至相关目录.2、打开FlashPaper 2.2目录,并进入到FlashPaper 2.2\初始化目录,⑴.双击“Get Flash Player”,安装Flash Player 8(已安装有相关版本的此步可省);⑵.双击“初始化.bat”,OK。
第二步,格式转换1、打开需上传的WORD或PPT文件,点击左上角的文件,按打印,选择打印机名称为Macromedia FlashPaaer,如下图:2、点击确定,出现下图3、转换成功后如下图3、保存为Flash或PDF文档。
第三步,文档上传进入新晃一中网校管理系统的文章管理之内容管理中进行内容编辑,插入Flash文件即可。
“AutoCAD 2004快捷键”经典收藏AutoCAD 2000快捷命令的使用AutoCAD 是目前世界各国工程设计人员的首选设计软件,简便易学、精确无误是AutoCAD成功的两个重要原因。
AutoCAD提供的命令有很多,绘图时最常用的命令只有其中的百分之二十。
采用键盘输入命令时由于有些常用命令较长,如BHATCH(填充) EXPLODE(分解),在输入时击键次数多,影响了绘图速度。
虽然AutoCA D提供了完善的菜单和工具栏两种输入方法,但是要提高绘图速度,只有掌握AutoCAD 提供的快捷的命令输入方法。
笔者在进行AutoCAD设计、培训和教学研究时,对于快捷命令的使用和管理积累了一些体验,现总结出,以供大家使用AutoCAD 2000时参考。
一、概述:所谓的快捷命令,是AutoCAD为了提高绘图速度定义的快捷方式,它用一个或几个简单的字母来代替常用的命令,使我们不用去记忆众多的长长的命令,也不必为了执行一个命令,在菜单和工具栏上寻寻匿匿。
所有定义的快捷命令都保存在AutoCAD安装目录下SUPPORT子目录中的ACAD.PGP文件中,我们可以通过修改该文件的内容来定义自己常用的快捷命令。
当我们每次新建或打开一个AutoCAD绘图文件时,CAD本身会自动搜索到安装目录下的SUPPORT路径,找到并读入ACAD.PGP文件。
当AutoCAD正在运行的时候,我们可以通过命令行的方式,用ACAD.PGP 文件里定义的快捷命令来完成一个操作,比如我们要画一条直线,只需要在命令行里输入字母“L”即可。
二、快捷命令的命名规律1、快捷命令通常是该命令英文单词的第一个或前面两个字母,有的是前三个字母。
比如,直线(Line)的快捷命令是“L”;复制(COpy)的快捷命令是“CO”;线型比例(LTScale)的快捷命令是“LTS”。
在使用过程中,试着用命令的第一个字母,不行就用前两个字母,最多用前三个字母,也就是说,AutoCAD的快捷命令一般不会超过三个字母,如果一个命令用前三个字母都不行的话,只能输入完整的命令。
任意函数发生器AFG2021-SC产品技术资料利用 AFG2021-SC 任意函数发生器,您可以入门级价格创建所需的信号。
凭借 20 MHz 带宽、14 位分辨率和 250 MS/s 采样率,可以生成所有形式的信号 -- 从复杂的串行数据流到简单的音频或时钟信号,再到车祸期间安全气囊传感器的输出,均可生成。
利用 9 种标准波形、调幅功能以及内置噪声发生器,可以快速创建完全满足设计所需的信号。
主要性能指标20 MHz 正弦波和 10 MHz 脉冲波形涵盖最常见的应用通过 250 MS/s 的采样率和 14 位垂直分辨率,可以创建高保真信号主要特点创新性 UI 通过直接访问最常用功能和参数缩短设置和评估时间内部 4 × 16 kS 内存和 USB 内存扩展功能提供用于定义复杂波形的大量容量前面板上的 USB 主机端口用于保存/重新加载任意波形和仪器设置内置调幅、噪声发生器、突发和扫频模式,通用性更广内置波形提供对常用信号的快速访问大型 3.5 英寸彩色屏幕同时显示图形和数字波形信息简体中文和英语形式的菜单和联机帮助2U 高度和半宽机架适合台式应用利用免费的 ArbExpress 软件,可以极其轻松地编辑波形应用电子测试和设计传感器仿真教育和培训功能测试出色的性价比大多数电子设备、电路和系统都设计为处理某种形式的信号。
这些信号可以如同音频或时钟信号一样简单,也可以如同串行数据流或车祸期间的安全气囊传感器输出一样更加复杂。
凭借 20 MHz 带宽、14 位分辨率和 250 MS/s 采样率,AFG2021-SC 任意函数发生器可以入门级价格创建简单和复杂的信号。
利用 9 种标准波形、25 种内置应用波形、调幅功能以及内置噪声发生器,可以快速创建完全满足设计所需的信号。
直观的用户界面最先见诸于 AFG3000 系列任意函数发生器的创新性易用功能部件是 AFG2021-SC 构建块,提供对设置和运行功能的快速访问。
公式编辑器解题报告湖南省长沙市长郡中学胡伟栋问题简述:给出键盘的一些操作,要求编一个程序模拟公式编辑器处理这些操作。
公式编辑器支持以下操作:输入字符、插入分式、插入矩阵、插入一行或一列到矩阵中、光标上下左右移动、光标移到编辑框首、光标移到编辑框尾。
分析:此题是一道很复杂的模拟题。
此题难点在于其对象的类型比较多:有字符、矩阵和分式,同时操作比较多:有光标的上下左右移动、Home、End,矩阵的增加行、列等。
且输出也比较麻烦。
解决此题主要是保持头脑清醒(这一点对做任何模拟题都非常重要)和选择好的数据结构。
这里,整个表达式很像一棵树的样子:如果一个表达式不是整个表达式,则它必有一个直接的包含它的表达式,这就是它的父表达式;每个表达式都可能有0个或多个子表达式且子表达式之间没有直接关系。
可以用树结构来处理整个表达式。
此题是一个模拟题,不要用到多少算法,只要按照原题所说的一步一步做即可。
具体做法可见参考程序。
参考程序:programMaths;{$Mode Delphi}// 引用Delphi模式constinf = 'maths.in'; // 输入文件ouf = 'maths.out'; // 输出文件maxChars = 100000; // 输出的非空字符最大数typeeleStyle = (eleChar, eleExp, eleMatrix, eleFraction); // 表达式的类型placeType = (pl_None, pl_Home, pl_End); // 不移动/移到编缉框开始位置/移到编缉框结束位置consths : array[eleChar..eleFraction] of integer = (0, 1, 1, 2); // 不同表达式的初始行数ws : array[eleChar..eleFraction] of integer = (0, 0, 1, 1); // 不同表达式的初始列数moveSetPlace : array[-1..1] of placeType = (pl_End, pl_None, pl_Home); // 向左(-1)/右(1)移动到子编辑框的位置ifEnd : array[-1..1] of integer = (1, 0, 0); // 向左(-1)/右(1)移动是否会到子编辑框的结束位置canMin : array[eleChar..eleFraction] of integer = (0, 0, 1, 1); // 编辑框的光标能向左移的最小位置typecanvasType = object// 所有非空字符输出队列l : integer; // 字符数pos : array[-1..maxChars, 1..2] of integer; // 输出位置chars : array[0..maxChars] of char; // 输出字符,#0表示分数线procedure PrintChar(y, x : integer; ch : char); // 在第y行第x列输出一个字符chprocedure sort(_From, _To : integer); // 将字符按行列位置排序procedure Save(fileName : string); // 输出到文件end;eleType = class// 表达式的基类fParent : eleType; // 父达式fStyle : eleStyle; // 表达式类型h, w : integer; // h为行数,w为列数pos : array[1..2] of integer; // 若当前编辑焦点在这个表达式的子表达式中,则指向对应子表达式的位置Width, Height, UpHeight, DownHeight : integer; // 输出宽度,高度,对齐行上方的高度,对齐行下方的高度constructor create(parent : eleType; style : eleStyle); // 构造类并初始化function getS(y, x : integer) : eleType; // 取得y行x列的子表达式procedure setS(y, x : integer; Value : eleType); // 设置y行x列的子表达式procedure setFocus(place : placeType); // 设置编辑焦点procedure moveHome; // 光标移动到行首(虽然只可能在expType子类中调用此过程,但为了便于调用,将它放在基类中)procedure moveEnd; // 光标移动到行尾(虽然只可能在expType子类中调用此过程,但为了便于调用,将它放在基类中)procedure moveUpOrDown(incs : integer); // 光标上移(incs=-1)或下移(incs=1)一行procedure moveLeftOrRight(incs : integer); // 光标左移(incs=-1)或右移(incs=1)一行procedure AddCol; // 添加一列procedure AddRow; // 添加一行procedure AddOne(ele: eleType); // 将一个表达式添加到光标位置(虽然只可能在expType子类中调用此过程,但为了便于调用,将它放在基类中)procedure getPrintMessage; // 得到输出的信息(应输出行数、列数等)procedure Print(HCenter, Left : integer); // 将表达式输出到输出队列中property s[y, x : integer] : eleType read getS write setS; // 子表达式。
这是一个属性,取值时相当于调用getS(y,x);给它赋值时相当于调用setS(y,x,value),其中value为所赋的值end;charType = class(eleType) // 字符子类Dat : char; // 所存储的运算数或运算符end;expType = class(eleType) // 编辑框子类fs : array[1..1, 1..500] of eleType; // 编辑框内的子表达式end;matrixType = class(eleType) // 矩阵子类fs : array[1..10, 1..10] of eleType; // 矩阵中的子表达式Heights, UpHeights, DownHeights, Widths : array[1..10] of integer; // 输出时每行对应的高度、对齐行上方的高度、对齐行下方的高度及每列对应的最大宽度end;fractionType = class(eleType) // 分式子类fs : array[1..2, 1..1] of eleType; // 分式中的子表达式end;varroot, // 整个表达式action : eleType; // 当前的焦点表达式screen : canvasType; // 输出队列function max(a, b : integer) : integer; // 求a,b的最大值beginif a > b then max := a else max := b;end;procedure canvasType.PrintChar(y, x : integer; ch : char);beginif ch = '-'then inc(x) elseif ch = #0then ch := '-';inc(l);pos[l, 1] := y; pos[l, 2] := x;chars[l] := ch;end;procedure canvasType.sort(_From, _To : integer);vari, j : integer;begini := _From; j := _To; pos[-1] := pos[(i + j) shr1];while i <= j dobeginwhile (pos[i, 1] < pos[-1, 1]) or (pos[i, 1] = pos[-1, 1]) and (pos[i, 2] < pos[-1, 2]) do inc(i);while (pos[j, 1] > pos[-1, 1]) or (pos[j, 1] = pos[-1, 1]) and (pos[j, 2] > pos[-1, 2]) do dec(j);if i <= j thenbeginpos[0] := pos[i]; pos[i] := pos[j]; pos[j] := pos[0];chars[0] := chars[i]; chars[i] := chars[j]; chars[j] := chars[0];inc(i); dec(j);end;end;if j > _From then sort(_From, j);if i < _To then sort(i, _To);end;procedure canvasType.Save(fileName : string);varcur : array[1..2] of integer;i, j : integer;beginsort(1, l);assign(output, fileName); rewrite(output);cur[1] := 1; cur[2] := 1;for i := 1to l dobeginif cur[1] <> pos[i, 1] then cur[2] := 1;for j := cur[1] + 1to pos[i, 1] dowriteln;write(chars[i] : pos[i, 2] - cur[2] + 1);cur[1] := pos[i, 1];cur[2] := pos[i, 2] + 1;end;writeln;close(output);end;constructor eleType.create(parent : eleType; style : eleStyle);vari : integer;fParent := parent;fStyle := style;h := hs[style];w := ws[style];pos[1] := 1;pos[2] := 1;if (fStyle = eleMatrix) or (fStyle = eleFraction) then// 如果是矩阵或分式,则一开始就应该有1或2个子编辑框for i := 1to h dos[i, 1] := expType.create(self, eleExp);end;function eleType.getS(y, x : integer) : eleType;begincase fStyle of// 对不同的子类得到第y行第x列的子表达式eleExp : getS := expType(self).fs[y, x];eleMatrix : getS := matrixType(self).fs[y, x];eleFraction : getS := fractionType(self).fs[y, x];else getS := nil;end;end;procedure eleType.setS(y, x : integer; value : eleType);begincase fStyle of// 对不同的子类设置第y行第x列的子表达式eleExp : expType(self).fs[y, x] := value;eleMatrix : matrixType(self).fs[y, x] := value;eleFraction : fractionType(self).fs[y, x] := value;end;end;procedure eleType.setFocus(place : placeType);beginaction := self;case place of// 设置焦点时可顺便确定光标位置pl_Home : moveHome;pl_End : moveEnd;end;end;procedure eleType.moveHome;beginpos[2] := 0;procedure eleType.moveEnd;beginpos[2] := w;end;procedure eleType.moveUpOrDown(incs : integer);beginif (pos[1] + incs >= 1) and (pos[1] + incs <= h) then// 当前表达式可以上/下移动则移动begininc(pos[1], incs);s[pos[1], pos[2]].setFocus(pl_Home);endelse// 当前表达式不可上/下移动则由上一级表达式移动if fParent <> nil thenfParent.moveUpOrDown(incs);end;procedure eleType.moveLeftOrRight(incs : integer);procedure parentMove; // 使用上一级表达式移动beginif fParent <> nil thenbeginif fParent.fStyle = eleExp thenbeginif incs = -1then dec(fParent.pos[2]);incs := 0;end;fParent.moveLeftOrRight(incs);end;end;varp : integer;beginif incs = 0then setFocus(pl_None) elseif (pos[2] + incs < canMin[fStyle]) or (pos[2] + incs > w) then parentMove else// 如果当前表达式不能移动,则使用上一级表达式移动case fStyle ofeleExp :beginp := max(pos[2], pos[2] + incs);case s[pos[1], p].fStyle of// 如果子表达式是矩阵或分式,则将光标移到子表达式中,否则直接改变光标位置eleMatrix, eleFraction :beginpos[2] := p;with s[pos[1], p] dobeginpos[1] := (h + 1) shr1;pos[2] := (1 + ifEnd[incs] * (w - 1));s[pos[1], pos[2]].setFocus(moveSetPlace[incs]);end;end;else inc(pos[2], incs);end;end;eleMatrix :begininc(pos[2], incs);s[pos[1], pos[2]].setFocus(moveSetPlace[incs]);end;else parentMove; // 分式要使用上一级表达式移动end;end;procedure eleType.AddRow;vari, j : integer;beginif fStyle = eleMatrix then// 如果当前是一个矩阵,则添加一行,否则看上一级表达式能否添加行beginfor i := h downto pos[1] dofor j := 1to w dos[i + 1, j] := s[i, j];inc(h);for j := 1to w dos[pos[1], j] := expType.create(self, eleExp);s[pos[1], pos[2]].setFocus(pl_Home);endelseif fParent <> nil then fParent.AddRow;end;procedure eleType.AddCol;vari, j : integer;beginif fStyle = eleMatrix then// 如果当前是一个矩阵,则添加一列,否则看上一级表达式能否添加列beginfor j := w downto pos[2] dofor i := 1to h dos[i, j + 1] := s[i, j];inc(w);for i := 1to h dos[i, pos[2]] := expType.create(self, eleExp);s[pos[1], pos[2]].setFocus(pl_Home);endelseif fParent <> nil then fParent.AddCol;end;procedure eleType.AddOne(ele : eleType);vari : integer;beginfor i := w downto pos[2] + 1dos[1, i + 1] := s[1, i];inc(w);s[1, pos[2] + 1] := ele;moveLeftOrRight(1);end;procedure eleType.getPrintMessage;vari, j : integer;beginWidth := 0; UpHeight := 0; DownHeight := 0;case fStyle ofeleChar :beginUpHeight := 0; DownHeight := 0;if charType(self).Dat = '-'then Width := 3else Width := 1;end;eleExp :for i := 1to w dobegins[1, i].getPrintMessage;inc(Width, s[1, i].Width);UpHeight := max(UpHeight, s[1, i].UpHeight);DownHeight := max(DownHeight, s[1, i].DownHeight);end;eleMatrix :with matrixType(self) dobeginfillchar(UpHeights, sizeof(UpHeights), 0);fillchar(DownHeights, sizeof(DownHeights), 0);fillchar(Widths, sizeof(Widths), 0);for i := 1to h dobeginfor j := 1to w dobegins[i, j].getPrintMessage;UpHeights[i] := max(UpHeights[i], s[i, j].UpHeight);DownHeights[i] := max(DownHeights[i], s[i, j].DownHeight);Widths[j] := max(Widths[j], s[i, j].Width);end;Heights[i] := UpHeights[i] + DownHeights[i] + 1;end;for i := 1to w doinc(Width, Widths[i] + 1);inc(Width);for i := 1to h shr1doinc(UpHeight, Heights[i] + 1);dec(UpHeight);if odd(h) theninc(UpHeight, 1 + UpHeights[h shr1 + 1]);for i := h downto h - h shr1 + 1doinc(DownHeight, Heights[i] + 1);dec(DownHeight);if odd(h) theninc(DownHeight, 1 + DownHeights[h shr1 + 1]);end;eleFraction :begins[1, 1].getPrintMessage;s[2, 1].getPrintMessage;UpHeight := s[1, 1].Height;DownHeight := s[2, 1].Height;Width := max(s[1, 1].Width, s[2, 1].Width) + 2;end;end;Height := UpHeight + DownHeight + 1;end;procedure eleType.Print(HCenter, Left : integer);varTop, L, i, j : integer;begincase fStyle ofeleChar : Screen.PrintChar(HCenter, Left, charType(self).Dat);eleExp :for i := 1to w dobegins[1, i].Print(HCenter, Left);inc(Left, s[1, i].Width);end;eleMatrix :with matrixType(self) dobeginTop := HCenter - UpHeight;for i := 1to h dobeginHCenter := Top + UpHeights[i];L := Left + 1;Screen.PrintChar(HCenter, Left, '[');for j := 1to w dobegins[i, j].Print(HCenter, L + (Widths[j] - s[i, j].Width) shr1);inc(L, Widths[j] + 1);end;Screen.PrintChar(HCenter, L - 1, ']');Top := Top + Heights[i] + 1;end;end;eleFraction :beginfor i := 1to width doScreen.PrintChar(HCenter, Left + i - 1, #0);s[1, 1].Print(HCenter- s[1, 1].DownHeight- 1, Left+ (Width- s[1, 1].Width) shr1);s[2, 1].Print(HCenter + s[2, 1].UpHeight + 1, Left + (Width - s[2, 1].Width) shr1);end;end;end;CTSC 2004 解题报告公式编辑器湖南省长沙市长郡中学胡伟栋procedure process; // 输入且处理varst : shortstring;tmp : eleType;beginassign(input, inf); reset(input);while not seekeof dobeginreadln(st);if st = 'Up'then action.moveUpOrDown(-1) elseif st = 'Down'then action.moveUpOrDown(1) elseif st = 'Left'then action.moveLeftOrRight(-1) elseif st = 'Right'then action.moveLeftOrRight(1) elseif st = 'Home'then action.moveHome elseif st = 'End'then action.moveEnd elseif st = 'AddRow'then action.addRow elseif st = 'AddCol'then action.addCol elsebeginif st = 'Matrix'then tmp := matrixType.create(action, eleMatrix) elseif st = 'Fraction'then tmp := fractionType.create(action, eleFraction) elsebegintmp := charType.create(action, eleChar);charType(tmp).Dat := st[1];end;action.AddOne(tmp);end;end;close(input);end;procedure print; // 输出beginroot.getPrintMessage;root.Print(root.UpHeight + 1, 1);Screen.Save(Ouf);end;beginroot := expType.create(nil, eleExp);root.setFocus(pl_Home);process;print;end.第11页。