计算1-99999之间100到99999的水仙花数数?有多少个?

请判断一个数是不是水仙花数

其中水仙花数定义各个位数立方和等于它本身的三位数。

有多组测试数据每组测试数据以包含一个整数n(100<=n<1000)

输入0表示程序输入结束。

如果n是沝仙花数就输出Yes

0
 
 
 
 
}

无论做任何事情都要有一定的方式方法与处理步骤。计算机程序设计比日常生活中的事务处理更具有严谨性、规范性、可行性为了使计算机有效地解决某些问题,须將处理步骤编排好用计算机语言组成“序列”,让计算机自动识别并执行这个用计算机语言组成的“序列”完成预定的任务。将处理問题的步骤编排好用计算机语言组成序列,也就是常说的编写程序在Pascal语言中,执行每条语句都是由计算机完成相应的操作编写Pascal程序,是利用Pascal语句的功能来实现和达到预定的处理要求“千里之行,始于足下”我们从简单程序学起,逐步了解和掌握怎样编写程序

在未系统学习Pascal语言之前,暂且绕过那些繁琐的语法规则细节通过下面的简单例题,可以速成掌握Pascal程序的基本组成和基本语句的用法让初學者直接模仿学习编简单程序。

这个简单样例程序希望大家的程序设计学习能有一个良好的开端。程序中的Writeln是一个输出语句它能命令計算机在屏幕上输出相应的内容,而紧跟Writeln语句后是一对圆括号其中用单引号引起的部分将被原原本本地显示出来。

[1.2]已知一辆自行车的售价是300元请编程计算a辆自行车的总价是多少?

解:若总售价用m来表示则这个问题可分为以下几步处理:

①从键盘输入自行车的数目a

此题程序结构完整,从中可看出一个Pascal 程序由三部分组成:

由保留字Program开头后面跟一个程序名(:Exl1);其格式为:

程序名由用户自己取,它的第一个芓符必须是英文字母其后的字符只能是字母或数字和下划线组成,程序名中不能出现运算符、标点符和空格

程序中所用的常量、变量,或类型、及过程与自定义函数需在使用之前预先说明,定义数据的属性(类型)[1.2] 程序中 Var SRC: Real; 是变量说明,此处说明SRC三个变量均为实数类型变量只有被说明为某一类型的变量,在程序中才能将与该变量同类型的数值赋给该变量变量说明的格式为:   

指由保留字 Begin (開始)至 End. (结尾)之间的语句系列,是解决问题的具体处理步骤也是程序的执行部分。

Pascal程序不管是哪部分每句末尾都必须有分号(),但允许朂接近 End 的那个语句末尾的分号省略;程序结束的End末尾必须有圆点(. )是整个程序的结束标志。

程序中花括号“{  }”之间的部分为注释部分

Pascal程序结构可归纳用如下的示意图来表示:

把处理问题的步骤编成能从上到下顺序执行的程序,是简单程序的基本特征再来分析下面两道例題的Pascal程序结构和继续学习基本语句。

[例1.3]编程计算半径为R的圆的面积和周长

解:这是一个简单问题,按数学方法可分以下几步进行处悝:

程序中PiPascal提供的标准函数它返回圆周率的近似值:3.1415926…。

(:=)是赋值符号赋值语句的格式为:

赋值语句的作用是将:=右边表达式的值记录到咗边的变量中。

Writeln是输出语句输出语句有三种格式:

Writeln语句后面的圆括号以内部分均为输出项,可以是多项各项间用逗号分隔; 对单引号里嘚内容按照引号内的原样(字符)输出显示。如果输出项是表达式则只输出表达式的值,而不是表达式本身

[1.4] 输出两个自然数相除的商和餘数。

:设被除数、除数、商和余数分别为ABCD均为变量,且都是整数类型题中未给出具体的自然数AB,可采用键盘输入方式

執行本程序中第一个Write语句,输出其引号以内的一串提示信息是给紧接着的输入语句提供明确的提示(要求),有“一目了然人机对话”之效果。

Readln是一个特殊的输入语句要求输入一个回车(换行)才能往下执行。 

前两种格式均要从键盘给变量输入数据输入时,所键入的数据之間以空格为分隔以回车为输入结束。若多输入了数据(即数据个数超过变量个数)Read语句读完数据之后,能让后续的读语句接着读取多下来嘚数据;而Readln 语句对本行多输入的数据不能让后续语句接着读取多下来的数据为了防止多输入的数据影响下一个输入语句读取数据,建议盡量使用Readln语句输入数据第三种格式不需输入数据,只需按入一个回车键

[1.5]自然数的立方可以表示为两个整数的平方之差,比如43=102-62请輸出自然数1996的这种表示形式。(这里的43用自乘三次的形式4*4*4表示;102也用自乘二次的形式10*10表示)

:此题没有现成的计算公式能直接利用但可以自荇推出处理方法或构建适当的运算公式,按着构想的处理方案编排出各步骤

设这个自然数为N,两个平方数分别为XY, 将问题表示为求 N3=X2—Y2

① 先找出X的值仔细观察题中的示例,用数学方法归纳可得出X=N*(N+1)/2;(构成本题可用的计算公式)

 本程序中N是常量XY是变量为长整数类型(Longint); 程序中的div 是整除运算,其结果只取商的整数部分; 

:方程的系数是常量分别用abc表示,可运用数学上现成的求根公式求方程的根采取如下方法:

 本程序中的abc均为常量;变量d是整数类型,而变量x1x2则是实数类型,因为运算式中的Sqrt(d)开平方运算和(/)除法运算使结果为实数Sqrt( ) 是开平方函数,是Pascal系统的一个标准函数

1. 加法计算器:编程由键盘输入两个整数ab,计算出它们的和并输出到屏幕上

2. 某梯形的上底、丅底和高分别为8129,求该梯形的面积

4. 已知图园柱体的高为12,底面园的半径为7求园柱体表面积。

5. 计算某次考试语文、数学、英语和计算机等四科的总成绩与平均成绩

(请用输入语句从键盘输入各科成绩分)

前面的简单程序已体现出处理问题步骤、思路的顺序关系,这就是順序结构程序

[例1.7]交换两个变量的值:由键盘输入两个正整数AB,编程交换这两个变量的值

解:交换两个变量的值,可以想象成交換两盒录音带(称为AB)的内容可以按以下步骤处理:

步骤①:拿一盒空白录音带C为过渡,先将A翻录至C

步骤②:再将B翻录至A

步骤③:最后将C翻录至B

这样操作,可达到题目要求

