PASCAL语言程序设计(5)

2019-04-16 00:40

2-6 某市出租车起步价8元,可以行使3公里,3公里以后,按每公里1.6元计算,现输入出租车行驶的公里数,输出顾客需付费多少元?

2-7 打印出如下图形:(字符之间无空格)

2-8 求N!=1*2*3*?*N ,这里N不大于10。提示:注意累乘器使用前要置1 2-9 输出1-100之间的所有偶数。数字间隔一空格,每行输出10个数。 2-10 输出1-N(N<=100)之间的奇数和。(用whiLe循环做) 【样例输入】100 【样例输出】2500

2-11 输入30个学生的成绩,分别统计成绩在85—100分,60—84分,60分以下,各分数段中的人数。

2-12 输入若干个字符,它的终止符是'$',计算输入的字符中小写字母'b'出现的次数。

【样例输入】abcdBcabcdaasdccbdfasd$ 【样例输出】3 2-13 求输入的一个整数的各位数字之和。(用whiLe循环做) 【样例输入】2359 【样例输出】19

2-14 求恰好使s=1+1/2+1/3+?+1/n的值大于K(K<=10)时n的值。 【样例输入】10 【样例输出】12367

2-15 求两个自然数M,N的最大公约数(M,N<=30000)。

2-16 百钱百鸡问题。一只公鸡值5元,一只母鸡值3元,3只小鸡值1元,现用一百元买一百只鸡,问有多少种方案?(某种鸡可以有0只)

2-17 老师面前摆了一堆铅笔,学生问有多少支铅笔,老师说,有100多支,并且若三个三个数,剩二个,若五个五个数,剩三个,若七个七个数,剩五个。请你编一个程序计算出这堆铅笔至少有多少支?

2-18 警察局抓了a,b,c,d四名偷窃嫌疑犯,其中有一人是小偷,审问中: a说:\我不是小偷\说:\是小偷\说:\小偷肯定是d\说:\冤枉人\现在已经知道四人中三人说的是真话,一人说的假话,问到底谁是小偷?输出小偷代号,用小写字母表示。

2-19 小球从100米高处自由落下,着地后又弹回高度的一半再落下。求第15次着地时, 小球共通过多少路程?

2-20 求2009个1997的乘积的最后两位数是多少? 2-21 找出被2、3、5除时余数为1的最小的十个数。 2-22 把一张一元钞票换成一分,二分和五分的硬币,每种至少一枚,问有哪几种换法?

21 / 53

第三章 数组 第一节 一维数组

一、定义

数组是按一定顺序排列且具有相同性质的变量的集合。数组根据下标个数的不同,可分为一维数组、二维数组和多维数组,我们先学习一维数组的使用方法。

一维数组语句格式: TYPE

标识符= array [下标范围] of 基类型; 在定义数组时,应注意:

“下标范围”中的下标为顺序类型之一的整型、字符型、布尔型、子界型等,但不能为实型。

下标范围决定的是数组元素下标的类型,同时也决定了数组中元素的个数。 如: Type

arraytype=array [1..10] of integer;

其中下标范围1..10的类型为子界类型(所谓子界类型,是指取一种数据类型的一部分作为新的数据类型),表明数组元素的个数为10个。其中1称为子界类型的“下界”,10称为子界类型的“上界”,上界和下界必须是同一个顺序类型,即同为整型、字符型或布尔型等,但不能是实型。也就是说,子界类型决定了该类型变量可以取值的范围(介于下界与上界之间)。在这里,下界和上界必须是属于同一个有序类型的常量,且下界的序号必须小于上界的序号(即前面的必须小于后面的)。

基类型决定了该数组能存放什么类型的值,同一数组的各元素均具有相同的数据类型。 二、数组元素的输入、输出

例3-1 按照顺序读入以下十个数据,然后以逆序方式输出。 【样例输入】13 7 1 29 36 65 38 23 19 10 【样例输出】10 19 23 38 65 36 29 1 7 13 【参考程序】 program aa; const n=10;

type arraytype=array[1..n] of integer; var a:arraytype; i:integer; begin

for i:=1 to n do read(a[i]); //顺序读入10个数据

for i:=n downto 2 do write(a[i],' '); //逆序输出后9个数据,每个数据后加一空格

writeln(a[1]); //第一个数据单独输出,后面无空格。 end.

三、数组的查找

查找也称检索或搜索。它是按照某种方法确定某一待查数据位置的一种基本运算操作。 1.顺序查找法

顺序查找法又称线性查找法,是最基本的一种查找方法,这种方法对所查数据所在的数据表没有任何特殊要求。

顺序查找的过程是:从头开始,根据给定的值,依次与数据表中的关键字进行比较,相同即为找到,给出相关信息,若查遍整个数据表仍然未找到,即表示该元素不存在。

2.折半法查找

也称二分法查找,它要求数据表中的元素是有序的。查找过程如下:

22 / 53

条件:有n个连续递增的数A[1],A[2],??,A[n],查找X,设p:=1;t:=n; 方法:(1)求中点:m=(p+t) DIV 2

(2)A[m]=X 中点值等于查找值,打印并结束 (3)A[m]X 将t:=m-1转(1)

