當前位置:名人名言大全網 - 笑話故事 - pascal問題

pascal問題

囧:教練不如學生練得多,如果妳敢讓妳的學生在復賽中開這樣的數組咱就真佩服妳了= =

妳的數組範圍設計太大了,尤其是這個數組的定義:c:array[1..50000,1..50000] of integer; 占了N多內存,程序根本無法運行,所以出現了錯誤216的提示 ,妳應該改為:c:array[1..500,1..500] of integer;才能執行完程序,壹旦妳用到所開的數組C程序馬上崩潰。

如果妳壹定要開array[1..50000,1..50000] 的話有三種辦法:第壹種是換臺超級電腦(玩笑話O(∩_∩)O哈哈~),第二種是用滾動數組,即定義小範圍數組,然後數組開到下限後,倒回[1,1]重新使用數組,此法適用於妳不再需要前面數組數據的情況。第三種是用指針鏈表,具體方法妳可以參照下面:

指針類型

11.1 指針

11.2 單鏈表

11.1 指針

指針是通過地址來訪問變量的壹種特殊的數據類型,屬於動態的數據結構,它可以在需要時產生,用完後則又可以取消或回收,以減少占用的內存空間。指針變量與其他類型的變量不同,它占有的不是數據,而是地址。

由於動態數據結構的變量是在程序執行過程中動態生成的,所以不能預先予以說明,無法預先給這些變量起名字,訪問時也無法通過名字直接輸出或顯示,而只能用指針得到其地址,然後間接訪問。

1、定義指針類型

在Turbo Pascal中,指針變量用來存放某個存儲單元的地址,即指針變量指向某個存儲單元。壹個指針變量僅能指向某壹種類型的存儲單元,這種數據類型是在指針類型的定義中確定的,稱為指針類型的基類型。指針類型定義如下:

類型名=^基類型名;

例如:type q=^integer;

var a,b,c:q;

說明:q是壹指向整型存儲單元的指針類型,其中"^"為指針符。a,b,c均定義為指針變量,分別可以指向壹個整型存儲單元。

上例也可用變量說明為:

var a,b,c:^integer;

指針也可以指向有結構的存儲單元。

例如:type person=record

name:string[10];

sex:(male,female);

age:20..70

end;

var pt:^person;

pt為指向記錄類型person的指針變量。

2、動態變量

應用壹個指針指向的動態存儲單元即動態變量的形式如下:

指針變量名^

例如:p^、q^、r^

指針變量p和它所指向的動態變量p^之間有如下關系:

以下語句把整數5存放到p所指向的動態變量p^中去:

p^:=5;

以下語句把p所指向的p^中的值賦給整型變量i:

i:=p^;

如果指針變量p並未指向任何存儲單元,則可用下列賦值語句:

p:=nil;

其中nil是保留字,表示“空”,相當於C語言裏面的null

3、對動態變量的操作

在Turob Pascal程序中,動態變量不能由var直接定義而是通過調用標準過程new建立的。過程形式為:

new(指針變量名);

如果有下列變量定義語句:

var p:^integer;

僅僅說明了p是壹個指向整型變量單元的指針變量,但這個整型單元並不存在,在指針變量p中還沒有具體的地址值。在程序中必須通過過程調用語句:new(p);才在內存中分配了壹個整型變量單元,並把這個單元的地址放在變量p中,壹個指針變量只能存放壹個地址。在同壹時間內壹個指針只能指向壹個變量單元。當程序再次執行new(p)時,又在內存中新建立了壹個整型變量單元,並把新單元的地址存放在p中,從而丟失了舊的變量單元的地址。

為了節省內存空間,對於壹些已經不使用的現有動態變量,應該使用標準過程dispose予以釋放。過程形式為:dispose(指針變量名);為new(指針變量名)的逆過程,其作用是釋放由指針變量所指向的動態變量的存儲單元。例如在用了new(p)後在調用dispose(p),則指針p所指向的動態變量被撤銷,內存空間還給系統,這時p的值為 nil。

4.需要註意之處

1、P與P^的區別

P是指向該動態變量的指針變量名,P^則稱為動態變量或標誌變量。P的值是P^的首地址,P^的值為與基類型相同的壹個值。

2、定義後及時分配存儲單元

定義了壹個指針變量後,並沒有為該指針分配動態存儲單元,此時的P的值無定義,調用P^則會產生運行錯誤。若想使該指針可用,可以對指針賦值,也可以通過NEW()過程分配存儲單元。

3、使用後及時收回存儲單元

指針使用後,不會自動歸還占用的存儲空間,應及時使用DISPOSE()過程來釋放P^所占用的存儲單元,以免浪費有限的存儲空間.

11.2 單鏈表

單鏈表的數據類型可定義如下:

type dlb=^node;

node=record

data:datatype;

next:dlb;

end;

例1 連續輸入壹序列整數,組成鏈表(並以動態的形式把它們記錄下來),當輸入的數為-1時,停止輸入,然後把輸入的整數按相反的順序輸出.

program lianbiao;

type link=^data;

data=record

num:integer;

next:link;

end;

var p,q:link;

i:integer;

begin

q:=nil;

readln(i);

while i<>-1 do

begin

new(p);

with p^ do

begin

num:=i;

next:=q;

end;

q:=p;

readln(i);

end;

while p<>nil do

begin

write(p^.num:6);

p:=p^.next;

end;

readln;

end.

(That's all,累呀~~~~)