您现在的位置:小学生自学网>> 信息>> pascal语言>> 基础教程

带格式的输出语句及输入语句

作者: 来源: 发布时间:2009年05月12日 点击数:
 

一、写语句的输出格式

  在pascal语言中输出数据时是可以按照一定格式的,对整数隐含的输出形式为按十进制数形式。对实数的输出,隐含的形式是科学记数法形式(如果不想用科学记数法输出而用小数形式输出,要自己另行定义)。

  事实上,输出语句中的每个输出项中的表达式之后可以加上格式说明,若输出项后没有加格式说明, 则数据按系统隐含的格式输出,还可加上一定格式符号按特定格式输出。

⒈隐含的输出格式

  pascal语言为整型量、实型量、布尔型量和字符串( 用一对单引号括起来的字符序列)规定了每种数据所占的宽度(即一个数据占几列) ,一个数据所占的宽度称为"场宽"或"字段宽"。系统给出的隐含场宽称为标准场宽。每一种pascal版本给定的标准场宽不尽相同。下表给出标准pascal和pc机上两种pascal版所规定的标准场宽。
       标准场宽
  ━━━━━━━━━━━━━━━━━
  数据类型  标准pascal Turbo pascal
  ─────────────────
  integer 10 实际长度
  real 22 17
  布尔型 10 4或5
  字符串 串长 串长
  ━━━━━━━━━━━━━━━━━
在Turbo Pascal系统中,对于整型字符串的输出都是按数据本身长度输出,对于布尔型数据(只有True和False两种值),TRUE为4列,FALSE为5列,一律采用大写输出。而real型数据的输出时,则按17列输出,其中第一列为符号位,正号不显示,后四位为"E±nn", 中间的12列为尾数部分。如:

writeln(sqrt(75));
则输出□8.6602540379E+00。
而writeln(sqrt(81));
则输出□9.0000000000E+00。
有时,在程序中往往根据实际情况,需要自己定义场宽。

⒉指定场宽

  在写语句中输出项含有格式符号时,就是为了指定场宽。

⑴指定单场宽.

  格式:write(表达式:N)或writeln(表达式:N),其中N为自然数,指定单场宽后,所有数据不再按标准场宽输出,而按指定场宽输出。若数据实际长度小于指定场宽时,则一律"向右靠齐,左留空格"。

  如write(1234:8);write('abcdef':12)
输出结果:
□□□□1234□□□□□□abcdef

  对于标准实型数据指定单场宽时,如果场宽大于标准场宽时,右靠齐按标准场宽格式输出17位,左留空格。若场宽小于标准场宽时,第一位仍为符号位,最后四位仍为"E±nn",中间部分为尾数显示部分。如果指定的宽度小于8位,则数据按8位格式"*.*E±nn "输出。

⑵指定双场宽

  如果输出项是实数时,如果希望输出的实数不用科学记数法输出,而用小数形式输出,可以用指定双场宽方法输出。
  双场宽输出格式为:write(实型表达式:m:n),其中m和n都是自然数,m 用以指定整个数据所占的宽度,n指定输出实数的小数位数。

如 : write(sqrt(75):9:4);
输出:□□□8.6602

  如果双场宽不能满足输出数据的最低要求, 系统自动突破指定的场宽限制,按实际长度输出。
 
如:write(sqrt(75):5:4); 要使小数点后有4位数字,而总场宽为5,是不可能的(因为还有一个小数点, 小数点前面还有一个数字)。它最低限度要有6列,即输出为:
8.6602

例1
   写出下列程序在turbo pascal下的输出结果.

program ex;
 const s='abcdefg';
var
 i:integer;
 r:real;
 c:char;b:boolean;
begin
 i:=1234;r:=1234.5678;
 c:='#';b:=true;
 writeln(i,i:6,i:3);
 writeln(r,r:12:5,r:8:5);
 writeln(c,c:5);
 writeln(s,s:10,s:5);
 writeln(b,b:5,b:3);
end.