[1.8] 分钱游戏。甲、乙、丙三人共有24元钱先由甲分钱给乙、丙两人,所分给的数与各人已囿数相同;接着由乙分给甲、丙分法同前;再由丙分钱给甲、乙,分法亦同前经上述三次分钱之后,每个人的钱数恰好一样多 求原先各人的钱数分别是多少?

:设甲、乙、丙三人的钱数分别为ABC。用倒推(逆序)算法 从最后结果入手,按反相顺序分步骤推算出每次各囚当时的钱数:(在每个步骤中,各人钱数分别存在ABC中)

{ AB未得到丙分给的钱时,只有结果数的一半;C应包含给AB及本身数三者之和 }

 {AC未得到乙分给的钱时只有巳有数的一半;B应包含给AC及本身数三者之和 }

 C未得到甲分给的钱时只有巳有数的一半;A应包含给BC及本身数彡者之和 }

细心观察会发现本程序语句的顺序很关键。此例用反推顺序(逆序)按步骤正确推算出各变量的值。当然有的问题可按正序步驟编程,这类程序都称为顺序程序

[1.9] 有鸡兔同笼,头30脚 90,究竟笼中的鸡和兔各有多少只?

:设鸡为J只兔为T只,头为H脚为F,则:

解此题暫不必采用数学上直接解方程的办法可采用“假设条件与逻辑推理”的办法:

 假设笼中30 个头全都是兔,那么都按每头4只脚计算总脚數为(4*H),与实际脚数 ( F )之差为(4*HF)如果这个差=0,则笼中全是兔(即鸡为0只);如果这个差值 >0说明多计算了脚数,凡是鸡都多给算了两只脚鼡它除以2就能得到鸡的只数,处理步骤为:

按此方法这两步运算必须注意先后顺序才会符合运算逻辑。

本程序中HF为常量,变量JTbyte类型,属于整数类型

Pascal定义了五个标准整数类型,如下表所示:

 在前面程序中常用的数据类型除整数类型,还有实数类型Pascal 还定义了五个标准实数類型,列表所示如下:

在实数类型定义下即使是整数,在程序执行时系统也将自动转换成科学记数形式试请运行下面程序并注意观察运荇结果:

2.某车棚存有自行车和三轮车共65辆,它们的轮子数合计为150个求该棚内存有的自行车和三轮车各是多少辆?

3.甲、乙、丙三人分别有磁帶364864盒先由甲把自己的磁带平均分为三份,分给乙、丙各一份自己留下一份;接着是乙,最后是丙都按甲的方法处理。编程输出甲、乙、丙在上述过程中各人的磁带数分别是多少? (输出所有的中间结果)

4.五位好朋友相聚第一位朋友带来了很多糖块赠送给各位朋友,使烸人的糖块在各自原有的基础上翻了一倍;接着第二位好友也同样向每人赠送糖块他同样使每人的糖块在各人已有的数量上翻了一倍;苐三、第四、第五位好友都照此办理。经过这样的赠送之后每人的糖块恰好都为32块。问各位好友原先的糖块数分别是多少?

在程序设计中许多问题是在一定条件下才选择某种处理方式的,这就需要用条件判断语句或情况选择语句进行处理程序执行中将出现选择(分支),根據条件只选择执行部分语句,不一定都是按原顺序从头到尾地执行所有语句这样的程序称为分支程序。

[2.1] 某服装公司为了推销产品采取這样的批发销售方案:凡订购超过100 套的,每套定价为50元否则每套价格为80元。编程由键盘输入订购套数输出应付款的金额数。

:X为订购套数Y为付款金额,则:

程序中的 if 语句常称为条件语句它的一般格式为:

IF 语句的功能是按条件在两种可能中选择其中一种。习惯上把if 后面的表达式称为条件then 后面的语句称为真项,else 后面的语句称为假项若条件成立(为真)就执行真项,然后执行if语句的后继语句;若条件不成立(为假)就跳过真项而执行假项然后执行后继语句。而第一种格式只有真项没有假项,当条件不成立(为假)就什么也不需做直接往下去执行後继语句。

[2.2] 读入三个不同的数编程按由小到大的顺序排列打印出来。

:设读入的三个数为abc为了把较小的数排在前面,可作如下處理:

if 语句规定它的真项或假项位置上只能是一个基本语句如果需要写一组语句,就应当使用复合语句本程序中有三处用到复合语句。烸个复合语句的范围是从Begin开始到与它相对应的End为止复合语句的地位和一个基本语句相同;其一般格式为:

1.假设邮局规定寄邮件时若每件偅量在1公斤以内(1公斤),按每公斤1.5元计算邮费如果超过1公斤时,其超出部分每公斤加收0.8元请编程序计算邮件收费。

2.输入三个正整数若能用这三个数作为边长组成三角形,就计算并输出该三角形的面积否则输出Can't(组成三角形的条件为:任意两边之和大于第三边)

3.输入一個三位数的整数将数字位置重新排列,组成一个尽可大的三位数例如:输入213,重新排列可得到尽可能大的三位数是321

如果有多种(两種或两种以上)选择,常用情况语句编程

将前面[2.1]改成用如下方法来处理。根据题意付款计算可分为两种情况:

显然,情况①与②的選择取决于X值假设用N表示“情况值”,暂且先让N2

如果X100N=1;(此题中N的值只是12且取决于X值)

程序中的 Caseend 语句为情况语句,是多蕗分支控制一般格式为:

执行情况语句时,先计算Case后面表达式的值然后根据该值在情况常量表中的“对应安排”,选择其对应的语句执荇执行完所选择语句后就结束Case语句;如果常量表中没有一个与表达式值对应的语句,则什么也不做就结束本Case语句

Case 语句的另一种应用格式为:

这种格式的前面部分是相同的,所不同的是:如果常量表中没有一个与表达式值对应的语句则执行与else对应的语句,然后结束Case语句

[2.2] 对某产品征收税金,在产值1万元以上征收税5%;在1万元以下但在5000

以上的征收税3%;在5000元以下但在1000元以上征收税2%1000元以下的免收税编程計算该产品的收税金额。

:x为产值tax为税金,用P表示情况常量各值以题意中每1000元为情况分界:

情况表达式的计算必须考虑到“全部”情況,不要有遗漏如果情况常量表的“值”在某范围内是连续的,可将常量表写成:

因此上面程序中的情况常量表可以写成如下程序中表示形式:

程序中的trunc(x)为取整函数,是Pascal的算术标准函数之一Pascal常用的算术标准函数有19:

1.运输公司计算运费时,距离(S)越长每公里运费越低,標准如下:

2. 输入考试成绩如果获85分以上为 A等,获60分~84分为B60分以下为C等,编程输出考试等级

请编程,由键盘输入加工零件数量显示應发奖金数。

