编写一个小程序调用全局函数,让使同一个函数调用两次时,每次的自变量空间都不同

如果一个函数经常被调用,而里面有1个临时局部变量,是否最好采用全局变量?_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
如果一个函数经常被调用,而里面有1个临时局部变量,是否最好采用全局变量?
否则,每次调用都需要为这个临时变量分配一次内存,用一个全局变量就可以避免这个问题,是这样子么
我有更好的答案
函数内定义的变量、代码块中的等都是局部变量。你又发现名字冲突了…如此痛苦。也许你读不懂上面的,有些编程经验后就可以明白的。
上面说的不好; 对程序员来说: 0,减少名字冲突。完全集中注意力再解决另一个问题,如果要移,你得把它依赖的全局变量也给移过去,难道你使用fun3前,还要初始化它所使用全局变量?再想,那你得弄多少全局变量? 最后,肯定编译都过不了首先。 对于用户来说。全局变量使读程序者难以跟踪程序状态,c++,根据记忆的七正负二原理,java,c#等)中,函数形式参数. 不知道你说的是什么编程语言中的,要知道,在c家族语言(c;想到”问题了之后,要去证明这个问题真的存在,但是这些全局变量原来又被别的函数依赖着、内存分配释放过程带来的效率问题,如果你在担心内存分配的花销,是可读性,可修改性等。简单说下。而且,一个全局变量无法表达不同的概念,这就更增加了阅读程序的难读性,至少先得看到这个问题的现象吧。大多数程序,最重要的不是它的执行速度,你无法把这种某个函数从一个文件移到另一个文件中。 2.如果函数依赖于全局变量,那么这种函数其实是不能被复用的。举个例子,局部就是名字空间。 1,人不善于记忆多个东西,而局部变量让你在一个地方用它。 1.程序不好甚至无法理解,是它的正确性。 用户要的是对他有用的软件,不是要你为他省几KB计算机内存 ,那你得把这些函数都移过去,移过去后,用全局变量的问题: 0,在另一个地方去不必记起和在意它,局部变量有很多好处,这对人的记忆是一个挑战。相对的,那么其实是在考虑一个事实上不存在的问题…因为内存分配带来的空间和时间花费是微忽其微的,并且以现在的计算机硬件。你&quot,局部变量的内存不只会分配,还会释放的。用全局变量确实可以避免多次局部变量内存分配。但是,主要有
采纳率:67%
为您推荐:
其他类似问题
全局变量的相关知识
换一换
回答问题,赢新手礼包 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
C++函数详解与应用实例
下载积分:466
内容提示:C++函数详解与应用实例
文档格式:PPT|
浏览次数:17|
上传日期: 13:49:26|
文档星级:
全文阅读已结束,如果下载本文需要使用
 466 积分
下载此文档
该用户还上传了这些文档
C++函数详解与应用实例
关注微信公众号 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
Matlab编写与调用函数
下载积分:400
内容提示:Matlab编写与调用函数
文档格式:PDF|
浏览次数:937|
上传日期: 20:02:46|
文档星级:
全文阅读已结束,如果下载本文需要使用
 400 积分
