请问在“pascal将十进制转二进制算法正整数m转换成k进制数”的程序中,这一句是什么意思?

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
Free Pascal 基本程序题集.doc29页
本文档一共被下载:
次 ,本文档已强制全文免费阅读,若需下载请自行甄别文档质量。
文档加载中...广告还剩秒
需要金币:130 &&
你可能关注的文档:
··········
··········
基本程序题集
For NOIP2007
Billy.Linux NOIP是一个比较基础的比赛,大家都说NOIP是考察基本算法的熟练掌握,所以个人认为无论是普及组还是提高组,都要从最最基本的题做起,要达到:只要是简单题,编完就对――不用编译;一般的题,写出来的都是对的――运行后几本上是正确的。为了提高,于是做了一个基本程序题集,以便查找自己的不足之处。
Problem1删数问题
Problem2旅行家的预算
Problem3线段覆盖
Problem4背包问题
Problem5任务调度
Problem6果子合并
Problem7射击竞赛
Problem8任务安排
Problem9最小差距
Problem1一元三次方程的解
Problem2查找第k大元素
Problem3麦森数
Problem4逆序对个数
Problem5寻找最近点对
Problem6剔除多余括号
Problem7赛程安排
Problem1皇后问题
Problem2八数码问题
Problem3拼图
Problem4质数方阵
Problem5埃及分数
Problem6字符串变换
Problem7聪明的打字员
Problem8 01序列
Problem9生日蛋糕
Problem1一笔画问题
Problem2 Car的旅行路线
Problem3求割点与桥
Problem4十字绣
Problem5舞会
Problem6休息中的小呆
Problem7最优布线问题
Problem8磁盘碎片整理
Problem9说谎岛
Problem10 01串问题
Problem11海岛地图
Problem1数的划分
Problem2最优分解方案
Problem3出栈序列统计
Problem5电子锁
Problem6堆塔问题
Problem7取数游戏
Problem8球迷购票
Problem9 Fibonacci公约数
Problem10传球问题
Problem11约瑟夫问题
Problem12青蛙过河
Problem13棋盘游戏
Problem1火车栈
Problem2括号表达式
Problem3银河英雄传说
Problem4矩形覆盖
Problem5最短路径问题
Problem6果子合并
字符串处理
Problem1相对分子质量
Problem2表达式求值
Problem3侦探推理
Problem4最长公共子串
Problem5一元一次方程的解
正在加载中,请稍后...跪求pascal题库_百度知道
跪求pascal题库
初中级别的`别太难了``
PASCAL基础题【程序1】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?【程序2】题目:判断101-200之间有多少个素数,并输出所有素数。1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。       【程序3】题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。【程序4】题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。(2)如果n&&k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n, 重复执行第一步。(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。【程序5】题目:利用条件运算符的嵌套来完成此题:学习成绩&=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。1.程序分析:(a&b)?a:b这是条件运算符的基本例子。【程序6】题目:输入两个正整数m和n,求其最大公约数和最小公倍数。1.程序分析:利用辗除法。【程序7】题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。【程序8】题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+(此时共有5个数相加),几个数相加有键盘控制。1.程序分析:关键是计算出每一项的值。【程序9】题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程   找出1000以内的所有完数。【程序10】题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在   第10次落地时,共经过多少米?第10次反弹多高?【程序11】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?【程序12】题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。      【程序13】题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。请看具体分析:【程序14】题目:输入某年某月某日,判断这一天是这一年的第几天?1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。【程序15】题目:输入三个整数x,y,z,请把这三个数由小到大输出。1.程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x&y则将x与y的值进行交换,然后再用x与z进行比较,如果x&z则将x与z的值进行交换,这样能使x最小。【程序16】题目:输出9*9口诀。1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。【程序17】题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个   第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下   的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。1.程序分析:采取逆向思维的方法,从后往前推断。【程序18】题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。 【程序19】
读入摄氏温度c,将它转换成华氏温度f输出,写出程序。已知:f=9/5*c+32【程序20】输入a,b,c,求一元二次方程ax2+bx+c=0的根。【程序21】依次输入10个学生的成绩,计算每个学生的成绩与平均成绩的差,并由此给出每个学生成绩的字母等级。如果成绩高于平均成绩10分以上为A等,与平均成绩相差在10分以内为B等,其余为C等。最后输出每个学生的编号,成绩和字母等级,每个学生占一行。【程序22】某屠宰场杀猪有一习惯,把每天要杀的n头猪按顺序排成一排,将排在单号位置的猪杀掉;然后把剩下的猪按上一次相对的位置排好,重新编号后再将排在单号位置的猪杀掉,重复前面的过程,直到剩下一头猪时停止杀猪,将这头猪放回,等待明天再杀。有一头聪明的猪摸准了这个规律,事先找好位置,使得它每天都不会被杀。求当总共有n头猪时,这个聪明的猪应该站在什么位置?(n由键盘输入)【解题指导】
采用数组存储猪的编号,即初始时利用循环语句令a[i]=i,接下来开始模拟杀猪过程,每次杀猪时,奇数位置的猪都被杀掉,偶数位置的猪重新编号,可以令a[i]=a[i]*2表示偶数的猪重新编号的情况,一次杀猪过程完后,猪的数量应该只剩n\2头了,以这n\2头猪为新的n重新杀猪,如此下去,直到n=1就表示只剩最后一头猪了。【程序23】编号为1,2,......,n的n个人按照顺时针方向围坐一圈。从第一个人开始顺时针方向自1开始报数,报到m时停止报数。报m 的人出列,从他在顺时针方向的下一个人开始重新报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。其中n,m由键盘输入。 【程序24】随机数产生时通常会有重复,现要求产生20个100以内的保证不重复的随机数存入数组,最后按从小到大的顺序输出这个数组,要求输出在同一行,每个元素之间用空格隔开。【程序25】某侦察队长接到一项紧急任务,要他在代号为A,B,C,D,E,F的六个侦察对员中选出若干人去侦察一件案子。由于每个侦察队员特长不同,针对这个案子,所需的人选必须注意以下几个条件:
⑴ A,B两人至少去一人;
⑵ A,D不能一起去;
⑶ 若D不去,则E也不去;
⑷ B,C两人都去或都不去;
⑸ C、D两人中去一人;
⑹ A、E、F三人中要派两人去。
请问应该让谁去?【程序26】让计算机产生一个1000以内的随机整数,从键盘上输入一个自然数,若正确,则输入猜对的提示,否则提示输入的数是大了还是小了。最后输出所猜的次数。【程序27】输入正整数a,对它进行质因式分解。例如:
输出:20=2*2*5【程序28】用物理天平测量物体的质量时,测得物体的质量为a克(a为整数,并小于1千克),问:这时在天平的砝码盘中应有哪几个砝码?请选用最少数量的砝码(天平的砝码由下列质量的砝码组成:500克1个,200克1个,100克2个,50克1个.20克1个,10克2个,5克1个,2克2个,1克1个)。【程序29】设有n盏灯,放在一排,从1~n依次顺序编号。有n个人也从1到n依次编号。第1个人(1号)将灯全部关闭,第2个人(2号)将凡是2的倍数的打开,第3个人(3号)将凡是3的倍数的灯做相反处理(该灯如为打开的,则将它关闭,如关闭的则将它开),以后的人都和3号一样,将凡是自己号数倍数灯做相反处理。键盘输入n,输出最后还亮着的灯的编号,每个编号之间用空格隔开。【程序30】 有一推理题:警官在死者被害现场发现A、B、C、D四名犯罪嫌疑人。讯问中,A说“我没有杀人”,B说“C是凶手”,C说“杀人者肯定是D”,D说“C在冤枉好人”。现已知:四人中有三人说的是真话,一人说的是假话,四名犯罪嫌疑人中有且只有一人是凶手。请编程判断到底谁是真正的凶手。【程序31】输入一个十进制整数,输入对应的二进制数【程序32】某次运动会上,八位运动员的100M比赛成绩(单位:秒)如下:
运动员号码(Number) 100M比赛成绩(Score)
要求按100M比赛成绩(score)排序,显示出前三名运动员的号码和成绩。【解题指导】
最好利用记录类型存储运动员信息【程序33】在下面式子中的二个□内填入一个合适的同样的数字,使等式成立。
□3*6528=3□*8256
最后要求输出整个完整的等式。 【程序34】任何一个正整数的立方都可以写成一组相邻奇数之和。
如: 33=7+9+11=27 43==13+15+17+19=64
这就是尼科彻斯定理,请编写程序验证该定理,输出任意整数,输出格式参考下面的样例:
输出:4(3)=13+15+17+19=64【程序35】来自不同国家的四位留学生A,B,C,D在一起交谈,他们只会中、英、法、日四种语言中的2种,情况是,没有人既会日语又会法语;A会日语,但D不会,A和D能互相交谈,B不会英语,但A和C交谈时却要B当翻译,B,C,D三个想互相交谈,但不到共同的语言,只有一种语言3人都会,请编程确定A,B,C,D四位留学生各会哪两种语言。【程序36】一辆以固定速度行驶的汽车,清晨司机看到里程表上从左到右的读数和从右到左的读数是相同的,这个数是95859,7小时后,里程表上又出现一个新的对称数。问此车的时速是多少(是一整数)?这个新的对称数是什么?设里程表为5位数字。 【程序37】小红今年12岁,她父亲比她大20岁,编一程序,计算出她的父亲在几年后比她年龄大一倍。那时他们的年龄各为多少?【程序38】某校一等奖学金认定办法如下:
⑴所考五门课成绩总分超过450分;
⑵每门课都在88分以上;
⑶前3门课(主课)每门成绩都在95以上,其他2门(非主课)每门成绩在80分以上。
凡满足上面任意一个条件都可认定为一等奖学金,输入某学生的5门课成绩,判定他是否能获得一等奖学金。窗体顶端窗体底端 【程序39】
利用下列公式计算并输出π的值:
π/4=1-1/3+1/5-1/7+...+1/(4n-3)-1/(4n-1) n=10000【程序40】 输入两个整数,求出它们的最大公约数和最小公倍数。【程序41】计算表达式的值:s=1-1/2+1/3-1/4+…+1/99-1/100【程序42】
某商场近期搞优惠活动,优惠办法如下:购物不足250元的,没有折扣;购物满250元(含250,下同)不足500元的,减价5%;购物满500元不足1000元的,减价10%;购物满1000元不足2000元的,减价15%;购物满2000元的,减价20%。输入货款,计算顾客实际应付的金额。【程序43】用筛法求素数.(255以内)【程序44】高精度加法和减法【程序45】用递归方法求幂函数m^n.输入M,N求幂 【程序46】打印
1 2 3 4 5 6
1 2 3 4 5 6
以下是回朔法部分【程序47】输出n,输出其排列数输入:3输出:123
321 【程序48】输出n,m,(n&m)输出组合数输入:5 3输出:123 124 125 134 135 145 234 235 245 345 【程序49】n皇后问题,在n*n棋盘上,求放n个皇后的方案数.输入:8输出:92 【程序50】老鼠走迷宫,n*n迷宫,1代表墙,0代表路,起点为(1,1),终点为(n,n),求一条最短的路.输入:40 1 0 00 0 0 01 0 1 10 0 0 0输出:(1,1)(2,1)(2,2)(3,2)(4,2)(4,3)(4,4)
6 【程序51】一个旅行者有一个最多能用m公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn.若每种物品只有一件求旅行者能获得最大总价值。输入:5 10
5 5输出:11
以下是查找和排序 【程序52】快速排序实现【程序53】二分查找实现【程序54】插入排序实现【程序55】冒泡排序实现
其他类似问题
为您推荐:
您可能关注的推广
pascal的相关知识
其他2条回答
USACO,PKU,ZJU,中学高级本及习题集都有初级的
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁各位大神,新人求助。_pascal吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:7,343贴子:
各位大神,新人求助。收藏
问题一:将十进制转换为二,八,十六进制。问题二:将二,八,十六转换为十进制。
1.辗转相除法2.乘权累加法请自行百度
不同进制数的转换及应用计算机的一个重要理论基础就是二进制思想。任何信息最终都是以二进制数的形式存储在计算机中的,在计算机中有时还用到十六进制和八进制。所以,在实际应用中,经常需要将一个十进制数转换成二进制、八进制或十六进制的数,有时又需逆向转换,将二进制、八进制或十六进制的数转换成十进制数,有时还需要在二进制、八进制和十六进制数之间进行相互转换(2,8,10,16等一般称为“基”)。不同进制数之间转换的基本算法是:(1) 十进制整数转换成n进制数的方法:将十进制整数不断除以n取余,最后反序输出即可。(2) n进制数(整数、实数都可以)转换成十进制数方法:按“权n”展开,即表示成若干项形如ai*ni的累加和即可。(3) 二进制、八进制、十六进制之间的转换方法:利用3位二进制表示1位八进制数,4位二进制数表示1位十六进制数的基本思想,3位一段(或4位一段)分别转换即可。注:一般2≤n≤16,十进制以上、十六进制以下的数制除了0~9十个字符外,还用到A、B、C、D、E、F几个字符,分别表示10~15。对于十进制,我们称它的基数为10,而二进制的基数就是2,十六进制的基数就是16。对于十进制数1234.56,我们可以表示成1*103+2*102+3*101+4*100+5*10-1+6*10-2,我们把10称之为十进制各个位的“权”。对于二进制数,我们也可以类似地表示成1*24+1*23+1*20+1*2-2+1*2-5,即二进制各个位的权为2i。这一方法(按权展开)同样可以用在任意n进制中。 二、不同进制数之间的相互转换1、十进制正整数转换成任意n进制数[方法介绍]就是模拟小学学过的除法运算,比如要把十进制整数39转换成二进制数,则转换方法如下左图,即不断除以2,直到商为0,再倒序输出即可,结果一般表示为(39)10
=( 。而要把十进制整数245转换成八进制数,方法一样,只要不断地除以8即可,如下右图所示,结果可以表示为:(245)10
=(365)8。一定要注意的是“倒序输出”。 图1
十进制整数转换成n进制方法示意图[算法描述]设十进制数为Y,要转换成n进制,用数组a存放最后的转换结果,i为数组下标,则算法描述如下:i:=0;重复做:
i:=i+1;
a[i]:=Y mod
Y:= Y div n直到Y=0为止。依次输出最高位a[i]到最低位a[1]。 [参考程序] 将十进制整数Y转换成任意n进制数(设n&10)。Program
ex1(input,output);var
a: array [1..100]
n,y,i,j:begin
write('input
readln(y);
write('input
readln(n);
write('(',y,')10=','(');
write (a[j]);
writeln(')',n);
readlnend.[程序样例]输入:245
8输出:(245)10=(365)8 [思考练习]如果n超过了10,比如要转换成十六进制数,可以用字符A、B、C、D、E、F分别表示数10~15,转换方法一样,只要在输出时把余数转换为字符(A~ F)即可。这个程序请大家完成。 2、任意n进制数(整数、实数)转换成十进制数[方法介绍]
我们知道一个十进制数1234.56,按权展开可以表示成1*103+2*102+3*101+4*100+5*10-1+6*10-2,同样,对于任意n进制数X,按权展开的方法是:( = 1*23+1*22+0*21+1*20+0*2-1 +1*2-2= 8+4+0+1+0+0.25 = 13.25(165)8 = 1*82 + 6*81 + 5*80
= 64+48+5 = 117这儿计算出来的13.25和117就是(和(165)8所对应的十进制数。[参考程序] 将任意n进制整数X转换成十进制数(设n&10)。Program
ex2(input,output);const
n,i,weight,total:
a:array[1..m]begin
write('input
readln(n);
write('input
readln(str);
write('(',str,')',n , '=(');
for i:= 1 to Length(str)
a[i]:= ord (str[i])-ord ('0');
{取出数中的每一位}
weight:=1;
total:=a[Length(str)];
for i:=Length(str)-1
if a[i] & n then
{判断输入的数是否合法}
writeln('input error! ');
weight:=weight*n;
{累乘计算出每一位的权}
total:=total+a[i]*
{按权展开每一位,累加求和}
writeln(total,’)10’);
readlnend.[程序样例]输入:2
100110输出:(=(38)10[思考练习]如果n超过了十进制,则程序怎么修改呢?这个方法也适用于把任意n进制小数转换成十进制小数,方法基本一样。因此,我们对一个n进制的实数,就可以把整数和小数部分截取出来后,分别进行转换,最后再加起来输出即可。请大家完成。 3、将十进制小数转换为其它进制的小数[方法介绍]将十进制小数转换为其它进制的数,其基本算法是:将小数乘以待转换的进制数,正向取整。图2
十进制小数转换成其它进制小数方法示意图所以,运算结果是:(0.325)10 ≈ (0. 0101)2大家发现,这种转换有时是一个近似值。思考:为什么?[参考程序]程序请大家完成。对于一个十进制的实数,我们就可以把整数和小数分解出来,分别转换成其它进制的整数和小数,最后再加起来输出结果。 4、二进制和十六进制之间的转换如要把二进制数(.01111)2转换成十六进制数,则我们以小数点为准,向前4位一段转换整数部分,不足则高位补0;再向后4位一段转换小数部分,不足则低位补0。如下图,最后相加输出即可得到答案:(3D9.78)16。 反之也一样,如要把十六进制数(A1F5.2)16二进制数,则结果为(11 )2。注意:一定要补齐4位
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或[转贴]pascal基础 - 郭连兵博客 - 吉林省教育社区
吉林省最大的教育社区门户
[转贴]pascal基础
& 08:28:00
/ 个人分类:
第一章  初识PASCAL语言信息学奥林匹克竞赛是一项益智性的竞赛活动,核心是考查选手的智力和使用计算机解题的能力。选手首先应针对竞赛中题目的要求构建数学模型,进而构造出计算机可以接受的算法,之后要写出高级语言程序,上机调试通过。程序设计是信息学奥林匹克竞赛的基本功,在青少年朋友参与竞赛活动的第一步必须掌握一门高级语言及其程序设计方法。
一、Pascal语言程序的基本结构任何程序设计语言都有着一组自己的记号和规则。PASCAL语言同样必须采用其本身所规定的记号和规则来编写程序。尽管不同版本的PASCAL语言所采用的记号的数量、形式不尽相同,但其基本成分一般都符合标准PASCAL的规定,只是某些扩展功能各不相同罢了。下面我们首先来了解Pascal语言的程序基本结构。为了明显起见先举一个最简单的PASCAL程序例子:从这个简单的程序可以看到:⒈一个PASCAL程序分为两个部分:程序首部和程序体(或称分程序)。程序首部是程序的开头部分,它包括:⑴程序标志。\"program⑵程序名称。如例中的exam1。在写完程序首部之后,应有一个分号。⒉程序体包括说明部分和执行部分两个部分。⑴说明部分用来描述程序中用到的变量、常量、类型、过程与函数等。PASCAL规定,凡程序中用到所有变量、符号常量、数组、标号、过程与函数、记录、文件等数据都必须在说明部分进行定义,不允许未说明先使用。⑵执行部分是一个PASCAL程序的核心部分。执行部分以\"begin\"开始,以\"end\"结束的复合语句,其间有若干个语句,语句之间以分号隔开。执行部分之后有一个句点,表示整个程序结束。⒋PASCAL程序的书写方法应以程序结构清晰、易读为目的。在编写程序时尽量模仿本书中例题程序格式。⒌在程序中,一对大括号间的文字称为注释。注释的内容由人们根据需要书写,可以用英语或汉语表示。注释可以放在任何空格可以出现的位置。执行程序时计算机对注释不予理睬。二、第一个程序下面程序在运行时,会提示输入一个圆的半径,然后会在屏幕上画一个圆。按回车后程序结束回到程序窗口。Program ex1;UVar Gm,Gd,R :BeginGd:=0;Write(\'Please enter the radius:\');readln(R);Initgraph(Gm,Gd,\' \');Setcolor(Green);Circle(320,240,R);RCEnd.注意,如果上面程序运行时会出现初始化图形错误,请将系统目录下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还定义了长整数常量MaxLongInt,其值为。⒉实型常量实型常量包括正实数、负实数和实数零。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都不是合法形式的实数。无论实数是用十进制表示法还是科学表示法,它们在计算机内的表示形式是一样的,总是用浮点方式存储。和整数相比,实数能表示的范围大得多,但值得注意的是实数的运算整数的运算速度慢且无法像整数那样精确表示,只能近似表示。⒊字符常量在Pascal语言中,字符常量是由单个字符组成,所有字符来自ASCII字符集,共有256个字符。在程序中,通常用一对单引号将单个字符括起来表示一个字符常量。如:\'a\',\'A\',\'0\'等。特殊地,对于单引号字符,则要表示成\'\'\'\'(用两个’表示)。对于ASCII字符集中,按每个字符在字符集中的位置,将每个字符编号为0-255,编号称为对应字符的序号。4.布尔常量布尔型常量仅有两个值,真和假,分别用标准常量名true和false表示。它们的序号分别为1和0。5.符号常量一个常量即可以直接用字面形式表示(称为直接常量, 如 124,156.8),也可以用一个标识符来代表一个常量,称为\"符号常量\"。但符号常量必须在程序中的说明部分定义,也就是说先定义,后使用。定义符号常量的一般格式:CONST&常量标识符&=&常量&说明:常量说明部分以关键字const开头, 后面的标识符为常量标识符,其中\"=\"号后的常量为整数、实数、字符、 字符串(字符、字符串常量在后面章节中将作介绍)。而且,在常量说明部分可以将几个常量说明成符号常量,共用一个关键字\"const\"。例如:则在本程序中pi和zero作为符号常量,分别代表实数3.14159和整数0。也就是说,常量说明部分既定义了常量名及其值,又隐含定义了常量的类型。关于符号常量,应注意下列几点:⑴符号常量一经定义,在程序的执行部分就只能使用该常量标识符,而不能修改其值。⑵使用符号常量比直接用数值更能体现\"见名知义\"的原则,也便于修改参数,故一个较好的程序中,应尽量使用符号常量,在执行部分基本上不出现直接常量。(二)变量变量代表了一个存储单元,其中的值是可变的,故称为变量。如游戏\"魂斗罗\"中玩者命的个数最初为3,当你死了一次命减少一,这里命的个数就是一个变量(或者说命的个数存储在一个存储单元中)。即在程序运行过程中,其值可以改变的量,称为变量。变量有三个要素是:变量名、变量类型、变量值。一个程序中可能要使用到若干个变量,为了区别不同的变量,必须给每个变量(存贮单元)取一个名(称为变量名),该变量(存贮单元)存放的值称为变量的值,变量中能够存放值的类型为变量的类型。例如 \"魂斗罗\"游戏中用于存放\"命\"的变量,在游戏程序中的名字可取为N,它的类型为整型,游戏初始时这个变量的值为3。1.变量名用一个合法的标识符代表一个变量。如n,m,rot,total 等都是合法变量名。在程序中用到的变量必须在说明部分加以说明,变量名应遵循自定义标识符的命名规则,并注意\"见名知义\"的原则,即用一些有意义的单词作为变量名。\"自定义标识符\"的命名规则为:自定义标识符必须以字母(包含下划线\"_\")开头,后面的字符可以是字母或数字。标识符长度不超过63个字符。2.变量的类型常量是有类型的数据,变量在某一固定时刻用来存放一个常量,因此也应有相应的类型。如整型变量用来存放整数,实型变量用来存放实数。3.变量说明在程序中若要使用变量,变量的名称及类型在程序的变量说明部分加以定义,变量的值则在程序的执行部分中才能赋给。变量说明的一般格式:VAR&变量标识符&[,&变量标识符&]:&类型&;(中括号内部分表示可省,下同)其中VAR是pascal保留字,表示开始一个变量说明段。例如:varage,day:amount,average:其中,Integer(整型)、Real(实型)是标准标识符, 它们是\"类型标识符\",代表了确定的类型,如age和 day 被定义为整型变量,amount和average被定义为实型变量。一旦定义了变量,就确定了它的类型,也就是说,就确定了该变量的取值范围和对该变量所能进行的运算。(三)算术表达式⑴算术表达式的定义pascal语言中的算术表达式是由符合pascal语法规定的运算对象(包括常量、变量、函数)、算术运算符、圆括号组成的有意义的式子。如:A+3..4-Abs(-1123)⑵算术运算符常用的有以下6个算术运算符:① + (加)- (减)③ * (乘)④ / (实数除)得到结果为实型.如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规定:() -& 函数 -& *,/,div,mod -& +,-表达式中相同优先级的运算符,按从左到右顺序计算;\"先乘除后加减\"(注:\"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);write(\'My name is Liping\');2、 writeln语句格式:Write(表达式1,表达式2,……)或writeln(二)输出语句的功能计算机执行到某一输出语句时,先计算出输出语句中的每个表达式的值,并将每一个表达式的值一个接一个地输出到屏幕上。Write语句与writeln语句格式上都相似,但它们在功能上有所不同,两个语句的区别在于,write语句将其后括号中的表达式一个接一个输出后,没有换行。而writeln语句则在输出各个表达式的值后换行。例如以下两个程序段的输出分别为:write(1,2,3,4);write(5,6);输出为:123456writeln(1,2,3,4);write(5,6);输出为:123456四、应用例析例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 :BeginA:=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);REnd.例2:有三个小朋友甲乙丙。甲有50粒糖果,乙有43粒糖果,两有13粒糖果。现在他们做一个游戏。从甲开始,将自己的糖分三份,自己留一份,其余两份分别给乙与丙,多余的糖果自己吃掉,然后乙与丙也依次这样做。问最后甲、乙、丙三人各有书多少粒糖果?分析:这个问题中我们关心的是在游戏过程中每个小朋友的糖果个数,且他们所拥有的的糖果数是在变化的。因此可用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?第三章  带格式的输出语句输入语句一、写语句的输出格式在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。有时,在程序中往往根据实际情况,需要自己定义场宽。⒉指定场宽在写语句中输出项含有格式符号时,就是为了指定场宽。⑴指定单场宽.格式: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); writeln(c,c:5); writeln(s,s:10,s:5); writeln(b,b:5,b:3);end.运行结果如下:1234□□□1.E+03□□34.56780#□□□□#abcdefg□□□abcdefgabcdefgTRUE□TRUETRUE3.应用例析例2:已知A=253,B=43,输出A*B的运算式子。即输出如下:253*43=10879253* 43759+101210879分析:对于该问题,我们只要控制好输出时右靠齐即可。即前四行的总宽度一样(例如为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.
二、 输入语句(读语句)在程序中变量获得一个确定的值,固然可以用赋值语句,但是如果需要赋值的变量较多,或变量的值经常变化,则使用本节介绍的输入语句──读语句,将更为方便。读语句是在程序运行时由用户给变量提供数据的一种很灵活的输入动作,它有两种格式: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语句( 读完本语句中变量所需的数据)后,下一个读语句接着从该数据输入行中继续读数据,也就是说,不换行。如: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语句后,指针移到下一个数据行的开头。各变量的值如下表所示。变量名 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号小朋友开始,将他的糖果均分三份(如果有多余的,则他将多余的糖果吃掉),自己留一份,其余两份分给他的相邻的两个小朋友。接着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时,按照小数形式输出,采用了指定双场宽格式。练习三1. 编一程序,将摄氏温度换为华氏温度。公式为:其中f为华氏温度,c是摄氏温度。2. 编一程序,输入三角形的三边a、b、c(假设这三边可以构成一个三角形),求三角形的面积S?(提示:可利用海伦公式&
第四章  简单的分支结构程序设计在现实生活中,我们每天都要进行根据实际情况进行选择。例如,原打算明天去公园,但如果明天天气不好,将留在家里看电视。所以人也会根据条件进行行为的选择。计算机也会根据不同情况作出各种逻辑判断,进行一定的选择。在这课与下一课中,我们将会发现,我们是通过选择结构语句来实现程序的逻辑判断功能。一、PASCAL中的布尔(逻辑)类型在前面,我们学习了整型(integer)与实型(real)。其中integer型数据取值范围为-3之间所有整数。而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.  TRUEFALSEb)布尔类型变量不能直接用读语句输入布尔类型变量不能通过读语句给它们提供值。事实上,我们可以通过间接方式对布尔变量进行值的输入。例如,以下程序是错误的:  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为双目运算,有两个运算对象。它们的运算真值表如下:于是,对于一个关系表达式,或多个关系表达式用布尔运算符连接起来的式子就称为布尔表达式。布尔表达式的值也为布尔值。如果一个表达式里出现两个或两个以上的运算符, 则必须规定它们的运算次序。pascal规定:①表达式中相同优先级的运算符,按从左到右顺序计算;②表达式中不同优先级的运算符,按从高到低顺序计算;③括号优先级最高,从内到外逐层降低;对于一个复杂的表达式可能同时包含算术运算、关系运算和逻辑运算以及函数运算。运算的优先顺序为:括号-&函数-&*、/、div、mod、and-&+、-、or、xo-&关系运算。对于复杂的命题,我们可以用布尔表达式来表示。例如,命题:\"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折。  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元进行收费。 试编一程序,输入行李的重量,算出托运费。第五章  if嵌套与case语句一、IF语句的嵌套在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}     else {x≤0时}      if x=0 then y:=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 then y:=1    else y:=0   else y=-1;   writeln(\'x=\',x:6:2,\'y=\',y);  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;               或者 y:=0;  if x&=0                 if x&=0   then if x&0               then    then y:=1                begin    else                    if x&0 then Y:=1;   else y:=-1;                end                      else Y:=-1;二、case语句上面我们知道可以用嵌套的if语句实现多分支的选择结构。但是如果分支越来越多时,用嵌套的if语句实现多分支就显得繁杂。当多分支选择的各个条件由同一个表达式的不同结果值决定时,可以用case语句实现。它的选择过程,很象一个多路开关,即由case语句的选择表达式的值,决定切换至哪一语句去工作。因此在分支结构程序设计中,它是一种强有力的手段。在实现多路径分支控制时,用case对某些问题的处理和设计,比用if语句写程序具有更简洁、清晰之感。(一)、情况语句的一般形式:  case &表达式& of   &情况标号表1&:语句1;   &情况标号表2&:语句2;   :   &情况标号表n&:语句n  其中case、of、end是Pascal的保留字, 表达式的值必须是顺序类型,它可以是整型、布尔型及以后学习的字符型、枚举型和子界型。情况标号表是一串用逗号隔开的与表达式类型一致的常量序列。语句可以是任何语句,包括复合语句和空语句。(二)、case语句的执行过程先计算表达式(称为情况表达式)的值,如果它的值等于某一个常量(称为情况常量,也称情况标号),则执行该情况常量后面的语句,在执行完语句后,跳到case语句的末尾end处。(三)、说明①情况表达式必须是顺序类型的;②情况常量是情况表达式可能具有的值,因而应与情况表达式具有相同的类型;③情况常量出现的次序可以是任意的;④同一情况常量不能在同一个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);   if (year mod 400=0 ) then&    writeln(\'is a leap year.\')   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     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.计算年之间的某月某日是星期几。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 其中:    第六章  for循环在实际应用中,会经常遇到许多有规律性的重复运算,这就需要掌握本章所介绍的循环结构程序设计。在Pascal语言中,循环结构程序通常由三种的循环语句来实现。它们分别为FOR循环、当循环和直到循环。通常将一组重复执行的语句称为循环体,而控制重复执行或终止执行由重复终止条件决定。因此,重复语句是由循环体及重复终止条件两部分组成。一、for语句的一般格式for &控制变量&:=&表达式1& to &表达式2& do &语句&;for &控制变量&:=&表达式1& downto &表达式2& do &语句&;其中for、to、downto和do是Pascal保留字。表达式1 与表达式2的值也称为初值和终值。二、For语句执行过程①先将初值赋给左边的变量(称为循环控制变量);②判断循环控制变量的值是否已\"超过\"终值,如已超过,则跳到步骤⑥;③如果末超过终值,则执行do后面的那个语句(称为循环体);④循环变量递增(对to)或递减(对downt o)1;⑤返回步骤②;⑥循环结束,执行for循环下面的一个语句。三、说明①循环控制变量必须是顺序类型。例如,可以是整型、字符型等,但不能为实型。②循环控制变量的值递增或递减的规律是:选用to则为递增;选用downto则递减。③所谓循环控制变量的值\"超过\"终值,对递增型循环,\"超过\"指大于,对递减型循环,\"超  过\"指小于。④循环体可以是一个基本语句,也可以是一个复合语句。⑤循环控制变量的初值和终值一经确定,循环次数就确定了。但是在循环体内对循环变量的值进行修改,常常会使得循环提前结束或进入死环。建议不要在循环体中随意修改控制变量的值。⑥for语句中的初值、终值都可以是顺序类型的常量、变量、表达式。四、应用举例例1.输出1-100之间的所有偶数。    var i:    begin     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分的硬币,每种至少一枚, 问有哪几种换法(各几枚)?第七课  while循环与repeat-until循环一、WHILE循环对于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;  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.以上我们已介绍了三种循环语句。一般说来,用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:  begin   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      begin       x:=x+1;           if x&trunc(sqrt(i)) then write(i:8);      end.练  习1、输入一个正整数n,将n分解成质因数幂的乘积形式。例如:36=22*322、输出如下图形。    &3、编写一程序,验证角谷猜想。所谓的角谷猜想是:\"对于任意大于1的自然数n,若n为奇数,则将n变为3*n+1,否则将n变为n的一半。经过若干次这样的变换,一定会使n变为1。\"4.有一堆100多个的零件,若三个三个数,剩二个;若五个五个数,剩三个;若七个七个数,剩五个。请你编一个程序计算出这堆零件至少是多少个?第八章  一维数组一、为什么要使用数组例1 输入50个学生的某门课程的成绩,打印出低于平均分的同学号数与成绩。分析:在解决这个问题时,虽然可以通过读入一个数就累加一个数的办法来求学生的总分,进而求出平均分。但因为只有读入最后一个学生的分数以后才能求得平均分,且要打印出低于平均分的同学,故必须把50个学生的成绩都保留下来, 然后逐个和平均分比较,把高于平均分的成绩打印出来。如果,用简单变量a1,a2,…,a50存放这些数据,可想而知程序要很长且繁。要想如数学中使用下标变量ai形式表示这50个数,则可以引入下标变量a。这样问题的程序可写为:tot:=0;{tot表示总分}  for i:=1 to 50 do {循环读入每一个学生的成绩,并累加它到总分}   begin    read(a);    tot:=tot+a;     ave:=tot/50;{计算平均分}  for i:=1 to 50 do   if a&ave then writeln(\'No.\',i,\' \',a);{如果第i个同学成绩小于平分,则将输出}而要在程序中使用下标变量,则必须先说明这些下标变量的整体―数组,即数组是若干个同名(如上面的下标变量的名字都为a)下标变量的集合。&二、一维数组当数组中每个元素只带有一个下标时,我们称这样的数组为一维数组。
1、一维数组的定义&(1)类型定义要使用数组类型等构造类型以及第6章要学习的自定义类型(枚举类型与子界类型),应在说明部分进行类型说明。 这样定义的数据类型适用整个程序。类型定义一般格式为:type&&标识符1&=&类型1&;   &标识符2&=&类型2&;   :   &标识符n&=&类型n&;  其中type是Pascal保留字,表示开始一个类型定义段。在其后可以定义若干个数据类型定义。&标识符&是为定义的类型取的名字, 称它为类型标识符。类型定义后,也就确定了该类型数据取值的范围,以及数据所能执行的运算。(2)一维数组类型的定义一维数组类型的一般格式:array[下标1..下标2] of &基类型&;说明:其中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个数。分析:我们可定义一个数组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);{从键盘上输入50个整数}      for i:=50 downto 1 do {逆序输出这50个数}    write(a: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);{读入10个初始数据}          for i:=1 to 9 do{进行9次排序}      begin       for j:=i+1 to 10 do{将第i个数与其后所有数比较}         if a&a[j] then {若有比a大,则与之交换}          begin           t:=a;a:=a[j];a[j]:=t;                 write(a:5);          end.练习:1.输入一串小写字母(以\".\"为结束标志),统计出每个字母在该字符串中出现的次数(若某字母不出现,则不要输出)。例:输入:aaaabbbccc.输出: a:4     b:3     c:32.输入一个不大于32767的正整数N,将它转换成一个二进制数。例如:  输入:100  输出: 11001003.输入一个由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 4第九章  多维数组一、多维数组的定义当一维数组元素的类型也是一维数组时,便构成了二维数组。二维数组定义的一般格式:    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 do    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门成绩和总分、平均分。源程序如下:  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   :   begin    {读入一个字符串以\'.\'号结束}   write(\'Input a string:\');   i:=0;read(ch);   while ch&&\'.\' Do   begin    i:=i+1;letter:=    read(ch)      {判断它是否是回文}   j:=1;   while (j&i)and(letter[j]=letter)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 in div 2+1,yn /*排数的初始位置*/  2 a[i,j]1;  3 for k:=2 to nn do  4 计算下一个排数位置(i,j);  5 if a[i,j]&&0 then&  6 ii-1;  7 jj-2;  8 a[i,j]k;  9 endfor对于计算下一个排数位置,按上述的四种情形进行,但我们应先处理第三处情况。算法描述如下:1 if (i=n)and(j=n) then&2 jj-1; /*下一个位置为(n,n-1)*/;3 else4 ii mod n +1;&5 jj 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个同学的语、数、英三科成绩,计算他们的总分与平均分,并统计出每个同学的名次,最后以表格的形式输出。2、 输出杨辉三角的前N行(N&10)。      1      1 1      1 2 1      1 3 3 14 6 4 1}

我要回帖

更多关于 二进制转十进制 的文章

更多推荐

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

点击添加站长微信