第一讲 初识Pascal语言

一、Pascal 语言概述
  Pascal 语言是一种算法语言,它是瑞士苏黎世联邦工业大学的Niklaus Wirth教授于1968年设计完成的,1971年正式发表。1975年对Pascal 语言进行了修改,作为“标准PASCAL语言”。
  Pascal 语言是一种结构化的程序设计语言,可以用来编写应用程序。它又是一种系统程序设计语言,可以用来编写顺序型的系统软件(如编译程序)。它的功能强、编译程序简单。

二、Pascal 语言的特点
   Pascal语言有以下几个主要的特点:
  ⒈ 它是结构化的语言。Pascal语言提供了直接实现三种基本结构的语句以及定义“过程”和“函数”的功能。可以方便地书写出结构化程序。在编写程序时可以完全不使用GOTO语句和标号。这就易于保证程序的正确性和易读性。Pascal语言强调的是可靠性、易于验证性、概念的清晰性和实现的简化。在结构化这一点上,比其它(如BASIC,FORTRAN77)更好一些。

  ⒉ 有丰富的数据类型。Pascal提供了整数、实型、字符型、布尔型、枚举型、子界型、数组类型、集合类型、记录类型、和文件类型和指针类型。  ⒊ 能适用于数值运算和非数值运算领域。PASCAL的功能较强,能广泛应用于各种领域。PASCAL语言还可以用于辅助设计,实现计算机绘图功能。

  ⒋ PASCAL程序的书写格式比较自由。PASCAL允许一行写多个语句,一个语句可以分写在多行上,这样就可以使PASCAL程序写得格式优美,便于阅读。

  由于以上特点,许多学校选PASCAL作为程序设计语言,它能给学生严格而良好的程序设计的基本训练。培养学生结构化程序设计的风格。

 

三、Pascal语言程序的基本结构
  程序设计语言都有着一组自己的记号和规则。PASCAL语言必须采用其本身所规定的记号和规则来编写程序。下面我们首先来了解Pascal语言的程序基本结构。

Pascal语言的程序结构为:
程序首部               
标号说明语句               
常量定义语句                 
类型定义语句      程序的说明部分       
变量说明语句 
函数和过程说明语句                     分程序 
                           
程序体        程序的执行部分
         
先看一个简单的PASCAL程序:
program exam1(input,output);
  var r,s,c:real;
  begin
   readln(r);
   c:=3.14*2*r;
   s:=3.14*r*r;
   writeln(c,s)
 end.

从这个简单的程序可以看到:
  1、 一个PASCAL程序分为两个部分:程序首部和程序体(或称分程序)。
  2、程序首部是程序的开头部分,它包括:
  ⑴ 程序标志。用“program”来标识“这是一个PASCAL 程序”。PASCAL规定任何一个PASCAL程序的首部都必须以此字开头。在Turbo pascal语言中,首部也可省略。
  ⑵ 程序名称。由程序设计者自己定义,如例中的exam1。
  在写完程序首部之后,应有一个分号。
 
  3、程序体是程序的主体。程序体包括说明部分(也可省略)和执行部分两个部分。
  ⑴ 说明部分用来描述程序中用到的变量、常量、类型、过程与函数等。本程序中第二行是“变量说明”,用来定义变量的名称、类型。

PASCAL规定,凡程序中用到所有变量、符号常量、数组、标号、过程与函数、记录、文件等数据都必须在说明部分进行定义(或称“说明”)。也就是说,不允许使用未说明先使用。
    ⑵ 执行部分的作用是通知计算机执行指定的操作。如果一个程序中不写执行部分,在程序运行时计算机什么工作也不做。因此,执行部分是一个PASCAL程序的核心部分。
  执行部分以“begin”开始,以“end”结束,其间有若干个语句,语句之间以分号隔开。执行部分之后有一个句点,表示整个程序结束。
    4、 PASCAL程序的书写方法比较灵活。 应以程序结构清晰、易读为目的。在编写程序时尽量模仿本书中例题程序格式。
    5、在程序中,一对大括号间的文字称为注释。注释的内容由人们根据需要可用英语书写。注释可以放在任何空格可以出现的位置。执行程序时计算机对注释不予理睬。
    6、保留字后不加标点符号(END除外)。

四、Turbo Pascal语言系统的使用
  下面我们就学习常用的Turbo Pascal 7.0系统的使用。
1、系统的启动
  在运行系统目录下的启动程序TURBO.EXE,即可启动系统。屏幕上出现如图1所示的集成环境。
2、Turbo Pascal系统集成环境简介
  最顶上一行为主菜单。中间蓝色框内为编辑窗口,可进行程序的编辑。最底下一行为提示行,显示出系统中常用命令的快捷键。

3、新建程序窗口
  按F10进行主菜单,选择File菜单,执行其中New命令。就可建立一个新的程序窗口(默认文件名为Noname00.pas或Noname01.pas等)。