运行结果如下:

1234□□12341234
□1.2345678000E+03□□1234.567801234.56780
#□□□□#
abcdefg□□□abcdefgabcdefg
TRUE□TRUETRUE

3.应用例析

例2:
   已知A=253,B=43,输出A*B的运算式子。即输出如下:

253*43=10879
253
* 43
759
+1012
10879

分析:
  
对于该问题,我们只要控制好输出时右靠齐即可。即前四行的总宽度一样(例如为12),第五行总宽度比前面少1。第六、七行总宽度与前四行一样。
参与程序如下:

var a,b:integer;
begin
 a:=253;b:=43;
 writeln(a:10,'*',b,'=',a*b);
 writeln(a:12);
 write('*':8);writeln(b:4);
 writeln('--------':12);
 writeln(a*3:12);
 write('+':6);writeln(a*4:5);
 writeln('--------':12);
 writeln(a*b:12);
end.

二、 输入语句(读语句)

  在程序中变量获得一个确定的值,固然可以用赋值语句,但是如果需要赋值的变量较多,或变量的值经常变化,则使用本节介绍的输入语句──读语句,将更为方便。读语句是在程序运行时由用户给变量提供数据的一种很灵活的输入动作,它有两种格式:

1.读语句的一般格式:

  read(<变量名表>);
readln[(<变量名表>)];

  其中变量名表是用逗号隔开的若干个变量名组成的。
功能:从标准输入文件(即INPUT,一般对应着键盘 )中读入数据,并依次赋给相应的变量。
  说明:
  read和readln是标准过程名,它们是标准标识符。
  执行到read或readln语句时,系统处于等待状态,等待用户从键盘上输入数据,系统根据变量的数据类型的语法要求判断输入的字符是否合法。如执行read(a)语句,a是整型变量,则输入的字符为数字字符时是合法的,当输入结束时,则自动将刚接受的一串数字字符转换为整数赋给变量a。
  在输入数值型(整型或实型)数据时,数据间要用空格或回车分隔开各个数据,输入足够个数的数据,否则仍要继续等待输入,但最后一定要有回车,表示该输入行结束,直到数据足够,该读语句执行结束,程序继续运行。

例3.
   设a、b、c为整型变量,需将它们的值分别赋以10,20,30,写出对应下列语句的所有可能输入格式。
Read(a,b,c);


   根据③,即可列出所有可能输入格式
  (a)10□20□30←┘
  (b)10□20←┘
    30←┘
  (c)10←┘
    20□30←┘
  (d)10←┘
    20←┘
    30←┘
  其中"←┘"表示回车键。下同。

  read语句与readln语句的第一个区别是:
  read语句是一个接一个地读数据,在执行完本Read语句( 读完本语句中变量所需的数据)后,下一个读语句接着从该数据输入行中继续读数据,也就是说,不换行。如:

  Read(a,b);
  Read(c,d);
  Read(e);

如果输入数据行如下:

1□2□3□4□5□6□←┘

则a,b,c,d,e的值分别为1,2,3,4,5,如果后面无读语句则数据6是多余的,这是允许的。
  Readln则不同,在读完本Readln语句中变量所需的数据后, 该数据行中剩余的数据多余无用,或者说,在读完本Readln语句中变量所需数据后,一定要读到一个回车,否则多余的数据无用。

例4
   设要达到例1同样的目的,但语句改为:
readln(a,b);readln(c)
则例3中的4种输入格式只有(b)(d)是有效的.

  ⑤readln语句与read语句的第二个区别是:read 后一定要有参数表,而readln可以不带参数表,即可以没有任何输入项, 只是等待读入一个换行符(回车)。经常用于暂停程序的运行,直到输入一个回车。
  
例5
   设有下列语句:
read(a,b,c);
readln(d,e);
readln;
readln(f,g);

  其中,所有变量均为整型。再设输入的数据如下:
  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
