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