380 likes | 544 Views
拆数深入. Pascal 程序形式. Program 程序名(程序参数表); Label 标号说明; Const 常量说明; Type 类型说明; Var 变量说明; Function 函数说明; Procedure 过程说明; Begin 程序语句; …… ; 程序语句; End. 1 、每一个完整语句由分号结束。 2 、 具体程序不一定包括全部说明,但如果出现,必须按这里所指定的前后次序编写 。 3 、程序体不可少,程序体以 END. 结束,且最后一个句号不能漏掉。 4 、 END 前一句语句的分号可有可无,有则编译时多一个空行。.
E N D
Pascal 程序形式 Program 程序名(程序参数表); Label 标号说明; Const 常量说明; Type 类型说明; Var 变量说明; Function 函数说明; Procedure 过程说明; Begin 程序语句; ……; 程序语句; End. 1、每一个完整语句由分号结束。 2、具体程序不一定包括全部说明,但如果出现,必须按这里所指定的前后次序编写。 3、程序体不可少,程序体以END.结束,且最后一个句号不能漏掉。 4、END前一句语句的分号可有可无,有则编译时多一个空行。 说明部分 程序体
3^4 试一试 program ls; uses math; begin write(power(3,4):0:0); end. program ls; begin write(exp(4*ln(3))); end. {打开数学库}
补充 (1) inc(x) 等同 x:=x+1; (2) inc(x, n) 等同 x:=x+n; (3) dec(x) 等同 x:=x-1; (4) dec(x,n) 等同 x:=x-n;
回顾 位数对调:输入一个三位自然数,把这个数的百位与个位数对调,输出对调后的数。 program exam1; var n,g,s,b:integer; begin read(n); g:=n mod 10; b:=n div 100; s:=n div 10 mod 10; write(g,s,b); end. 参考程序 随机产生三位数,此程序如何调?
Pascal的System单元提供了两个与随机数有关的子程序:Randomize和Random。Pascal的System单元提供了两个与随机数有关的子程序:Randomize和Random。 Randomize过程用于初始化随机种子,其初始值取决于当前的系统时钟。 Random函数用于获取随机数. 它有两种调用形式: Random,返回一个0到1之间(不包括1)的随机实数; Random(N),返回0至N之间(不包括N)的随机整数,N为Word类型整数。 例如:Random(100) 返回[0 100)之间的整数
随机产生一个三位自然数,分离出百位、十位与个位上的数字随机产生一个三位自然数,分离出百位、十位与个位上的数字 program w_sj; var g,s,b,x:integer; beginrandomize;x:=trunc(random*900)+100;g:=x mod 10;b:=x div 100;s:=(x div 10) mod 10;writeln('x=',x );writeln('b=',b);writeln('s=',s);writeln('g=',g); end. Random(900)+100 [0 900)
如果输入时是作为字符或字符串,程序如何改?如果输入时是作为字符或字符串,程序如何改?
三位数翻转 字符串输入 字符输入 program ls; var a,b,c:char; begin read(a,b,c); write(c,b,a); end. program ls; var n,a,b,c:string; begin read(n); a:=copy(n,1,1); b:=copy(n,2,1); c:=copy(n,3,1); write(c,b,a); end.
思考: • 如果数字不止3位,但知道位数,也就是输入时除了数字信息还有位数信息,程序应当如何改? • 如果不知道数字的位数,用回车或“#”结束,本程序如何改?
program aa; var a,b:longint; begin read(a); writeln('a=',a); repeat b:=a mod 10; a:=a div 10; write(b) until a=0; readln; end. 输入最多几位
翻转数程序深入-学生程序一 program ls; var n:string;x,i:integer; a:array[1..100] of char; begin read(x); if x<100 then for i:=1 to x do read(a[i]); for i:=x downto 1 do write(a[i]); end. 特别有意思的是看起来正确的程序结果有误,你能知道哪个细节有问题么? read(x);改成readln(x);试试,结果对了没? 为什么呢?
原来,由于度入的数据类型是字符,回车 、换行都是字符。读完了位数x后光标依然在第一行,然后继续读回车、换行,第3个才读到我们输入的下一行的数字 5 12345 1111111111111111111111111111111111111
那里错了 program zzw; var x:string; a,w,q:integer; begin read(x); a:=length(x); q:=a; repeat w:=copy(x,q,1); write(w); q:=dec(q); until q=0; end. program zzw; var w,x:string; a, q:integer; begin read(x); a:=length(x); q:=a; repeat w:=copy(x,q,1); write(w); dec(q); until q=0; end.
program asd5; • var x:array[1..100] of char; • a,n:integer; • begin • read(x); • n:=length(x); • for a:=n downto 1 do • write(x[a]); • end.
一个整型数据用来存放整数。Pascal支持五种预定义整型,它们是shortint(短整型)、 integer(整型)、 longint(长整型)、 byte(字节型)和 word(字类型), Pascal分别用相同的名字作为他们的表识符。每一种类型规定了相应的整数取值范围以及所占用的内存字节数。
一个实型数据用类存放实数。 Pascal支持五种预定义实型,它们是real(基本实型)、 single(但精度实型)、double(双精度实型)、extended(扩展实型)、comp(装配实型), Pascal分别用相同的名字作为他们的表识符。每一种类型规定了相应的实数取值范围、所占用的内存字节数以及它们所能达到的精度。
布尔表达式 布尔表达式 then 语句一 语句二 语句 简单的IF语句 一、格式IF <布尔表达式>THEN 语句;IF <布尔表达式>THEN 语句1 ELSE 语句2; then else
分支 program ex; var x:real;y:integer; begin wrtie('Input x:');readln(x); if x>0then y:=1{x>0时,y的值为1} else {x≤0时} if x=0then y:=0 else y:=-1; writeln('x=',x:6:2,'y=',y); end.
此处无符号 IF语句中复合语句用法 IF <布尔表达式>THEN begin 一个语句以上 end; IF <布尔表达式>THEN begin 一个语句以上 end ELSE begin 一个语句以上 end;
case <表达式> of <情况标号表1>:语句1; <情况标号表2>:语句2; : <情况标号表n>:语句n else 语句; end;
var x,y:real; begin write('Input x:');readln(x); case trunc(x/100) of 0:y:=x+1; 1:y:=x-1; else y:=0; end;{end of case} writeln('x=',x:8:2),'y=',y:8:2); end.
输入两个实数,再输入+、-、* 或 / 号,根据运算符输出这两个数的和、差、积或商。 Program xx; var a,b,s:real; operator:char; begin readln(a,b); read (operator); case operator of '+’: s:=a+b; '-’:s:=a-b; '*’:s:=a*b; '/’:s:=a/b; end; writeln(a,operator,b, '=’,s:5:4) end.
program ex1; var a,b:string; x,y,s:real; begin read(x,a,b,y); case b of '+':s:=x+y; '-':s:=x-y; '*':s:=x*y; '/':s:=x/y; end; write(s:0:2); end.
program ex1; var n,k:integer; l,m,j,a:string; x,y,s:real; begin read(a); n:=length(a); k:=pos('+',a); if k=0 then k:=pos('-',a); if k=0 then k:=pos('*',a); if k=0 then k:=pos('/',a); l:=copy(a,1,k-1); val(l,x); m:=copy(a,k+1,n-k); val(m,y); j:=copy(a,k,1); case j[1] of '+':s:=x+y; '-':s:=x-y; '*':s:=x*y; '/':s:=x/y; end; write(s:0:2); end.
循环结构 • 循环结构是程序设计的三种基本结构之一 • 对一条或一组语句重复执行多次,以最终完成某项任务。 • 重复循环对象是一条或多条语句,称为循环体。 • pascal有三种循环结构形式: • 计数循环:按己定次数执行循环体 • 当型循环:当条件满足时重复执行循环体 • 直到型循环:反复执行循环体直到条件满足为止
for语句的一般格式 for <控制变量>:=<表达式1> to <表达式2> do <语句>; 递增 for <控制变量>:=<表达式1> downto <表达式2> do <语句>; 递减
for语句(复合) for <控制变量>:=<表达式1> to <表达式2> do begin 一个以上语句; end; for <控制变量>:=<表达式1> downto <表达式2> do begin 一个以上语句; end;
求100(包括)以内所有数之和 while i<=100 do begin num:=num+i; i:=i+1; end; repeat num:=num+i; i:=i+1; until i>100; for i:=1 to 100 do num:=num+i; 思考:从键盘输入若干数字,对它们求和,直到从键盘读入的数是#时结束 While a<>‘#’ do until a=‘#’
1、输出1-100之间的所有偶数 2、求s=1+4+7+…+298的值
题一 编写程序,求100~1000之间能被7整除的数,每行输出10个。
题二 有个两位数x,将它的个位数字与十位数字对调后得到一个新数y,此时y恰好比x大36,请编程求出所有这样的两位数。 Program ex34; Var x,a,b,y:integer; Begin For x := 10 to 99 do Begin a := x div 10; b := x mod 10; y := b*10+a; if y-x=36 then writeln(x); End; End. 解: ① 用for循环列举出所有的两位数,x为循环变量; ② 用公式a:= x div 10分离出x的十位数字; ③ 用公式b:= x mod 10分离出x的个位数字; ④ 用公式y:= b*10+a合成新数y; ⑤ 用式子y-x=36筛选出符合条件的数x并输出。
题三(选) 把整数3025从中剪开分为30和25两个数,此时再将这两数之和平方,(30+25)2=3025计算结果又等于原数。求所有符合这样条件的四位数。 解:设符合条件的四位数为N,它应当是一个完全平方数,用(a*a)表示。 ① 为了确保N=(a*a)在四位数(1000~9999)范围内,可确定a在32~99循环; ② 计算N=a*a;将四位数N拆分为两个数n1和n2; ③ 若满足条件(n1+n2)*(n1+n2)=N 就输出 N
program exam35; var n,a, x,n1,n2: integer; begin for a:=32 to 99 do begin n:=a*a; n1:= n div 100; {拆取四位数的前两位数} n2:= n-n1*100; {拆取四位数的后两位数} x:=n1+n2; if x*x=n then writeln (n); end; readln end.
WHILE循环 格式: while <布尔表达式> do <语句>;其意义为:当布尔表达式的值为true时,执行do后面的语句。 While i<=100 do begin num:=num+i; i:=i+1; End;
应用一 • 输入若干个字符,以“#”为终止字符,统计输入字符中字母“a”出现的次数(包括大写A)。 • 参考程序 program tmp; var ch:char; i:integer; begin i:=0; read(ch); while ch<>'#' do begin if (ch='a') or (ch='A') then i:=i+1; read(ch); end; writeln('i=',i); readln; end.
应用二 • 求输入一个整数的各位数字之和。 • 分析,求328各位之和可以按下面方法进行 • 首先 328 mod 10得8,328 div 10得32 • 继续32 mod 10得2,32 div 10得3 • 3 mod 10得3,3 div 10为0 • 为了达到循环执行,可以令X=328,然后X逐步赋值缩小为32、3、0 • 参考程序 program tmp; var s,x,t:integer; begin s:=0; readln(x); while x<>0 do begin t:=x mod 10; s:=s+t; x:=x div 10; end; writeln('s=',s); readln; end.
应用一 • 输入若干个字符,以“#”为终止字符,统计输入字符中字母“a”出现的次数(包括大写A)。 • 参考程序 program tmp; var ch:char; i:integer; begin i:=0; read(ch); while ch<>'#' do begin if (ch='a') or (ch='A') then i:=i+1; read(ch); end; writeln('i=',i); readln; end.