购买

¥20.0

加入VIP
  • 专属下载券
  • 上传内容扩展
  • 资料优先审核
  • 免费资料无限下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 一天学会FreePascal

一天学会FreePascal.ppt

一天学会FreePascal

ranfand
2019-03-04 0人阅读 举报 0 0 0 暂无简介

简介:本文档为《一天学会FreePascalppt》,可适用于市场营销领域

一天学会FreePascal制作者:axpokl前言第一章一向是很重要的无论你是否学过Pascal语言都请看一下。本教程不是为了NOIP的人写的本教程不会过多涉及算法。那些脑残学很牛逼的牛群们请立即退散。本教程是为了使那些学了C语言(或其它编程语言)能够瞬间看懂pascal语言程序的人写的。本教程也适合初学者观看。本教程是本人写的第一个教程吐槽是可以的但吐得太多会伤身体。如果有什么问题欢迎QQ:。发现任何错别字或程序bug也请联系:。目录目录第一章Pascal语言介绍第二章编译写好的程序第三章编写简单的程序第四章子程序第五章单元库第六章编译指令第七章子界和枚举第八章数组集合文件记录指针附录封面第一章Pascal语言介绍什么是Pascal?好吃么?Pascal语言是什么语言?什么又是机器语言呢?机器语言都是相同的吗?X指令集包括哪些指令?什么是计算机程序?汇编语言又是什么傻逼东西?为什么需要Pascal语言?如何让计算机读懂Pascal语言?编译器是如何运作的?目录什么是Pascal?好吃么?Pascal的取名是为了纪念十七世纪法国脑残学家BlaisePascal(不来色middot帕斯卡)。所以Pascal并不好吃。programhelloworldbeginwriteln(#HelloWorld!#)end一个好看的Pascal语言程序很可能长得像这样:第一章Pascal语言是什么语言?Pascal语言是计算机程序语言(简称程序语言)使用这种语言不仅能让我们编写计算机程序例如:Windows操作系统、猜数字小游戏、魔兽争霸皮卡丘沙滩排球等等还可以使我们变得更加脑残。计算机俗称电脑是一种糟糕物。它通常是一个屏幕一个鼠标一个键盘和一个黑箱子。有时候人们说的计算机仅仅指它的黑箱子。这个黑箱子过去曾经是为了帮助脑残学家研究脑残学才被发明的它的效果就是帮那些懒惰的脑残学家在研究脑残学时减少运动量。事实上八成的计算机并不能够读懂Pascal语言。计算机只能读懂机器语言对机器语言作出反应。第一章什么又是机器语言呢?机器语言是一种只有计算机才读得懂的语言也是计算机唯一能够直接读懂的语言。这种语言只有两个字母:和。人类阅读机器语言时会发生眼残:第一章什么又是机器语言呢?世界上只有个别脑残学家看得懂机器语言所以我们才需要其它容易看得懂的计算机程序语言来告诉计算机我们要它做什么。机器语言所有的ldquo单词rdquo的集合叫做计算机的指令集。指令集也就是计算机黑箱子能做的事。比如ldquordquo是一个机器语言单词它的意思是告诉计算机在屏幕上画一个白点。而计算机所有能做的事基本上就只是在屏幕上画白点点了。第一章机器语言都是相同的吗?有些计算机不仅能够在屏幕上画白点还可以画红点、绿点和蓝点。不是所有计算机懂得的机器语言都是相同的它们的能力有高低。通常的家用计算器和笔记本计算机都懂得X指令集。这是一个古老的通用的指令集即使是今天大多数计算机都认得它。第一章X指令集包括哪些指令?数据传送指令mdashmdash就是把数据传来传去比如传给屏幕。算术运算指令mdashmdash就是做一些内的简单加减法。逻辑运算指令mdashmdash就是做一些傻逼的逻辑运算。串指令mdashmdash顾名思义就是一串一串执行指令。程序转移指令mdashmdash就是转移去执行其它的指令。伪指令mdashmdash计算机不认识的假的指令!其它指令mdashmdash比如空指令高级指令等等。原来计算机只会做这些傻逼事情。。。。。。虽然计算机只能够做这些事情计算机已经显得足够伟大了。第一章什么是计算机程序?计算机程序(ComputerProgram简称程序)是语句的集合。语句是单词的集合。为了编写一个机器语言程序人类发明了汇编语言。汇编语言的词语是一些英文单词的缩略语和一些数字。每条缩略语和一些数字的组合与机器语言指令相对应。这样人们就不用书写和的机器语言代码了。写完程序后对照书本把英文单词和数字翻译成、的代码就能完成机器语言程序了。第一章汇编语言又是什么傻逼东西?事实上即使有了汇编语言(ASM语言)能够使用英文表达自己的意思计算机也只能做些很傻逼的事。如果要它在屏幕上输出ldquo你好妈妈rdquo几个汉字你也许需要让它发送无数个指令给屏幕让屏幕画很多很多点。于是就诞生了更加高级的语言比如Pascal语言。一个经过反编译的EXE程序至少不再是乱码了第一章为什么需要Pascal语言?计算机编程语言分三类:机器语言低级语言高级语言。机器语言就是、构成的语言。之前我们说的汇编语言就是低级语言它唯一的好处就是使用了英文作为记注符而不是数字。高级语言就多了最有名的莫过于C语言了。Pascal语言也算一种除此之外还有:FORTANCJavaVBDelphiLispprolog等等。还有一些脚本语言虽然不是编程语言但是也是计算机语言如:batvbsHTMLasp。第一章为什么需要Pascal语言?正因为机器语言、低级语言可读性差所以我们需要形如Pascal语言的高级语言来编写程序。一个Windows操作系统的程序代码重达G它的代码位于SYSTEMROOTSystem下包含几亿条指令。即使一个人一秒能够写一条指令它也一辈子都写不完啊!使用Pascal语言我们可以快速准确方便地书写程序但是计算机并不能够直接读懂Pascal语言所以我们需要一样很重要的东西。第一章如何让计算机读懂Pascal语言?编译器(Complier)是一个由某个超级脑残编写出来的机器语言程序它能够让计算机自动将一个Pascal语言程序转换成机器语言程序。programhelloworldbeginwriteln(#HelloWorld!#)end编译器Complier囧!第一章编译器是如何运作的?将一个高级语言程序转换成机器语言程序的过程叫做编译。将一个高级语言程序转换成机器语言程序的原理叫做编译原理(感觉像是废话)。例如编译器获得ldquowriteln(#HelloWorld!#)rdquo这条语句后就会分析这条语句的语法然后将得知这条语句其实就是在屏幕上输出一些白点而已便把需要做的事转换成乱七八糟的东西。编译原理十分复杂因为要理解人类的语言并非易事所以只有一些脑残人士才能写的出编译器来。有很多人写过编译器最有名的莫过于TruboPascal编译器它的InlineComplie技术曾震惊全世界。第一章在哪里能够得到编译器?当然是网上下载啦~!由于TruboPascal编译器已经过时这里推荐FreePascal编译器:http:sourceforgenetprojectsfreepascalfilesWin如果使用的不是Windows位操作系统也可以去这里下:http:wwwfreepascalorgdownloadvar不同的编译器理解Pascal语言略有不同这造就了略有不同的Pascal语言语法(语言是随着时代变迁的嘛)。以后讲到的的Pascal语言语法都是基于FreePascal编译器的。第一章第二章编译写好的程序编写你的第一个Pascal程序如何查看程序运行结果?程序出错了怎么办?部分中文计算机用户遇到的问题常用快捷键(请熟记!)大致了解你写的第一个程序编译Pascal程序用到文件的类型调试目录编写你的第一个Pascal程序第一步:打开fpexe(请确定你已经正确安装了freepascal)然后你会看到形如右边的界面:第二步:点击FileNew然后在蓝色的背景中按照左边的图打字。切记:不可错一字不可倒一字不可漏一字不可多一字!第二章编写你的第一个Pascal程序第三步:按F开始编译会弹出一个对话框叫你保存。输入helloworld后按Ok。如果正常此时你会看到如下界面:第四步:按CtrlF运行程序你会发现屏幕闪了一下这表示你编译并运行成功了。第二章如何查看程序运行结果?想知道刚才程序做了什么事你可以按AltF查看或者点击DebugUserScreen来查看。原来傻逼计算机只是在屏幕上输出了一些白点点。第二章程序出错了怎么办?当你编译了程序后如果有错误会出现以下提示:这时候你按回车光标会停在错误出现的后一个字符(没准是下一行)上。你必须修改错误的部分直到程序能够正确编译为止。如图最常见的错误莫过于分号漏加。图中的ldquordquoexceptbutldquoBEGINrdquofound意思就是分号漏加了。第二章程序出错了怎么办?在编译的时候出的错叫做编译错误还有种错误是在运行的时候出错的叫做运行时错误。比如你让计算机去计算除以语法上是没有错误但是不符合逻辑。不同的错误有不同的出错代码具体请参见附录里的ldquoPascal错误码表rdquo。出错提示中的(,)是出错的行数和列数。第二章部分中文计算机用户遇到的问题有时候你家的freepascal看上去像这样:请别紧张这只是脑残计算机在和你看玩笑。这表现出你家计算机逻辑混乱的另一面。事实上出现这种情况是因为你的计算机使用了错误的代码页。你可以建立一个bat脚本输入以下内容后再运行:chcpnulfpexe第二章常用快捷键(请熟记!)AltEnterAltXFFFAltFCtrlFAltFFFCtrlFCtrlF全屏退出保存打开编译并连接编译编译连接并运行看结果单步步过运行单步步入运行加断点加跟踪变量第二章大致了解你写的第一个程序programhelloworld{程序总是以program和一串英文字母开始}{单词之间用空格隔开}begin{程序的语句部分开始}writeln(#HelloWorld!#){输出一个字符串}end{程序总是以end和一个英文半角句号结束}{大括号里写的都是注释}{注释会被编译器忽略}(*除此之外你还可以用一个半圆左括号加一个星号和一个星号加一个半圆右括号表示一段注释*)=程序结束以后加什么内容编译器都懒得鸟你一行内的两根斜杠后面的内容也会被认为是注释。{你甚至还可以用嵌套的方法}表示这是注释!{原来一个pascal语言程序就是这么写的。}栗子:helloworldpas第二章编译Pascal程序用到文件的类型pas程序源代码bak程序源代码的备份o目标文件(经过编译的源代码)exe编好的程序(经过连接的目标文件)pp单元库文件ppu经过编译的单元库文件inc源代码的一部分(头文件)pasppuoppexe编译连接第二章调试你可以在学习编写简单的程序以后再来看这一节。调试是一种检查程序运行时错误的重要手段。当你学会了一些编程方法并能够熟练书写程序以后编译错误已经不再是你畏惧的东西了但运行时错误将永远陪伴你。世界上最讨厌的事不是程序中有错而是不知程序的错出在哪里。一个程序编写完以后进行运行。如果运行的结果和期望的不同那就需要调试修改。第二章调试按F进行一句一句执行。如果错误出线在某个子程序内可以按F进入子程序一句一句执行F也会跟进其它文件内的子程序。按CTRLF输入变量名称随时查看变量的值。所有的调试功能都在菜单中的debug中。除了F和F以外你还可以使用F直接执行到某一条语句后停止。除此之外使用CTRLF添加程序断点以后再用CTRLF也是一种可取的调试方法。第二章第三章编写简单的程序语句和程序段最简单的程序更高级的程序常量和变量关键字和标识符数据类型定义常量和变量操作符运算符优先级让计算机进行简单的数学运算赋值交换两个变量的值条件让计算机求解一元二次方程循环嵌套猜数字游戏空语句目录语句和程序段一条语句就是一个句子(俗称一句话!我不知道该怎么解释)。除了begin和end外Pascal的每条语句都是以结尾的。一个程序段就是一段程序程序段又称为复合语句。程序段是由begin一些语句和end构成的。语句的种类可多了在以后的学习中你将一一接触不同的语句。之前我们能遇到的writeln(#HelloWorld!#)是条语句它其实是调用了SYSTEM单元库中的一个叫做writeln()的过程(过程是子程序的一种)。第三章最简单的程序一个最简单的程序包含一个程序说明和一个主程序段:programprogram{主程序说明}{定义主程序的各种变量和常量}begin{主程序段开始}writeln(#我是一个语句#){主程序段内容}end{主程序段结束}主程序段也是程序段只不过它结尾的最后一个end是以英文半角句号而非分号结束的。也就是说pascal语言程序的最后一条语句一定是end。第三章更高级的程序如果你认为Pascal语言只不过是只能在屏幕上输出ldquoHelloWorld!rdquo的傻逼语言那么你就错了因为其实它还能输出更多东西比如:ldquocaonima!rdquo。。。。。。因为认真你就输了。programinputoutputvars:stringbeginreadln(s)writeln(s)end栗子:inputoutputpas第三章常量和变量虽说魔兽争霸也只不过是屏幕上的一些白点点但是要完成魔兽争霸我们还需要更多的手段。上面一段程序和helloworldpas不同的是它使用了vars:string定义了一个字符串变量。一个变量(或常量)可以用来储存信息例如一串文字(字符串类型)一个数字(整数类型、实数类型)。貌似只有这些功能。第三章常量和变量使用const关键字来定义常量。使用var关键字来定义变量。vars:string中的s就是一个变量string是它的数据类型(字符串类型)。通过readln(s)语句我们可以在屏幕里输入一串文字并保存到变量s中下次就可以直接用writeln(s)输出字符串s了。别忘了定义一个变量以后也需要加分号。第三章关键字和标识符不是随便一串英文字母都可以用来定义变量的。一个变量(或常量)的名称叫做变量(或常量)的标识符。标识符不能是关键字(又称保留字)。标识符不能重复定义。你可以假定关键字是已经被定义的标识符。标识符不能以数字开头并且必须由英文字母、数字和下划线组成。标识符是不区分大小写的。关键字就是Pascal语言预定好的有特殊含义的单词如programconstvarbeginend等等。如果你打入了一个单词是白色的那他就是关键字了所以别把关键字用作标识符。(常用的关键字见附录中的ldquo常用关键字列表rdquo)第三章数据类型每个变量或常量都有它自己的数据类型。数据类型决定了数据是如何存储在内存中的。除了字符串类型(string)以外还有很多数据类型:整数类型(integer)字符类型(char)实数类型(real)布尔类型(boolean)数组类型(array)集合类型(set)枚举类型(())子界类型()文件类型(file)指针类型(^)记录类型(record)对象类型(object)这些类型都有自己的定义和使用方法将在之后的章节一一介绍。第三章常用数据类型(整数类型)整数类型能表示的数字范围占用内存Shortint~Integer~Longint^~Int^~^Byte~Word~Cardinal~能表示的数字范围越大占用的内存也就越多。第三章常用数据类型(实数类型)实数类型能表示的数字范围占用内存RealSingel或Double或SingleEEDoubleEEExendedEECompEE内存又称主存是你计算机中的一个配件需要花钱购买。内存越大则价格越高。如果内存不够用了你的程序就会崩溃。内存使用的单位叫做字节一个字节相当于八个开关。第三章常用数据类型(布尔、字符类型)布尔类型能表示的数字范围占用内存Booleanfalse或true字符类型能表示的数字范围占用内存Char#~#具体到号数字表示什么字符请参见附录中的ldquoASCII码表rdquo。其它表示方法:IntegerInteger$FADChar#a#第三章常用数据类型(字符串类型)字符串类型能表示的数字范围占用内存String#x字符串类型其实是一个引用类型它的值指向内存中的一个地址。字符串类型是一种特殊的类型。输出的字符串必须用单引号括起来否则计算机会把它当成一个变量例如writeln(abc)和writeln(#abc#)的含义是完全不同的。第三章定义常量和变量programpiconstconstPI={pi其实是个有理数}vard:integerbeginwrite(lsquo请输入直径rsquo)readln(d)writeln(#周长#,PI*d)end使用=定义常量。使用:定义变量常量的值是不可修改的。虽说可以用变量来代替常量但是常量的使用可以使程序更简洁并。程序中过多的数字(硬编码)的出现不易于程序的修改和维护。常量先于变量而定义在定义某些变量时甚至可以直接使用到常量(如数组)。栗子:piconstpas第三章操作符对变量进行运算、赋值的符号叫做操作符(Operator)。运算符是操作符的一种。数学运算符关系运算符逻辑运算符加法:等于:=且:and减法:大于:或:or乘法:*小于:否:not除法:大于等于:=异或:xor整除:div小于等于:=取余数:mod不等于:第三章运算符第三章优先级学过小学数学的小朋友都知道数学运算都是从左往右进行的。乘除法的优先级高于加减法。()not,~,*,,div,mod,and,,as,shl,shr|,!,,,or,xor=,,,=,,=,in,iselsethen第三章让计算机进行简单的数学运算programaplusbvara:integerb:integerbeginreadln(a)readln(b)writeln(ab)endprogramaplusbvara,b:integer{定义两个变量时可以把它们写在一起。}beginreadln(a)readln(b){语句也是如此}writeln(ab)end栗子:aplusbpas栗子:aplusbpas第三章字符串连接操作符*programabssvara,b:integers,s:stringbeginreadln(a)readln(b)writeln(ab)readln(s)readln(s)writeln(ss)end{不同的数据类型之间操作符的效果也是不同的。}输入:输出:输入:输出:栗子:absspas第三章赋值变量和常量的区别在于变量的值是可以改变的。赋值符号::=赋值符号也是一种操作符。programsetivari:integerbegini:=writeln(i)end栗子:setipas第三章交换两个变量的值(低级)利用第三变量c来交换两个变量的值。这个程序的优点是简单缺点是需要用到第三个变量。!programabceasyvara,b,c:integerbeginreadln(a,b)c:=aa:=bb:=cwriteln(a,b)end栗子:abceasypas第三章交换两个变量的值(中级)利用数学运算操作符来交换两个变量的值。第一行a变成了一开始的ab。第二行b变成了a。第三行由于a是abb是a相当于aba=b。这个程序的优点不需要用到第三变量缺点是有可能会溢出例如输入a=b=。programabcnormalvara,b:integerbeginreadln(a,b)a:=ab{a变成了和}b:=ab{abb=a}a:=ab{aba=b}writeln(a,b)end栗子:abcnormalpas第三章交换两个变量的值(高级)利用位运算操作符来交换两个变量的值。这个程序的优点就是一个字:牛逼。(xor是对整型的每位进行异或运算不懂的问老师吧反正xor平时不需要。使用位运算还可以加快程序执行速度。)programabchardvara,b:integerbeginreadln(a,b)a:=axorbb:=axorba:=axorbwriteln(a,b)end栗子:abchardpas第三章条件(if)尽管我们已经能让计算机进行一些简单的数学运算并将结果输出出来但是要完成魔兽争霸我们还需要一种很重要的语句:条件语句。ifa=bthenc:=a=b可以是任何一个布尔变量还记得运算符号一节中有说关系运算符ldquo=rdquo的输出结果是布尔类型么?如果使用多个布尔变量切记用括号括起来:if(a=b)and(c=d)thene:=下面一条语句将永远不会被执行:iffalsethenwriteln(#Iamstipud#)第三章条件(程序段)then之后跟的语句可以是一条语句也可以是一个程序段:ifc=dthenbegina:=bb:=bbend切记如果要写两条语句必须将这两条语句写在程序段的begin和end之间否则第二条语句将不在条件语句的判定内(一定会被执行)。第三章条件(ifelse)ifelse语句:ifa=bthenc:=elsed:=相当于:ifa=bthenc:=ifnot(a=b)thend:=切记无论else前的语句是一条语句还是一个程序段else前的那一个分号必须删掉!ifa=bthenbeginc:=de:=fendelseg:=h第三章让计算机求解一元二次方程programyiyuanercivara,b,c,d:realbeginwrite(#请输入a:#)readln(a)write(#请输入b:#)readln(b)write(#请输入c:#)readln(c)d:=b*b*a*cifdthenwriteln(#方程无解!#)elsebeginwrite(#第一个解是:#)writeln((bsqrt(d))a)write(#第二个解是:#)writeln((bsqrt(d))a)endend栗子:yiyuanercipas第三章循环例如我们要一下子重复输出句话一种方法是把writeln(#我是剑圣#)复制遍。但是这种办法十分坑爹而且写出来的程序十分庞大。另一种方法就是使用循环语句。加入你在魔兽争霸中需要显示个剑圣这个剑圣分别叫做ldquo剑圣rdquoldquo剑圣rdquoldquo剑圣rdquohellipldquo剑圣rdquo这时候你就不得不使用循环语句了。循环语句有三种:while语句repeatuntil语句和for语句。第三章循环(while)理论上说使用while语句可以完成其它循环语句所能做到的所有的事。while语句用起来是这样的:a:=whilea=dobeginwriteln(#我是第#,a,#句话#)a:=aend和if语句一样当while后的布尔值是true时就执行后面的语句或程序段只不过执行完一遍以后还会重新判断是否再次执行。第三章循环(repeatuntil)a:=repeatwriteln(#我是第#,a,#句话#)a:=auntila=这段程序和右边的程序效果是一样的。无论如何repeatuntil之间的语句一定会执行一遍因为判断是在until执行的。当until后的布尔值为true时就跳出循环。a:=whilea=dobeginwriteln(#我是第#,a,#句话#)a:=aend和repeatuntil不同的是repeatuntil之间可以是多条语句而while后必须是一条语句或者一个程序段。until前可不加分号。第三章循环(for)fora:=todowriteln(#我是第#,a,#句话#)这段程序的效果和右边的是一样的。for语句总是很简洁但是并非所有循环都能用for语句表示出来。for语句的循环体变量(这里是a)的值是不可改变的。a:=whilea=dobeginwriteln(#我是第#,a,#句话#)a:=aend总能把for语句用while语句表达出来。学会把for用while写出是很重要的因为有时候你没法把循环用for表达出来。第三章循环(fordownto)可惜的是for语句不支持C语言中的步长功能每次循环循环体变量的值只会加一。尽管如此for语句提供了另一种方法来表达减一:forb:=downtodowriteln(#我是第#,b,#句话#)programgotolabel{定义一个标记}beginb:=:{在这里标记}writeln(#我是第#,b,#句话#)b:=bifb=thengoto{跳转到标记}end使用goto语句来达到目的第三章循环(goto)使用goto语句虽然有时候能使书写程序变得简便但是通常情况下它会破坏程序结构。它会让程序不止一个出口所以应该避免使用。理论上所有的循环都可以用while语句来完成。同样道理break和continue这些会破坏循环结构的语句也应该避免使用它们是万恶之源因此在此不再介绍此类语句的使用方法。(就不告诉你就不告诉你就不~告诉你!)第三章嵌套举个栗子你就明白了:ifabthenifcdthenbeginwhilee=fdog:=gif()=thenwriteln(#好的#)endelse后面也可加嵌套即elseifhellip分号加不加自己多试试就知道了。第三章猜数字游戏好了现在你已经有能力让计算机在屏幕上持续得画一大堆点了虽说离写出魔兽争霸还有很长的一段路要走但是凭借这点知识写一些小游戏已经不成问题了。如果你能理解这个程序并且正确预料这个程序运行后将会发生什么那么恭喜你你已经学会编写一个简单的Pascal语言程序了!programcaishuzivara,b,i,n:integerbegina:={最大值}b:={最小值}writeln(#请输入一个的整数:#)栗子:caishuzipas(上半部分)第三章猜数字游戏fori:=downtodobeginwrite(#你还有#,i,#次机会:#)readln(n){输入的数}if((bn)(na))thenbeginwrite(#数字太小了傻逼!#)a:=nend{if}elsebeginwrite(#数字太大了傻逼!#)b:=nend{else}end{for}writeln(#你已经没有机会了。#)writeln(#你真是个大傻逼!#)readln()end栗子:caishuzipas(下半部分)第三章空语句一个典型的空语句:空语句用在条件语句上:ifa=bthen空语句用在循环语句上:whiletruedo{死循环}加了空语句不会怀孕:writeln(#加了空语句不会怀孕#)第三章空语句programhelloworldvoidbeginwriteln(#HelloWorld!#)end{除了程序名外仔细观察这段程序和之前的helloworld程序有什么不同这段程序能否通过编译?为什么?}{答案:能。begin之后的那个分号相当于空语句。}栗子:helloworldvoidpas第三章条件(case)*虽然本作者一向不推荐使用case语句但是作为一个优秀的程序员必须对所有可能出现的语句做一个了解因为你不用不代表别人不会用到时你看到case语句说这不是pascal语言因为我没教过我就傻眼了:caseiof{这里不加分号}:writeln(#ok#):a:=b:if()=thenwriteln(#yes!#){是子界有关子界的内容请参看后面几章}else:whiletruedo{这里的分号可以不加只不过这里用了空语句}end第三章循环(break)*我不推荐大家使用case语句是出于两个原因第一是因为case语句局限性很大第二是因为begin和end不是对称的case语句中没有begin。在这里顺便也把break的用法说了吧还是举栗子:a:=whiletruedobegina:=aifathenbreakend就是这样看不懂也别来问我只能说你学艺不佳。第三章第四章子程序函数与过程参数返回值局部变量和全局变量实际参数和形式参数重载递归超前引用(forward)writeln()和readln()场宽(:操作符)使用其它子程序程序也是子程序操作符也是子程序目录函数与过程细心的小朋友已经发现在求解一元二次方程中我们使用了sqrt()来求解一个实数的平方。sqrt()就是一个子程序。Pascal的子程序分为两种一种叫做函数(Function)如sqrt()另一种叫做过程(Procedure)如writeln()。函数于过程的区别在于函数是有返回值的。例如:a:=sqrt(b)但是这样是错误的:c:=writeln(d){这是错误的}因为writeln()只是一个过程它并没有返回值。第四章函数与过程子程序可以理解为ldquo一个独立的程序段rdquo。它的结构就和一个程序一样。子程序名是一个标识符例如一个过程:procedureprocedure(){过程说明}{定义各种变量和常量}begin{过程程序段开始}writeln(#我是一个语句#){过程程序段内容}end{过程程序段结束}第四章参数参数其实就是变量。在使用writeln()时你会键入writeln(#大傻逼#)这个ldquo#大傻逼#rdquo就是一个参数如果没有这个参数writeln()只会在屏幕上输出一个空行。参数的出现使得子程序的效果产生各种变化。一个参数可以是一个变量。使用参数是主程序将变量的值传给子程序的一种手段。第四章返回值只有函数有返回值。你可以把函数本身看成一个变量例如:functioninc(i:integer):integerbegininc:=iend在定义函数inc的同时你就同时已经定义了一个叫inc的整数类型变量。当你把参数传递给函数时就可以使用它返回的值了例如:b:=inc(a)第四章局部变量和全局变量programbianliangvara,b:integerprocedureprocedure()vara,c:integerbegin{过程开始}a:=ab:=bc:=cend{过程结束}begin{主程序开始}procedure()a:=ab:=bend{主程序结束}局部变量c是在子程序内定义的所以在主程序段不能使用变量c否则会报错。全局变量b在子程序内也能使用。变量a在子程序外和子程序内都有定义。被定义的是两个不同的变量。过程段内改变的是局部变量a的值主程序段改变的是全局变量a的值。第四章实际参数和形式参数programcanshuvara,c:integerb:realfunctionabc(i:integer):realvarq:integerbegini:=ia:=aabc:=iq:=qendbeginb:=abc(c)enda,b,c是实际参数它们的值无论在子程序内还是子程序外都会被改变。q是变量参数只在子程序内起效果用完就结束了其中i是形式参数调用结束时值会返回给c。i和c是两个不同的变量你不能在子程序外使用i。无论是何种参数本作者都不建议通过参数来传递返回值。最好的方法还是使用abc:=i的方式传递。第四章重载writeln(#abc#)和writeln()其实是两个不同的子程序。参数不同的同名子程序不是同一个子程序同名参数不同的子程序叫做子程序的重载一个子程序可以有无数个重载:procedureprocedure(a:integer)begina:=aendprocedureprocedure(a,b:integer)begina:=ab:=awriteln(#我是重载#)endprocedureprocedure(s:string)beginwriteln(s)writeln(#即使类型不同也可以重载#)end第四章递归递归其实就是子程序调用它自己调用自己难道不会出现死循环么?看这个:functionjiecheng(canshu:integer):longintbeginifcanshuthenjiecheng:=jiecheng(canshu)*canshuelsejiecheng:=end递归是一种常用算法它通常可以大大优化程序提高程序运行效率节省内存和钞票。第四章超前引用(forward)有时候子程序需要相互调用但是pascal子程序必须先定义才能调用怎么办?看这里:procedureplay()forwardproceduremenu()vara:integerbeginreadln(a)ifa=thenplay()endprocedureplay()vara:integerbeginreadln(a)ifa=thenmenu()end第四章writeln()和readln()writeln()和readln()都是过程。writeln()和readln()都可以使用多个参数。write()和writeln()的用法我就不说了自己试。虽然read()和readln()都是以回车来结束读取的但是read()读取是按空格为分隔符来的。反正我只支持使用readln()来读数据并且每次最好只读一个。其实更好的方式是使用其它单元库的其它子程序来读数据例如keypress()getMouseEvent()等等。第四章场宽(:操作符)输出的数据不够整齐?场宽能够帮助你!fori:=todowrite(i:)场宽也能够限制输出数据的长度:fori:=todowrite(i:)还有一种双场宽用于输出实数:writeln(::)前一个冒号后是整数部分长度后一个冒号后是小数部分长度。输出实数时小数部分是四舍五入的。第四章使用其它子程序SYSTEM单元库中除了writeln()和readln()以外系统中其实还有许多其它可用的子程序例如ord()chr()sqr()sqrt()abs()trunc()round()等等详细请见附录中的ldquo常用子程序列表rdquo。除了SYSTEM单元库外你还可以使用其它单元库例如CRT单元库这个单元库里有delay()sound()等子程序。有关单元库的内容将在下一章介绍。第四章程序也是子程序programinc(i:integer):integerbegininc:=iend说对了我们的程序其实也是个子程序。当我们用外面的命令或别的程序调用它时也能获得和子程序一样的效果。当一个子程序没有参数时我们可以把它的括号省略例如:functionfunctionabc:integer平时我们定义的programprogram其实就是个即没有参数又没有返回值的子程序。第四章操作符也是子程序你以为:=是和是系统预定的?那你就错了。操作符的本质也是子程序。operator(a,b:integer):integerbeginasm{hellip}endend这是一个加法操作符的定义它是用pascal内嵌的汇编语言实现的。我们知道汇编语言是脑残使用的语言所以我在这里就不多讨论了。操作符也是可以重载的具体方法就是看上面的格式使用operator关键字懒得多说了。第四章第五章单元库使用CRT和GRAPH单元库SYSTEM单元库书写一个单元库pp文件和ppu文件、o文件的关系目录使用CRT和GRAPH单元库使用uses语句可以使用单元库预编好的子程序。每个程序只能有一个uses语句。uses语句必须紧紧跟在program语句之后。programprogramusesCRT,GRAPHbeginwriteln(#随便写点内容#)clrscr()end和SYSTEM单元库一样CRT、GRAPH单元库的子程序也写在附录的ldquo常用子程序列表rdquo中。使用GRAPH单元库时必须先初始化绘图窗口自己找参考书吧GRAPH确实单元库是一个强大的单元库。第五章SYSTEM单元库你在书写程序之前系统已经默认隐藏包含了usesSYSTEM这条语句这就是为什么你能使用writeln()子程序的原因。在SYSTEM单元中不仅包含了很多子程序还定义了很多类型例如integerchar等等。在源码中的systemhinc中我们还可以发现SYSTEM单元库包含了mathhinc和currhinc等代码也就是说我们无需使用MATH单元库就可以使用MATH单元库内预定的子程序等内容。作者建议大家看一下源码systemfpd内的内容systemfpd的内容已经写在附录中。第五章书写一个单元库这不难看个栗子就知道:unitunit{单元库声明}interface{关键字不可省略}constconst=vari:integer{定义各种常量和变量}procedureprocedure(){这里不用写出程序段只需写出子程序声明可以写很多个}implementation{另一个关键字不可省略}procedureprocedure(){再写一次声明}beginwriteln(#ok#)end{这里写出程序段}end{和一个程序一样结束一个单元库}第五章pp文件和ppu文件、o文件的关系我们通常把单元库的代码保存为pp文件而非pas文件。与pas文件不同的是按AltF将pas文件被编译后只生成o文件而pp文件被编译后会生成ppu和o文件。如果pas文件有使用单元库则会寻找该单元库的pp文件如果没有找到pp则会寻找ppu和o。把所有的o文件用linkexe(或者makeexe)连接起来就成了可运行的exe文件了。当然linkexe也可以将o文件连接成dll文件。第五章第六章编译指令inc文件和{$I}编译指令{$define}和{$ifdef}了解WindowsAPI调用外部子程序内嵌汇编语言目录inc文件和{$I}如果你心情好去官网上下FreePascal的源码在source文件夹里除了paspp你还会发现很多inc文件。inc文件是没法通过编译的因为它只是源代码的一部分。如果你有一个文件叫abcinc在你的程序中有一句{$Iabcinc}这相当于abcinc的所有内容全部都照抄到这条语句的这个位置了。当然如果在abcinc中已经加入{$Icbainc}那么在照抄abcinc之前会先将cbainc照抄进去。如果找不到所有所需的文件就无法通过编译编译时会停留在出错的{$Iabcinc}或{$Icbainc}上。第六章inc文件和{$I}同一个pas可以{$I}同一个文件多次不同的pas文件或pp文件也可以{$I}同一个文件。甚至可以互相{$I}。{$I}是种编译指令编译指令都是以ldquo{$rdquo开头的在编译一个程序之前makeexe会先找到所有编译指令并进行处理然后再编译。在makeexe之后也可加各种参数来达到同样的效果例如Iabcinc。第六章编译指令{$define}和{$ifdef}刚才说到两个pas互相{$I}对方难道不会出现死循环么?有什么东西能先于{$I}阻止它们吗?有那就是编译指令本身。编译指令又叫编译开关因为编译器最终要将pascal语言转成机器语言而每种机器懂得的机器语言又略有不同所以我们需要提供更多的信息告诉编译器如何把自己的代码编译成机器语言例如你用的机器使用何种指令集。我用{$definehaha}定义了一个叫haha的东西haha只是有被定义和没有定义两种状态。定义了当然是有用处的。第六章编译指令{$define}和{$ifdef}接下来就有{$ifdefhaha}usesCRT{$endif}就是如果定义过了haha那么这个地方就有ldquousesCRTrdquo这条语句否则这个地方就啥都没写编译器会忽略这段话。你觉得这很麻烦?写了又不用为什么不直接不写?这就好像为什么要把程序分块写成子程序一样为了易于修改。想想看如果把源码拷贝到另一台电脑只要改开头的{$definehaha}不需要去删除那修改程序不是很方便么?除此之外你还可以用{$undef}来取消来取消一个定义用{$else}控制另一段代码是否使用甚至你还可以嵌套这些编译指令。第六章其它编译指令*{$APPTYPEGUI}可在写windows程序的时候去掉DOS黑框框。在用DOS单元前{$M$,,}不然Dos单元的部分函数会出问题。更多编译指令请见附录ldquoPascal编译指令rdquo。第六章了解WindowsAPI前面说到了SYSTEM系统单元库实际上系统单元库也是人写出来的(废话)。那么诸如writeln()这种子程序在系统单元库是如何实现的呢?其实它是调用了WindowsAPI。WindowsAPI是比尔盖茨的同事们为了自己和大家方便写的一系列动态链接库(DLL)它的地址位于SYSTEMROOTSystem包括kerndlluserdll等。这些DLL通常使用C语言写成的经过编译后变成了机器语言。Pascal语言程序可以使用external和name关键字使用这些在操作系统中预先存在的DLL实现各种功能(比如在屏幕上画白点点等)。第六章调用外部子程序看看附录里的freepascal源码funcinc是如何定义所有WindowsAPI子程序的你就能学会如何使用name和external关键字调用外部子程序了。第六章内嵌汇编语言别嵌了先去学汇编语言然后再去学混合语言编程技术。这一块已经不属于Pascal语言的犯愁了。反正你看到asm和后面一大堆绿色代码就忽略掉吧。第六章第七章子界和枚举定义数据类型子界枚举(这一章很短你知道为什么的)目录定义数据类型使用type关键字你可以定义新的数据类型例如:typemytype=integer然后你就定义了一个叫mytype的数据类型这个数据类型和integer效果一样只是换了个名称。(!不是浪费时间么)系统中自带定义了很多其它类型如typeqword=int它的目的是为了让其它语言的程序员也可以使用这种类型因为在其它语言中也许int就叫做qword。接着你就可以使用vara:mytype或者varb:qword了。第七章子界你以为integerboolean等数据类型都是系统预定的?那你就对了!!但是何谓预定这是一个问题。对于integer这样的数据类型来说它是可以用其它方法来描述它的。typeinteger=是一个子界类型它是pascal里的一个基本类型。所有整数类型都

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

评分:

/147

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利