──────────────────────────
  为了避免可能出现的错误,建议在程序中按下列原则使用读语句:(A)如果没有特殊需要,在一个程序中尽量避免混合使用read语句和readln语句;(B)尽量用readln语句来输入数据, 一个数据行对应一个readln语句;(C)由于执行read或readln语句时, 系统不会提供任何提示信息,因此,编程时最好在readln语句之前加以适当提示,例如:

write('Input a,b,c:');
readln(a,b,c);
在执行时,屏幕上显示:
Input a,b,c:■
其中,"■"为光标。执行readln语句后,系统处于待待输入状态, 只有输入了所需数据后才继续往下执行。

三、顺序结构程序设计

  到目前为止,我们可以用读、写语句和赋值语句编写一些简单的程序。通过阅读这些程序,可以逐步熟悉pascal程序的编写方法和应遵循的规则,为以后各章的学习打基础。
  
例6
   试编一程序,输入一梯形的上底、下底、高, 求该梯形的面积。
分析:
   整个程序分为三段:输入、计算、输出。程序中用a,b,h三个变量分别存放梯形的上、下底与高,S存放面积。 要而使用这些变量都要先说明,程序的执行部分中先输入上、下底与高,接着求面积S,最后输出结果S。

  源程序如下:
 program Tixing; {程序首部}
 var a,b,h,s:real; {程序说明部分}
begin
 write('Input a,b,h:');
 readln(a,b,h); {程序执行部分}
 s:=(a+b)*h/2;
 write('s=',s:10:3);
end.

例7
   某幼儿园里,有5个小朋友编号为1,2,3,4,5,他们按自己的编号顺序围坐在一张圆桌旁。他们身上都有若干个糖果,现在他们做一个分糖果游戏。从1号小朋友开始,将他的糖果均分三份(如果有多余的,则他将多余的糖果吃掉),自己留一份,其余两份分给他的相邻的两个小朋友。接着2号、3号、4号、5号小朋友也这如果做。问一轮后,每个小朋友手上分别有多少糖果。

分析: 
  
这道问题与第二课中的例2基本一样,只不过这里有5位小朋友,且他们初始时糖果的数目不确定。这里用a,b,c,d,e分别存放5个小朋友的糖果。初始时它们的值改为由键盘输入。其它都与第二课中的例2类似。
参考程序如下:

program fentang;
var a,b,c,d,e:integer;
begin
 write('Please Enter init numbers ');readln(a,b,c,d,e);
 a:=a div 3;b:=b+a;e:=e+a;{1号均分后,1、2、5号的糖果数变化情况}
 b:=b div 3;c:=c+b;a:=a+b;{2号均分后,1、2、3号的糖果数变化情况}
 c:=c div 3;b:=b+c;d:=d+c;{3号均分后,2、3、4号的糖果数变化情况}
 d:=d div 3;c:=c+d;e:=e+d;{4号均分后,3、4、5号的糖果数变化情况}
 e:=e div 3;d:=d+e;a:=a+e;{5号均分后,4、5、1号的糖果数变化情况}
{输出结果}
 writeln('a=',a);
 writeln('b=',b);
 writeln('c=',c);
 writeln('d=',d);
 writeln('e=',e);
 readln;{暂停}
end.

例8
   编一程序求半径为R的圆的周长与面积?
分析:
   程序要先输入半径R,然后求周长c和面积s,最后输出c和s.
源程序如下:

program circle;
 const PI=3.14159;
 var r,c,s:real;
begin
 write('Enter R=');readln(r);
 c:=2*pi*r;
 s:=pi*sqr(r);
 writeln('c=',c:10:2);
 writeln('s=',s:10:2);
end.
  在程序中,为了输出实型周长C和面积S时,按照小数形式输出,采用了指定双场宽格式。

练习

1. 编一程序,将摄氏温度换为华氏温度。公式为:

其中f为华氏温度,c是摄氏温度。

2. 编一程序,输入三角形的三边a、b、c(假设这三边可以构成一个三角形),求三角形的面积S?
(提示:可利用海伦公式