Elegantnější je třídit už v průběhu načítání. Načítat do spojového seznamu nebo ještě lépe do binárního stromu.
Příspěvky odeslané z IP adresy 82.208.37.–
Freepascal umí Assign a spol. úplně stejně jako Turbo pascal. Dokonce i pro dlouhé názvy souborů. Chyba je tedy mezi židlí a klávesnicí :-)
Co se týče tvého postupu - uvědom si, že používáš funkce určené pro binární, nikoliv textové soubory. Taky mi není úplně jasné, co po svém programu chceš. Jestli prostě vypsat čísla od 0 do 100, tak musíš provést konverzi z typu Longint na typ String:
uses sysutils, crt;
Var I,F : Longint;
s:string;
Begin
F:=FileCreate ('testik.dat');
If F=-1 then Halt(1);
For I:=0 to 100 do begin
s:=IntToStr(i)+#13#10;
FileWrite(F, s[1], Length(s));
end;
FileClose(f);
end.
Endžoj:
uses Graph;
const s = 100;
n = 32000;
var gd,gm:integer;
x,y:integer;
a,d,pi2:real;
begin
gd:=vga;
gm:=vgaHi;
InitGraph(gd,gm,'');
a:=0;
pi2:=pi*2;
repeat
D:= (1+Sin(A)) * (1+0.9*Cos(8*A)) * (1+0.1*Cos(24*A)) * (0.9+0.05*Cos(200*A));
X:= Round(D*Cos(A)*S);
Y:= Round(D*Sin(A)*S);
PutPixel(X+320, 400-Y, 2);
A:= A + Pi2/N;
until A >= Pi2;
readln;
CloseGraph;
end.
Nejsem autor, jenom překladatel z jiného jazyka (z Euphorie).
Buďto to můžeš řešit hrubou silou nebo v rukavičkách.
Hrubou silou znamená, že si uděláš pole 1..10000, budeš tam zapisovat nelezené prvky a pořád ho budeš procházet, jestli tam je prvek na vstupu. Jestli neni, tak ho tam přidáš a postup se opakuje. Algoritmus je jednoduchý, ale pomalý, protože čísla nejsou nijak tříděná a pole se většinou prochází zbytečně dlouho.
var data,prac:array[1..10000] of longint;
a,b,c,p:integer;
je_tam:boolean;
begin
write('Kolik zadas cisel? ');
readln(a);
for b:=1 to a do
begin
write('Zadej hodnotu c.',b,': ');
readln(data);
end;
{Data mame nactena, jdem je zpracovavat}
p:=0;
for b:=1 to a do
begin
je_tam:=false;
for c:=1 to p do
if prac[c]=data then begin je_tam:=true;Break;end;
if je_tam=false then
begin
inc(p);
prac[p]:=data;
end;
end;
writeln('Zadano bylo ',p,' ruznych hodnot.'#13#10'Tady jsou:');
for b:=1 to p do
write(prac,', ');
writeln(#8#8' '); {umaze posledni carku}
readln;
end.
V rukavičkách znamená, že přijímaná data budeš za pochodu řadit podle velikosti, takže procházení, jestli číslo už bylo, bude mnohem rychlejší. Na takovýhle postup se ale pole nehodí. Na to se používají binární vyhledávací stromy, a to je tak o tři levely obtížnější.
Na můj vkus je to naprogramovaný trochu divně, já bych to dělal jinak, ale to je jedno.
Problém je uvnitř procedury PohybHada, v řádku i:=i+1;
I se totiž nikde dál v programu nenuluje, takže se pořád zvětšuje a zvětšuje a v řádce xpole[i]:=xHlava;
se vlastně provede xpole[101]:=xHlava; což znamená přetečení pole.
Taky nemáš inicializovaný proměnný, ale to je, předpokládám, tím, jak jsi ze zdrojáku narychlo vyseknul tenhle fragment.
v Turbo pascalu se to dělá takhle: http://www.int21h.ic.cz/?id=63
Jestli ale píšeš program pro windows, tak budeš asi muset použít Freepascal, a to verzi pro windows. S tím ti neporadím, ale vím, že v nápovědě je to dobře popsaný.
Pascal zná objekty už od verze 5.5 - ten vyšel tuším, v roce 1990. Object pascal je jenom reklamní trik - je to úplně normální pascal, který tedy má, pravda, trochu rozšířené možnosti ohledně objektového programování, ale nejde o nic zásadního. Standard object pascal v sobě zahrnují Delphi (od verze 1.0), Freepascal a snad i Virtual pascal a GNU pascal.
Jinak - není úplně přesné, že Turbo pascal byl navržen pro výuku programování. Původní pascal od Niclause Wirtha opravdu pro výuku navržen byl. Pro profesionální programování pak stvořil odvozený jazyk Modula-2. Jenže firma Borland řekla, že překladač pro Modulu dělat nebude, a že raději zdokonalí jazyk pascal, aby byl použitelný i pro profesionály. Tak vznikl Turbo pascal.