program area;

uses wincrt;

type point=record

           p1:real; {每一點既座標x}

           p2:real; {每一點既座標y}

           end;

var

infile:text;   

ad:array [1..4]of string;{因為infile有四組面積要計,每一組既座標資料分別儲藏係ad array [1..4]裡面}

max,z:integer;   {max係用黎記住每一組共有幾多組座標,z只是備用的}

con:array [1..7]of point;{因為infile最長一組有7組座標,所以設定最多儲藏7個座標就夠}

a:array[1..4]of real; {a就係用黎記住每一組ad計出黎既面積}

{點解max,con唔係有4組呢,,,因為我個program希望計完一組再計一組既面積,一計到面積就用a來儲起,咁之前既資料就唔洗再用,所以maxcon可以循環再用}

function carea(c1,c2,c3:point):real;{計有面積既function}{c1,c2,c3就係你要掉那3座標去計}

var parea,pparea,temp:real;{parea就係工式加既部份,pparea就係工式減既部份}

begin

parea:=c1.p1*c2.p2+c2.p1*c3.p2+c3.p1*c1.p2;

pparea:=c2.p1*c1.p2++c3.p1*c2.p2+c1.p1*c3.p2;

temp:=(parea-pparea);

temp:=0.5*abs(temp);

carea:=temp;

end;

procedure win;{polygons.txt拿資料}

var x:integer;

begin

assign(infile,'c:\polygons.txt');

reset(infile);

for x:=1to 4do

readln(infile,ad[x]);{成句入哂,唔清理d 括號先,,,,等成個program分細d,易搞d}

close(infile);

end;

 

procedure din(temp:string);{處理每一句d括號既時候}{temp就係入其中一個ad既資料}

var x,y,z:integer;{基本上,z都係備用既 }

num:real;

temps:char;{temps係用黎記低temp那一個位的字}

temp1:string;{temp1就係記得temp裡面其中一個座標,因為我唔係infile既時候一併搞埋,所以d座標}

                        {string,我要將d座標轉番做real;

begin

temps:=temp[1];{temps記得temp第一個字先}

x:=1;{x就係用黎比自己知道自己睇緊temp邊個位,x=1即係我睇緊temp第一個位}

y:=0;{y係用黎共住我delete左幾多個括號}

temp:=copy(temp,1,length(temp))+'!';{我首先係temp呢個句子加上!}

while (temps<>'!') do{自己睇到!既時候即係話睇哂,唔係!即係話要繼續做}

begin if (temps='(')or (temps=')' ){如果自己睇到係括號時就係做delete既時候}

      then begin

           temp:=copy(temp,1,x-1)+copy(temp,x+1,length(temp));

{呢句就係將一句裡面某個位刪去方法}

           temps:=temp[x];{因為而經刪去了括號,temps更新自己睇緊咩字}

                        {其實呢一步亦已經睇緊括號之後既字係咩}

           y:=y+1;{你剛剛刪了一個字,當然記低自己又刪了一個括號}

           end

      else begin{如果唔係括號,就要做以下既事}

           x:=x+1;{x+1}

           temps:=temp[x];{temps睇下一個字}

           end;

end;

 

max:=trunc(y/2);{點解我記得刪左幾多個括號?一個座標要兩個括號,刪左8個括號即係有4個座標囉}

{頭先刪走左括號,點解唔刪埋逗號,原因有二:一,分散d困難既野,二,用下val呢個function既用途}

x:=1;{x再返去1,即係成句句子由頭睇過}

temps:=temp[1];{temps睇番第一個字先}

for z:=1 to max do{以下每load lfor load 一個座標,so1 to max}

begin

val(temp,num,y);{val係一個已經係pascal定義既procedure,功能係將一個string轉左數字}

{例子val(a,b,c),a係你那段文字,b係你想轉出黎既位置(real integer),

c係一個錯誤位置(c必須是integer}

{比如: a:=0.3(string來的); (b假設係real)

 then val(a,b,c)  b就會變成0.3(real) c0

 又例如a:[email protected](string)

then val(a,b,c)  b不會有東西,c4,因為@不是一個數字,而且@a既第4,所以c4

但值得留意係假如a:=0.3(string來的); (b假設係integer)

then val(a,b,c)  b不會有東西,因為integer不會有小數點,小數點係a既第2,所以c2}

if y<>0{如果y不等於0,即係話如果num取不到數字,即係不能成功將temp轉為num}

{y就是指著逗號的位置}

then begin

     temp1:=copy(temp,1,y-1);{逗號前的位置就是我們想要的x座標}

     val(temp1,num,x);{今次num一定可以轉為數字了,x放在這裡只是陪襯}

     end;

temp:=copy(temp,y+1,length(temp)-y);{既然那了第一個x座標,那可以連逗號也可以取去}

con[z].p1:=num;{那了第一個座標x,那就當然先放在預先準備的con}

 

val(temp,num,y);{這次到拿y座標,方法如上}

if y<>0

then begin

     temp1:=copy(temp,1,y-1);

     val(temp1,num,x);

     end;

temp:=copy(temp,y+1,length(temp)-y);

con[z].p2:=num;

end;

end;{小心寫左幾多個begin,要小心放回end既位置

 

procedure cal(st:integer);{計算部分}

var x:integer;{x是備用的}

temp1,temp2:real;{temp1就是每一個三角形的面積位置,temp2就是將temp1加總}

begin

temp2:=0;

for x:=2 to (max-1) do{這個for點解係2max-1,自己計一計就知點解}

begin  temp1:=carea(con[1],con[x],con[x+1]);

       temp2:=temp2+temp1;{加總唷}

end;

a[st]:=temp2;{將結果放在預先準備的位置唷}

end;

 

begin{main}

win;{infile}

for z:=1to 4 do

begin

din(ad[z]) ;{處理好每一組的座標}

cal(z);{計算面積}

writeln(a[z]);

end;

end.

{整個program就是這樣,會發現main program好簡單好少,有時可先寫main program,

寫得再天馬行空都得,program細分下去,遂份遂份做,你可見我的procedure並不是由infile開始的,

就是知道要解決什麼問題就先做,procedure之中可再拆procedure,就好像我係cal之中再拆 carea一樣

如果覺得問題好巨大,唔知點開手,不況將一d已知既問題寫開,之後將各個問題重新組合。例如:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以上為大分法,

一個procedure真的要寫時,會有更多更多的考慮,細分法就好似咁:

我個sudoku都係靠細分法先成功寫出黎,對住個表,會好清楚自己個program點做,可以幫你只有咁多了

Hosted by www.Geocities.ws

1