1. 程式人生 > >Pascal程式設計(二級)——基礎篇05格式化輸入輸出

Pascal程式設計(二級)——基礎篇05格式化輸入輸出

大家好,我們接著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.

截圖


好,今天就到這裡,主要研究了格式化輸入輸出的有趣現象!~後續再接著聊!~~