4、程序的输入、编辑与运行
   在当前程序窗口中,一行一行的输入程序。事实上,程序窗口是一个全屏幕编辑器。所以对程序的编辑与其它编辑器的编辑方法类似,这里不再重复。
  当程序输入完毕之后,一般要先按Alt+F9(或执行compile菜单中compile命令)对程序进行编译。如果程序有语法错误,则会在程序窗口的第一行处显示第一个红色错误信息。若无语法错误,则窗口正中央会出现一个对话框,提示编译成功。接下来,我们可以运行程序了。
程序的运行可以通过按ALT+R打开RUN菜单中的RUN命令,或直接按快捷键CTRL+F9。则可以在用户窗口中输出运行结果。通常在程序运行结束后系统回到Pascal系统的集成环境,因此要查看运行结果,要按ALT+F5将屏幕切换到用户屏幕。

5、程序的保存与打开
  当我们想把程序窗口中的程序存入磁盘时,可以通过按F2键(或执行File菜单中的save命令)来保存程序。第一次保存文件时屏幕上会出现一个对话框要求输入文件名(默认扩展名为.pas)。
  当我们要将磁盘上的程序文件中的PASCAL程序装入窗口时,可按F3(或执行File菜单中的Open命令)来装入程序,此时系统也会弹出一个对话框要求输入要打开的文件名,或直接在文件对话框列表中选择所要的文件,然后回到打开文件。

第二讲 数据类型、表达式、函数

一、数据类型

   第五讲 输入语句
   
  
读语句
    格式: read(变量名表);
    readln[(变量名表)];
    语义:从键盘输入数据,依次赋值给相应变量。
Ø       变量名表为一串用逗号分隔的变量标识符。
Ø       数值型数据之间用空格或回车键分隔,最后一定要回车,表示输入完毕。
 
例4、设a,b,c为整型变量; 如需将a,b,c的值分别赋以10,20,30,写出对应read(a,b,c);语句的所有可能输入格式。
键盘输入 ① 10 20 30↓   ② 10 20↓    ③ 10↓        ④ 10↓
 30↓          20 30↓        20↓
                                                             30↓
如将read(a,b,c)改为readln(a,b); readln(c);而达到本例同样的输入目的,上面哪些输入格式是有效的。
Ø       read语句是一个接一个地读数据,在执行完本Read语句( 读完本语句中变量所需的数据)后,下一个读语句接着从该数据输入行中继续读数据,也就是说,不换行。
read(a,b);
      read(c,d);
      read(e);
   如果输入数据行如下:
       1□2□3□4□5□6□↓       ↓表示回车键
Ø       Read后一定要有变量名表,readln可以没有输入项,只是读一个回车换行符。  
 
 例5、设有下列语句(所有变量为整型)
  read(a,b,c);
  readln(d,e); readln;
  readln(f,g);
     设输入文件input 中的数据如下:
  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  
  
Ø       read(a,b); readln; read(c); 相当于 readln(a,b); read(c)
read(a); readln(b,c);   相当于 readln(a,b,c);
read(a); read(b); 相当于 read(a,b);
 但是:readln(a); readln(b);   不等价于 readln(a,b);  
 
Ø       为了避免可能出现的错误,建议在程序中按下列原则使用读语句:
 
 ①如果没有特殊需要,在一个程序中尽量避免混合使用read语句和readln语句;
 
 ②尽量用readln语句来输入数据, 一个数据行对应一个readln语句;
 
 ③由于执行read或readln语句时, 系统不会提供任何提示信息,因此,编程时最好在readln语句之前加以适当提示,例如:
   write('Input a,b,c:');
   readln(a,b,c);
在执行时,屏幕上显示:
   Input a,b,c:■
其中,"■"为光标。执行readln语句后,系统处于待输入状态, 只有输入所需数据后才继续往下执行。
   第六讲 分支结构
   
一、PASCAL中的布尔(逻辑)类型
  布尔类型变量不能通过读语句输入给它们提供值,可以通过间接方式对布尔变量进行值的输入。
var a: boolean; 
begin readln(a); {错误语句} writeln(a); end.   
 
二、布尔表达式
  逻辑运算符:or、and、not。它们分别相当于数学上的“或”、“与”和“非”。
三个运算符的运算对象为布尔值,其中and与or有两个或两个以上运算对象,not为单目运算,只有一个运算对象。
用布尔运算符把一个关系表达式或多个关系表达式连接起来的式子就称为布尔尔表达式。布尔表达式的值也为布尔值。它们的布尔运算真值表如下:  
 
a
b
a and b
a or b
not a
false
false
false
false
ture
false
true
false
ture
 
true
false
false
true
false
true
true
true
true
 
   
    对于复杂的命题,我们可以用逻辑表达式来表示。例如,
“判断一个数是否大于0小于10” 可表示为 (x>0) and (x<10)。
“判断一个数是否小于等于0或大于等于10” 则表示为(y<=0) or (y>=10)。
“数学、英语成绩都大于等于90分或数学、英语两科成绩总分大于185分”
表示为 (math>=90) and (English>=90) or (math+English>185)。
 
  例4_1、在你前面有一个长长的阶梯,如果你每步跨2阶,那么最后剩1 阶;如果你每步跨3阶,那么最后剩2 阶;如果你每步跨5阶,那么最后剩4 阶;如果你每步跨6阶,那么最后剩5 阶;如果你每步跨7阶,那么正好走完,一阶不剩,问你这条阶梯最少有多少阶?
 