在编程中经常遇到需要多次规律相同的重复处理这就是循环问题。Turbo Pascal采用不同的循环方式来实现常用的环循有三种:  forrepeatwhile. 

for循環是一种自动计数型循环。

解:① 用a代表1~20各数同时也用a兼作计数,以控制循环次数;

    ④ a自动计数(加1)如果未超越所规定的循环范围則重复步骤③,否则结束循环

(1)种格式的初值小于等于终值,循环变量值按自动加1递增变化;

(2)种格式的初值大于或等于终值循环变量值按自动减1递减变化。for 循环是 (以递增1或以递减1) 计数型循环

比如若将[3.1]程序改为倒计数(递减)循环,则输出201的自然数数

①设a表示3060的所囿的数可用for循环列出;

在这个程序中,for循环后的循环语句是一个条件分支语句

方法二:我们知道,在式子a=2*n中若n取自然数123…,時则a依次得到偶数246…。因此要想得到3060的偶数就可以让上面式子中的n1530的自然数就可以了。所以本题还可以按以下步骤处理:

①设n表示1530的所有自然数可用for循环列出;

[例3.3]自然数求和:编一个程序,求从1100的自然数的和

② 令a表示1100的自然数,用循环列出;

④ 循环结束后S即为1100的自然数的和,输出即可

[3.4]一个两位数x,将它的个位数字与十位数字对调后得到一个新数y此时y恰好比x36,请编程求出所有这样的两位数

解:① 用for循环列举出所有的两位数,x为循环变量;

⑤ 用式子y-x=36筛选出符合条件的数x并输出

[3.5] 把整数3025从中剪开分为3025两个数,此时再将这两数之和平方(30+25)2=3025计算结果又等于原数。求所有符合这样条件的四位数

:设符合条件的四位数为N,它应当是一个完铨平方数用(a*a)表示。

[3.6]用“*”号打印出如下的长方形图案

解:① 上面给出的图例共有4行,我们可以用一个循环控制行的变化;

② 在每行Φ又有9列我们可以在前面控制行的循环中再套一个循环来控制列的变化。

程序中的循环对于a的每个值都包含着一个b=(19)次的内循环外循環for a 将内循环for b 包含在里面,称为for循环的嵌套嵌套形式如:

:a为被乘数,范围为19b为乘数范围为1a;乘式为a*b=(a,b的乘积),则

⑴从上面分解的橫行中看到共有9行这里的“行”数变化与a的变化从19相同,可用a控制“行”的循环;

⑵每“行”里面相乘的次数与b的范围相关由b控制烸“行”里面的“内部”循环;

⑶内循环被包含在最里层,执行完每“行”的内部循环就到下一“行”去执行新“行”里面的循环,每“行”都拥有形式相同的( b=1)内循环

即每到一“行”都要执行该“行”的内循环。这里所指的“行”可以理解成抽象的行不一定是實际上具体对应的行,可以是一个处理“块”

根据这种格式还可以实现多层循环嵌套,例如:

[3.8]从七张扑克牌中任取三张,有几种组合方法请编程输出所有组合形式。

 [3.9] 数学上把除了1和它本身没有别的数能够整除它的自然数叫做素数(或质数)。现在由键盘输入一个自然数N编程判断N是否是素数,是则输出“Yes”否则输出“No”。

解:根据定义对于给定的自然数N,只需判断除1和它本身外还有没有第三个自嘫数即可。

③ 若N的约数的个数超过2个则判定N不是素数。

程序中的变量yse为布尔(或逻辑)类型(Boolean)布尔值只有两个:

 布尔值与条件判断结果为真(條件成立)或为假(条件不成立)的作用相同,常用于条件语句和循环语句中

1.打印出120的平方数表。

2.打印出100200之间的奇数

4.一辆快车和一辆慢車开往同一地点,快车票价为18元慢车票价为13. 5元,共售出400张共计5940元,求快车票和慢车票各多少张?.

5.求出能被5整除的所有四位数的和

6.在下媔式子中的二个□内填入一个合适的同样的数字,使等式成立

7.有一个三位数,它的各位数字之和的11倍恰好等于它自身请编程求出这个彡位数。

8.在自然数中如果一个三位数等于自身各位数字之立方和,则这个三位数就称为是水仙花数如:153=13+53+33,所以153是一个水仙花数求所有嘚水仙花数。

9.编程序打印出下列图案:

平行四边形 等腰三解形      菱形

10.编程打印出如下图案:

11.有三种明信片:第一种每套一张售價2元;第二种每套一张,售价4元; 第三种每套9张售价2元。现用100元钱要买100张明信片要求每种明信片至少要买一套,问三种明信片应各买幾套请输出全部购买方案。

12.某人想把一元钱换成伍分、贰分、壹分这样的零钱 在这三种零钱中每种零钱都至少各有一个的情况下,共囿多少种兑换方案并打出这些方案。

15.AB两个自然数的和、差、积、商四个数加起来等于243AB两数。

16.百钱买百鸡:今有钱100元要买100只鸡,公鸡3元一只母鸡1元一只,小鸡13只若公鸡、母鸡和小鸡都至少要买1只,请编程求出恰好用完100元钱的所有的买鸡方案

Repeat循环是直到型循环。

程序中的Repeat循环格式为:

      Repeat循环首先执行由RepeatUntil括起来的循环体语句然后检查Until后面的条件表达式:如果表达式结果为假,则继续执行循环體接着继续检查Until后面的条件表达式,如此反复执行直到这个表达式结果为真时结束循环Repeat循环体语句必须有能改变Until后面条件表达式值的語句,并最终使这个条件表达式的值为真使循环自动结束。

[3.10]求两个自然数MN的最大公约数

解:若自然数a既是M和约数,又是N的约数則称aMN的公约数,其中最大的称为最大公约数为了求得最大公约数,可以从最大可能的数(如MN)向下寻找找到的第一个公约数即昰最大公约数。

[3.11]校体操队到操场集合,排成每行2,最后多出1;排成每行3,也多出1;分别按每行排4,5,6,都多出1;当排成每行7人时,正好不多求校体操队至少是多少人?

:①设校体操队为X,根据题意X应是7的倍数,因此X的初值为7,以后用inc(x,7)改变X值;

程序中对每个X值,都先给Yes 赋真值只有在循環体各句对X进行判断时,都得到“通过”(此处不赋假值)才能保持真值

[3.12]从键盘输入一个整数XX不超过10000),若X的各位数字之和为7的倍數则打印“Yes”,否则中打印“No

解:本题考察的是数字分离的方法,由于X的位数不定所以以往的解法不能奏效,这是介绍一种取余求商法

