第二节
顺序结构程序与基本数据类型
前面的简单程序已体现出处理问题步骤、思路的顺序关系,这就是顺序结构程序。
[例1.7]交换两个变量的值:由键盘输入两个正整数A和B,编程交换这两个变量的值。
解:交换两个变量的值,可以想象成交换两盒录音带(称为A和B)的内容,可以按以下步骤处理:
步骤①:拿一盒空白录音带C为过渡,先将A翻录至C;
步骤②:再将B翻录至A;
步骤③:最后将C翻录至B。
这样操作,可达到题目要求。
Pascal程序:
Program
Exam17;
Var a,b,c
: integer;
Begin
Write(‘A,B=’);
Readln(a,b);
C:= A;
{等价于步骤1}
A :=
B; {等价于步骤2}
B :=
C; {等价于步骤3}
Writeln(A,B);
End.
[例1.8]
分钱游戏。甲、乙、丙三人共有24元钱,先由甲分钱给乙、丙两人,所分给的数与各人已有数相同;接着由乙分给甲、丙,分法同前;再由丙分钱给甲、乙,分法亦同前。经上述三次分钱之后,每个人的钱数恰好一样多。
求原先各人的钱数分别是多少?
解:设甲、乙、丙三人的钱数分别为A,B,C。用倒推(逆序)算法,
从最后结果入手,按反相顺序,分步骤推算出每次各人当时的钱数:(在每个步骤中,各人钱数分别存在A、B、C中)
步骤①: A=8 B=8 C=8
{这是最后结果的钱数,三人都一样多
}
步骤②: A=A/2 (=4)
B=B/2 (=4) C=A+B+C(=16) { A,B未得到丙分给的钱时,只有结果数的一半;C应包含给A,B及本身数三者之和
}
步骤③: A=A/2 (=2)
C=C/2 (=8) B=A+B+C(=14) {A,C未得到乙分给的钱时,只有巳有数的一半;B应包含给A,C及本身数三者之和
}
步骤④: B=B/2 (=7)
C=C/2 (=4) A=A+B+C(=13)
C未得到甲分给的钱时,只有巳有数的一半;A应包含给B,C及本身数三者之和
}
步骤⑤:
输出A(=13)B(=7)C(=4){此时的A,B,C
就是三人原先的钱数 }
Pascal程序:
Program
Exam18;
Var a,b,c:
integer;
Begin
a:=8;
b:=8; c:=8;
{对应于步骤①}
a:=a div 2;
b:=b div 2;
c:=a+b+c;
{对应于步骤②}
a:=a div 2;
c:=c div 2;
b:=a+b+c;
{对应于步骤③}
b:=b div 2;
c:=c div 2;
a:=a+b+c;
{对应于步骤④}
Writeln('a=',a,'
': 4,'b=',b,'
': 4,'c=',c)
; {输出}
Readln
End.
细心观察,会发现本程序语句的顺序很关键。此例用反推顺序(逆序),按步骤正确推算出各变量的值。当然,有的问题可按正序步骤编程,这类程序都称为顺序程序。
本程序Writeln语句的输出项含有(
' ' : 4 ),这里的冒号用来指定该项显示所占宽度,此处是输出4个空格即(空格项占4格)。
[例1.9]
有鸡兔同笼,头30,脚
90,究竟笼中的鸡和兔各有多少只?
解:设鸡为J只,兔为T只,头为H,脚为F,则:
J+T=30 ①
2*J+4*T=90 ②
解此题暂不必采用数学上直接解方程的办法,可采用“假设条件与逻辑推理”的办法:
假设笼中30
个头全都是兔,那么都按每头4只脚计算,总脚数为(4*H),与实际脚数
( F )之差为(4*H—F),如果这个差=0,则笼中全是兔(即鸡为0只);如果这个差值
>0,说明多计算了脚数,凡是鸡都多给算了两只脚,用它除以2就能得到鸡的只数,处理步骤为:
① J=(4*H—F)/2
{先用脚数差值除以2算出鸡的只数}
② T=H—J
{再用总头数减鸡数算出免的只数}
按此方法,这两步运算必须注意先后顺序才会符合运算逻辑。
Pascal程序:
Program
Exam16;
Const H=30;
{常量说明 }
F=90;
Var J,T:
byte;
{为字节类型的整数 }
Begin
J:=(4*H-F)
div 2; {整除运算
}
T:=H-J
Writeln
('J=',J,'
': 6,'T= ',T
) ;
Readln
End.
本程序中H,F为常量,变量J,T为byte类型,属于整数类型。
Pascal定义了五个标准整数类型,如下表所示:
|
类型 |
取值范围 |
占字节数 |
格式 |
|
Shortint(短整型) |
-128..127 |
1 |
带符号8位 |
|
Integer (整型) |
-32768..32767 |
2 |
带符号16位 |
|
Longint(长整型) |
-2147483648..2147483647 |
4 |
带符号32位 |
|
Byte (字节型) |
0..255 |
1 |
无符号8位 |
|
Word
(字型) |
0..65535 |
2 |
无符号16位 |
在前面程序中常用的数据类型除整数类型,还有实数类型。Pascal
还定义了五个标准实数类型,列表所示如下:
|
类型 |
取值范围 |
占字节数 |
有效数字 |
|
Real |
2.9×10-39~1.7×1038 |
6 |
7~8位 |
|
Single |
1.5×10-45~3.4×1038 |
4 |
11~12位 |
|
Double |
5.0×10-324~1.7×10308 |
8 |
15~16位 |
|
Extended |
1.9×10-4951~1.1×104932 |
10 |
19~20位 |
|
Comp |
-263+1~238-1 |
8 |
19~20位 |
在Turbo
Pascal 中实数的表示用科学记数法,可认为由三部分组成:
# . ## E +## 或
# . ## E -##
①
#.##表示有效数字;
② E表示以10为底的幂;
③ +##或-##是指数部分,+号可省略。
例如: 1.7E+38 可写成1.7E38
(等同于1. 7×1038
)。
在实数类型定义下,即使是整数,在程序执行时系统也将自动转换成科学记数形式,试请运行下面程序并注意观察运行结果:
Program
Exam17;
Var x: real;
{x为实数类型 }
Begin
X:=180;
{把整数180赋给实数类型变量X}
Writeln
('x=',x)
;
{输出的x自动表示成实数形式
}
Readln
End.
习题1. 2
1.已知△ABC中的三边长分别为25.76,74.03,59.31,求△ABC的面积。
(
计算公式:
S=
。 其中P
= )
2.某车棚存有自行车和三轮车共65辆,它们的轮子数合计为150个。求该棚内存有的自行车和三轮车各是多少辆?
3.甲、乙、丙三人分别有磁带36,48,64盒。先由甲把自己的磁带平均分为三份,分给乙、丙各一份,自己留下一份;接着是乙,最后是丙,都按甲的方法处理。编程输出甲、乙、丙在上述过程中各人的磁带数分别是多少?
(输出所有的中间结果)
4.五位好朋友相聚。第一位朋友带来了很多糖块赠送给各位朋友,使每人的糖块在各自原有的基础上翻了一倍;接着第二位好友也同样向每人赠送糖块,他同样使每人的糖块在各人已有的数量上翻了一倍;第三、第四、第五位好友都照此办理。经过这样的赠送之后,每人的糖块恰好都为32块。问各位好友原先的糖块数分别是多少?
|