Pascal程序设计(二级)——基础篇05格式化输入输出

2016-11-12 07:56:41来源:CSDN作者:baidu_32651739人点击

大家好,我们接着Pascal2010语言特性的研讨,对于一门语言,进行详细的研究是必要的,因为各种语言的特点或者说特性都是各有千秋的,详细的了解语言特性是对我们编程有很大帮助的,俗话说得好,“磨刀不误砍柴工”就是这个理,就像我们学习英语类似,我们从小学到大学都学了很多年,我们的Pascal语言花一番功夫详细彻底的研究同样也是需要的。。。

好,转回今天的正题,对于格式化输入输出,很多人并不陌生,但是又仿佛不能像C一样说的那么简洁透彻,那么就让我们先从下面的具体的计算问题研究,注意这里关于各种常用数据的表示,自行学习参考资料,还有例题中要用到的Format函数,不熟悉的自行上网搜寻学习,这里不重码了。。。

好,瞧例题,这个例题是关于一个近代物理实验的计算题,知道怎么回事的,可以详细了解习题,感觉有点陌生的,可以只关注最后的数学计算式就行了,我们主要是借这个题研究格式输入输出的。。。(这种方法论在中学中,大家也不陌生了,叫关注主要因素,忽略次要因素!!微笑



给出程序:

program Ag原子速度;


{$APPTYPE CONSOLE}


uses
  SysUtils;


var
  v:real;


begin

  //注意科学计数法的写法规则
  v:=0.1*sqrt(((9.274e-24)*60)/((0.15e-3)*(1.79e-25)));
  writeln('Ag原子速度是',v);

  //writeln可以直接调用format函数的!~
  writeln(format('%s%f',['Ag原子速度是',v]));
  { %f 表示浮点数, 保留或凑够两位小数点 }
  writeln('Ag原子速度是',format('%f',[v]));


  { %g 表示浮点数, 会去掉多余的 0 }
  writeln('Ag原子速度是',format('%g',[v]));


  { %e 用科学计数法表示整数或浮点数 }
  writeln('Ag原子速度是',format('%e',[v]));


  { %x 用十六进制表示一个整数 }
//  writeln('Ag原子速度是',format('%x',[v]));
//这里不能用16进制输出,否则在运行时中断


  { 指定小数点的位数, 取值范围1-9, 输入0也当1用 }
  writeln('Ag原子速度是',format('%.6f',[v]));


  { 这是给整数指定位数, 如果小了则无效 }
//  writeln('Ag原子速度是',format('%.8d',[v]));
//实型或者说浮点型是不能用这种方式指定整数位数的,否则在运行时中断


  { 给科学计数法指定位数 }
  writeln('Ag原子速度是',format('%.6e',[v]));


  //注意这里不带中括号了,用的是formatfloat
  writeln('Ag原子速度是',formatfloat('####.####',v));
  writeln('Ag原子速度是',formatfloat('0000.0000',v));
  writeln('Ag原子速度是',formatfloat('0.00E+0',v));
  writeln('Ag原子速度是',formatfloat('0.00E+00',v));
  readln;
end.


程序中已经详细讨论了格式化输入输出的一些问题,因此运行结果只给图,就不重复分析了!~微笑



这里仿佛有人就问了,readln不和format函数交往的不多哈!~微笑是的,你在类型中都已经定义好各种类型了,Delphi可能认为readln时就不必重复了!~微笑

这点和C就有很多不同,C有灵活的简单类型的输入输出,而Pascal2010只对输出做了很多工作,你可以详细查阅format,formatdatetime,formatfloat的资料。。。


再如,另一个常见的简单例题,但是对于我们研究Pascal2010的格式化输入输出特性,很有帮助

program triangle(input,output);
{已知两边及一夹角,求第三边及面积}


{$APPTYPE CONSOLE}


uses
  SysUtils,
  Windows,
  Classes,
  Math,
  dialogs;


const
  pi=3.141593;


var
  a,b,c,d,alfa,s1:real;
  s:string;


//下面是个转成2进制数的函数,Delphi中格式化输入输出特殊进制的数较少
//需要的话,只能自编程序
Type
  TBinString = Array[ 0..31 ] Of Char ;


Function IntToBin( N: Integer ): TBinString ;
Const
  BinCharArr: Array[ 0..1 ] Of Char = ( '0', '1' ) ;
Var
  I: Integer ;
Begin
  For I := 0 To 32 - 1 Do
  Begin
    Result[ 31 - I ] := BinCharArr[ N And 1 ] ;
    N := N Shr 1 ;
  End ;
End ;


var
  sbin: TBinString ;




begin
  {输入a,b及alfa的值}
  writeln('please input a,b,alfa:');
  read(a,b,alfa);
//readln差不多都不能用format函数,如果这里输入
//readln(format('%f',[a]);就出现错误!


  writeln('a=',a:4:2,'    b=',b:4:2,'    alfa=',alfa:4:2);
  {计算c及s}
  alfa:=alfa*pi/180;
  c:=sqrt(a*a+b*b-2*a*b*cos(alfa));
  s1:=0.5*a*b*sin(alfa);


  {输出c及s}
  writeln('c=',c:-16:6,'s=',s1:-12:6);
  writeln('c=',c:-$16:6,'s=',s1:-12:6);
  writeln('c=',c:16:6,'s=',s1:-12:6);
//场宽的概念仍然适合,并且可以增加符号表示左右对齐
//但是左对齐多了并不增加0或者空格,这里第2种输出多个16进制符号,没任何影响!!


  writeln('c=',format('%f',[c]),'s=',format('%e',[s1]));
//但并不是所有的format格式输出,writeln都能用的!
//例如,这里就会出现中断错误,如果你改为writeln(format('%x',[c]));
//运行中断错误处writeln(format('%x',[c]));
  readln(d);
  writeln($d);               //注意这个是16进制的数噢
  writeln($16,$18,$20,$12);
  sbin:=inttobin(18);
  writeln(sbin);
//这里writeln(inttobin(18));不能直接引用函数inttobin(18)


  Messagebox(0,'内容','标题',MB_ICONHAND);
  ShowMessage(s);                          //需要调用dialogs函数!
//消息函数,WinAPI,控制台都是可以调用的
  readln;
  readln;
end.

程序截图:





注意了哈,这里面两幅图都出现了Windows提示图标,这不是什么错误噢,他们是控制台调用的WINAPI函数!~微笑

如何?控制台是不是和我们以前说的纯DOS特性不同??微笑

上面程序中也做了详细的解说,这里也不重复了!~可见,要想很好的了解格式化输入输出,也需要团队开发时多积累经验,你瞧,我这里又用了团队一词,就是说我们以后学习模式也会发生改变,这和DOS时代学习软件是不是不同啊??那时的软件小巧,独立就可以研究,但是现在Delphi2010比Turbo Pascal,Turbo C,MS C,甚至Microsoft Visual Stdio6.x功能更强大的多,自然需要花费的功夫也大得多,现在的语言套件功能都逐渐增强,所以任何的单个一个人去完全研究透某种科学都不现实了,这就是时代性!!

就像VS2008一样,出了个什么套件啊??VS2008团体开发版!!!!~~~~

所以,我们不管是VS Stdio还是Delphi,在出教程和实验课本时,都应广招有识之士,共同努力!!~~

好,闲话了一会,为了熟悉今天的内容,再练个简单的:

program prochar(input,output);
//输入字符,求其序号、前导、后继


{$APPTYPE CONSOLE}


uses
  SysUtils;


var
  och:integer;
  ch,pch,sch:char;


begin
  {输入字符}
  writeln('please input ch');
  read(ch);
  writeln('ch=',ch);
  {计算序号、前导、后继}
  och:=ord(ch);
  pch:=pred(ch);
  sch:=succ(ch);


  {输出序号、前导、后继}
  writeln('och=',och,'  pch=',pch,'  sch=',sch);
  writeln('och=',och:8,'pch=',pch:-8,'sch=',sch:8);
//有时,利用格式化不如自己控制格式输出,让输入输出简洁有序
//所以要恰当选择最简洁直观或者美观的!~~

  readln;
  readln;
end.

截图:



呵呵,注意了哈,这里用的是希腊文!!~~吐舌头

这两个练习,虽然简单,但是想了想,里面有些有用的,还是给大家了,注意了,虽然,我们前面很多典型例子,都比这两个繁复点,但是,简单有点实用的瞧瞧还是有点好处的。。。好,另一个:

program circuit(input,output);
//确定是否在圆环内,注意小圆半径不能大于大圆半径


{$APPTYPE CONSOLE}


uses
  SysUtils;


var
  bool:boolean;
  x,y:real;


begin
  {读入x,y}
  writeln('please input x,y');
  read(x,y);
  writeln('x=',x:4:1,'  y=',y:4:1);
  //用的场宽,加上自己的控制,达到格式输出


  {根据x,y是否在圆环内给bool赋值}
  bool:=(x*x+y*y>=1)AND(x*x+y*y<=4);
  {输出结果}
  writeln(bool);        //注意布尔型输出结果
  readln;
  readln;
end.


截图



好,今天就到这里,主要研究了格式化输入输出的有趣现象!~后续再接着聊!~~

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台