第12课 函数和过程

  • 格式:doc
  • 大小:38.50 KB
  • 文档页数:3

第十二课函数和过程12.1 过程1.过程的定义procedure 过程名(形式参数:参数说明);{也可以不带参数}varbegin...end;2.过程的调用过程名(实在参数表);例1:求n个自然数的最大公约数;program gcd1;const maxn=100;var n,i,gcd:integer;a:array[1..maxn] of integer; procedure enter;beginwrite('n=(<100)');readln(n);for i:=1 to n dorepeatwrite('a[',i,']=');readln(a[i]);until a[i]>0;end;procedure find_gcd(x,y:integer);{定义过程} var r:integer;beginr:=x mod y;while r<>0 dobegin x:=y;y:=r;r:=x mod y; end gcd:=y;end;procedure print;beginwriteln('GCD=' ,gcd);end;beginenter;gcd:=a[1];for i:=2 to n dofind_gcd(gcd,a[i]);print;end.12.2 函数1.函数的定义function 函数名(形参表):函数类型; { ————函数首部}var {————局部变量说明部分}begin {————函数体}... {————函数语句}...函数名:=表达式end;2.函数的调用:函数在语法上相当于一个表达式,所以,调用时,函数不能独立成为一个语句;它可以出现在任何表达式可以出现的地方。

例如赋值语句的右边:X:=函数名(实在参数表); {————X的类型与函数类型必须一致}又,如果函数类型是boolean,则还可以出现在条件语句中,充当条件表达式:if 函数名(实在参数表) then ……例3:编一程序,求从10名同学中选出3名代表,有几种不同的选法。

(公式:C(m,n)=m!/n!*(m-n)!从m中选n)program zohe1;var m,n:integer;c:longint;function factor(x:integer):longint;{定义} var i:integer;p:longint;beginp:=1;for i:=1 to x do p:=p*i;factor:=p;{这个语句必须}end;beginwrite('m,n=');readln(m,n);c:=factor(m) div (factor(n)*factor(m-n));{调用}writeln('c(',m,',',n,')=',c);end.12.3全局变量和局部变量在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。

全局变量作用域是整个程序;局部变量作用域是定义该变量的子程序。

当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。

例4:全局变量和局部变量。

program local_global;var i,k:integer; procedure sub1;var i,j:integer;begini:=17;writeln('i in sub=',i);writeln('k in sub=',k);end;begini:=2;k:=9;writeln('i in main=',i);writeln('k in sub=',k);sub1;writeln('i in main=',i);writeln('j in main=',j);readln;end.上述程序运行时将出现Unknown Identfier;因为变量j在主程序中没定义。

当删除本语句时。

运行结果如下:i in main=2k in main=9i in sub=17k in sub=9i in main=212. 4 值参和变量参数值形参——传值:调用时可用表达式代替形参,不该变实在参数的值。

变量形参——传地址:调用时必须用变量代替行参变量,改变实在参数的值。

例4:请看下列程序的运行结果。

program li3_10;var a,b,c:integer;procedure sub(x,y:integer;var z:integer);beginx:=x+1;y:=y+1;z:=x+y;writeln('sub:x=',x:2,'y=',y:2,'z=',z:2);end;begina:=1;b:=4;c:=9;writeln('main:a=',a:2,'b=',b:2,'c=',c);sub(a,b,c);writeln('main:a=',a:2,'b=',b:2,'c=',c);sub(c+5,b*b,a);writeln('main:a=',a:2,'b=',b:2,'c=',c);readln;end.main:a=1 b=4 c=9sub:x=2 y=5 z=7main:a=1 b=4 c=7sub:x=13 y=17 z=30main:a=30 b=4 c=7练习与作业1、试编写一个将阿拉伯数字转换为中文大写数字的函数。

(如中文状态不方便,可以替换为ABCDEFGHIJ)2、输入一个长字符串和一个短字符串以及一个合适的整数,通过程序从指定位置用指定短字符串替换长字符串中的内容(要求编写过程来实现),最后输出新字符串。

第13课 子界与枚举类型Pascal 有丰富的数据类型,在程序设计中有特殊而方便的应用。

类型定义的语法格式: type<标识符1>=<类型1>; <标识符2>=<类型2>; ……<标识符n>=<类型n>; 13.1子界与枚举 1.子界类型:当某些变量的取值范围很具体时,可用子界类型,它更符合实际、便于查错和节省内存。

定义如下: type riqi=1..31; zimu='A'..'Z';var day:riqi;ch1:zimu; 13.2 枚举类型:通过预定义列出所有值的标识符来定义一个有序集合,这些值的次序和枚举类型说明中的标识符的次序是一致的。

枚举类型的形式:(标识符1,……,标识符n) 例如:type daystype=(sunday,monday,tuesday,wednesday,thursday,friday,saturday) 枚举元素只能是标识符,而不能是数值常量或字符常量。

例如以下的定义是错误的:< type daystype=('sun','mon','tue','wed','thu','fri','sat')枚举元素是标识符,不要把作为枚举元素的标识符视作变量名,它不能被赋值。

同一个枚举元素不能出现在两个或两个以上的枚举类型定义中。

例如以下的定义是错误的: type daytype1=(monday,tuesday); daytype2=(monday,wednesday);可以将枚举类型的定义和变量的定义结合在一起。

例如:var a:(monday,tuesday,sunday)枚举类型属于顺序类型。

根据定义类型时各枚举元素的排列顺序确定它们的序列,序列号从0开始。

例如:已经定义daystypeord(sunday)=0,succ(sunday)=monday,pred(friday)=thursday但是枚举类型中的第一个元素没有前趋,最后一个元素没有后继。

Turbo Pascal 不允许直接读写枚举值,所以枚举值的输出常用case 语句间接的输出。

枚举值的输入,则要一一判断读入字符是否是枚举类型的标识符。

若是才能赋给枚举变量,否则就会出错。

例如:枚举值的输出 case day ofsunday:write('sunday'); monday:write('monday'); tuesday:write('tuesday'); wednesday:write('wednesday'); thursday:write('thursday'); friday:write('friday'); saturday:write('saturday'); end;。