此种方法,首先是将要查找的数据项与数据表的中间项进行比较,若相等则表示已查到,结束查找过程,否则,继续往下进行,若中间项数据大于查找数据项,则可知要查找的数据在表的前半部,反之则在后半部。然后再选定相应的前(后)部的一半,重复上述过程。在查找的过程中,不断地将数据区域分半,使需查找的数据所在范围越来越小。由此可见,它要比顺序查找的效率高得多,是最常用的查找办法,适用于数据较多的情况下。

例3-2 先输入10个递增排列的数,然后输入一个数X,看它是否在这10个数中,若在,输出它的位置,否则输出’not in’。

【样例输入】 //两行,第一行是10个数,第二行是要查找的数 2 18 23 27 35 39 47 48 55 69 48

【样例输出】 //一行,查找的结果 8

程序一:二分法查找,思考一下查找了多少次 program aa; var

p,t,i,f,m,x:integer;

a:array[1..10] of integer; begin

for i:=1 to 10 do //输入10个递增的数据 read(a[i]);

read(x); //输入待查找的数据x p:=1; t:=10;f:=0; while p<=t do begin

m:=(p+t) div 2;

if a[m]=x then //找到了,输出m,并使f的值为1,然后中断while循环

begin

writeln(m); f:=1; break; end else

if x>a[m] then p:=m+1 //若x>a[m],则待查找的数据在后半部分。 else t:=m-1; //若x

if f=0 then writeln('not in'); //f=0,没有找到,输出not in end.

程序二:顺序查找法 program aa;

const n=10;

type ash=array[1..n] of integer; var a:ash; m,x,i:integer; begin

for i:=1 to n do read(a[i]); readln(x);

23 / 53

m:=0;

for i:=1 to n do

if a[i]=x then begin m:=i; break; end; if m>0 then writeln(m) else writeln('not in'); end.

思考:若在1000个数据中查找一个数,程序一和程序二分别最多查找多少次,可以确定该数据是否存在数据表中?

四、数组元素的移动与插入

当一个数组建立好后,有时会根据问题的需要,移动一下各元素中的数据位置或在数组中插入一个数据。

例3-3 将A数组中从第M个元素起一直到最后的元素平移到数组的开头,并把A[1]到A[M-1]中的元素向后顺移,如图所示。

图3-1

【样例输入】 //两行,第一行是6个数,第二行是M的值 1 2 3 4 5 6 3

【样例输出】 //一行,移动结果,两个数之间隔一空格,最后无空格 3 4 5 6 1 2 【参考程序】 program aa; const n=6;

type arraytype=array[1..n] of integer; var a:arraytype; i,j,m,k:integer; begin

for i:=1 to n do read(a[i]); //读入n个数据 m:=maxint;

while (m>n) or (m<=0) do //保证m的值在数组下标范围内 readln(m);

for j:=1 to n-m+1 do //共需进行n-m+1次移动 begin

k:=a[n]; //将最后一个数据放到暂存单元k中

for i:=n-1 downto 1 do a[i+1]:=a[i]; //移动数组元素,空出数组第一个位置

a[1]:=k; //将暂存单元k中的元素放入数据第一个位置 end;

for i:=1 to n-1 do write(a[i],' '); //按要求输出移动后的数组元素 writeln(a[n]); end.

例3-4 先读入10个由小到大排列的数,然后将一个数X插入到这个有序的数列中,要求插入后该数列仍然有序。

【样例输入】 //两行,第一行是要插入的数X,第二行是10个数 6

1 2 3 4 5 6 7 8 9 10

【样例输出】 //一行,插入后的数列 1 2 3 4 5 6 6 7 8 9 10

24 / 53

【参考程序】 program aa;

var a:array[0..11]of integer; i,j,k,x:integer; f:boolean; begin

k:=10; readln(x); //输入要插入的元素

for i:=1 to k do read(a[i]); //对数组元素进行赋值 j:=1;

while (x>=a[j]) and (j<=k) do j:=j+1; //寻找x应插入的位置 if j>k then a[j]:=x //插入到数组的最后 else begin

for i:=k downto j do a[i+1]:=a[i]; //移动数据元素,空出第j个位置

a[j]:=x; //插入x到数组第j个位置 end;

for i:=1 to k do write(a[i],' '); //输出 writeln(a[k+1]); end.

第二节 二维数组及应用

一、二维数组的定义

和一维数组一样,要在程序的说明部分的类型说明中对二维数组进行定义。它的一般形式为:

TYPE

数组类型名=array[行下标范围,列下标范围] of 数组元素基类型 对二维数组的输入与输出也可用二重循环来实现: 输入:

for i:=1 to 5 do

for j:=1 to 4 do read(a[i,j]); 输出:

for i:=1 to 5 do begin

for j:=1 to 4 do write(a[i,j], ' '); writeln; end;

从二维数组的定义可以看出,和一维数组相比较,二维数组在定义时一定要指定两个下标。行下标范围用来指定行下标的类型和它的取值范围,列下标范围用来指定列下标的类型和它的取值范围。

二、二维数组元素的输入与输出

例3-5 输入5名学生4门功课的考试成绩,输出各人各科成绩及总分,成绩均为整数。 【样例输入】 //每行4个数据,数据间隔一空格 23 45 67 89 90 87 76 67 90 78 67 45 86 87 98 76 67 86 90 91

【样例输出】 //共三行,每行5个数据,前4个是各科成绩,第5个是总成绩,数据间隔一空格,最后无空格。

23 45 67 89 224

25 / 53


PASCAL语言程序设计(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:金融衍生工具期末复习总结

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: