(三)字符型常数 一个字符型常数是括在两个单引号之间的PASCAL字符集中的一个字符。如‘a’表示字母a, ‘ ’表示空格字符,‘7’表示数字7,等等。不同的实现方案对PASCAL字符集有不同的定义,但一般都包括:26个大小写的英文字母,10个数字及一些标点符号、运算符号等专用符号。 除了字符型常数外,在程序中还可使用字符串常数。字符串常数是括在引号中的一串PASCAL字符。如: ‘His name is Li Min’ 字符串常数可由字符型数组来表示,用法见第六章。
本节将讨论如何将数据从标准输入文件input输入到变量中,以及如何将变量中的数据输出到标准输出文件output中去。关于变量与一般的PASCAL文件之间数据的输入输出问题将在第八章讨论文件中叙述。 在1.3节中,我们曾介绍过在PASCAL程序的首部有参数input和output,即这里input和output是两个预定义的标准文件,表明该程序的输入数据是从标准文件(一般指终端键盘或卡片上)读入,计算结果将输出到标准文件output(一般指显示终端或打印机)上。 有两种形式输入语句: read (<输入元表>) readln (<输入元表>) 其中输入元表是一串由逗号隔开的变量标识符。 Read语句执行时将从read中依次读入一串数据到相应的变量中去。如; Read(x,y,z); 表示从终端键盘或卡片读入三个数,并把它们依次存放到变量x,y,z中去。 Readln语句的作用与read语句不同之处是:在读input文件时,将当前行中的一串数读到相应的变量中去,然后自动跳过行结束符,以后再执行输入语句时,将从下一行的第一个数据开始读入。如在input文件中有如下两行数据: 第一行:15, -0.83 ,36 第二行: a 则执行语句 readln (x,y); read (ch) 将15读入x,-0.83读入y,然后跳到下一行,将字符型常数’a’,读入字符型变量ch。此时,第一行中数据36被跳过了。 又如,程序中有下列输入语句 readln(x,y,z); readln(m,n,p); read(r,s); 若输入数据是这样安排的: 第一行:234 746 932 836 第二行:65 76 第三行:801 402 第四行:142 329 则在执行了上述输入语句后,数据的分配如下: x 234 y 746 z 932 m 65 n 76 p 801 r 142 s 329 可见,执行第一个readin(x,y,x)语句后,第一行的前三个数据分别赋给x,y,z三个变量。执行第二输入语句时,是从第二行开始读入数据的。但因第二行只有两个数据,所以,第三行的801赋给变量p。在执行第三个输入语句时,则从第四行读入两个数据。其中,第一行的836和第三行的402都被跳过了。 相应于输入语句,PASCAL中也有两种不同形式的输出语句 write<输出元表> wirteln<输出元表> 其中,输入元表是一串由逗号分隔的表达式。数值常数、字符串常数、有确定值的变量、算术及布尔表达式等都可作为输出元。 Write语句的功能是将各输出元依次输出到标准文件output中(显示终端或打印机上)。Writeln语句的作用除将各输出元输出外,还在最后一个输出元之后自动送一个行结束符到output文件上(即自动换行),以后再遇到输出语句时,将输出到下一行去。 读者和用户所关心的问题是如何控制输出打印的格式,以便得到一张清晰的符合要求的输出报告。PASCAL语言中有两种格式控制,一种是系统规定好的标准格式,各个编译系统在地规定好了各种不同类型的输出元所占据的输出位置。例如,某编译系统规定整型值占据的打印宽度(也称域宽)为10;实型值占据的打印宽度为14。若有I,j为整型变量;a,b为实型变量。且I=173, j=-3,a=-0.7169,b=1538.93,则语句 write(b); write(i) 的输出形式为(其中’└┘’代表一个空格) └┘└┘0.153893E+04 └┘└┘└┘└┘└┘└┘└┘173
14个 格位 10个格位 应当指出,不同的编译对标准域宽有不同的规定,读者应查阅有关手册。对于字符型输出元以及字符串常数,则都按标准PASCAL的规定:每个字符占据一个输出位置,字符,串常数,包括在单撇号内的字符全部按原样打印输出。例如,变量ch为字符型,且ch=’p’,则语句 write(‘└┘The character is └┘’ch) 输出如下内容: The charater is p 另一种是带域宽控制的输出语句,其形式为: write(e:m) 其中,e为输出元,冒号后面的m是整型表达式,表示输出元e所占据的输出域宽。例如,上述例中的各输出元若用下列语句 write(b:16); write(I:8,ch:4) 由输出结果为 └┘└┘└┘└┘0.153893 E+04 └┘└┘└┘└┘└┘178└┘└┘└┘?
16个格位 8个格位 4个格们 又如,语句 write(‘The results are as follows:’); writeln; writeln(‘I=’,I:1,’:5,’j=’,j:1); writeln(‘I+j=’,I+j) 输出如下3行结果: The results are as follows; I:=173└┘└┘└┘└┘└┘j=-3 I+j=└┘└┘└┘└┘└┘└┘└┘170 对于实型输出元,上述例中皆以指数形式输出。若希望用带小数点的十进制形式 ,并控制小数点后的数位,可用下述形式的输出语句 write(eral:m:n) 其中 ereal为实型输出元,m为该输出元占据的总域宽,n为小数点后面数的位数。例如,实型量a=-0.7169,则语句 write(a:12:5) 输出结果为└┘└┘└┘└┘-0.71690 由这些例子可知: (1)输出数据是根据域宽向右靠齐的。 (2)输出整数时,若域宽小于该整数所需的位数时,则域宽自动改为所需的格位数。 (3)若需输出一个空行,可用不带输出元表的writeln语句。 (4)若需输出n个空格,可用输出元‘ ’:n. 最后给出几个完整的PASCAL 程序例子作为本章的结束。 例2-1根据输入的半径计算圆的周长和面积 PROGRAM circle(input,output); CONST Pi=3.141593; Width=10; Prec=4; VAR R,area,circuit:real; BEGIN Write(‘Please enter the radius:’); Readln(r); Circuit:=2*pi*r; Area:=pi*sqr(r); Writeln(‘circuit=’,circuit:width:prec); Writeln(‘area=’,area:width:prec); END 由于程序运行时操作员无法知道程序何时输入数据,故一般在输入语句前放一个输出语句,输出一些操作员打入数据的信息。如本程序中的第一个输出语句(为节省篇幅,在本书以后的程序例中,一般不插入这类输出)。当操作员在终端显示上见到提示信息 Please enter the radius:时,即可在键盘上打入半径的数据,后接一个行结束符(一般是回车键,表示该输入行已结束),后面的输入语句将些数据送入变量r。接着程序将计算周长和面积,并在显示屏幕上输出二行结果: circuit=└┘└┘XXX.XXXX area=└┘XXXX.XXXX 若程序员要改变输出域宽及小数点后的位数时,只需修改常数说明中width和prec的定义。 例2-2 编一个程序能查询任一PASCAL字符所对应的十进制序号 PROGRAM inquiring(input,output); VAR Ch:char; BEGIN Write(‘What is the character you want to inquire?’) Readln(ch); Writeln(‘The number of ‘,ch,’is’,ord(ch)); END. 运行此程序时,操作员只要在提示信息的问号后面打入所需查询的字符和一个回车键,程序将结果输出到终端显示上。如: The number of a is 97 例2-3 将形式为0.XXXXXXX的输入数据分隔成3个整数:小数点后的第1、2、3位组成一个整数送变量I;第4、5、6位组成一个整数送变量j;最后一位送变量K。输出这三个整数。 PROGRAM separate(input,output); CONST Ten=10; VAR I,j,k:integer; Number,temp:real; BEAIN Read(number); Temp:=sqr(ten)*ten, Number:=number*temp; I:=trunc(number); Number:=(number-I)*temp: J:=trunc(number); K:=round((number-j)*ten+0.1); Write(‘I=’,I:3,’ ’:5,’j=’,j:3,’ ’:5,’k=’,k:1); END. 由于实型量在计算机中不能被精确地表示,因此变量number中最后一位数字存在误差,如实数0.2145783输入后可能被表示成0.214578299… 或0.21457831。故程序中最后一个赋值语句是为了保证K值的正确性而这样处理的。此时,对于输入数据0.2145783将输出如下结果: I:=214 j=578 k=3