2)用X div 10将刚分离的个数数字删除,并将结果送回给X

3)重复(1)(2)直到X0

[例3.13]求19921992的乘积的末两位数是多少?

解:积的个位與十位数只与被乘数与乘数的个位与十位数字有关所以本题相当于求199292相乘,而且本次的乘积主下一次相乘的被乘数因此也只需取末兩位参与运算就可以了。

[3.14]尼科彻斯定理:将任何一个正整数的立方写成一组相邻奇数之和

[3.15]猜价格:中央电视台的“幸运52”栏目深受觀众喜爱,其中的“猜商品价格”的节目更是脍炙人口现在请你编一个程序模拟这一游戏:由计算机随机产生2005000之间的一个整数,作为某件商品的价格然后由你去猜是多少,若你猜的数大了则计算机输出提示“Gao”,若你猜的数小了则计算机输出提示“Di”,然后你根據提示继续猜直到你猜对了,计算机会提示“Ok”并统计你猜的总次数。

解:本题的游戏规则大家都清楚要完成程序,必须把处理步驟理清:

  (1)用随机函数Random产生2005000之间的一个整数X

3)若AX则输出“Gao”;

4)若AX,则输出“Di”;

(5)AX则输出“Ok”;

1.求两个自然数MN的最小公倍数(如果求三个或更多个数的最小公倍数呢?应如何解决)

2.小会议室里有几条相同的长凳,有若干人参加开会如果每条凳孓坐6,结果有一条凳子只坐有3;如果每条凳子坐5,就有4人不得不站着。求会议室里有多少人开会,有多少条长凳?

3.某动物饲养中心用1700元专款购買小狗(每只31)和小猫(每只21)两种小动物要求专款专用,正好用完应当如何购买?请输出所有方案。

4.某整数X加上100就成为一个完全平方数,如果让X加上168 就成为另一个完全平方数求X?

5.某次同学聚会,老同学见面个个喜气洋洋,互相握手问好。参加此次聚会者每人都与老同学握了一次手,共握903,试求参加聚会的人数

6.用自然数300262205167分别除以某整数A所得到的余数均相同。求出整数A以及相除的余数

7.1600年前我国的一部经典数学著作中有题:“今有物,不知其数三三数之,剩二;五五数之剩三;七七数之,剩二问物几何。”求最小解

8.编程求出所有不超过1000嘚数中,含有数字3的自然数并统计总数。

9.阿姆斯特朗数:如果一个正整数等于其各个数字的立方和则该数称为阿姆斯特朗数(也称自戀数),如40743+03+73试编程求出1000以内的所有阿姆斯特朗数。

While循环是当型循环

[例3.8] 前面第一章[例1.2]的鸡兔同笼,头30,脚90, 求鸡兔各几只?在此用丅面方法编程求解

   ①让鸡的只数逐次加1进行递推计算,初始时J=0;

程序中采用While当型循环While循环语句的格式为:

其中do后面的“语句”是被重复執行的,称为循环体;若循环体是多个语句, 必须用begin--end包起来成为复合语句。

While循环首先判断条件式当条件式的值为真就执行do 后面的语句(循环体)。

While的循环体内也必须包含能改变控制变量取值语句, 影响条件式的值, 最终使条件式为false (假), 才能结束循环

Pascal语言的三种基本循环方式,  for循环对循環范围有明确规定, 且循环变量只能是递增加1或递减1自动计数控制; 而repeat--until循环和while--do循环比较灵活, 只要对条件表达式的值能控制满足一定要求就能组荿循环, 但在循环体中必须有改变循环变量值的语句, 使条件判断(逻辑值)最终为True或flase, 让循环能够终止。

解:采用如下方法步骤:

(4) 结束循环输出6(余数为零时的b值即是所求的最大公约数)。

此方法称为辗转相除法求最大公约数

[例3.11]将一根长为369cm的钢管截成长为69cm和39cm两种规格的短料。在這两种规格的短料至少各截一根的前提下, 如何截才能余料最少

解:设两种规格的短料分别为:

①设最小余料的初始值min=369;

②在X循环范围内,每一個X值都计算出对应的Y和R;

在有些情况中, 三种循环方法可以互相换用。

[例3.12]甲、乙、丙三人都是业余射击爱好者, 在一次练习中他们枪枪中靶: 甲射了八发子弹,取得225环成绩,乙射了七发,也取得225环;丙只射了六发,同样取得225环下面是成绩表,请编程完成下表中空项的填数。

程序运行结果获得兩组填数答案如果改用for循环,程序将更加简明:

3.小球从100高处自由落下,着地后又弹回高度的一半再落下求第20次着地时, 小球共通过多少路程?

4.某登山队员第一天登上山峰高度的一半又24米; 第二天登上余下高度的一半又24米;每天均如此。到第七天,距山顶还剩91米求此山峰的高度?

6.出售金鱼者决定将缸里的金鱼全部卖出。第一次卖出全部金鱼的一半加二分之一条;第二次卖出剩余的三分之一加三分之一条金鱼;第三次卖出余丅金鱼的四分之一加四分之一条;第四次卖出余下的五分之一加五分之一条金鱼还剩下11条金鱼。当然,出售金鱼时都是整数条,不能有任何破損求缸里原有的金鱼数?

7.外出旅游的几位朋友决定次日早晨共分一筐苹果。天刚亮,第一个人醒来,他先拿了一个,再把筐里的八分之一拿走;第②个人醒来,先拿两个,再把筐里的八分之一拿走;第三个人醒来,先拿三个,再拿走筐里的八分之一;…每个人依次照此方法拿出各人的苹果,最后筐裏的苹果全部拿完,他们每人所拿到的苹果数正巧一样多求原先筐里的苹果数和人数。

8.图中由6个圆圈构成三角形,每条边上有三个圈, 将自然數1--6 不重复地填入各圆圈位置上,使每条边圆圈上的数字之和相等,请编程输出所有的填法

程序中往往需要把主要任务分成若干个子任务,每個子任务只负责一个专门的基本工作每个子任务就是一个独立的子程序。Turbo Pascal 可以把函数和过程作为子程序调用

Pascal允许用户在程序中自己说奣定义所需要的函数并在程序中调用这些函数。

[例4.1]编程找出由键盘任意输入五个整数中的最大整数

解:设输入的五个整数为n1、n2、n3、n4、n5,为叻便于处理引入一个中间变量t1,按如下步骤处理:

②将t1与n2比较将两者中较大的数放入t1;

③将t1与n3比较,将两者中较大的数放入t1;

④将t1与n4仳较将两者中较大的数放入t1;

⑤将t1与n5比较,将两者中较大的数放入t1;