下载此文档
该用户还上传了这些文档
Matlab编写与调用函数
关注微信公众号为了明显起见先举一个最简单的pascal程序例子【例1】_甜梦文库
为了明显起见先举一个最简单的pascal程序例子【例1】
洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& 第一课 初识 Pascal 语言信息学奥林匹克竞赛是一项益智性的竞赛活动, 核心是考查选手的智力和使 用计算机解题的能力。选手首先应针对竞赛中题目的要求构建数学模型,进而构 造出计算机可以接受的算法,之后要写出高级语言程序,上机调试通过。程序设 计是信息学奥林匹克竞赛的基本功, 在青少年朋友参与竞赛活动的第一步必须掌 握一门高级语言及其程序设计方法。 一、Pascal 语言概述 PASCAL 语言也是一种算法语言,它是瑞士苏黎世联邦工业大学的 N.沃思 (Niklaus Wirth)教授于 1968 年设计完成的, 1971 年正式发表。 1975 年, PASCAL 对 语言进行了修改,作为&标准 PASCAL 语言&。 PASCAL 语言是在 ALGOL 60 的基础上发展而成的。它是一种结构化的程序设 计语言,可以用来编写应用程序。它又是一种系统程序设计语言,可以用来编写 顺序型的系统软件(如编译程序)。它的功能强、编译程序简单,是 70 年代影 响最大一种算法语言。 二、Pascal 语言的特点 从使用者的角度来看,PASCAL 语言有以下几个主要的特点: ⒈它是结构化的语言。PASCAL 语言提供了直接实现三种基本结构的语句以 及定义&过程&和&函数&(子程序)的功能。可以方便地书写出结构化程序。在编写 程序时可以完全不使用 GOTO 语句和标号。 这就易于保证程序的正确性和易读性。 PASCAL 语言强调的是可靠性、易于验证性、概念的清晰性和实现的简化。在结 构化这一点上,比其它(如 BASIC,FORTRAN77)更好一些。 ⒉有丰富的数据类型。PASCAL 提供了整数、实型、字符型、布尔型、枚举 型、子界型以及由以上类型数据构成的数组类型、集合类型、记录类型和文件类 型。 此外, 还提供了其它许多语言中所没有的指针类型。 沃思有一个著名的公式: &算法+数据结构=程序&。指出了在程序设计中研究数据的重要性。丰富的数据 结构和上述的结构化性质,使得 PASCAL 可以被方便地用来描述复杂的算法,得 到质量较高的程序。 ⒊能适用于数值运算和非数值运算领域。 有些语言 (如 FORTRAN 66,ALGOL 60) 只适用于数值计算,有些语言(如 COBOL )则适用于商业数据处理和管理领域。 PASCAL 的功能较强,能广泛应用于各种领域。PASCAL 语言还可以用于辅助设计, 实现计算机绘图功能。 ⒋PASCAL 程序的书写格式比较自由。不象 FORTRAN 和 COBOL 那样对程序的 书写格式有严格的规定。PASCAL 允许一行写多个语句,一个语句可以分写在多 行上,这样就可以使 PASCAL 程序写得象诗歌格式一样优美,便于阅读。1 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& 由于以上特点, 许多学校选 PASCAL 作为程序设计课程中的一种主要的语言。 它能给学生严格而良好的程序设计的基本训练。培养学生结构化程序设计的风 格。但它也有一些不足之处,如它的文件处理功能较差等。 三、Pascal 语言程 序的基本结构 任何程序设计语言都有着一组自己的记号和规则。PASCAL 语言同样必须采 用其本身所规定的记号和规则来编写程序。尽管不同版本的 PASCAL 语言所采用 的记号的数量、形式不尽相同,但其基本成分一般都符合标准 PASCAL 的规定, 只是某些扩展功能各不相同罢了。下面我们首先来了解 Pascal 语言的程序基本 结构。 为了明显起见先举一个最简单的 PASCAL 程序例子: 【例1】从这个简单的程序可以看到: ⒈一个 PASCAL 程序分为两个部分:程序首部和程序体(或称分程序)。 ⒉程序首部是程序的开头部分,它包括: ?程序标志。用&program&来标识&这是一个 PASCAL 程序&。PASCAL 规定任 何一个 PASCAL 程序的首部都必须以此字开头。在 turbo pascal 语言中,首部也 可省略。 ?程序名称。由程序设计者自己定义,如例中的 exam1。 在写完程序首部之后,应有一个分号。 ⒊程序体是程序的主体,在有的书本里也称&分程序&。程序体包括说明部分 (也可省略)和执行部分两个部分。 ?说明部分用来描述程序中用到的变量、常量、类型、过程与函数等。本程 序中第二行是&变量说明&,用来定义变量的名称、类型。 PASCAL 规定,凡程序中用到所有变量、符号常量、数组、标号、过程与函 数、记录、文件等数据都必须在说明部分进行定义(或称&说明&)。也就是说, 不允许使用未说明先使用。 ?执行部分的作用是通知计算机执行指定的操作。 如果一个程序中不写执行 部分,在程序运行时计算机什么工作也不做。因此,执行部分是一个 PASCAL 程 序的核心部分。 执行部分以&begin&开始,以&end&结束,其间有若干个语句,语句之间以分2 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& 号隔开。 执行部分之后有一个句点,表示整个程序结束。 ⒋PASCAL 程序的书写方法比较灵活。当然,书写不应以节省篇幅为目的, 而应以程序结构清晰、 易读为目的。 在编写程序时尽量模仿本书中例题程序格式。 ⒌在程序中,一对大括号间的文字称为注释。注释的内容由人们根据需要书 写,可以用英语或汉语表示。注释可以放在任何空格可以出现的位置。执行程序 时计算机对注释不予理睬。 四、Turbo Pascal 语言系统的使用 目前,常用的 Pascal 语言系统有 Turbo Pascal7.0 与 Borland Pascal 7.0, 下面我们就来学习 Turbo Pascal 7.0 系统的使用。 1. 系统的启动 在运行系统目录下的启动程序 TURBO.EXE,即可启动系统。屏幕上出现如图 1 所示的集成环境。 2. Turbo Pascal 系统集成环境简介 最顶上一行为主菜单。中间蓝色框内为编辑窗口,在它个编辑窗口内可以进 行程序的编辑。最底下一行为提示行,显示出系统中常用命令的快捷键,如将当 前编辑窗口中文件存盘的命令快捷键为 F2,获得系统帮助的快捷键为 F1,等等。3. 新建程序窗口3 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& 按 F10 进行主菜单,选择 FILE 菜单,执行其中 New 命令。就可建立一个新 的程序窗口(默认文件名为 Noname00.pas 或 Noname01.pas 等)。 4. 程序的输入、编辑与运行 在当前程序窗口中,一行一行的输入程序。事实上,程序窗口是一个全屏幕 编辑器。所以对程序的编辑与其它编辑器的编辑方法类似,这里不再重复。 当程序输入完毕之后,一般要先按 Alt+F9(或执行 compile 菜单中 compile 命令)对程序进行编译。如果程序有语法错误,则会在程序窗口的第一行处显示 第一个红色错误信息。若无语法错误,则窗口正中央会出现一个对话框,提示编 译成功。接下来,我们可以运行程序了。 程序的运行可以通过按 ALT+R 打开 RUN 菜单中的 RUN 命令,或直接按快捷键 CTRL+F9。则可以在用户窗口中输出运行结果。通常在程序运行结束后系统回到 Pascal 系统的集成环境,因此要查看运行结果,要按 ALT+F5 将屏幕切换到用户 屏幕。 5.程序的保存与打开 当我们想把程序窗口中的程序存入磁盘时,可以通过按 F2 键(或执行 File 菜单中的 save 命令)来保存程序。 第一次保存文件时屏幕上会出现一个对话框要 求输入文件名(默认扩展名为.pas)。 当我们要将磁盘上的程序文件中的 PASCAL 程序装入窗口时,可按 F3(或执 行 File 菜单中的 Open 命令)来装入程序,此时系统也会弹出一个对话框要求输 入要打开的文件名,或直接在文件对话框列表中选择所要的文件,然后回到打开 文件。 五、第一个程序 下面程序在运行时,会提示输入一个圆的半径,然后会在屏幕上画一个圆。 按回车后程序结束回到程序窗口。 Program ex1; U Var Gm,Gd,R : Begin Gd:=0; Write('Please enter the radius:');readln(R); Initgraph(Gm,Gd,' '); Setcolor(Green); Circle(320,240,R); R C End.4 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& 注意,如果上面程序运行时会出现初始化图形错误,请将系统目录下 BGI 子 目录 EGAVGA.BGI 和 UNITS 子目录中的 Graph.tpu 拷贝到系统目录下 BIN 目录即 可。 请输入上面的程序,并练习将其存盘、打开与运行上面程序。 第二课 赋值语句、输出语句 上节课,我们学习了 Pascal 语言的程序基本结构,在一个程序中,所有的 操作都由执行部分来完成,而执行部分又都是由一个个语句组成的。因此,下面 开始我们要学习 pascal 语言的基本语句,并且在学习过程中逐步学会程序设计 的基本方法。 这节课我们要学习两种语句,即赋值语句与输出语句。在语句学习之前我们 要先了解一些 pascal 语言的基础知识。 一、 常量、变量与算术表达式 (一)常量 在程序运行过程中,其值不能被改变的量称为常量。如 123,145.88,'abc',true 等。 ⒈整型常量 整型常量采用我们平常使用的十进制整数表示。 138,0,-512 等都是整型常 如 量,而 18.或 18.0 都不是整型常量。 pascal 中有一个标准标识符 Maxint,它代表所使用的计算机系统允许的最大整 型数,而最小的整型数即为-Maxint-1。 一个整型数据用来存放整数。Turbo Pascal 支持五种预定义整型,它们是 shortint(短整型)、 integer(整型)、 longint(长整型)、 byte(字节 型)和 word(字类型),Turbo Pascal 分别用相同的名字作为他们的表识符。 每一种类型规定了相应的整数取值范围以及所占用的内存字节数。 类型 格式 shortint 符号 8 位 inteter 符号 16 位 longint 符号 32 位 byte 符号 8 位 数值范围 -128..128 -3 -.. 0..255 1 2 4 1 占字节数 带 带 带 带5 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& word 符号 16 位 0..65535 2 带Turbo Pascal 规定了两个预定义整型常量表识符 maxint 和 maxlonint,他 们各表示确定的常数值,maxint 为 32767, maxlongint 为 ,他们的 类型分别是 integer 和 longint。 ⒉实型常量 实型常量包括正实数、负实数和实数零。pascal 中表示实型常量的形式有 两种。 ?十进制表示法 这是人们日常使用的带小数点的表示方法。 如 0.0,-0.0,+5.61,-8.0,-6.050 等都是实型常量, 0.,.37 都不是合法的 而 实数形式。 ?科学记数法 科学记数法是采用指数形式的表示方法,如 1.25×105 可表示成 1.25E+05。 在科学记数法中,字母&E&表示 10 这个&底数&,而 E 之前为一个十进制表示的小 数,称为尾数,E 之后必须为一个整数,称为&指数&。 如- , +0.268E-5 , 1E5 是合法形式,而.34E12 , 2.E5 , E5 ,E,1.2E+0.5 都不是合法 形式的实数。 无论实数是用十进制表示法还是科学表示法, 它们在计算机内的表示形式是 一样的,总是用浮点方式存储。 和整数相比,实数能表示的范围大得多,但值得注意的是实数的运算整数的 运算速度慢且无法像整数那样精确表示,只能近似表示。 一个实型数据用类存放实数。Turbo Pascal 支持五种预定义实型,它们是 real(基本实型)、 single(但精度实型)、double(双精度实型)、extended (扩展实型)、comp(装配实型),Turbo Pascal 分别用相同的名字作为他们 的表识符。每一种类型规定了相应的实数取值范围、所占用的内存字节数以及它 们所能达到的精度。 类型 数 real 11..12 single double 15..16 数值范围 2.9e-39..1.7e38 1.5e-45..3.4e38 5.0e-324..1.7e308 占字节数 6 4 8 7..8 有效位6 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& extended 19..20 comp 19..20 3.4e-e+1..2**63-1 10 8Turbo Pascal 支持两种用于执行实型运算的代码生成模式:软件仿真模式 和 80x87 浮点模式。除了 real 可以在软件仿真模式下直接运行以外,其他类型 必须在 80x87 浮点模式下运行。 ⒊字符常量 在 Pascal 语言中,字符常量是由单个字符组成,所有字符来自 ASCII 字符 集,共有 256 个字符。在程序中,通常用一对单引号将单个字符括起来表示一个 字符常量。如:'a','A','0'等。特殊地,对于单引号字符,则要表示成''''。 对于 ASCII 字符集中, 按每个字符在字符集中的位置, 将每个字符编号为 0-255, 编号称为对应字符的序号。 4.布尔常量 布尔型常量仅有两个值,真和假,分别用标准常量名 true 和 false 表示。 它们的序号分别为 1 和 0。 5.符号常量 一个常量即可以直接用字面形式表示(称为直接常量, 如 124,156.8), 也可以用一个标识符来代表一个常量,称为&符号常量&。但符号常量必须在程序 中的说明部分定义,也就是说先定义,后使用。 定义符号常量的一般格式: CONST &常量标识符&=&常量& 说明: 常量说明部分以关键字 const 开头, 后面的标识符为常量标识符, 其中&=& 号后的常量为整数、实数、字符、 字符串(字符、字符串常量在后面章节中将 作介绍)。而且,在常量说明部分可以将几个常量说明成符号常量,共用一个关 键字&const&。例如:7 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&&则在本程序中 pi 和 zero 作为符号常量,分别代表实数 3.14159 和整数 0。也就 是说, 常量说明部分既定义了常量名及其值, 又隐含定义了常量的类型。 关 于符号常量,应注意下列几点: ?符号常量一经定义,在程序的执行部分就只能使用该常量标识符,而不能 修改其值。 ?使用符号常量比直接用数值更能体现&见名知义&的原则,也便于修改参 数,故一个较好的程序中,应尽量使用符号常量,在执行部分基本上不出现直接 常量。 (二)变量 变量代表了一个存储单元,其中的值是可变的,故称为变量。如游戏&魂斗 罗&中玩者命的个数最初为 3,当你死了一次命减少一,这里命的个数就是一个 变量(或者说命的个数存储在一个存储单元中)。即在程序运行过程中,其值可 以改变的量,称为变量。 变量有三个要素是:变量名、变量类型、变量值。 一个程序中可能要使用到若干个变量,为了区别不同的变量,必须给每个变 量(存贮单元)取一个名(称为变量名),该变量(存贮单元)存放的值称为变 量的值,变量中能够存放值的类型为变量的类型。例如 &魂斗罗&游戏中用于存 放&命&的变量,在游戏程序中的名字可取为 N,它的类型为整型,游戏初始时这个 变量的值为 3。 1.变量名 用一个合法的标识符代表一个变量。如 n,m,rot,total 等都是合法变量名。 在程序中用到的变量必须在说明部分加以说明, 变量名应遵循自定义标识符的命 名规则,并注?见名知义&的原则,即用一些有意义的单词作为变量名。 &自定义标识符&的命名规则为:自定义标识符必须以字母(包含下划线&_&) 开头,后面的字符可以是字母或数字。标识符长度不超过 63 个字符。8 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& 2.变量的类型 常量是有类型的数据,变量在某一固定时刻用来存放一个常量,因此也应有 相应的类型。如整型变量用来存放整数,实型变量用来存放实数。 3.变量说明 在程序中若要使用变量,变量的名称及类型在程序的变量说明部分加以定 义,变量的值则在程序的执行部分中才能赋给。 变量说明的一般格式: VAR &变量标识符&[,&变量标识符&]:&类型&; (中括号内部分表示可省,下同) 其中 VAR 是 pascal 保留字,表示开始一个变量说明段, 每个变量标识符或由 逗号隔开的多个变量标识, 必须在它的冒号后面说明成同一类型。一个程序中, 可以说明许多不同类型的变量,每种类型变量之间用分号隔开,共用一个 VAR 符 号。 例如: var age,day: amount,average: 其中,Integer(整型)、Real(实型)是标准标识符, 它们是&类型标识符&, 代表了确定的类型,如 age 和 day 被定义为整型变量,amount 和 average 被定 义为实型变量。 一旦定义了变量,就确定了它的类型,也就是说,就确定了该变量的取值范 围和对该变量所能进行的运算。 (三)算术表达式 ?算术表达式的定义 pascal 语言中的算术表达式是由符合 pascal 语法规定的运算对象(包括常 量、变量、函数)、算术运算符、圆括号组成的有意义的式子。如: A+3..4-Abs(-1123) ?算术运算符 常用的有以下 6 个算术运算符: ① ② + (加) - (减)9 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& ③ * (乘) ④ / (实数除)得到结果为实型.如 5.0/2.0=2.5, 5/2= 2. 5,4/2=2.0 而不等于 2。 ⑤ DIV (整除) DIV 它要求除数和被除数均为整型, 结果也为整型。如 10 DIV 2=5,10 DIV 3=3, 5 DIV 10=0. -15 DIV 4= -3。DIV 运算只取商的整数部 分,参与 DIV 运算的两个对象不能为实型。 ⑥ mod (求余), 也只能用于整数运算,结果为整数。 例如:10 mod 4=2 , -17 mod 4= -1 , 4 mod (-3)=1, - 4 mod 3= -1,即 a mod b=a-(a div b)*b。 (3)运算优先顺序 如果一个表达式里出现两个或两个以上的运算符, 则必须规定它们的运算 次序。pascal 规定: ①表达式中相同优先级的运算符,按从左到右顺序计算; ②表达式中不同优先级的运算符,按从高到低顺序计算; ③括号优先级最高,从内到外逐层降低; 在算术运算中运算符的优先顺序与数学上的四则运算一致,即&先乘除后加减& (注:&MOD&、&DIV&运算的优先级与&*&、&/&相同)。 二、赋值语句 变量既然代表一个存储单元,其值是可变的,那么其中的值是怎么提供的, 又是怎么改变的呢?可以通过赋值语句来进行。 1、 赋值语句的格式 变量名:=表达式; 其中&:=&称为赋值号。 2、 执行过程 计算机先计算赋值号右边表达式的值,然后将表达式的值赋给变量名代表的变 量。如:A:=(9*8)-(2-1); A:=A+1 三、输出语句 输出语句的作用是将程序运算的结果输出到屏幕或打印机等输出设备。 这里通常 是指输出到屏幕。 (一)输出语句的两种格式 1、 write 语句 格式 Write(表达式 1,表达式 2,??); 如:write(1,2,3,4); write(1.2,3.4,5);10 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& write('My name is Liping'); 2、 writeln 语句 格式: Write(表达式 1,表达式 2,??)或 writeln (二)输出语句的功能 计算机执行到某一输出语句时,先计算出输出语句中的每个表达式的值,并 将每一个表达式的值一个接一个地输出到屏幕上。 Write 语句与 writeln 语句格式上都相似,但它们在功能上有所不同,两个 语句的区别在于,write 语句将其后括号中的表达式一个接一个输出后,没有换 行。而 writeln 语句则在输出各个表达式的值后换行。 例如以下两个程序段的输出分别为: write(1,2,3,4);write(5,6); 输出为: 123456 writeln(1,2,3,4);write(5,6); 输出为: 1234 56 四、应用例析 例 1: 某仓库 5 月 1 日有粮食 100 吨,5 月 2 日又调进 20 吨,5 月 3 日卖出库存 的 3 分之二,5 月 4 日又调进库存的 3 倍粮食,问该仓库从 5 月 1 日到 5 月 4 日 期间每天的粮食分别是多少吨?(输出每天的库存量) 分析: 在这个问题中, 主要要描述从 5 月 1 日到 5 月 4 日期间仓库的粮食库存量, 且易知它是不断变化的。因此我们可以用一个变量 A 来描述仓库的粮食库存量。 程序可写如下: Program ex1; Var A : Begin A:=100;Writeln('5/1:',A); A:=A+20;Writeln('5/2:',A); A:=A div 3; writeln('5/3:',A); A:=A *4; writeln('5/4:',A);R End. 例 2: 有三个小朋友甲乙丙。甲有 50 粒糖果,乙有 43 粒糖果,两有 13 粒糖果。11 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& 现在他们做一个游戏。从甲开始,将自己的糖分三份,自己留一份,其余两份分 别给乙与丙,多余的糖果自己吃掉,然后乙与丙也依次这样做。问最后甲、乙、 丙三人各有书多少粒糖果? 分析: 这个问题中我们关心的是在游戏过程中每个小朋友的糖果个数,且他们所 拥有的的糖果数是在变化的。 因此可用 a,b,c 三个变量分别存放甲乙丙三个小朋 友在某一时刻所拥有的糖果数。对于每人,分糖后,他的糖果数一定为原来的糖 果数 div 3(因为分糖过程糖果的数目不一定都刚好分完,用整除恰恰可以表示 多余的糖自己吃掉)。而其他两人则增加与这个小朋友现在拥有的一样的糖果。 程序可写如下: program ex2; var A,B,C: begin A:=50;B:=43;C:=13; {初始时每个小朋友所拥有的糖果数} A:=A div 3; B:=B+A;C:=C+A;{甲小朋友分糖果后,每个人拥有的糖果数变化 情况} B:=B div 3; A:=A+B;C:=C+B; {乙小朋友分糖果后,每个人拥有的糖果数变化 情况} C:=C div 3; A:=A+C;B:=B+C; {丙小朋友分糖果后,每个人拥有的糖果数变化 情况} writeln('A=',A,'B=',B,'C=',C); {输出结果} end. 注: 上程序中倒数第三行中'A='表示一个字符串(即用一对单引号括起来的一 串字符),对于字符串,输出字符串的内容(即引号内的所得字符,而引号不输 出)。 以上程序的运行结果为: A=51B=35C=16 练习二 1、已知某梯形的上底 A=13,下底 B=18,高 H=9,求它的面积 S。 2、某机关组织游泳比赛。将一堆西瓜分给前三名,把该堆西瓜中的一半又半个 西瓜奖给第一名;剩下的一半又半个西瓜给第二名;把最后剩下的一半又半个西 瓜给第三名,但每次分时并没切开任何一个西瓜,且刚好西瓜分完。问前三名各 分到多少个西瓜 3、已知某圆的半径 R=139,求该圆的周长 C 与面积 S?12 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& 第三课 带格式的输出语句及输入语句 一、写语句的输出格式 在 pascal 语言中输出数据时是可以按照一定格式的,对整数隐含的输出形 式为按十进制数形式。对实数的输出,隐含的形式是科学记数法形式(如果不想 用科学记数法输出而用小数形式输出,要自己另行定义)。 事实上,输出语句中的每个输出项中的表达式之后可以加上格式说明,若输 出项后没有加格式说明, 则数据按系统隐含的格式输出,还可加上一定格式符 号按特定格式输出。 ⒈隐含的输出格式 pascal 语言为整型量、实型量、布尔型量和字符串( 用一对单引号括起来 的字符序列)规定了每种数据所占的宽度(即一个数据占几列) , 一个数据所占的 宽度称为&场宽&或&字段宽&。 系统给出的隐含场宽称为标准场宽。 每一种 pascal 版本给定的标准场宽不尽相同。下表给出标准 pascal 和 pc 机上两种 pascal 版 所规定的标准场宽。 标准场宽 ━━━━━━━━━━━━━━━━━ 数据类型 标准 pascal Turbo pascal ───────────────── integer 10 实际长度 real 22 17 布尔型 10 4 或 5 字符串 串长 串长 ━━━━━━━━━━━━━━━━━ 在 Turbo Pascal 系统中,对于整型字符串的输出都是按数据本身长度输出,对 于布尔型数据(只有 True 和 False 两种值),TRUE 为 4 列,FALSE 为 5 列,一 律采用大写输出。而 real 型数据的输出时,则按 17 列输出,其中第一列为符号 位,正号不显示,后四位为&E±nn&, 中间的 12 列为尾数部分。如: writeln(sqrt(75)); 则输出□8.E+00。 而 writeln(sqrt(81)); 则输出□9.E+00。 有时,在程序中往往根据实际情况,需要自己定义场宽。 ⒉指定场宽 在写语句中输出项含有格式符号时,就是为了指定场宽。 ?指定单场宽.13 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& 格式:write(表达式:N)或 writeln(表达式:N),其中 N 为自然数,指定单场 宽后,所有数据不再按标准场宽输出,而按指定场宽输出。若数据实际长度小于 指定场宽时,则一律&向右靠齐,左留空格&。 如 write(1234:8);write('abcdef':12) 输出结果: □□□□1234□□□□□□abcdef 对于标准实型数据指定单场宽时,如果场宽大于标准场宽时,右靠齐按标准 场宽格式输出 17 位,左留空格。若场宽小于标准场宽时,第一位仍为符号位, 最后四位仍为&E±nn&,中间部分为尾数显示部分。如果指定的宽度小于 8 位, 则数据按 8 位格式&*.*E±nn &输出。 ?指定双场宽 如果输出项是实数时,如果希望输出的实数不用科学记数法输出,而用小数 形式输出,可以用指定双场宽方法输出。 双场宽输出格式为:write(实型表达式:m:n),其中 m 和 n 都是自然数,m 用以指定整个数据所占的宽度,n 指定输出实数的小数位数。 如 : write(sqrt(75):9:4); 输出:□□□8.6602 如果双场宽不能满足输出数据的最低要求, 系统自动突破指定的场宽限制, 按实际长度输出。 如:write(sqrt(75):5:4); 要使小数点后有 4 位数字,而总场宽为 5,是不可能 的(因为还有一个小数点, 小数点前面还有一个数字)。它最低限度要有 6 列, 即输出为: 8.6602 例1 写出下列程序在 turbo pascal 下的输出结果. const s='abcdefg'; var i: r: c:b: begin i:=1234;r:=; c:='#';b:= writeln(i,i:6,i:3); writeln(r,r:12:5,r:8:5);14 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& writeln(c,c:5); writeln(s,s:10,s:5); writeln(b,b:5,b:3); end. 运行结果如下: 1234□□ □1.E+03□□34.56780 #□□□□# abcdefg□□□abcdefgabcdefg TRUE□TRUETRUE 3.应用例析 例 2: 已知 A=253,B=43,输出 A*B 的运算式子。即输出如下: 253*43= * 43 759 + 分析: 对于该问题,我们只要控制好输出时右靠齐即可。即前四行的总宽度一样 (例如为 12),第五行总宽度比前面少 1。第六、七行总宽度与前四行一样。 参与程序如下: var a,b: begin a:=253;b:=43; writeln(a:10,'*',b,'=',a*b); writeln(a:12); write('*':8);writeln(b:4); writeln('--------':12); writeln(a*3:12); write('+':6);writeln(a*4:5); writeln('--------':12); writeln(a*b:12); end. 二、 输入语句(读语句) 在程序中变量获得一个确定的值,固然可以用赋 值语句,但是如果需要赋值的变量较多,或变量的值经常变化,则使用本节介绍15 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& 的输入语句──读语句,将更为方便。读语句是在程序运行时由用户给变量提供 数据的一种很灵活的输入动作,它有两种格式: 1.读语句的一般格式: read(&变量名表&); readln[(&变量名表&)]; 其中变量名表是用逗号隔开的若干个变量名组成的。 功能:从标准输入文件(即 INPUT,一般对应着键盘 )中读入数据,并依次赋给相 应的变量。 说明: ①read 和 readln 是标准过程名,它们是标准标识符。 ②执行到 read 或 readln 语句时,系统处于等待状态,等待用户从键盘上输 入数据,系统根据变量的数据类型的语法要求判断输入的字符是否合法。如执行 read(a)语句,a 是整型变量,则输入的字符为数字字符时是合法的,当输入结 束时,则自动将刚接受的一串数字字符转换为整数赋给变量 a。 ③在输入数值型(整型或实型)数据时,数据间要用空格或回车分隔开各个 数据,输入足够个数的数据,否则仍要继续等待输入,但最后一定要有回车,表 示该输入行结束,直到数据足够,该读语句执行结束,程序继续运行。 例 3. 设 a、b、c 为整型变量,需将它们的值分别赋以 10,20,30,写出对应下列 语句的所有可能输入格式。 Read(a,b,c); 解 根据③,即可列出所有可能输入格式 (a)10□20□30←┘ (b)10□20←┘ 30←┘ (c)10←┘ 20□30←┘ (d)10←┘ 20←┘ 30←┘ 其中&←┘&表示回车键。下同。 ④read 语句与 readln 语句的第一个区别是: read 语句是一个接一个地读数据,在执行完本 Read 语句( 读完本语句中变 量所需的数据)后,下一个读语句接着从该数据输入行中继续读数据,也就是说, 不换行。如:16 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& Read(a,b); Read(c,d); Read(e); 如果输入数据行如下: 1□2□3□4□5□6□←┘ 则 a,b,c,d,e 的值分别为 1,2,3,4,5,如果后面无读语句则数据 6 是多余的,这 是允许的。 Readln 则不同,在读完本 Readln 语句中变量所需的数据后, 该数据行中剩 余的数据多余无用,或者说,在读完本 Readln 语句中变量所需数据后,一定要 读到一个回车,否则多余的数据无用。 例4 设要达到例 1 同样的目的,但语句改为: readln(a,b);readln(c) 则例 3 中的 4 种输入格式只有(b)(d)是有效的. ⑤readln 语句与 read 语句的第二个区别是:read 后一定要有参数表,而 readln 可以不带参数表,即可以没有任何输入项, 只是等待读入一个换行符(回 车)。经常用于暂停程序的运行,直到输入一个回车。 例5 设有下列语句: read(a,b,c); readln(d,e); readln(f,g); 其中,所有变量均为整型。再设输入的数据如下: 1□2←┘ 3□4□5□6□7□8←┘ 9□10←┘ 11←┘ 12□13←┘ 列表给出每个变量的值. 分析: 可以假想有一&数据位置指针&,每读一个数据后,指针后移到该数据之后, 每执行一个 readln 语句后,指针移到下一个数据行的开头。 各变量的值如下表所示。17 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& ━━━━━━━━━━━━━━━━━━━━━━━━━━ 变量名 a b c d e f g ────────────────────────── 值 1 2 3 4 5 11 12 ────────────────────────── ⑥为了避免可能出现的错误,建议在程序中按下列原则使用读语句:(A)如 果没有特殊需要,在一个程序中尽量避免混合使用 read 语句和 readln 语句;(B) 尽量用 readln 语句来输入数据, 一个数据行对应一个 readln 语句;(C)由于执行 read 或 readln 语句时, 系统不会提供任何提示信息,因此,编程时最好在 readln 语句之前加以适当提示,例如: write('Input a,b,c:'); readln(a,b,c); 在执行时,屏幕上显示: Input a,b,c:■ 其中,&■&为光标。执行 readln 语句后,系统处于待待输入状态, 只有输入了所 需数据后才继续往下执行。 三、顺序结构程序设计 到目前为止,我们可以用读、写语句和赋值语句编写一些简单的程序。通过 阅读这些程序,可以逐步熟悉 pascal 程序的编写方法和应遵循的规则,为以后 各章的学习打基础。 例6 试编一程序,输入一梯形的上底、下底、高, 求该梯形的面积。 分析: 整个程序分为三段:输入、计算、输出。程序中用 a,b,h 三个变量分别存放 梯形的上、下底与高,S 存放面积。 要而使用这些变量都要先说明,程序的执 行部分中先输入上、下底与高,接着求面积 S,最后输出结果 S。 源程序如下: program T {程序首部} var a,b,h,s: {程序说明部分} begin write('Input a,b,h:'); readln(a,b,h); {程序执行部分} s:=(a+b)*h/2; write('s=',s:10:3); end. 例7 某幼儿园里,有 5 个小朋友编号为 1,2,3,4,5,他们按自己的编号顺 序围坐在一张圆桌旁。他们身上都有若干个糖果,现在他们做一个分糖果游戏。 从 1 号小朋友开始,将他的糖果均分三份(如果有多余的,则他将多余的糖果吃18 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& 掉),自己留一份,其余两份分给他的相邻的两个小朋友。接着 2 号、3 号、4 号、5 号小朋友也这如果做。问一轮后,每个小朋友手上分别有多少糖果。 分析: 这道问题与第二课中的例 2 基本一样,只不过这里有 5 位小朋友,且他们 初始时糖果的数目不确定。这里用 a,b,c,d,e 分别存放 5 个小朋友的糖果。初始 时它们的值改为由键盘输入。其它都与第二课中的例 2 类似。 参考程序如下: var a,b,c,d,e: begin write('Please Enter init numbers ');readln(a,b,c,d,e); a:=a div 3;b:=b+a;e:=e+a;{1 号均分后,1、2、5 号的糖果数变化情况} b:=b div 3;c:=c+b;a:=a+b;{2 号均分后,1、2、3 号的糖果数变化情况} c:=c div 3;b:=b+c;d:=d+c;{3 号均分后,2、3、4 号的糖果数变化情况} d:=d div 3;c:=c+d;e:=e+d;{4 号均分后,3、4、5 号的糖果数变化情况} e:=e div 3;d:=d+e;a:=a+e;{5 号均分后,4、5、1 号的糖果数变化情况} {输出结果} writeln('a=',a); writeln('b=',b); writeln('c=',c); writeln('d=',d); writeln('e=',e);{暂停} end. 例8 编一程序求半径为 R 的圆的周长与面积? 分析: 程序要先输入半径 R,然后求周长 c 和面积 s,最后输出 c 和 s. 源程序如下: const PI=3.14159; var r,c,s: begin write('Enter R=');readln(r); c:=2*pi*r; s:=pi*sqr(r); writeln('c=',c:10:2); writeln('s=',s:10:2); end. 在程序中, 为了输出实型周长 C 和面积 S 时,按照小数形式输出,采用了指定 双场宽格式。19 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& 练习三1. 编一程序,将摄氏温度换为华氏温度。公式为: 其中 f 为华氏温度,c 是摄氏温度。 2. 编一程序,输入三角形的三边 a、b、c(假设这三边可以构成一个三角形), 求三角形的面积S? (提示:可利用海伦公式20 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& 第四课 简单的分支结构程序设计 在现实生活中,我们每天都要进行根据实际情况进行选择。例如,原打算明 天去公园,但如果明天天气不好,将留在家里看电视。所以人也会根据条件进行 行为的选择。计算机也会根据不同情况作出各种逻辑判断,进行一定的选择。在 这课与下一课中,我们将会发现,我们是通过选择结构语句来实现程序的逻辑判 断功能。 一、PASCAL 中的布尔(逻辑)类型 在前面,我们学习了整型(integer)与实型(real)。其中 integer 型数据 取值范围为-32768 到 32767 之间所有整数。而 real 型数据取值范围为其绝对值 在 10-38 到 1038 之间的所有实数。它们都是数值型的(即值都为数)。布尔型 (Boolean)是一种数据的类型,这种类型只有两种值,即&真&与&假&。 1、 布尔常量 在 Pascal 语言中&真&用 ture 表示,&假&用 False 表示。所以布尔类型只有 TRUE 与 FALSE 两个常量。 2、 布尔变量(BOOLEAN) 如果我们将某些变量说明成布尔型,那么这些变量就是布尔变量,它们只能 用于存放布尔值(ture 或 false)。 例如,VAR A,B:BOOLEAN; 3、 布尔类型是顺序类型 由于这种类型只有两个常量,Pascal 语言中规定 ture 的序号为 1,false 的序号为 0。若某种类型的常量是有限的,那么这种类型的常量通常都有一个序 号,我们称这种类型为顺序类型。如前面我们学过的整型(integer),以及后 面要学到的字符型(char)都是顺序类型。 4、 布尔类型的输入与输出 a)输出 VAR A,B:BOOLEAN; BEGIN A:=TRUE;B:=FALSE; WRITELN(A,B); END. TRUEFALSE21 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& b)布尔类型变量不能直接用读语句输入 布尔类型变量不能通过读语句给它们提供值。事实上,我们可以通过间接方 式对布尔变量进行值的输入。 例如,以下程序是错误的: var a,b,c:B begin readln(a,b,c); {错误语句} writeln(a,b,c); end. 二、关系表达式与布尔表达式 1、什么是关系表达式 用小括号、&、&、&=、&=、=、&&将两个算术表达式连接起来的式子就称为 关系表达式(比较式)。 如:3+7&8,x+y&10,2*7&=13 等都是关系表达式。 2、关系表达式的值 很显然,这几个关系表达式中第一个是正确的,第三个是错误的,而第二个 表达式可能是对的,也可能是错的。所以我们很容易发现,这些表达式的值是& 对&的或&不对&的(或者说,是&真&的或&假&的),即关系表达式的值为布尔值。 表示该比较式两端式子的大小关系是否成立。如 3+2&6 是错的,故它的值为 FALSE。同样,45&=32 是对的,故该表达式的值为 true。 关系表达式用于表示一个命题。如:&m为偶数&可表示为:m mod 2=0。& n为正数&可表示为:n&0。 3.布尔运算及布尔表达式 为了表示更复杂的命题,Pascal 还引入三种逻辑运算符:not、and、or。 它们分别相当于数学上的&非&、&且&和&或&的意义。 这三个运算符的运算对象为布尔量,其中 not 为单目运算,只有一个运算对 象,and 与 or 为双目运算,有两个运算对象。它们的运算真值表如下:a false false true trueb false true false trueNot a true true false falsea and b false false false truea or b false ture true truea xor b false true true false22 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& 于是,对于一个关系表达式,或多个关系表达式用布尔运算符连接起来的式 子就称为布尔表达式。布尔表达式的值也为布尔值。 如果一个表达式里出现两个或两个以上的运算符, 则必须规定它们的运算 次序。pascal 规定: ①表达式中相同优先级的运算符,按从左到右顺序计算; ②表达式中不同优先级的运算符,按从高到低顺序计算; ③括号优先级最高,从内到外逐层降低; 对于一个复杂的表达式可能同时包含算术运算、 关系运算和逻辑运算以及函 数运算。运算的优先顺序为:括号 à 函数 ànotà*、/、div、mod、andà+、-、 or、xorà 关系运算。 对于复杂的命题,我们可以用布尔表达式来表示。例如,命题:&m,n 都是 偶数或都是奇数&可表示为&(m mod 2=0)and(n mod 2=0) or (m mod 2=1)and(n mod 2=1)&。 三、简单的 IF 语句 1、格式 Ⅰ、IF <布尔表达式>THEN 语句; Ⅱ、IF <布尔表达式>THEN 语句1 ELSE 语句2; (注意Ⅱ型 IF 语句中语句1后无&;&号) 2、功能 Ⅰ、执行 IF 语句时,先计算<布尔表达式>的值,若为 TRUE 则执行语句,否则不执行任何操作。 Ⅱ、 执行 IF 语句时, 先计算<布尔表达式>的值, 若为 TRUE 则执行语句1, 否则执行语句2; 3、示例 1)例4.2输入一个整数a,判断是否为偶数。(是输出&yes&否则输 出&no&)。 Program ex4_2; Var a: Begin Write('a=');readln(a); If (a mod 2 =0)then writeln('yes') Else writeln('no'); R End. 2)华榕超市里卖电池,每个电池8角钱,若数量超过10个,则可打 75 折。23 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& Program ex4_3; Var Num:Price,Total: Begin Write('Num=');readln(Num); Price=0.8; If Num&10 then Price:=Price*0.75; Total:=Num*P Writeln('Total=',Total:0:2); R End. 3)编写一与电脑猜&红&或&黑&的游戏。 分析:用1代表红,0代表黑。先由计算机先出答案,然后再由人猜,猜对 输出&YOU WIN&否则输出&YOU LOST&。为了模拟猜&红&或&黑&的随意性,程序中 需要用到随机函数 random(n)。 函数是什么呢,例如大家都知道|-2|=2,|58|=58,那么|x|=?。 如果我们用 y 表示|x|,那么 .这里 y=|x|就是一个函数,也就是说函数是 一个关于一个或多个自变量(未知量,如上例中的 x)的运算结果。 在 pascal 语言中,系统提供了许多内部函数,其中包括|x|函数,当然它用 abs(x)表示。我们如果要求 x2-y 的绝对值,可以调用内部函数 abs(x*x-y)即可 求得。Random(n)也是一个内部函数,调用它能得到 0~n-1 之间的整数(但它不 确定的,或说是随机的)。同时由于函数是一个运算结果,所以函数的调用只能 出现在表达式中。 Program ex4_3; U Var Computer,People: Begin R Computer:=random(2); Write('You guess(0-Red 1-Black):');readln(People); If People=Computer then writeln('YOU WIN') Else writeln('YOU LOST'); R End. 作业:.某车站行李托运收费标准是:10 公斤或 10 公斤以下,收费 2.5 元, 超过 10 公斤的行李,按每超过 1 公斤增加 1.5 元进行收费。 试编一程序,输入 行李的重量,算出托运费。24 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&&第五课一、IF 语句的嵌套if 嵌套与 case 语句在 if 语句中,如果 then 子句或 else 子句仍是一个 if 语句, 则称为 if 语句的嵌套。 例1 计算下列函数分析:根据输入的 x 值,先分成 x&0 与 x≤0 两种情况,然后对于情况 x≤0,再区分 x 是小于 0,还是 等于 0。 源程序如下: var x: y: begin wrtie('Input x:');readln(x); if x&0 then y:=1{x&0 时,y 的值为 1} then y:=0 else {x≤0 时} if x=0 else y:=-1; writeln('x=',x:6:2,'y=',y); end. 显然,以上的程序中,在 then 子句中嵌套了一个Ⅱ型 if 语句。当然程序也可以写成如下形式: var x:y: begin wrtie('Input x:');readln(x); if x&=0 then if x&0 else y=-1; writeln('x=',x:6:2,'y=',y); then y:=1 else y:=025 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&&end. 但是对于本题,下面的程序是不对的。 y:=0; if x&=0 then if x&0 then y:=1 else y:=-1; 明显,从此人的程序书写格式可以看出,他想让 else 与第一个 if 配对,而事实上,这是错的。因为 pascal 规定:else 与它上面的距它最近的 then 配对,因此以上程序段的逻辑意义就与题义不符。 要使上程序段中 esle 与第一个 then 配对,应将程序段修改为: y:=0; if x&=0 then if x&0 then y:=1 else else y:=-1; 二、case 语句 上面我们知道可以用嵌套的 if 语句实现多分支的选择结构。但是如果分支越来越多时,用嵌套的 if 语句实现多分支就显得繁杂。当多分支选择的各个条件由同一个表达式的不同结果值决定时,可以用 case 语句实现。它的选择过程,很象一个多路开关,即由 case 语句的选择表达式的值,决定切换至哪一语句去 工作。因此在分支结构程序设计中,它是一种强有力的手段。在实现多路径分支控制时,用 case 对某些问 题的处理和设计,比用 if 语句写程序具有更简洁、清晰之感。 (一)、情况语句的一般形式: case &表达式& of &情况标号表 1&:语句 1; &情况标号表 2&:语句 2; : &情况标号表 n&:语句 其中 case、of、end 是 Pascal 的保留字, 表达式的值必须是顺序类型,它可以是整型、布尔型及以 后学习的字符型、枚举型和子界型。情况标号表是一串用逗号隔开的与表达式类型一致的常量序列。语句 可以是任何语句,包括复合语句和空语句。 (二)、case 语句的执行过程 先计算表达式 (称为情况表达式) 的值, 如果它的值等于某一个常量 (称为情况常量, 也称情况标号) , 则执行该情况常量后面的语句,在执行完语句后,跳到 case 语句的末尾 end 处。 (三)、说明 ①情况表达式必须是顺序类型的; 或者 y:=0; if x&=0 then begin if x&0 then Y:=1; end else Y:=-1;26 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&&②情况常量是情况表达式可能具有的值,因而应与情况表达式具有相同的类型; ③情况常量出现的次序可以是任意的; ④同一情况常量不能在同一个 case 语句中出现两次或两次以上; ⑤每个分语句前可以有一个或若干个用逗号隔开的情况常量; ⑥如果情况表达式的值不落在情况常的范围内,则认为本 case 语句无效,执行 case 语句的下一个语 句。turbo pascal 中增加了一个&否则&的情况,即增加一个 else 子句,但也是可省的。 ⑦每个常量后面只能是一个语句或一个复合语句。 例 2 根据 x 的值,求函数 Y 的值:分析:利用 case 语句进行程序设计, 关键在于巧妙地构造情况表达式。本例中三种情况可用一个表达 式区分出来:Trunc(x/100)。因为 x 在(0~100)之间时表达式值为 0;x 在[100,200)时表达式值为 1 ;其 余部分可用 else 子句表示。 源程序如下: var x,y: begin write('Input x:');readln(x); case trunc(x/100) of 0:y:=x+1; 1:y:=x-1; else y:=0;{end of case} writeln('x=',x:8:2),'y=',y:8:2); end.三、选择结构的程序设计 例 3 输入一个年号,判断它是否是闰年。 分析:判断闰年的算法是:如果此年号能被 400 除尽, 或者它能被 4 整除而不能被 100 整除,则它是 闰年。否则,它是平年。 源程序如下: var year: begin write('Input year:');readln(year); write(year:6);27 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&&if (year mod 400=0 ) else if (year mod 4=0)and(year mod 100&&0) then writeln('is a leap year.') else writeln('is not a leap year.'); end. 例 4 判断 1995 年,每个月份的天数。 分析:程序分为:输入月份,计算该月的天数,输出天数 源程序如下: var month,days: begin write('Input month:');readln(month); case month of 1,3,5,7,8,10,12:days:=31; 4,6,9,11 :days:=30; 2 :days:=28; else days:=0; if days&&0 then writeln('Days=',days); end. 例 5 期未来临了,班长小 Q 决定将剩余班费 X 元钱,用于购买若干支钢笔奖励给一些学习好、表现好 的同学。已知商店里有三种钢笔,它们的单价为 6 元、5 元和 4 元。小 Q 想买尽量多的笔(鼓励尽量多的 同学),同时他又不想有剩余钱。请您编一程序,帮小 Q 制订出一种买笔的方案。 分析:对于以上的实际问题,要买尽量多的笔,易知都买 4 元的笔肯定可以买最多支笔。因此最多可 买的笔为 x div 4 支。由于小 q 要把钱用完,故我们可以按以下方法将钱用完: 若买完 x div 4 支 4 元钱的笔, 还剩 1 元, 4 元钱的笔少买 1 支, 则 换成一支 5 元笔即可; 若买完 x div 4 支 4 元钱的笔,还剩 2 元,则 4 元钱的笔少买 1 支,换成一支 6 元笔即可;若买完 x div 4 支 4 元钱的 笔,还剩 3 元,则 4 元钱的笔少买 2 支,换成一支 5 元笔和一支 6 元笔即可。 从以上对买笔方案的调整,可以看出笔的数目都是 x div 4,因此该方案的确为最优方案。 源程序如下: var a,b,c:{a,b,c 分别表示在买笔方案中,6 元、5 元和 4 元钱笔的数目} x,y:{x,y 分别表示剩余班费和买完最多的 4 元笔后剩的钱} begin write('x=');readln(x){输入 x} c:=x div 4;{4 元笔最多买的数目} y:=x mod 4;{求买完 c 支 4 元笔后剩余的钱数 y} case y of thenwriteln('is a leap year.')28 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&&0 : begin a:=0;b:=0; 1 : begin a:=0;b:=1;c:=c-1; 2 : begin a:=1;b:=0; c:=c-1; 3 : begin a:=1;b:=1; c:=c-2; writeln('a=',a,'b=',b,'c=',c); end.练习1.输入三角形的三个边,判断它是何类型的三角形(等边三角形?等腰三角 形?一般三角形?)。 2.输入三个数,按由大到小顺序打印出来。 3.计算 1901 年 2099 年之间的某月某日是星期几。 4.输入两个正整数 a,b。b 最大不超过三位数,a 不大于 31。使 a 在左,b 在右,拼接成一个新的数 c。例如:a=2,b=16,则 c=216;若 a=18,b=476, 则 c=18476。 提示:求 c 的公式为: c=a×K+b 其中:29 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&&第六课for 循环语句在实际应用中,会经常遇到许多有规律性的重复运算,这就需要掌握本章所 介绍的循环结构程序设计。在 Pascal 语言中,循环结构程序通常由三种的循环 语句来实现。它们分别为 FOR 循环、当循环和直到循环。通常将一组重复执行的 语句称为循环体,而控制重复执行或终止执行由重复终止条件决定。因此,重复 语句是由循环体及重复终止条件两部分组成。 一、for 语句的一般格式 for &控制变量&:=&表达式 1& to &表达式 2& do &语句&; for &控制变量&:=&表达式 1& downto &表达式 2& do &语句&; 其中 for、to、downto 和 do 是 Pascal 保留字。表达式 1 与表达式 2 的值 也称为初值和终值。 二、For 语句执行过程 ①先将初值赋给左边的变量(称为循环控制变量); ②判断循环控制变量的值是否已&超过&终值,如已超过,则跳到步骤⑥; ③如果末超过终值,则执行 do 后面的那个语句(称为循环体); ④循环变量递增(对 to)或递减(对 downto)1; ⑤返回步骤②; ⑥循环结束,执行for循环下面的一个语句。 三、说明 ①循环控制变量必须是顺序类型。例如,可以是整型、字符型等,但不能为 实型。 ②循环控制变量的值递增或递减的规律是:选用 to 则为递增;选用 downto 则递减。 ③所谓循环控制变量的值&超过&终值,对递增型循环,&超过&指大于,对递 减型循环,&超 过&指小于。 ④循环体可以是一个基本语句,也可以是一个复合语句。 ⑤循环控制变量的初值和终值一经确定,循环次数就确定了。但是在循环体 内对循环变量的值进行修改,常常会使得循环提前结束或进入死环。建议不要在 循环体中随意修改控制变量的值。 ⑥for 语句中的初值、终值都可以是顺序类型的常量、变量、表达式。 四、应用举例 例 1.输出 1-100 之间的所有偶数。 var i: begin30 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& for i:=1 to 100 do if i mod 2=0 then write(i:5); end. 例 2.求 N!=1*2*3*?*N ,这里 N 不大于 10。 分析:程序要先输入 N,然后从 1 累乘到 N。 程序如下: var n,i : integer;{i 为循环变量} S :{s 作为累乘器} begin write('Enter n=');readln(n);{输入 n} s:=1; for i:=2 to n do{从 2 到 n 累乘到 s 中} s:=s*i; writeln(n,'!=',s);{输出 n!的值} end. 练 习1. 求 s=1+4+7+?+298 的值。 2. 编写一个评分程序,接受用户输入 10 个选手的得分(0-10 分),然后去 掉一个最高分和一个最低分,求出某选手的最后得分(平均分)。 3. 用一张一元票换 1 分、2 分和 5 分的硬币,每种至少一枚, 问有哪几 种换法(各几枚)?31 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&&第七课一、WHILE 循环WHILE 循环与 REPEAT对于 for 循环有时也称为计数循环,当循环次数未知,只能根据某一条件来决定是否进行循环时,用 while 语句或 repeat 语句实现循环要更方便。 while 语句的形式为: while &布尔表达式& do &语句&; 其意义为:当布尔表达式的值为 true 时,执行 do 后面的语句。 while 语句的执行过程为: ①判断布尔表达式的值,如果其值为真,执行步骤 2,否则执行步骤 4; ②执行循环体语句(do 后面的语句); ③返回步骤 1; ④结束循环,执行 while 的下一个语句。 说明:这里 while 和 do 为保留字,while 语句的特点是先判断,后执行。 当布尔表达式成立时,重 复执行 do 后面的语句(循环体)。 例 1 、求恰好使 s=1+1/2+1/3+?+1/n 的值大于 10 时 n 的值。 分析:&恰好使 s 的值大于 10&意思是当表达式 s 的前 n-1 项的和小于或等于 10,而加上了第 n 项后 s 的值大于 10。从数学角度,我们很难计算这个 n 的值。故从第一项开始,当 s 的值小于或等于 10 时,就 继续将下一项值累加起来。当 s 的值超过 10 时,最后一项的项数即为要求的 n。 程序如下: var s : n :{n 表示项数} begin s:=0.0;n:=0; while s&=10 do{当 s 的值还未超过 10 时} begin n:=n+1;{项数加 1} s:=s+1/n;{将下一项值累加到 s} writlen('n=',n);{输出结果} end. 例 2、求两个正整数 m 和 n 的最大公约数。 分析:求两个正整数的最大公约数采用的辗转相除法求解。以下是辗转的算法: 分别用 m,n,r 表示被除数、除数、余数。 ①求 m/n 的余数 r. ②若 r=0,则 n 为最大公约数.若 r≠0,执行第③步. ③将 n 的值放在 m 中,将 r 的值放在 n 中. ④返回重新执行第①步。 程序如下: program ex4_4;32 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&&var m,n,a,b,r: begin write('Input m,n:'); readln(m,n); a:=m;b:=n;r:= while r&&0 do begin a:=b;b:=r; r:= writeln('The greatest common divide is:',b:8); end. 二、直到循环(REPEAT-until 语句) 用 while 语句可以实现&当型循环&,用 repeat-until 语句可以实现&直到型循环&。repeat-until 语 句的含义是:&重复执行循环,直到指定的条件为真时为止&。 直到循环语句的一般形式: Repeat &语句 1&; : &语句 n&; until &布尔表达式&; 其中 Repeat、until 是 Pascal 保留字,repeat 与 until 之间的所有语句称为循环体。 说明: ①repeat 语句的特点是:先执行循环,后判断结束条件,因而至少要执行一次循环体。 ②repeat-until 是一个整体,它是一个(构造型)语句,不要误认为 repeat 是一个语句, until 是 另一个语句。 ③repeat 语句在布尔表达式的值为真时不再执行循环体,且循环体可以是若干个语句,不需用 begin 和 end 把它们包起来, repeat 和 until 已经起了 begin 和 end 的作用。while 循环和 repeat 循环是可以 相互转化的。 对于例 2 中求两个正整数的最大公约数,程序可用 repeat-until 循环实现如下: var m,n,a,b,r : begin write('Input m,n='); readln(m,n); a:=m;b:=n; repeat r:= a:=b;b:=r; until r=0; writeln('The greatest common divide is',a); end.33 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&&以上我们已介绍了三种循环语句。一般说来,用 for 循环比较简明,只要能用 for 循环,就尽量作用 for 循环。只在无法使用 for 循环时才用 while 循环和 repeat-until 循环, 而且 while 循环和 repeat-until 循环是可以互相替代的。for 循环在大多数场合也能用 whiel 和 repeat-until 循环来代替。 一般 for 循环用于有确定次数循环,而 while 和 repeat-until 循环用于未确定循环次数的循环。 当一个循环的循环体中又包含循环结构程序时,我们就称之为循环嵌套。三、循环结构程序设计 例 3 求 1!+2!+?+10!的值。 分析:这个问题是求 10 自然数的阶乘之和,可以用 for 循环来实现。程序 结构如下: for n:=1 to 10 do begin ①N!的值 àt ②累加 N!的值 t end 显然,通过 10 次的循环可求出 1!,2!?,10!,并同时累加起来, 可求得 S 的 值。而求 T=N!,又可以用一个 for 循环来实现: t=1; for j:=1 to n do t:=t*j; 因此,整个程序为: program ex4_5; var t,s: i,j,n: begin S:=0; for n:=1 to 10 do begin t:=1; for j:=1 to n do t:=t*j; S:=S+t; writeln('s=',s:0:0); end. 以上的程序是一个二重的 for 循环嵌套。这是比较好想的方法,但实际上对 于求 n!,我们可以根据求出的(n-1)!乘上 n 即可得到,而无需重新从 1 再累乘 到 n。 程序可改为: program ex4_5; var t,s: i,j,n: begin34 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& S:=0;t:=1; for n:=1 to 10 do begin t:=t*n; S:=S+t; writeln('s=',s:0:0); end. 显然第二个程序的效率要比第一个高得多。第一程序要进行 1+2+?+10=55 次循环,而第二程序进行 10 次循环。如题目中求的是 1!+2!+?+1000!, 则两个程序的效率区别更明显。 例 4 一个炊事员上街采购,用 500 元钱买了 90 只鸡, 其中母鸡一只 15 元, 公鸡一只 10 元,小鸡一只 5 元,正好把钱买完。 问母鸡、 公鸡、 小鸡各买多少只? 分析:设母鸡 I 只,公鸡 J 只,则小鸡为 90-I-J 只,则 15*I+ 10* J+(90-I-J)*5=500,显然一个方程求两个未知数是不能直接求解。必须组合出所 有可能的 i,j 值,看是否满足条件。这里 I 的值可以是 0 到 33,J 的值可以 0 到 50。 源程序如下: programr ex4_6; var i,j,k: begin for i:=1 to 5 do for j:=1 to 8 do begin k:=90-i-j; if 15*i+10*j+5*k=500 then writeln(i:5,j:5,k:5); end. 例 5、求 100-200 之间的所有素数。 分析:我们可对 100-200 之间的每一整数进行判断,判断它是否为素数, 是则输出。而对于任意整数 i,根据素数定义,我们从 2 开始,到 ,找 i 的第 一个约数。若找到第一个约数,则 i 必然不是素数。否则 i 为素数。 源程序如下: var i : x : begin for i:=100 to 200 do begin x:=2; while (x&=trunc(sqrt(i)))and(i mod x&&0)do begin35 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& x:=x+1; if x&trunc(sqrt(i)) then write(i:8); end. 练 习1、输入一个正整数 n,将 n 分解成质因数幂的乘积形式。 例如:36=22*32 2、输出如下图形。3、编写一程序,验证角谷猜想。所谓的角谷猜想是:&对于任意大于 1 的自 然数 n,若 n 为奇数,则将 n 变为 3*n+1,否则将 n 变为 n 的一半。经过若干次 这样的变换,一定会使 n 变为 1。& 4.有一堆 100 多个的零件,若三个三个数,剩二个;若五个五个数,剩三 个;若七个七个数,剩五个。请你编一个程序计算出这堆零件至少是多少个?36 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&&第八课 一维数组一、为什么要使用数组 例 1 输入 50 个学生的某门课程的成绩,打印出低于平均分的同学号数与 成绩。 分析:在解决这个问题时,虽然可以通过读入一个数就累加一个数的办法来 求学生的总分,进而求出平均分。但因为只有读入最后一个学生的分数以后才能 求得平均分,且要打印出低于平均分的同学,故必须把 50 个学生的成绩都保留 下来, 然后逐个和平均分比较,把高于平均分的成绩打印出来。如果,用简单 变量 a1,a2,?,a50 存放这些数据,可想而知程序要很长且繁。 要想如数学中使用下标变量 ai 形式表示这 50 个数,则可以引入下标变量 a[i]。这样问题的程序可写为: tot:=0;{tot 表示总分} for i:=1 to 50 do {循环读入每一个学生的成绩,并累加它到总分} begin read(a[i]); tot:=tot+a[i]; ave:=tot/50;{计算平均分} for i:=1 to 50 do if a[i]&ave then writeln('No.',i,' ',a[i]);{如果第 i 个同学成绩 小于平均分,则将输出} 而要在程序中使用下标变量,则必须先说明这些下标变量的整体D数组,即 数组是若干个同名(如上面的下标变量的名字都为 a)下标变量的集合。 二、一维数组 当数组中每个元素只带有一个下标时,我们称这样的数组为一维数组。 1、一维数组的定义 (1)类型定义 要使用数组类型等构造类型以及第 6 章要学习的自定义类型(枚举类型与子 界类型),应在说明部分进行类型说明。 这样定义的数据类型适用整个程序。 类型定义一般格式为: type &标识符 1&=&类型 1&; &标识符 2&=&类型 2&; : &标识符 n&=&类型 n&; 其中 type 是 Pascal 保留字,表示开始一个类型定义段。在其后可以定义若 干个数据类型定义。&标识符&是为定义的类型取的名字, 称它为类型标识符。 类型定义后, 也就确定了该类型数据取值的范围, 以及数据所能执行的运算。 (2)一维数组类型的定义 一维数组类型的一般格式: array[下标 1..下标 2] of &基类型&;37 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& 说明:其中 array 和 of 是 pascal 保留字。下标 1 和下标 2 是同一顺序类 型, 且下标 2 的序号大于下标 1 的序号。 它给出了数组中每个元素(下标变量) 允 许使用的下标类型,也决定了数组中元素的个数。基类型是指数组元素的类型, 它可以是任何类型,同一个数组中的元素具有相同类型。因此我们可以说,数组 是由固定数量的相同类型的元素组成的。 再次提请注意:类型和变量是两个不同概念,不能混淆。就数组而言,程序 的执行部分使用的不是数组类型(标识符)而是数组变量(标识符)。 一般在定义数组类型标识符后定义相应的数组变量,如: type arraytype=array[1..8] var a1,a2: 其中 arraytype 为一个类型标识符,表示一个下标值可以是 1 到 8,数组元素 类型为整型的一维数组;而 a1,a2 则是这种类型的数组变量。 也可以将其全并起来: var a1,a2:array[1..8] 当在说明部分定义了一个数组变量之后,pascal 编译程序为所定义的数组 在内存空间开辟一串连续的存储单元。 例如,设程序中有如下说明: type rowtype=array[1..8] coltype=array['a'..'e'] var a:b: 2、一维数组的引用 当定义了一个数组, 则数组中的各个元素就共用一个数组名( 即该数组变量 名),它们之间是通过下标不同以示区别的。 对数组的操作归根到底就是对数组 元素的操作。一维数组元素的引用格式为: 数组名[下标表达式] 说明:①下标表达式值的类型, 必须与数组类型定义中下标类型完全一致, 并且不允许超越所定义的下标下界和上界。 ②数组是一个整体,数组名是一个整体的标识,要对数组进行操作, 必须对其元素操作。数组元素可以象同类型的普通变量那样作用。如:a[3]:=34; 是对数组 a 中第三个下标变量赋以 34 的值。 read(a[4]);是从键盘读入一个数到 数组 a 第 4 个元素中去。 特殊地,如果两个数组类型一致,它们之间可以整个数组元素进行传送。如: var a,b,c:array[1..100] begin c:=a;a:=b;b:=c; end. 在上程序中,a,b,c 三个数组类型完全一致, 它们之间可以实现整数组传 送,例子中,先将 a 数组所有元素的值依次传送给数组 c,同样 b 数组传给 a, 数组 c 又传送给 b,上程序段实际上实现了 a,b 两个数组所有元素的交换。 对于一维数组的输入与输出, 都只能对其中的元素逐个的输入与输出。 在下 面的应用示例中将详细介绍。 三、一维数组应用示例 例 2 输入 50 个数,要求程序按输入时的逆序把这 50 个数打印出来。也就是 说,请你按输入相反顺序打印这 50 个数。38 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& 分析:我们可定义一个数组 a 用以存放输入的 50 个数, 然后将数组 a 内容 逆序输出。 源程序如下: program ex5_1; type arr=array[1..50] {说明一数组类型 arr} var a:i: begin writeln('Enter 50 integer:'); for i:=1 to 50 do read(a[i]);{从键盘上输入 50 个整数} for i:=50 downto 1 do {逆序输出这 50 个数} write(a[i]:10); end. 例 3 输入十个正整数,把这十个数按由小到大的顺序排列。 将数据按一定顺序排列称为排序,排序的算法有很多,其中选择排序是一种 较简单的方法。 分析:要把十个数按从小到大顺序排列,则排完后,第一个数最小,第二个 数次小,??。因此,我们第一步可将第一个数与其后的各个数依次比较,若发 现,比它小的,则与之交换,比较结束后,则第一个数已是最小的数(最小的泡 往下冒)。同理,第二步,将第二个数与其后各个数再依次比较,又可得出次小 的数。如此方法进行比较,最后一次,将第九个数与第十个数比较,以决定次大 的数。于是十个数的顺序排列结束。 例如下面对 5 个进行排序,这个五个数分别为 8 2 9 10 5。按选择排 序方法,过程如下: 初始数据 :8 2 9 10 5 第一次排序:8 2 9 10 5 9 2 8 10 5 10 2 8 9 5 10 2 8 9 5 第二次排序:10 8 2 9 5 10 9 2 8 5 10 9 2 8 5 第三次排序:10 9 8 2 5 10 9 8 2 5 第四次排序:10 9 8 5 2 对于十个数,则排序要进行 9 次。源程序如下: program ex5_2; var a:array[1..10] i,j,t: begin writeln('Input 10 integers:'); for i:=1 to 10 do read(a[i]);{读入 10 个初始数据} for i:=1 to 9 do{进行 9 次排序}39 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& begin for j:=i+1 to 10 do{将第 i 个数与其后所有数比较} if a[i]&a[j] then {若有比 a[i]大,则与之交换} begin t:=a[i];a[i]:=a[j];a[j]:=t; write(a[i]:5); end. 练习: 1.输入一串小写字母(以&.&为结束标志),统计出每个字母在该字符串中 出现的次数(若某字母不出现,则不要输出)。 例: 输入:aaaabbbccc. 输出:a:4 b:3 c:3 2.输入一个不大于 32767 的正整数 N,将它转换成一个二进制数。 例如: 输入:100 输出: .输入一个由 10 个整数组成的序列,其中序列中任意连续三个整数都互不 相同,求该序列中所有递增或递减子序列的个数。 例如: 输入:1 10 8 5 9 3 2 6 7 4 输出:6 对应的递增或递减子序列为: 1 10 10 8 5 5 9 9 3 2 2 6 7 7 440 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&&第九课多维数组一、多维数组的定义 当一维数组元素的类型也是一维数组时,便构成了二维数组。二维数组定义 的一般格式: array[下标类型 1] of array[下标类型 2] of 元素类型; 但我们一般这样定义二维数组: array[下标类型 1,下标类型 2] of 元素类型; 说明:其中两个下标类型与一维数组定义一样,可以看成&下界 1..上界 1& 和&下界 2..上界 2&, 给出二维数组中每个元素( 双下标变量)可以使用下标值的 范围。of 后面的元素类型就是基类型。 一般地,n 维数组的格式为: array[下标类型 1,下标类型 2,?,下标类型 n] of 元素类型; 其中, 下标类型的个数即数组的维数, 且说明了每个下标的类型及取值范围。 二、多维数组元素的引用 多维数组的数组元素引用与一维数组元素引用类似, 区别在于多维数组元素 的引用必须给出多个下标。 引用的格式为: &数组名&[下标 1,下标 2,?,下标 n] 说明:显然,每个下标表达式的类型应与对应的下标类型一致,且取值不超 出下标类型所指定的范围。 例如,设有说明: type matrix=array[1..5,1..4] var a: 则表示 a 是二维数组,共有 5*4=20 个元素,它们是: a[1,1]a[1,2]a[1,3]a[1,4] a[2,1]a[2,2]a[2,3]a[2,4] a[3,1]a[3,2]a[3,3]a[3,4] a[4,1]a[4,2]a[4,3]a[4,4] a[5,1]a[5,2]a[5,3]a[5,4] 因此可以看成一个矩阵,a[4,2]即表示第 4 行、第 2 列的元素。由于计 算机的存储器是一维的,要把二维数组的元素存放到存储器中,pascal 是按行 (第一个下标)的次序存放,即按 a[1,1]a[1,2]a[1,3]a[1,4]a[2, 1]?,a[5,4]的次序存放于存储器中某一组连续的存储单元之内。 对于整个二维数组的元素引用时,大多采用二重循环来实现。如:给如上说 明的二维数组 a 进行赋值:a[i,j]=i*j。 for i:=1 to 5 do for j:=1 to 4 do a[i,j]:=i*j; 对二维数组的输入与输出也同样可用二重循环来实现: for i:=1 to 5 do begin for j:=1 to 4 do41 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& read(a[i,j]); for i:=1 to 5 do begin for j:=1 to 4 do write(a[i,j]:5); 三、多维数组的应用示例 例 1 设有一程序: program ex5_3; const n=3; type matrix=array[1..n,1..n] var a: i,j:1..n; begin for i:=1 to n do begin for j:=1 to n do read(a[i,j]); for i:=1 to n do begin for j:=1 to n do write(a[j,i]:5); end. 且运行程序时的输入为: 2□1□3←┘ 3□3□1←┘ 1□2□1←┘ 则程序的输出应是: 2□3□1 1□3□2 3□1□1 例 2 输入 4 名学生数学、物理、英语、化学、pascal 五门课的考试成绩, 求出每名学生的平均分,打印出表格。 分析:用二维数组 a 存放所给数据,第一下标表示学生的学号, 第二个下标 表示该学生某科成绩,如 a[i,1]、a[i,2]、a[i,3]、a[i,4]、a[i,5]分别存放 第 i 号学生数学、物理、英语、化学、pascal 五门课的考试成绩,由于要求每个 学生的总分和平均分, 所以第二下标可多开两列,分别存放每个学生 5 门成绩42 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& 和总分、平均分。 源程序如下: program ex5_4; var a:array[1..4,1..7] i,j: begin fillchar(a,sizeof(a),0); {函数 fillchar 用以将 a 中所有元素置为 0} writeln('Enter 4 students score'); for i:=1 to 4 do begin for j:=1 to 5 do {读入每个人 5 科成绩} begin read(a[i,j]); {读每科成绩时同时统计总分} a[i,6]:=a[i,6]+a[i,j]; a[i,7]:=a[i,6]/5;{求平均分} {输出成绩表} writeln( 'No. Mat. Phy. Eng. Che. Pas. Tot. Ave.'); for i:=1 to 4 do begin write(i:2,' '); for j:=1 to 7 do write(a[i,j]:9:2); end. 四、数组类型的应用 例 3 输入一串字符,字符个数不超过 100,且以&.&结束。 判断它们是否构成 回文。 分析:所谓回文指从左到右和从右到左读一串字符的值是一样的,如 12321,ABCBA,AA 等。先读入要判断的一串字符(放入数组 letter 中),并记住 这串字符的长度,然后首尾字符比较,并不断向中间靠拢,就可以判断出是否为 回文。 源程序如下: program ex5_5; var letter : array[1..100] i,j : 0..100; ch :43 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& begin {读入一个字符串以'.'号结束} write('Input a string:'); i:=0;read(ch); while ch&&'.' do begin i:=i+1;letter[i]:= read(ch) {判断它是否是回文} j:=1; while (j&i)and(letter[j]=letter[i])do begin i:=i-1;j:=j+1; if j&=i then writeln('Yes.') else writeln('No.'); end. 例 4 奇数阶魔阵 魔阵是用自然数 1,2,3?,n2 填 n 阶方阵的各个元素位置,使方阵的每行 的元素之和、每列元素之和及主对角线元素之和均相等。奇数阶魔阵的一个算法 是将自然数数列从方阵的中间一行最后一个位置排起,每次总是向右下角排(即 Aij 的下一个是 Ai+1,j+1)。但若遇以下四种情形,则应修正排数法。 (1) 列排完(即 j=n+1 时),则转排第一列; (2) 行排完(即 i=n+1 时),则转排第一行; (3) 对 An,n 的下一个总是 An,n-1; (4) 若 Aij 已排进一个自然数,则排 Ai-1,j-2。 例如 3 阶方阵,则按上述算法可排成: 4 3 8 9 5 1 2 7 6 有了以上的算法,解题主要思路可用伪代码描述如下: 1 i n div 2+1,y n /*排数的初始位置*/ 2 a[i,j] 1; 3 for k:=2 to n n do 4 计算下一个排数位置 (i,j); 5 if a[i,j]&&0 then 6 i i-1; 7 j j-2; 8 a[i,j] 9 endfor 对于计算下一个排数位置,按上述的四种情形进行,但我们应先处理第三处44 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& 情况。算法描述如下: 1 if (i=n)and(j=n) then 2 j j-1; /*下一个位置为(n,n-1)*/; 3 else 4 i i mod n +1; 5 j j mod n +1; 6 源程序如下: program ex5_7; var a : array[1..99,1..99] i,j,k,n : begin fillchar(a,sizeof(a),0); write('n=');readln(n); i:=n div 2+1;j:=n; a[i,j]:=1; for k:=2 to n*n do begin if (i=n)and(j=n) then j:=j-1 else begin i:=i mod n +1; j:=j mod n +1; if a[i,j]&&0 then begin i:=i-1; j:=j-2; a[i,j]:=k; for i:=1 to n do begin for j:=1 to n do write(a[i,j]:5); end. 练习: 1、 输入 N 个同学的语、数、英三科成绩,计算他们的总分与平均分,并统 计出每个同学的名次,最后以表格的形式输出。45 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& 2、 输出杨辉三角的前 N 行(N&10)。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 146 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&&第十课字符与字符串处理一、字符、字符串类型的使用 (一)字符类型 字符类型为由一个字符组成的字符常量或字符变量 。 字符常量定义: const 字符常量='字符' 字符变量定义:Ⅱ Var 字符变量: 字符类型是一个有序类型, 字符的大小顺序按其 ASCⅡ代码的大小而定。函 数 succ、pred、ord 适用于字符类型。 例如:后继函数:succ('a')='b' 前继函数:pred('B')='A' 序号函数:ord('A')=65 例 1 按字母表顺序和逆序每隔一个字母打印。即打印出: a c e g I k m o q s u w y z x r v t p n l j h f d b 程序如下: program ex8_1; var letter: begin for letter:='a' to 'z' do if (ord(letter)-ord('a'))mod 2=0 then write(letter:3); for letter:='z' downto 'a' do if (ord(letter)-ord('z'))mod 2 =0 then write(letter:3); end. 分析:程序中,我们利用了字符类型是顺序类型这一特性,直接将字符类型 变量作为循环变量,使程序处理起来比较直观。 (二)字符串类型 字符串是由字符组成的有穷序列。 字符串类型定义: type &字符串类型标识符&=string[n]; var 字符串变量: 字符串类型标识符; 其中:n 是定义的字符串长度,必须是 0~255 之间的自然整数,第 0 号单元中 存放串的实际长度,程序运行时由系统自动提供,第 1~n 号单元中存放串的字符。 若将 string[n]写成 string,则默认 n 值为 255。 例如:type man=string[8];47 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& line=string; var name:man; screenline:line; 另一种字符类型的定义方式为把类型说明的变量定义合并在一起。 例如:VAR name:STRING[8]; screenline:STRING; Turbo Pascal 中,一个字符串中的字符可以通过其对应的下标灵活使用。 例如:var name:string; begin readln(nsme); for i:=1 to ord(name[0])do writeln(name[i]); end. 语句 writeln(name[i])输出 name 串中第 i 个字符。 例 2 求输入英文句子单词的平均长度. 程序如下: program ex8_2; var ch: s,count,j: begin write('The sentence is :'); readln(ch); s:=0; count:=0; j:=0; repeat inc(j); if not (ch[j] in [':',',',';','''','!','?','.',' ']) then inc(s); if ch[j] in[' ','.','!','?'] then inc(count); until (j=ord(ch[0])) or (ch[j] in ['.','!','?']); if ch[j]&&'.' then writeln('It is not a sentence.') else writeln('Average length is ',s/count:10:4); end. 分析:程序中,变量 s 用于存句子中英文字母的总数,变量 count 用于存放 句子中单词的个数,ch[j]表示 ch 串中的第 j 个位置上的字符,ord(ch[0])为 ch 串的串长度。程序充分利用 Turbo Pascal 允许直接通过字符串下标得到串中 的字符这一特点,使程序比较简捷。48 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& 二、字符串的操作 (一)字符串的运算和比较 由字符串的常量、变量和运算符组成的表达式称为字符串表达式。 字符串运算符包括: 1.+:连接运算符 例如:'Turbo '+'PASCAL'的结果是'Turbo PASCAL'。 若连接的结果字符串长度超过 255,则被截成 255 个字符。若连接后的字符 串存放在定义的字符串变量中,当其长度超过定义的字符串长度时,超过部份字 符串被截断。 例如:var str1,str2,str3:string[8]; begin str1:='Turbo '; str2:='PASCAL'; str3:=str1+str2; end. 则 str3 的值为:'Turbo PA'。 2.=、〈〉、〈、〈=、〉、〉=:关系运算符 两个字符串的比较规则为,从左到右按照 ASCⅡ码值逐个比较,遇到 ASCⅡ 码不等时,规定 ASCⅡ码值大的字符所在的字符串为大。 例如:'AB'〈'AC' 结果为真; '12'〈'2' 结果为真; 'PASCAL '='PASCAL' 结果为假; 例 3 对给定的 10 个国家名,按其字母的顺序输出。 程序如下: program ex8_3; var i,j,k: t:string[20]; cname:array[1..10] of string[20]; begin for i:=1 to 10 do readln(cname[i]); for i:=1 to 9 do begin k:=i; for j:=i+1 to 10 do if cname[k]&cname[j] then k:=j; t:=cname[i];cname[i]:=cname[k];cname[k]:=t; for i:=1 to 10 do writeln(cname[i]); end. 分析:程序中,当执行到 if cname[k]&cname[j]时,自动将 cname[k]串与 cname[j]串中的每一个字符逐个比较,直至遇到不等而决定其大小。这种比较方 式是计算机中字符串比较的一般方式。 三、字符串的函数和过程49 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& Turbo Pascal 提供了八个标准函数和标准过程,见下表,利用这些标准函数 与标准过程,一些涉及到字符串的问题可以灵活解决。函数和过程名 copy(s,m,n) length(s) pos(sub,s) insert(sour,s,m) 功 能 说 明取 s 中第 m 个字符开 若 m 大于 s 的长度,则返回空串;否则, 始的 n 个字符 求 s 的动态的长度 在 s 中找子串 sub 在 s 的第 m 个字符位 置处插入子串 sour 若 m+n 大于 s 的长度,则截断 返回值为整数 返回值为 sub 在 s 中的位置, byte 型 为 若返回串超过 255,则截断delete(s,m,n)删除 s 中第 m 个字符 若 m 大于 s 的长度,则不删除;否则, 开始的 n 个字符串 若 m+n 大于 s 的长度,则删除到结尾Str(x[:w[:d]],s)将整数或实数 x 转换 w 和 d 是整型表达式,意义同带字宽的 成字符串 s write 语句val(s,x,code)将字符串 S 转换成 若 S 中有非法字符, code 存放非法字 则 整数或实数 x 符在 S 中的下标; 否则, code 为零。 code 为整型upcase(ch)将字母 ch 转换成大 写字母若 ch 不为小写字母,则不转换例 4 校对输入日期(以标准英语日期,月/日/年)的正确性,若输入正确则 以年.月.日的方式输出。 程序如下: program ex8_4; const max:array[1..12] of byte =(31,29,31,30,31,30,31,31,30,31,30,31); var st: p,w,y,m,d: begin write('Input Error!'); procedure init(var x:integer); begin p:=pos('/',st); if (p=0) or (p=1) or (p&3) val(copy(st,1,p-1),x,w); if w&&050 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& delete(st,1,p); begin write('The Date is :'); readln(st); init(m); init(d); val(st,y,w); if not (length(st)&&4) or (w&&0) or (m&12) or (d&max[m]) if (m=2) and (d=29) then if y mod 100=0 then begin if y mod 400&&0 end else if y mod 4&&0 write('Date : ',y,'.',m,'.',d); end. 分析:此题的题意很简单,但在程序处理时还需考虑以下几方面的问题。 1.判定输入的月和日应是1位或2位的数字,程序中用了一个过程 inst, 利用串函数 pos,求得分隔符/所在的位置而判定输入的月和日是否为1位或2 位,利用标准过程 val 判定输入的月和日是否为数字; 2.判定月和日是否规定的日期范围及输入的年是否正确; 3.若输入的月是 2 月份,则还需考虑闰年的情况。 例 5 对输入的一句子实现查找且置换的功能。 程序如下: program ex8_5; var s1,s,o: i: begin write('The text:'); readln(s1); write('Find:');readln(s); write('Replace:');readln(o); i:=pos(s,s1); while i&&0 do begin delete(s1,i,length(s)); insert(o,s1,i); i:=pos(s,s1); writeln(s1); end.51 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&& 分析:程序中,输入要查找的字符串及要置换的字符串,充分用上了字符串处 理的标准过程 delete、insert 及标准函数 pos。52 洛阳市 014 子弟学校信息学竞赛辅导 &&Pascal 基础教程&&第十一课枚举、子界、集合及记录类型在前面几章中我们用到了整型、实型、布尔型、字符型的数据。以上数据类 型是由 pascal 规定的标准数据类型,只要写 integer,real,boolean, char, pascal 编译系统就能识别并按这些类型来处理。pascal 还允许用户定义一些类 型,这是其它一些语言所没有的,这就使得 pascal 使用灵活、功能丰富。 一、枚举类型 随着计算机的不断普及,程序不仅只用于数值计算,还更广泛地用于处理非 数值的数据。例如,性别、月份、星期几、颜色、单位名、学历、职业等,都不 是数值数据。 在其它程序设计语言中,一般用一个数值来代表某一状态,这种处理方法不 直观,易读性差。如果能在程序中用自然语言中有相应含义的单词来代表某一状 态,则程序就很容易阅读和理解。也就是说,事先考虑到某一变量可能取的值, 尽量用自然语言中含义清楚的单词来表示它的每一个值,这种方法称为枚举方 法,用这种方法定义的类型称枚举类型。

我要回帖

更多关于 小程序调用函数 的文章

 

随机推荐