三、IF语句
1、格式
  ① IF <布尔表达式> THEN  语句1;
执行IF语句时,先计算布尔表达式值,若为TRUE则执行语句,否则不执行任何操作;
  ② IF <布尔表达式> THEN  语句1  ELSE  语句2;

执行IF语句时,先计算布尔表达式值,若为TRUE则执行语句1,否则执行语句2
2、注意
    ① if、then、else为一条完整的语句,在else之前不能有分号;
    ②语句1、语句2若实际功能非一条语句所能描述,要写成复合语句。

 
例4_2: 输入一个整数a,判断是否为奇数,是输出“yes”否则输出”no”。
  var a:integer;
  begin  
   write('a='); readln(a);
   if a mod 2 =1 then writeln('yes') else writeln('no');
   readln;
  end.
 
例4_3:华联超市里卖电池,每个电池一元钱,若数量超过10个,则可打85折。
   var num:integer;    price,total:real;
   begin
    write('num='); readln(num);  price=1;
    if num>10 then price:=price*0.85;
    total:=num*price;
    writeln('Total=',total:3:2)
end.
 

第六讲IF语句嵌套和CASE语句
   

四、IF语句的嵌套
在if语句中,如果then子句或else子句仍是一个if语句, 则称为if语句的嵌套。
 
例4_4、求三个给定的整数a,b,c中的最大数。
 ① if a>b then if a>c then max:=a   { 使用if语句嵌套 }
                      else max:=c
          else if b>c then max:=b
                     else max:=c;
② if a>b then max:=a else max:=b; { 更简单方法,不必嵌套 }
if max<c then max:=c
但如有下面的嵌套语句:
     if a>0 then if b<0
          then y:=1
else y:=0;
那么else是a>0的否定,还是b<0的否定呢?pascal规定:else与它上面的距它最近的then配对。 如果想让else和第一个if语句配对,则:
if a>0 then begin if b<0 then y:=1 end
else y:=0;
 
 
五、case语句
  当多分支选择的各个条件由同一个表达式的不同结果值决定时,可以用case语句来实现。它的选择过程,很象一个多路开关,即由case语句的选择表达式的值,决定切换至哪一语句去工作。在实现多分支控制时,用case对某些问题的处理和设计,比用if语句写程序更简洁、更清晰。
①情况语句的一般形式:
  case <表达式> of
    <情况标号表1>:语句1;
    <情况标号表2>:语句2;
         :
   else
<情况标号表n>:语句n
  end;
  case语句使用else形式,else前一语句后应有分号,这不同于if-then-else。
表达式的值必须是顺序类型,它可以是整型、布尔型及以后学习的字符型、枚举型和子界型。情况标号表是一串用逗号隔开的与表达式类型一致的常量序列。语句可以是任何语句,包括复合语句和空语句。

② case语句的执行过程
  先计算表达式(称为情况表达式)的值,如果它的值等于某一个常量(称为情况常量或情况标号),则执行该情况常量后面的语句,在执行完语句后,跳到case语句的末尾end处。
③ 说明
  情况常量是情况表达式可能具有的值,因而应与情况表达式具有相同的类型;
  情况常量出现的次序可以是任意的;
  同一情况常量不能在同一个case语句中出现两次或两次以上;
  每个分语句前可以有一个或若干个用逗号隔开的情况常量;
  每个常量后面只能是一个语句或一个复合语句。
 