⑥经过以上5步处理后t1即为5个数中最大者。

从上面规划的步骤看来从步骤②到步骤⑤需处理的目标是相同的,因此我们可以设计一段子程序Max(x1,x2)以找出x1和x2中最大的值并返回。

从上例看出引入函数实际上昰将一个复杂的问题划分成若干个易于处理的子问题,将编程化简的一种有效办法而化简的方法是多种多样的,如前面已经做过求三个數中的最大数所以可定义一个专门求三个数中最大数的函数(Max)。第一次用这个函数求出n1,n2,n3三个数中的最大数t1;第二次调用这个函数求出t1与n4,n5三个數中的最大数也就是前三个数的最大数(已在t1中)和后面二个数再求一次,就得到五个数的最大数因此,需要两次使用“求三个数中的最夶数”步骤如下:

主程序中两次调用自定义函数。自定义函数的一般格式为:

函数中的形式参数接受调用函数时所传入的值用来参与函數中的运算。

[例4.2]求任意输入的五个自然数的最大公约数

解:⑴自定义一个专门求两自然数的最大公约数的函数GCD;

   ⑵调用自定义函数,第一次求湔两个数的最大公约数;从第二次开始,用每次求得的最大公约数与下一个数再求两个数最大公约数,直到最后。本题共四次“求两个数的最大公约数” 设输入的五个自然数分别是a1,a2,a3,a4,a5,采用如下步骤:

⑤ 输出 a1,此时的a1已是五个数的最大公约数

函数的结果是一个具体的值, 在函数体中必须将所得到的运算结果赋给函数名;主程序通过调用函数得到函数的运算结果。调用函数的一般格式为:

调用函数时, 函数名后面圆括号内嘚参数必须有确定的值, 称为实在参数调用时即把这些实际值传送给函数形参表中的相应形参变量。函数不是单独的语句, 只能作为运算赋徝或出现在表达式中

2.求从键盘输入的五个自然数的最小公倍数。

3.哥德巴赫猜想的命题之一是:大于6 的偶数等于两个素数之和编程将6~100所囿偶数表示成两个素数之和。

4.如果一个自然数是素数,且它的数字位置经过对换后仍为素数,则称为绝对素数,例如13试求出所有二位绝对素数。

自定义函数通常被设计成求一个函数值一个函数只能得到一个运算结果。若要设计成能得到若干个运算结果,或完成一系列处理,就需要洎定义“过程”来实现

[例4.3] 把前面[例2.2 ](输入三个不同的整数,按由小到大排序)改为下面用自定义过程编写的Pascal程序:

程序中Procedure Swap是定义过程名,从莋用来看过程与函数是相似的,都能将复杂的问题划分成一些目标明确的小问题来求解只不过函数有值返回而过程则没有。自定义过程的一般格式如下:

[例4.4]如果一个自然数除了1和本身,还有别的数能够整除它, 这样的自然数就是合数例如15,除了1和15,还有3和5能够整除,所以15是合数。14,15,16昰三个连续的合数,试求连续十个最小的合数

解:从14,15,16三个连续合数中可看出,它们正好是两个相邻素数13和17 之间的连续自然数,所以求连续合数問题可以转化为求有一定跨度的相邻两个素数的问题。因此求连续十个最小的合数可用如下方法:

①从最小的素数开始,先确定第一个素数A;

②再确定与A相邻的后面那个素数B;(作为第二个素数);

③检查A,B的跨度是度否在10 以上,如果跨度小于10,就把B 作为新的第一个素数A,重复作步骤②;

程序中的过程SUB,用来确定b是否为素数过程名后面圆括号内的变量是形式参数,简称为形参过程SUB(x: integer; Var yy: boolean) 中的x是值形参,而前面冠有Var的yy是变量形参。值形参只能从外界向过程传入信息,但不能传出信息;变量形参既能传入又能传出信息本程序过程SUB中的x是由调用过程的实在参数b传入值,进行處理后不需传出;而yy是把过程处理结果用逻辑值传出,供调用程序使用

试把[例4.3]程序中的过程 SWAP(Val x,y: integer),将x,y前面的Var去掉就变成了纯粹的值形参,就不能将过程所处理的结果传出去也就无法得到处理后的结果,通过运行程序比较可以非常明显地看到值形参和变量形参的区別。

调用过程名后面圆括号内的实在参数与定义过程的形参表必须相对应调用过程相当于一个独立语句,可单独使用

[例4.5]将合数483的各位数字相加(4+8+3)=15,如果将483分解成质因数相乘:  483=3*7*23把这些质因数各位数字相加(3+7+2+3),其和也为15即某合数的各位数字之和等于它所有质因數的各数字之和。求500以内具有上述特点的所有合数

解:①设n为所要求的合数,让n在1~500间循环做以下步骤;

    ③调用过程SUB3进行非素数判定鉯布尔变量yes的真假值判定是否,yes的初值为true如果为 (not true)非素数,就做步骤④⑤,⑥;否则取新的n值重复步骤③;

    ⑤调用SUB2,求n的各质因数對于每个质因素都通过SUB1求它各位数字之和,将所有各质因数字传送给t2

    ⑥如果t1=t2(各位数字之和等于它所有质因数的各数字之和),则输出此n

程序定义了三个过程SUB1,SUB2SUB3,其中SUB2过程中又调用了SUB1在过程中定义的变量或参数,只在本过程内部使用有效这些变量称为局部变量。洳SUB2中的xx只在SUB2中使用属于局部变量。

1.输入自然数n求前n个合数(非素数),其素因子仅有23,或5

2.自然数a的因子是指能整除a的所有自然数,但不含a本身例如12的因子为:1,2,3,4,6。若自然数a的因子之和为b而且b的因子之和又等于a,则称a,b为一对“亲和数” 求最小的一对亲和数。

3.求前n個自然数的平方和要求不用乘法。例如:3的平方不用3*3可用3+3+3。

4.试用容积分别为17升、13升的两个空油桶为工具从大油罐中倒出15升油来,编程显示出具体的倒油过程

5.如果一个数从左边读和从右边读都是同一个数,就称为回文数例如6886就是一个回文数,求出所有的既是回文数叒是素数的三位数

6. 任何大于2的自然数都可以写成不超过四个平方数之和。如:

Pascal系统允许用户自定义的数据类型有:数组类型、子界类型、枚举类型、集合类型、记录类型、文件类型、指针类型

[例5.1]总务室在商店购买了八种文具用品,其数量及单价如下表:

编程计算各粅品计价及总计价

解:表中有两组数据,设表示物品件数的一组为a表示物品单价的一组为b。

ab两组数据以序号为关联,具有相应的顺序关系按如下方法处理:

①定义s,ab三个数组,按相应顺序关系给a,b赋值(件数和对应单价) ;

②每读入一对数据(件数和对应单价)以同一序号的件数和对应单价计算出同一物品的计价:

③循环做步骤②,做完后输出s数组所记入的各物品计价及总计价t

输出语句为  write(实数:n:m)  的形式时,则输出该实数的总宽度为n其中小数m位,此时的实数不以科学计数形式显示

程序中用来表示如物品件数和物品單价等属性相同的有序数据,Pascal语言把它归为数组数组成员(分量)称为数组元素。数组必须在说明部分进行定义:确定数组名数组分量(元素)的个数及类型。一般格式有:

本程序中a数组和b数组中8个元素的数据都是已知数据可当作常量,用常量说明语句给数组元素赋初值所以上面的程序Exam51可改为如下形式:

程序中对数组的输入、输出处理,常用循环语句控制下标进行有序地直接操作每个数组元素。

[例5.2]编程输入十个正整数然后自动按从大到小的顺序输出。

解:①用循环把十个数输入到A数组中;

只需知道两个数中的前面那元素的標号就能进行与后一个序号元素(相邻数)比较,可写成通用形式A[ i ]与A[ i +1]比较那么,比较的次数又可用1~( n - i )循环进行控制 (即循环次数与两两楿比较时前面那个元素序号有关) ;

    ③在每次的比较中若较大的数在后面,就把前后两个对换把较大的数调到前面,否则不需调换位置

下面例举5个数来说明两两相比较和交换位置的具体情形:

 经过第一轮的1~ (N-1)次比较,就能把十个数中的最小数调到最末尾位置第二轮比較1~ (N-2)次进行同样处理,又把这一轮所比较的“最小数”调到所比较范围的“最末尾”位置;……;每进行一轮两两比较后其下一轮的比較范围就减少一个。最后一轮仅有一次比较在比较过程中,每次都有一个“最小数”往下“掉”用这种方法排列顺序,常被称之为“冒泡法”排序

程序中定义a数组的下标类型为 1.. N ,这种类型规定了值域的上界和下界是从一个有序类型范围取出一个区段,所以称为子界類型子界类型也是有序类型。

例[5.3] 用筛法求出100以内的全部素数并按每行五个数显示。

解:⑴ 把2到100的自然数放入a[2]到a[100]中(所放入的数与下标號相同);

    ⑵ 在数组元素中以下标为序,按顺序找到未曾找过的最小素数minp,和它的位置p(即下标号);

    ⑸ 打印输出a数组中留下来、未被筛掉的各元素值并按每行五个数显示。

用筛法求素数的过程示意如下(图中用下划线作删去标志) :

程序中自定义的子界类型在用法上與标准类型(如integer)相同,只是值域上界、下界在说明中作了规定而标准类型的值域由系统内部规定,其上界、下界定义是隐含的可直接使用。例如:

[例5.4]在一次宴会上有来自八个不同国家的宾客被安排在同一张圆桌就坐。A是中国人会讲英语;B是意大利人,他能讲西班牙语;C是英国人会讲法语;D是日本人,能讲汉语;E是法国人会讲德语;F是俄国人,懂意大利语;G是西班牙人能讲日语;最后一个是德国人,懂俄语编程序安排他们的座位,使他们在各自的座位上能方便地跟两旁的客人交谈

解:①根据题目提供条件与数据,建立如丅关系代码表:

表中总代码实际上是前三项代码的归纳:第一个字母表示哪国人;第二个数字表示本国语代号;第三个数字表示懂哪国外語如A13,A表示中国人1表示汉语(本国语),3表示会说英语所以每个宾客的情况均用总代码(三个数据组成的字符串)表示;

②定义由8個元素组成的数组(NAME),元素类型为字符串类型(String);

③元素的下标号影响各人座位关系必须满足后一个元素的下标号应与前一个元素字符串中的第三个数据相同。例如:若第一个位置总代码为A13则第二个位置应根据A13中最后的3,安排C35即A与C可以交谈。以此类推

用字符串处理函数COPY,截取字符串的第一个字母作为宾客代码打印再取第三个字符,用VAL将其转换成数字将这个数字作为下标号,把这个下标号的元素咹排在旁边(相邻);

④重复步骤③的方法安排其后的元素,直到八个数据全部处理完为止

Pascal常用的字符串处理标准函数有7个:

设变量s,strstr1,str2均为字符串类型(string){多个字符};ch为字符类型(char){单个字符};

(1)copy(strn,m)从字符串str的左边第n个开始截取m个字符;

(2)concat(str1str2)将两个字串连接成为一个新的字串;

(6)pos(str1,str2)求字串str1在字串中开始的位置;

Pascal常用的字符串处理标准过程有4个:

(1)Val(strx,code)将数字型字串轉为数字并存入变量x中;

(3)insert(str1str2,n)把字串str1插入在字串str2的第n个字符之前结果在str2中;{此过程中的str2为变量形参,具有传入传出的功能};

(4)delete(strn,m)从字符串str的第n个开始删除m个字符,把剩余的字符存在str中{此过程中的str为变量形参,具有传入传出的功能};

[例5.5]一个两位以上的洎然数如果左右数字对称,就称为回文数编程找出所有不超过6位数字的回文数,同时又是完全平方数的数

如121是回文数,又是11的平方所以是完全平方数。

   ③逐个取s的左右字符检查是否相同(对称),检查对数不超过总长度的一半;

1.裴波那契数列:数列1、1、2、3、5、8、13、21…称为裴波那契数列它的特点是:数列的第一项是1,第二项也是1从第三项起,每项等于前两项之和编程输入一个正整数N,求出数列的第N项是多少(N不超过30)。

2.下面的竖式是乘法运算式中P表示为一位的素数,编程输出此乘法竖式的所有可能方案

3.节目主持人准备從N名学生中挑选一名幸运观众,因为大家都想争当幸运观众老师只好采取这样的办法:全体同学排成一列,由前面往后面依顺序报数12,12,…报单数的同学退出队伍,余下的同学向前靠拢后再重新由前往后12,12,…报数报单数者退出队伍,如此下去最后剩下一人為幸运观众编程找出幸运观众在原队列中站在什么位置上?(N由键盘输入N < 255)。

4.  05289表明等式右边是一个七位的完全平方数,而这七个数芓互不相同编程求出所有这样的七位数。

5. 校女子100米短跑决赛成绩如下表请编程打印前八名运动员的名次、运动员号和成绩。(从第一洺至第八名按名次排列)

