




免费预览已结束,剩余13页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Pascal速成教程By:kk234560、程序的设计过程建模-算法-源代码-编译-执行-发行-|1、你的第一个Pascal程序 1 program ex01; 2 begin 3 writeln (hello world); 4 end. 编译,执行,我们看到了第一个输出: |-| |hello world| |_ | |-| 让我们来看看这个程序的结构: 行1:program语句指定程序名称,例如,这里告诉编译器,程序名称为ex01,在FreePascal中可以省略。 行2:begin.end:语句块开始、结束的标志,Pascal程序中,主程序必须包含在一组begin.end中。其实,只要程序员认为语句为一个整体,那么它们就应该被包含于begin.end中 行3:writeln (hello world);writeln语句控制输出,这里,输出hello world。 更多细节: 1、行1、行3中语句结束的“;”:Pascal中每一个语句结束,其末尾应当有分号(特殊情况后面再讨论)表示语句结束。 2、行4末尾的“.”:Pascal中全局程序的begin.end语句组结束后,末尾用“.”。 3、行3中,包含 hello world 的“”,Pascal中,字符串都由“”包围。2、输入、输出 我们的程序用writeln语句实现了输出hello world的使命,但若我们要电脑读入一个数,并将它输出,那该怎么办? 我们先看一看下列程序: 1 program ex02; 2 var 3 i:integer; 4 begin 5 readln (i); 6 writeln (i); 7 end. 编译,运行,看到如下窗口: |-| |_ | |-| 当你键入一个数(比如说5)以后,得到以下输出: |-| |5 | |5 | |_ | |-| 行2:var关键字表示变量的定义,即行3到下一个关键字(这里是行5的begin)属于变量的声明。关于变量的介绍在后面会提到,这里,你只需要知道,行3定义了一个整型变量(数据类型在第4节讲到) 行5:readln语句读入一个值到i(这里是5),writeln语句输出i的值。 readln ();输入函数,控制输入变量,它是一个无限参数指令,例如: x1, x2, x3, x4, x5, x6.xN:integer; 注意,变量间用“,”隔开 readln (x1, x2, x3, x4, x5.,xN); 函数中,参数间用“,”隔开 说明:在Pascal中,表示注释语句,注释语句的内容不会影响到编译,只是程序员为了使程序更便于阅读而书写,注意,必须成对出现,这一点和begin.end很相似。 writeln ();输出函数,与readln一样,也是无限参数指令。即writeln (x1, x2., xN);将输出x1到xN的所有值。 writeln ();可以将数字、字符串混合输出,例如: 假定i=3, j=4, 则 writeln (No., i, is, j);将输出如下内容:|-|No.3is4 |_ |-| 由以上例子可以看出,writeln (); 输出内容间没有空格,要输出空格,应该改为: writeln (No., i, , is, , j); 则输出为: |-|No.3 is 4 |_ |-|3、表达式 1、赋值表达式: 1 program ex03; 2 var 3 x1, x2:integer; 4 begin 5 readln (x1); 6 x2 := x1; 7 writeln (x2); 8 end. 编译,运行,看到如下内容: |-| |5 | |5 | |_ | |-| 行5读入了一个x1的值(这里为5),行6将x1的值赋给x2,因而行7输出5。Pascal中,赋值号为:=,它就相当于我们现实中的,但由于Pascal中已经另有用处,因而被:=替代。 2、运算符: 计算机就是要计算,那么如何在Pacal中实现计算呢?先看看下面程序: 1 program ex03; 2 var 3 x1, x2:integer; 4 begin 5 readln (x1); 6 x2 := x1 + x1; 7 writeln (x2); 8 end. 运行后,看到: |-| |5 | |10 | |_ | |-| 程序输出为10,也就是说,第6行语句先计算了x1+x1的值(这里为10,因为输入为5),再将值赋给x2。 Pascal中内置了以下运算符: 符号 名称 举例 + 加号 1 + 1 = 2 减号 1 - 1 = 0 * 乘号 2 * 3 = 6 / 除号 10 / 2 = 5.0 为什么会有小数点?后面再说 div 整除 8 div 7 = 1 求的是“不超过 a / b 的最大整数” mod 取余 23 mod 10 3 求的是“a / b 的余数” 运算符的运算顺序与现实中基本相同,若要提高运算级,应使用()。 运算符可以与函数连用,例如,ex03的第7行改为writeln (x1 + x1);同样可以输出10。4、数据类型 1 program ex04; 2 var 3 x1, x2, x3:integer; 4 begin 5 readln (x1, x2); 6 x3 := x1 / x2; 7 writeln (x3); 8 end. 编译,出错了?编译器给出一条错误信息: Error: Incompatible types: got S80REAL expected SMALLINT 这是因为,x1 / x2不一定为整数,将它的值赋给x3,显然有问题。 解决办法:1、将“/”改为“div”,整除,但显然有数据损失; 2、就是下面要讲的数据类型: Pascal定义了一系列的内置数据类型: 类型 名称 值范围 integer 整型 -32768 - 32767 longint 长整型 -2147484648 - 2147483647 real 实数型 很大很大 double 实数型 比real更大(不要给我说你用得上) char 字符型 string 字符串 boolean 布尔型 true 和 false 数据定义格式: 变量1, 变量2, 变量3.变量N: 数据类型 例如: var a1, a2, a3 : integer; 定义了三个integer类型 b1, b2, b3 : longint; 定义了三个longint型 c1, c2, c3 : real; 定义了三个real型 d1, d2, d3 : char; 定义了三个char型 e1, e2, e3 : string; 定义了三个string型 数据类型介绍: 1、 longint: 用于存储整数,但范围比integer大,使用方法与integer相同; 2、 real: 含小数,例如,将ex04中行3改为: x1, x2:integer; x3:real; 将x3改为实型 然后,编译,运行,输出如下: |-| |5 6 | | 8.333333333333334E-001| |_ | |-| 注意,Pascal中实数的显示使用的是科学计数法。 3、 char: 字符型,存储一个字符。例如: c: char; readln (c); 假设输入为s writeln (c); 输出s 4、 string: 字符串型,存储一个字符串。例如: s: string; readln (s); 假设输入hello world writeln (s); 输出hello world 变量赋值: 变量都可以赋值。例如: a: integer; a := 5; 让a的值为5 s: string; s := Hello world; 让s的值为Hello world, 注意,“”不要漏掉 c := c; 让c的值为c, 注意,“”不要漏掉 变量命名: 1) 大小写等效; 2) 不可重复变量名; 3) 尽量使用有意义的名称,但不是Pascal的保留字; 4) 必须以字母打头; 5) 不包含Pascal定义的符号。 综合例程: 读入一个人的信息:姓名,年龄,性别,升高,体重,计算其身体指数:身体指数=(身高-100)*2-体重,输出以上各项: program ex05; var name: string; 姓名 age: integer; 年龄 sex: char; 性别 height: real; 身高 weight: real; 体重 index: real; 身体指数 begin readln (name); readln (age); readln (sex); readln (height); readln (weight); writeln (name); writeln (age); writeln (sex); writeln (height); writeln (weight); index := (height - 100) * 2 - weight; writeln (index); end. 运行以上程序,效果如下: |-| |Charles | |18 | |M | |178.8 | |70.2 | |Charles | |18 | |M | | 1.788000000000000E+002 | | 7.020000000000000E+001 | | 8.740000000000002E+001 | |_ | |-| 注意,实数输出前方有一个空格,这是留给符号的(比如说负号)。5、if语句: 看看下面这张图,如果要让程序实现这样一个流程,该怎么做呢? |*| | 变量a | |*| | * * 是 * 否|-*条件满足*-| * | | * * | |*| |*| |*指令1*| |*指令2*| |*| |*| | | | |*| |-|*指令3*|-| |*| 这是一个选择结构,需要用到if语句。 1)逻辑运算符: Pascal中定义了以下逻辑运算符: 符号 意义 大于 小于 等于 现在明白了为什么赋值号不是了吧 不等于 = 大于等于 2) and (a2 then writeln (a); if.else语句的联用: 看看下面的例子: if a0 then writeln (Positive); if a0与a0 then writeln (Positive) 注意,这里没有“;” else writeln (Negative); else语句表示与if条件互斥的情况,用else,可以省去再写一次相似条件。注意,else前面语句末尾没有“;”。else后面也可以跟多个语句,同样用begin、end包围,例如: if a0 then begin writeln (a); writeln (Positive); end 注意,这个end后面同样没有“;” else begin writeln (a); writeln (Negative); end; if 语句的嵌套: 通常,一个判断不一定能够解决全部问题,这时候,我们需要在if里面再写上if语句,这是很简单的事情,权当在if条件满足情况下的另一个判断,写法与没有if时候是一回事。例如(假设a是一个integer型变量) if a0 then 在a0的情况下判断 begin if a=1 then 如果a为1,则输出One writeln (One)else writeln (Larger than one); 如果a不为1,因为是在a0的条件下,所以a肯定大于1,输出Larger than one end else 在a=0的情况下判断 begin if a0 then 如果a小于0,则输出Negative writeln (Negative)else writeln (Zero); 因为是在a 0 then 如果delta0,有两根,要分别输出 11 begin 12 x1 := (-b + sqrt (delta) / (2 * a); 13 x2 := (-b - sqrt (delta) / (2 * a); 14 writeln (x1=, x1, x2=, x2); 15 end 16 else else表示delta=0的情况 17 begin 18 if delta = 0 then 在delta=0的情况下,如果delata=0,则x1=x2,输出 19 begin 20 x1 := -b / (2 * a); 21 writeln (x1=x2=, x1); 22 end 23 else 在delta=0的情况下,delta不为0,则delta必然小于零,这时,方程无解,输出“No Root” 24 writeln (No Root); 25 end; 25 end.6、循环语句 如果要打印10个“*”符号,怎么办?这里有一种实现办法: writeln (*); -| . | . |-10行 . | writeln (*); -| 10个“*”,打印完成,那么,如果要打印1000个“*”呢?以上办法就显得有点不现实。 还好,Pascal有循环语句。 1) for 循环: 格式: for 循环变量:=初值 to 终值 do begin 语句. end;例如:i: integer;.for i := 1 to 1000 do writeln (*); 将打印出1000个“*”号。 与if一样,如果循环里面只有一条语句,begin.end可以省略,当有多条语句时,必须用begin.end,例如: for i := 1 to 3 dobegin writeln (*); writeln (i); end; 以上部分执行效果如下: |-| |* | |1 | |* | |2 | |* | |3 | |_ | |-| 2) while 循环: 格式: while (条件) dobegin 语句. end; 如果条件满足,循环执行,直到条件不满足时跳出。例如: a:=0; while a9; 将输出:1, 2.10 repeat.until 和while的区别: 条件满足 至少执行次数 while 执行循环 0次(如果本来条件就不满足) repeat 跳出循环 1次(因为条件没有优先判断) 4) 循环的跳出: 有时候,有些条件已经满足,我们不需要循环继续执行了,可以用break跳出循环,例如: while 条件 do -| begin | 语句1 | break; -|-| 语句2 | end; | -| 程序运行到break时,便按照上图所示方式,直接跳到处的语句。7、文件输入输出: 你可能已经对反复输入数据感到厌倦,特别是数据量大时。这时,我们可以把数据写入一个文件,在让程序从文件中获得这些数据。 1) read, write 函数: 我们已经对readln、writeln函数十分熟悉了,read、write函数与它们相似。readln,writeln是执行一次换一行,read、write不换行,假设文件数据如下,考虑我们要怎样把它们读入: 1 2 3 4 5 6 7 8 9 10 现在来看: 用readln: readln (a, b); Ok, a为1, b为2 readln (c, d); No! c为6, d为7!因为readln(a,b)已经执行了一次,输入“光标”换行了! 用read: read (a, b); Ok, a为1, b为2 read (c, d); Ok, c为3, d为4。因为read语句执行后是不换行的! 我们再来看看write和writeln的区别: 用writeln: writeln (hello world); writeln (hello again); 看到的输出如下: |-|hello world |hello again |_ | -注意,光标在这里。|-| 用write: write (hello world); write (hello again); 看到输出如下(假定屏幕宽度同上): |-|hello worldhe|llo again_ | -注意,光标在这里。|-| 通过以上例子,我们看到,write与writeln相比,输出后不换行。 P.S: 题目中的数据格式多样,到底使用write还是writeln,readln还是read,一定要视具体情况而定 2) 文件输入输出: 要让Pascal从屏幕输入输出变为文件输入输出,就要加上以下语句: program yourname; var变量定义. beginassign (input, 文件名); 定义输入文件,注意文件名要用“”包围 assign (output,文件名); 定义输出文件,注意文件名要用“”包围 reset (input); 重置输入 rewrite (output); 覆写输出 语句. close (input); 关闭输入文件 close (output); 关闭输出文件,这一步很重要,否则输出的内容都在缓存里没有被写入! end. 3) 一个简单的例子: 输入三个数,输出它们的和。 【文件输入】(sum.in)一行,三个整数 【文件输出】(sum.out)一个数,三个数的和。 program ex07; var sum, a1, a2, a3: integer; begin assign (input, sum.in); assign (output, sum.out); reset (input); rewrite (output); read (a1, a2, a3); sum := a1 + a2 + a3; writeln (sum); 这里用write也可以,但最后一行最好用writeln,因为评测器似乎是由空行来判断文件结束的 close (input); close (output); 不要忘了close ()哦! end.8、小试身手:这里,我们要完成一道NOIP2004的复赛试题,虽然是复赛,但题目真的真的真的很基础,我们要将前面所学的东西统统加进去,来完成这一道题: 津津的储蓄计划 (save.pas)【问题描述】 津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。 为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100元或恰好100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。 例如11月初津津手中还有83元,妈妈给了津津300元。津津预计11月的花销是180元,那么她就会在妈妈那里存200元,自己留下183元。到了11月月末,津津手中会剩下3元钱。 津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。 现在请你根据2004年1月到12月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到2004年年末,妈妈将津津平常存的钱加上20还给津津之后,津津手中会有多少钱。【输入文件】 输入文件save.in包括12行数据,每行包含一个小于350的非负整数,分别表示1月到12月津津的预算。【输出文件】 输出文件save.out包括一行,这一行只包含一个整数。如果储蓄计划实施过程中出现某个月钱不够用的情况,输出-X,X表示出现这种情况的第一个月;否则输出到2004年年末津津手中会有多少钱。【样例输入1】29023028020030017034050908020060【样例输出1】-7【样例输入2】29023028020030017033050908020060【样例输出2】1580 分析: 文件名是什么?题目上很清晰的写了:save.pas! 要让电脑处理问题,最主要的一步就是要让它读入数据,怎么读?这里有12个数据,很明显我们需要用一个循环: for i:=1 to 12 do readln (a); 该用read还是readln?因为每行只有一个数,都无所谓! 我们是把所有数据读入再处理还是边读边处理?如果全部读入,怎么存储(要用到数组!),因而我们只能边读入边处理。 怎么处理?这又是一个问题。通过以上内容,我们有了一个大概框架: program save; var m_month, i:integer; i为循环变量,m_month表示每月花销(这里推介使用这种“前缀+表意”的命名方法,例如,这里m_表示“money” begin assign (input, save.in); assign (output, save.out); reset (input); rewrite (output); for i:=1 to 12 do begin readln (m_month); 其它操作 end; close (input); close (output); end. 现在就是处理“其它操作”部分的问题了。 重新回归题目,发现题目上有几个关键点: 1) 妈妈每月给津津300元很明显,我们需要一个变量来存储津津手里的钱,我们把这个变量叫做m_trans,这是money_transformation的缩写; 2) 津津可以随时把整百的钱存在她那里,到了年末她会加上20还给津津这句话告诉我们,妈妈手里有多少存款是需要一个变量来记录的,我们把这个变量命名为m_mother; 3) 每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100元或恰好100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中这句话告诉了我们津津存钱多少的计算,即:存款=(上月
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 虚拟仿真应急预案
- 2025代理经销合同范本
- 国有企业人力资源管理人员招聘考试题库一
- 2025年大专建筑构造试题及答案
- 2025年物理能力培养题库及答案
- 2025年株洲生物会考试题及答案
- 2025年历史高中真题分类及答案
- 贷款额度合同(标准版)
- 2025年高考地理古城题库及答案
- 安徽中考体育模拟测试题及答案
- 2025年高考语文考前关注:作文审题立意技巧
- 氯气的性质课件高一上学期化学人教版
- 水利工程监理部主要工作制度(依据2014版监理规范编写)
- 2025浙江版八年级科学下册知识梳理(详细版)
- 2024年酒吧演艺公司与艺人合同
- DB43-T 3061-2024 普通级实验用羊的饲养环境及设施规范
- 血浆灌流联合其他治疗方法治疗肿瘤的研究进展
- 信息技术 数字孪生能力成熟度模型
- 述情障碍的社会根源
- 家园2-菲雅利帝国全贸易模式全商品
- 四级词汇熟词僻义表
评论
0/150
提交评论