例4_5、输入两个实数,再输入+、-、* 或 / 号,根据运算符输出这两个数的和、差、积或商。
var a,b,s:real; operator:char;
begin
  writeln('input a,b:’); readln(a,b);
  writeln('input operator:’); readln(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.
 
例4_6、输入某年某月份,输出其天数。
分析:程序中要判断输入的年份是否是闰年。判断闰年的算法是:如果此年份能被400整除,或者它能被4整除而不能被100整除,则它是闰年。否则,它是平年。
  var year,month,days:integer;
  begin
   write('Input year,month:'); readln(year,month);
   case month of
    1,3,5,7,8,10,12: days:=31;
    4,6,9,11 :       days:=30;
2: if (year mod 400=0) or (year mod 100<>0) and (year mod 4=0)
then days:=29
else days:=28;
else days:=0;
      end;
if days<>0 then writeln( year,‘-’,month ,’has ',days)

else writeln(‘Input error’)
  end.

 

  第七讲 循环
 
FOR语句
格式
   for 控制变量:=初值 to  终值 do  语句;
   for 控制变量:=初值 downto 终值 do  语句;
 
For语句执行过程:
1、先将初值赋给左边的变量(称为循环控制变量);
  2、判断循环控制变量的值是否已“超过”终值,如已超过,则跳到步骤5;
  3、果末超过终值,则执行do后面的那个语句(称为循环体);
  4、控制变量返回步骤2;
  5、循环结束,执行for循环后语句。
说明:
  循环控制变量必须是顺序类型。例如,可以是整型、字符型等,但不能为实型。
  循环控制变量的值选用to则为递增;选用downto则递减。
  循环控制变量的值“超过”终值,对递增型循环,“超过”指大于,对递减型循环,“超过”指小于。
  循环控制变量的初值和终值一经确定,循环次数就确定了。但是在循环体内对循环变量的值进行修改,常常会使得循环提前结束或进入死环。建议不要在循环体中随意修改控制变量的值。
  for语句中的初值、终值都可以是顺序类型的常量、变量、表达式。

例5_1、求S=1+2+3+…+ 100
  var n,i : integer;             {i为循环变量}
    S : longint;                {s为累加器}
  begin
   write('input n='); readln(n); s:=0;
   for i:=2 to n do s:=s+i;     {从2到n累加到s中}

 writeln('1+2+3+…+ 100=',s);
end.
 
例5_2、输出斐波那契数列的前20项。
  规律: F 1=0            (n=1)
         F 2=1            (n=2)
         F n=Fn-1+Fn-2      (n>=3)    即 0,1,1,2,3,5,8,13,21,……
  分析:由公式F n=Fn-1+Fn-2,采用递推算法求解。
方法一
var a,b,i: longint;
  begin
a:=0; b:=1; write(a, ', ',b);
for i=2 to 10 do
begin a:=a+b; b:=a+b; write( ', 'a, ', ',b); end;
 end.
方法二
var a,b,c,i:integer;
  begin
a:=0; b:=1; write(a, ', ',b);
for i=3 to 20 do
begin c:=a+b; a:= b; b:=c; write(', ',c); end;
 end.
 
二、WHILE 当型循环语句
对于for循环有时也称为计数循环,当循环次数未知,只能根据某一条件来决定是否进行循环时,用while 语句或repeat语句实现循环更方便。
    格式:
       while 布尔表达式 do ;
         <循环体>
  while语句的执行过程为:
  1、判断布尔表达式的值,布尔表达式的值为true时,执行do后面的语句(步骤2),否则执行步骤4;
  2、执行循环体语句;
  3、返回步骤1;
  4、结束循环,执行while的下一个语句。
  说明: while语句的特点是先判断,后执行。 当布尔表达式成立时,重复执行do后面循环体的语句。

例4_3、斐波那契数列的第n项的值恰好大于10000,求n。
  var a,b,c,n: integer;

begin 
   a:=0; b:=1; n:=2;
   while c<=10000 do
    begin
c:=a+b; a:=b; b:=c; n:=n+1;  
    end;
   writlen('n=',n);           
end.
  
例4_4、求两个正整数m和n的最大公约数。
  分析:采用辗转相除法求解,分别用m、n、r表示被除数、除数、余数。
  1、求m/n的余数r;
  2、若r=0,则n为最大公约数,若r≠0,执行第3步;
  3、将n的值赋于m,将r的值赋于n;
  4、返回重新执行第1步。
  var m,n,r:integer;
  begin
    writeln('Input m,n:'); readln(m,n);
    r:=m mod n;
    while r<>0 do
    begin
     m:=n; n:=r; r:=m mod n
    end;
    writeln('The greatest common divide is: ',n);
  end.

二、REPEAT-UNTIL直到型循环语句
 

  repeat-until语句的含义是 “重复执行循环,直到指定的条件为真时为止”。
  直到循环语句的一般形式:
     Repeat
      语句1;
      :
      语句n;
   until 布尔表达式;
  repeat与until之间的所有语句称为循环体。
  说明:
  1、repeat语句的特点是:先执行循环,后判断结束条件,因而至少要执行一次循环体。
  2、repeat-until是一个整体,它是一个(构造型)语句,不要误认为repeat是一个语句, until是另一个语句。
  3、repeat循环体可以是若干个语句,不需用begin和end。

while循环和repeat循环是可以相互转化的。
 
例5_5、两个正整数的最大公约数,可用repeat-until循环实现:
本例输出语句中有m、n的原值,所以在程序中增加了两个中间变量a、b。
  var m,n,r,a,b : integer;
  begin     
   write('Input m,n='); readln(m,n);
a:=m; b:=n;
   repeat
    r:=a mod b; a:=b; b:=r;
   until r=0;
   writeln('The greatest common divide of ',m, 'and ',n, 'is ',a);
  end.
    

一般说来,用for 循环比较简明,只要能用for循环,就尽量作用for循环。只在无法使用for循环时才用while循环和repeat-until循环, for 循环在大多数场合也能用whiel和repeat-until循环来代替。一般for循环用于有确定次数的循环,而while和repeat-until循环用于未确定循环次数的循环。

 

  第七讲 循环嵌套
 
循环嵌套用于一个循环的循环体中又包含循环结构程序时。
 
例5_6、1!+2!+…+10!的值。
   分析:这个问题是求1到10自然数的阶乘之和。
  var s,t: longint;
    i,j:integer;
  begin
   s:=0;
   for i:=1 to 10 do
    begin
     t:=1;
     for j:=1 to i do t:=t*j;    { 求N!的值t }
      s:=s+t;                      { 累加N!的值t }
    end;
   writeln('s=',s);
  end.
  以上的程序是一个二重for循环嵌套。这是比较容易想到的方法,但实际上对于求n!,可以求出的(n-1)!再乘上n即可得到,而无需重新从1再累乘到n。程序可改为:
  var s,t:longint;
    i:integer;
  begin
   S:=0; t:=1;
   for i:=1 to 10 do
    begin t:=t*i; s:=s+t end;
   writeln('s=',s);
  end.
  显然程序二的效率要比程序一高得多。程序一要进行1+2+…+10=55次循环,而程序二进行10次循环。
 
例5_7、上街采购,用500元钱买了90只鸡, 其中母鸡一只15元,公鸡一只10元,小鸡一只5元,正好把钱买完。问母鸡、公鸡、小鸡各买多少只?
  var i,j,k:integer;
  begin
   for i:=1 to 33 do
    for j:=1 to 50 do
     begin
      k:=90-i-j;
      if 15*i+10*j+5*k=500 then writeln(i:5,j:5,k:5);
     end;
  end.
例5_8、求100-200之间的所有素数。
  分析:我们可对100-200之间的每一整数进行判断,判断它是否为素数,是则输出。而对于任意整数i,根据素数定义,我们从2开始到找到i的第一个约数。若找到第一个约数,则i必然不是素数。否则i为素数。
  var i,x : integer;
begin
   for i:=101 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:6)
 end;
    end; writeln
  end. 
将for循环改为while循环可以减少循环次数。
  
例5_9、输出下面的数字图形:     
1
            222
         33333
        4444444
         555555555
var row,column,n,d:integer;
begin
  writeln('n=' ); readln(n);
  d:=20;
  for row:=1 to n do
    begin
      write(' ':d-row);
      for column:=1 to 2*row-1 do write(row);
      writeln;
    end
end.
 
例5_10、三人对ABCD的比赛名次预测如下:
A B C D
        甲   1 3
        乙         1 4
        丙   3        2
比赛结果,三人都只说对了一个,问A、B、C、D的实际名次。
var a,b,c,d:shortint;
begin
    for a:=1 to 4 do
     for b:=1 to 4 do
if a<>b then
for c:=1 to 4 do
if (a<>c) and (b<>c) then
    begin
     d:=10-a-b-c;
if (ord(a=1)+ord(b=3)=1) and (ord(c=1)+ord(d=4)=1)
and (ord(a=3)+ord(d=2)=1)
then writeln('A=',a, 'B=',b, 'C=',c, 'D=',d)
  end;
end.
 
五、用GOTO语句实现循环
 
例5_11、两个正整数的最大公约数,可用GOTO实现循环
label a;
  var m,n,r : integer;
  begin     
   write('Input m,n='); readln(m,n);
write('The greatest common divide of ',m, 'and ',n, 'is ')
a:r:=m mod n; m:=n; n:=r;
   if r<>0 then goto a;
   writeln(m);
  end.
   
   GOTO语句是无条件转向语句,GOTO语句的使用可能会使程序出现乱线团式的结构,应限制使用。Pascal语言的发明者沃思说过:“如果一个程序员在Pascal程序中使用goto语句,往往说明他还没有学会用Pascal语言来思考 。”
 

整数类型 integer   -32768~32767
     短整型 shortint  -128~127
     长整型 longint   -2147483648~2147483647
     字节型 type       0~255
     字型    word       0~65535

实数型 real:包括正实数、负实数和实数零。实数的绝对值在1E-38到1E+38之间。
   形式有两种:
    ⑴ 十进制表示法
  人们日常使用的带小数点的表示方法。如0.0,-0.0,5.61,-8.0,等都是实数形式。
  ⑵ 科学记数法
  科学记数法是采用指数形式的表示方法,如1.25×105可表示成1.25E+05。在科学记数法中,字母“E”表示10这个“底数”,而E之前为一个十进制表示的小数,称为尾数,E之后必须为一个整数,称为"指数"。 如-1234.56E+26 , 0.268E-5 , 1E5是合法形式,而.34E12 , 2.E5 , E5 ,E,1.2E+0.5都不是合法形式的实数。

 和整数相比,实数能表示的范围大得多,但值得注意的是实数的运算整数的运算速度慢且无法像整数那样精确表示,只能近似表示。如2.03.0比23的运算慢。

字符型 char 括在两个单引号中的字符: ’a’表示字符;a表示标识符, ’3’ 表示字符;3表示整数值
  布尔型 boolean
   布尔型有两个值,真和假,分别用标准常量名true和false表示,序号分别为1和0。

二、常量
  在程序运行过程中,其值不能被改变的量称为常量。如12,14.8,'abc',true等。
  Pascal中有一个标准标识符Maxint,它代表所使用的计算机系统允许的最大整型数,而最小的整型数即为-Maxint-1。Turbo Pascal还定义了长整数常量MaxLongInt,其值为2147483647。

字符常量:是由字符组成,所有字符来自ASCII字符集,共有256个字符。在程序中,通常用一对单引号将单个字符括起来表示一个字符常量。如:'a','A','0'等。对于ASCII字符集中,按每个字符在字符集中的位置,将每个字符编号为0-255,编号称为对应字符的序号。

符号常量:一个常量即可以直接表示(称为直接常量, 如 124,156.8),也可以用一个标识符来代表一个常量,称为“符号常量”。但符号常量必须在程序中的说明部分先定义,后使用。

定义符号常量的一般格式:
           CONST    <常量标识符>=<常量>
 
    说明:常量说明部分以关键字const开头, 后面的标识符为常量标识符,其中"="号后的常量为整数、实数、字符、 字符串。例如:

const

pi=3.14159;

zero=0;

var r,s,c:real;

则在程序中pi和zero作为符号常量,分别代表实数3.14159和整数0。也就是说,常量说明部分既定义了常量名及其值,又隐含定义了常量的类型。

Pi(function函数)为 3.1415926535897932385

三、变量
  变量代表了一个存储单元,其中的值是可变的,故称为变量。即在程序运行过程中,其值可以改变的量,称为变量。
  变量有三个要素是:变量名、变量类型、变量值。
  一个程序中可能要使用到若干个变量,为了区别不同的变量,必须给每个变量(存贮单元)取一个名(称为变量名),该变量(存贮单元)存放的值称为变量的值,变量中能够存放值的类型为变量的类型。
  1、变量名
  用一个合法的标识符代表一个变量。如m,rot,total 等都是合法变量名。在程序中用到的变量必须在说明部分加以说明。
  “自定义标识符”的命名规则为:自定义标识符必须以字母(包含下划线"_")开头,后面的字符可以是字母或数字。标识符长度不超过63个字符。

变量名应遵循自定义标识符的命名规则,并注意“见名知义”的原则,即用一些有意义的单词作为变量名。
  2、变量的类型
  常量是有类型的数据,变量在某一固定时刻用来存放一个常量,因此也应有相应的类型。如整型变量用来存放整数,实型变量用来存放实数。
  3、变量说明
  在程序中若要使用变量,变量的名称及类型在程序的变量说明部分加以定义,变量的值则在程序的执行部分中才能赋给。
  变量说明的一般格式:
     VAR  <变量标识符> [,<变量标识符>]:<类型>;      (中括号内部分表示可省)
  其中VAR是pascal保留字,表示开始一个变量说明段, 每个变量标识符或由逗号隔开的多个变量标识, 必须在它的冒号后面说明成同一类型。一个程序中,可以说明许多不同类型的变量,每种类型变量之间用分号隔开,共用一个VAR符号。

例如:
var  age,day:integer;

average:real;
  其中,Integer(整型)、Real(实型)是标准标识符, 它们是“类型标识符”,代表了确定的类型,如age和 day 被定义为整型变量, average被定义为实型变量。
  一旦定义了变量,就确定了它的类型,也就是说,就确定了该变量的取值范围和对该变量所能进行的运算。

 

四、表达式

表达式的定义
  pascal语言中的算术表达式是由符合pascal语法规定的运算对象(包括常量、变量、函数)、算术运算符、圆括号组成的有意义的式子。如:A+3.14159*5/8.4-Abs(-13)

1、算术运算符
  常用的有以下6个算术运算符: + 、- 、* 、 / (实数除)得到结果为实型.如  5.0/2.0=2.5, 5/2= 2. 5,4/2=2.0而不等于2。
  div (整除)  div它要求除数和被除数均为整型,结果也为整型。如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。
2、关系运算符: >、<、>=、<=、=、<>
3、逻辑运算符: NOT、 AND 、OR
4、运算优先顺序
  如果一个表达式里出现两个或两个以上的运算符, 则必须规定它们的运算次序。

PASCAL语言规定运算优先级如下:
 ① 表达式中相同优先级的运算符,按从左到右顺序计算
 ② 表达式中不同优先级的运算符,从高到低进行计算
 ③ 括号优先级最高,从内到外逐层依次降低
 ④ not优先级为4
 ⑤ *、/、div、mod、and优先级为3
  ⑥ +、-、or优先级为2
 ⑦ =、<>、<、>=、<=、in优先级为1

五、标准函数

学习标准函数要注意:

每个标准函数对自变量的数据类型都有一定的要求,函数经过运算后得到的函数值的类型也是一定的。函数值的类型关系到该函数能够参加的运算。函数也可做自变量。

1、算术运算函数函数

绝对值函数abs(x) abs(-10)=10

平方值函数 sqr(x)   sqr(4)=16

平方根值函数sqrt(x)  sqrt(4)=2

2、逻辑判断函数

奇数函数 odd(x)   integer Boolean   odd(-11)=true,odd(10)=false

3、转换函数

截尾函数  trunc(x)  real integer   trunc(3.7)=3, trunc(-7.9)=-7

舍入函数  round(x)  real integer   round(12.7)=13, round(12.4)=12

round(-5.7)=-6

序数函数 ord(x)   函数值为字符在ASCII中的序号 ord(‘a’)=97,

ord(‘0’)=48,  ord(true)=1

字符函数 chr(x) x表示ASCII中的序号 函数值为该序号代表的字符值。

chr(48)=’0’ ,  chr(32)=’ ’

4、顺序函数

前驱函数 pred(x)  pred(5)=4, pred(‘b’)=’a’, pred(true)=false

后继函数 succ(x)  succ(5)=6, succ(‘A’)=’B’

第三讲 赋值语句
 

一、赋值语句
  变量既然代表一个存储单元,其值是可变的,那么怎么赋值的,又是怎么改变的呢?可以通过赋值语句来进行。
1、 赋值语句的格式
    变量名:=表达式;              其中“:=”称为赋值号。
 
2、 执行过程
计算机先计算赋值号右边表达式的值,然后将表达式的值赋给变量。如:A:=9*8-2; A:=A+1

注意:1、赋值号与比较关系符是不同的两个符号,

2、赋值号两边的数据类型必须相容

3、变量在程序中如没有赋值,数值变量的值为0。

例1:下列赋值语句那些是错的?错在哪里?(var : x,y,z,a: integer; )

① x:=x+y       ② x=y+z     ③ x+y:=z

例2:写出下列程序的运行结果

var a,b,c:integer;

begin

a:=5; b:=8;

c:=a; a:=b; b:=c;

writeln('a=’,a,’  ',’b=’,b)

end.

思考题:如果不引入第三个中间变量,能否交换两个变量的值?编程序试一试。

学习两个过程:

① inc(x,n)  等价于 x:=x+n      ② dec(x,n)  等价于 x:=x-n

inc(x)   等价于 x:=x+1         dec(x)    等价于 x:=x-1

 

第四讲 输出语句

输出语句

   输出语句的作用是先计算表达式的值,并按指定的格式输出到屏幕。
 
1、输出语句的两种格式
 ① write语句
    格式: Write(表达式1,表达式2,……);
       如:write(1,2,3,4);    write('My name is Liping');
 ② writeln语句
    格式: Writeln (表达式1,表达式2,……) 或 writeln  
2、输出语句的功能
  计算机执行到某一输出语句时,先计算出输出语句中的每个表达式的值,并将每一个表达式的值一个接一个地输出到屏幕上。
  Write语句与writeln语句功能基本相同,但有两点不同:
① write语句将其后括号中的表达式一个接一个输出后,没有换行。而writeln语句则在输出各个表达式的值后换行。
② write语句至少必须输出一项内容,而writeln语句允许不输出任何内容,只是换行。
write(x,y);    等价于 write(x); write(y);
writeln(x,y); 不等价于writeln(x); writeln(y);
等价于write(x); writeln(y);

例1、以下两个程序段的输出分别为:
   ① write(1,2,3,4);write(5,6);     ② writeln(1,2,3,4);write(5,6);
      输出为:                          输出为:
      123456                            1234
                                        56
 
例2:有三个小朋友甲乙丙。甲有50粒糖果,乙有43粒糖果,两有13粒糖果。现在他们做一个游戏。从甲开始,将自己的糖分三份,自己留一份,其余两份分别给乙与丙,多余的糖果自己吃掉,然后乙与丙也依次这样做。问最后甲、乙、丙三人各有多少粒糖果?
    分析:在游戏中每个小朋友拥有的的糖果数是在变化的,用a,b,c三个变量分别存放甲乙丙在某一时刻所拥有的糖果数。对于每人,分糖后,他的糖果数一定为原来的糖果数 div 3(用整除恰可以表示多余的糖自己吃掉)。而其他两人则增加与这个小朋友现在拥有的糖果数。

程序如下:
var A,B,C:integer;
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.

  
3、输出格式:数据的输出格式很重要,输出的数据所占的列数为场宽。
Ø       输出项中无指定格式符号,则按标准场宽输出,integer实际长度,real 17列,char串长。
Ø       单场宽(输出整数时自定义) 格式:e:n1   n1是正整数,表示e输出时所占的列数。
Ø       双场宽(输出实数时自定义) 格式:e:n1:n2   n1,n2是正整数,且n1>n2, n1输出总列数含符号位、整数部分、小数点、小数部分,n2小数部分的列数。
Ø       数据不突破场宽限制时,单场宽一律向右看齐,双场宽实数向小数点看齐,多余的小数位补0。  
Ø       数据实际位数超过场宽时,以保证数据的正确输出为原则。单场宽时自动将n1扩展到所需位数,双场宽时自动将n1扩展到所需位数,n2小于实际的小数位数时,则舍去多余的位数,内存中仍保留该数的精确值。  
 
例3、写出下列程序的运行结果:
const s='abcd';
var i:integer; r:real; c:char; b:Boolean;
begin
   i:=1234; r:=123.456; c:= '*’; b:=true;
   writeln(i,i:5,i:3);
   writeln(r,r:8:4,i:8:2);  
   writeln(c,c:4);
   writeln(s,s:8,s:3);
   writeln(b,b:5,b:3)
end.
运行结果
1234 12341234
1.2345600000E+02123.4560 123.46
*   *
abcd    abcdabcd
TRUE TRUETRUE    

pascal(收藏)相关推荐

  1. 收藏|最优论文+代码查找神器,覆盖AI全领域(966个ML任务、8500+论文)

    来源:机器之心 本文约3500字,建议阅读5分钟. 本文介绍了查找论文及对应源码神器的最新版本,从应用领域到具体任务再到实现一步到位. 查找论文及对应源码的神器 Papers With Code 刚刚 ...

  2. 2020 年最具潜力 44 个顶级开源项目,涵盖 11 类 AI 学习框架、平台(值得收藏)

    导语:​Github 开源项目技术图 雷锋网 AI 开发者按:工欲善其事必先利其器,这也是大部分开发者在日常工作中最重要开发原则.选择与开发内容相匹配的工具,常常会使我们事半功倍.但面对人工智能的多个 ...

  3. Dataset:数据集集合(综合性)——机器学习、深度学习算法中常用数据集大集合(建议收藏,持续更新)

    Dataset:数据集集合(综合性)--机器学习.深度学习算法中常用数据集大集合(建议收藏,持续更新) 目录 常规数据集 各大方向分类数据集汇总 具体数据集分类 相关文章 DL:关于深度学习常用数据集 ...

  4. C++函数调用方式(_stdcall, _pascal, _cdecl...)总结 收藏

    C++函数调用方式(_stdcall, _pascal, _cdecl...)总结 收藏 __stdcall: _stdcall 调用约定相当于16位动态库中经常使用的PASCAL调用约定.在32位的 ...

  5. DELPHI参数几个概念上的区别 收藏

    DELPHI参数几个概念上的区别 收藏  引用参数: 引用参数用var关键字标示 procedure DoubleTheValue (var Value: Integer); begin   Valu ...

  6. DELPHI 指针使用用的一篇好文 收藏

    DELPHI 指针使用用的一篇好文 收藏     Delphi里自己管理内存的两对函数 new(),dispose()和getmem(),freemem() 大家都认为,C语言之所以强大,以及其自由性 ...

  7. 收藏 | 聊聊 GPU 的计算能力上限

    点上方计算机视觉联盟获取更多干货 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:来自 | 知乎   作者丨卜居 链接丨https://zhuanlan.zhihu.com/p/2313027 ...

  8. 收藏 | 从头训练深度监督目标检测

    点上方计算机视觉联盟获取更多干货 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:作者:Sik-Ho Tsang 编译:ronghuaiyang    |     AI公园 AI博士笔记系列推 ...

  9. 收藏 | 使用合成数据集做目标检测

    点上方计算机视觉联盟获取更多干货 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:作者:Sergey Nikolenko 编译:ronghuaiyang    |    AI公园 AI博士笔记 ...

最新文章

  1. 微型计算机怎么插耳机,让听音更轻松一些,朗琴E10真无线耳机
  2. 关于div的滚动条滚动到底部,内容显示不全的问题。(已解决)
  3. 1996黄金一代NBA选秀
  4. 复数矩阵分解的拆解思路(矩阵求逆/特征值分解)
  5. 您需要了解的WordPress漏洞以及如何修复它们
  6. C++::增加目标码(object code)的大小的操作
  7. @query传参_前端框架vue中query和params传参
  8. AAAI2021-基于对比学习的三元组生成式抽取方法
  9. 北航计算机学硕还是专硕,经验教训-2018二战考研北航计算机
  10. 2021年6月23日,我们毕业啦!!!
  11. centOs安装 ruby环境
  12. Three.js图像波动特效
  13. raspberry pi pico|在raspberry pi pico上玩nes游戏(1)(开源树莓派pico NES模拟器)-效果演示及介绍
  14. Stacked Hourglass学习笔记
  15. 黑帽SEO网站优化常用的14种技巧
  16. 剑指Offer-46:把数字翻译成字符串
  17. 分享我见到的培训面试和就业的情况(同时给出建议)
  18. Unity2020版本使用Kinect的修复(附粒子人像互动demo)
  19. grid - gap
  20. 智商黑洞(门萨Mensa测试)5

热门文章

  1. Android-MPAndroidChart:RadarChart(雷达蜘蛛图)绘制圆点
  2. Problem F: 一天中的第几秒
  3. 3MX格式转OSGB格式
  4. 下载 WIN10 系统镜像
  5. 京东云高可用业务架构建设 | 京东云技术团队
  6. 仿wordpress管理后台设计的后台管理框架
  7. 互联网兴起背后 众多医疗网红离开医院照样门庭若市
  8. QQ音乐 for Mac(腾讯音乐客户端)
  9. 【数据库取证篇】阿里云RDS MySQL数据库在线取证教程
  10. 无人机遥感测绘服务:主要应用于航空摄影测量、国土测绘等