6.  求数字的乘积根正整数的数字乘积这样规定:这个正整数中非零数字的乘积。例如整数999的数字乘积为9*9*9得到729;729嘚数字乘积为7*2*9,得到126;126的数字乘积为1*2*6得到12;12从数字乘积为1*2,得到2如此反复取数字的乘积,直至得到一位数字为止999的数字乘积根是2。編程输入一个长度不超过100位数字的正整数打印出计算数字乘积根的每一步结果。输出格式如下:

9. 一个素数,去掉最高位,剩下的数仍是素数;洅去掉剩下的数的最高位,余留下来的数还是素数,这样的素数叫纯粹素数求所有三位数的纯粹素数。

试编程,找出所有小于100的自然数对,当加囷减该数对时可各得出一个完全平方数。

[例5.6]假设四个商店一周内销售自行车的情况如下面表一所示

几种牌号自行车的单价如表二所示。求各店本周出售自行车的总营业额

解:①把表一看成是由行(每个店占一行)与列(每种牌号占一列)共同构成的数据组,按表格排列的位置顺序用A数组表一各数据表示如下:

A数组有4行3列,每个数组元素由两个下标号表示这样的数组称为二维数组。

②表二的数据按排列顺序用B数组表示如下:

②B数组有3个数据用一维数组表示,下标号与表一中列的序号有对应关系

③计算各店营业额并用T数组表示:

T數组共有4个数据,为一维数组下标号与商店号有对应关系。

④输出T数组各元素的值

程序中定义二维组方式与一维数组形式相同。二维數组的元素由两个下标确定

二维数组元素的格式如下:

常用下标1代表数据在二维表格中的行序号,下标2代表所在表格中列的序号

[例5.7]输叺学号从1101 至1104的4名学生考试语文、数学、化学、英语、计算机六门课的成绩,编程求出每名学生的平均分按每名学生数据占一行的格式输絀。

解:根据题目所给数据及要求定义如下数据类型:

①学生成绩:在数据表格中每人的成绩占一行,每行6列(每科占一列);定义二維数组s各元素为实型;

②个人平均分:定义一维数组av,各元素为实型;

③个人总分:是临时统计为计算机平均分服务,用简单实型变量t;

②每读入一科成绩分就累计到个人总分t中;

③输完第i个人的各科成绩,就计算出第i个人平均分并存入数组av(i)中;

④重复上述步骤直箌全部学生的成绩处理完毕;

⑤用双重循环按行列形式输出完整的成绩表。

程序中的学生成绩用键盘输入方式赋给二维数组各元素如果昰少量已知数据,也可在常量说明部分直接给二维数组各元素赋常数,现将本例题改为如下程序:

程序说明部分定义了枚举类型枚举類型常用自然语言中含义清楚、明了的单词(看成代码)来表示“顺序关系”,是一种顺序类型是根据说明中的排列先后顺序,才具有01,2…n的序号关系可用来作循环变量初值和终值,也可用来作数组下标但枚举类型不是数值常量或字符常量,不能进行算术运算只能作为“序号关系”来使用。

[例5.8]从红(red)、黄(yellow)、兰(blue)、白(white)、黑(black)五种颜色的球中任取三种不同颜色的球,求所有可能的取法

解:①将五种颜色萣义为枚举类型;

程序中的从red到black的顺序关系本来是不存在的,但经过枚举类型定义之后就建立了这种“枚举”先后而产生的顺序排列关系。这种“关系”完全取决于类型说明时的位置排列

[例5.9] 新录A、B、C三个工人,每人分配一个工种每个工种只需一人,经测试三人做某种笁作的效率如下表所示。如何分配三人的工作才能使他们工作效益最大

解:①定义各元素值为整数型的X数组,将表中的数据按行列关系莋如下处理:

在这里x数组第一个下标为枚举型,表示工人(A,B,C);第二个下标为子界型表示工种(一、二、三):

③将每次计算得到的S与“朂大值”m比较,(m的初值为0)只要有大于m的S值即取代m原来的值,使之最大同时用数组dd记录最大S值时的工种i, j, k值;

④当循环全部结束时,打茚记录下来的每个人的工种

程序中用枚举类型表示工人代码(A,B,C), 比较直观、清晰、易读好理解。

在程序中枚举类型都可以用数字序号来取代下面程序用1,2,3代表工人A,B,C:

它由1到32的自然数组成一个3*3的方阵,方阵的每一行每一列和两个对角线上的各数字之和都相等,且等于n (n2+1) / 2(n是方阵的行数或列数)编程打印出n为10以内的奇数阶幻方。

解:仔细观察示例有如下规律:

1.输入四个学生考试五门功课,要求按个人总汾从高到低排列输出二维成绩表格(即每行有学号,五科成绩及总分)

右图是n从0~4的杨晖三角形:

编程输出n行的杨晖三角形

3.下面是┅个4*4的矩阵,它的特点是:(1)矩阵的元素都是正整数;(2)数值相等的元素相邻这样,这个矩阵就形成了一级级“平台”其上最大的“平台”面积为8,高度(元素值)为6若有一个已知的N*N的矩阵也具有上面矩阵的特点,求矩阵最大“平台”的面积和高度 

4.打印一个n*n的数字螺旋方阵。这个数字方阵的特点是:以左上角1开始向下数字以外圈向里按自然数顺序转圈递增,一直到中心位置的n2为止例如n =3:       

Pascal系统把具有囲同特征的同一有序类型的对象汇集在一起,形成一个集合可将集合类型的所有元素作为一个整体进行集合运算。

[例5.11]用随机函数产生20个互不相同的40到100的随机整数然后按从小到大顺序打印。

①为使产生的随机整数互不相同因此,每产生一个数都要判断集合中已否包含,如果没有包含就放到集合中,并统计个数直到20个。

②将集合中的数移到数组中此题利用下标序号从小到大的特征进行映射排序打茚。

程序中定义了集合类型DD集合的元素为子界类型。

定义集合类型的一般格式是:

集合的值放在一对方括号中各元素用逗号隔开,与排列的顺序无关因此,[9,2,5]和[25,9]的值相等没有任何元素的集合是空集合,用[ ]表示如果集合的元素是连续的,可用子界表示如[5,6,7,8,9]可表示為[5 .. 9] 。

集合变量名:= 集合表达式;

①相等:a=b若两个集合中的元素个数相等,每个元素相同则两个集合相等,比较结果为真(ture)否则为假(false);

3.集合的测试运算:检查某个数据在集合中,测试结果为ture;不在集合中测试结果为false;例如:

从程序Exam511的输出部分可看到,集合类型的值不能直接输出,要用测试方法进行输出或转换成数组元素的值

[例5.12]用集合进行筛法求200以内的素数。

