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.
截圖
好,今天就到這裡,主要研究了格式化輸入輸出的有趣現象!~後續再接著聊!~~