解:①将[2..200]放入集合S中;

    ②取S中的第一个元素徝nxt,放入集合P中同时将S中的凡是nxt的倍数的元素全部“划”去;

集合内的元素个数不能超过255个,如果要用超过255个成员的集合类型求素数必須用小集合的数组来表示大集合,即把大集合分成若干个小集合每个小集合只是数组的元素,(数组元素为一个小集合)整个数组就是┅个大集合筛法运用在每个数组元素(小集合)中进行。

 [例5.13]将自然数1--9这九个数分成三组将每组的三个数字拼成为三位数,每个数字不能重复且每个三位数都是完全平分数。请找出这样的三个三位数

解:①自定义函数yes,用集合判定九个数字是否有重复采用逆向思维,假设做邓了三个三位完全平方数:

将三个三位完全平方数分离成单个数字放入集合dd中检查集合dd,如果自然数1~9每个数恰好都在集合dd中函数yes赋真(ture) ;只要有一个不在集合中,九个数字没有占完集合中的九个位置则必有重复,函数值为假(false)因为集合中对相同数字视為同一成员,如果有重复则集合中不足9个成员(用测试运算)。

②程序用11~31平方产生三位的完全平方数用循环方式每次取三个数为一組,存入a数组

③对a数组的三位数调用自定义函数yes处理;

④如果函数yes值为真,就打印a数组中的三个数

1.设计一个将十六进制数转换为十进淛数的程序。

2.将自然数1--9数字不重复组成三个三位数且三个数之比为1∶2∶3。求出能满足条件的全部方案

3.从键盘输入一个20位以内的自然数,然后将组成这个数的各位数字重新排列得到一个数值为最小的新数,且新数的位数保持不变打印出重新排列后的新数。

4. 现有五件物品重量分别为4、8、10、9、6.5公斤,它们的价值分别为12、21、24、17、10.5元。有一个背包装入物品总量不得超过19公斤,该选哪几件物品放入背包内使总價值最大?

前面介绍的数组类型和集合类型有一个共同点那就是在同一个数组或集合中的各有元素都必须具有相同的类型。如果要处理如丅表所示的学生档案卡片上的数据各栏目的数据类型不一样(学号,姓名成绩…),需要用不同的类型表示。

为此PASCAL系统定义了记录类型,可用来表示不同类型的数据

[例5.14]建立一张学生情况表格,求出每位学生的平均成绩并输出这张表格。

解:①定义记录类型:Date(表示日期记录有三个域:day 日,mon月yea年);

程序自定义Date记录类型,用来表示学生的出生年月日含三个分量(称为域):

自定义Stuta记录类型,用来表礻学生情况,含六个域:

dd(出生年月日) 是前面所定义的date记录类型 ;

s(表示学生成绩)是数组类型各元素为real实型 ;

程序定义的数组sarr的每個元素为Stuta记录(每个记录相当于一张学生情况卡片,整个数组相当于全体学生的情况卡片)

自定义记录类型的一般格式为:

访问记录中嘚分量,有两种方式:

[例5.15]利用记录类型将N个数由大到小排序输出排序结果并显示每个数原来的位置序号。

PASCAL系统自定义文件类型可非常方便地实现对外存贮器的存取使用。常用的文件类型有顺序文件(File}和文本文件(Text)

[例5.16]建立一个由1到50连续整数为分量的顺序文件。

解:①定义顺序文件类型(file);

[例5.17]输出一个由1到50连续整数为分量的顺序文件

解:①定义顺序文件类型(file);

    ④打开与文件变量对应的磁盘文件,并将文件分量指針设置在开头位置;

顺序文件在磁盘上以二进制形式存储,所以又称为二进制文件

另一种常用的文件类型是文本文件,以ASCII码的形式存储仳较通用,可以用DOS命令TYPE显示文件内容

解:①定义文件变量f为文本文件类型(TEXT);

[例5.19]读出a驱上磁盘文件f1.dat,并输出打印文件内容

解:①定義文件变量f为text类型;

 将文件变量指定为实际文件

 将变量值写入文件分量

 打开文件,指针恢复到开头

 读文件分量值赋给变量

3.用随机函数产生100個三位数的随机整数存入文件名为 ff.dat中,然后读出该文件内容进行从大到小排序,将排序后的数据按每行10个的格式显示并存入文件名為fff.dat中。

4.将一段英文句子存入Eng.dat文件中(以每句为一行)然后读出并显示。(也可用汉语拼音代替英文句子)

5.建立N个学生档案卡每张卡包含:编号、姓名、性别、年龄、三科成绩的等级(分A、B、C三档),编程示例输出显示

前面所学的变量都具有共同的特点:系统依据程序說明部分获得变量名和类型信息,即为变量分配对应大小的存储空间在程序执行过程中,各变量对应的存储空间始终存在且保持不变這些变量均称为静态变量。

与静态变量对应的是动态变量在程序执行过程中可以动态产生或撤消,所使用的存储空间也随之动态地分配戓回收为了使用动态变量。PASCAL系统提供了指针类型用指针变量(静态变量)来指示动态变量(存储地址变量)。下面介绍如何利用指针建立动态数据结构

[例5.19] 分别用简单变量和指针变量交换两个变量的值。

(1)用简单变量交换:

(2)用指针变量交换:

第(1)种方法直接采用变量赋值進行交换,(实际上给各存储单元重新赋值)其过程如下图所示:

第(2)种方法对各存储单元所保存的值并不改变,只是交换了指向这些单え的存储地址(指针值)可以简略地用如下图示说明:

(图中“—→”表示指向存储单元)

指针类型的指针变量a,b存有各指向单元的地址值,將指针交换赋值步骤为:

    基类型就是指针所指向的数据元素的数据类型也可以将类型说明合并在变量说明中直接定义说明:

例如Exam519_1中类型說明与变量可以合并说明为:

定义了指针变量的类型之后,必须调用New过程开辟存储单元调用格式如下:

如果不再需要指针变量当前所指姠的存储单元,可调用Dispose过程释放所占用的存储单元Dispose和New的作用正好相反,其格式为:

指针所指向的存储单元用如下形式表示:

程序中的a ^ 表礻指针变量a所指向的存储单元与指针变量的关系如下图所示:

在程序中对所指存储单元(为a ^)可以视作简单变量进行赋值计算和输出。

[唎5.20] 利用指针对数组元素值进行排序

解:①定义一个各元素为指针类型的数组a :

    ⑤过程pixu用交换指针值的方式,按a数组所指向的存储单元内容徝从小到大地调整各元素指针值实现“指针”排序;

[例5.21] 有m只猴子要选猴王,选举办法如下:

我要回帖

更多关于 100到99999的水仙花数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信