Jump to content
gość123456789

Przetwarzanie danych w pliku rekordowym

Recommended Posts

Witam, mam zrobić na informatykę taki program i mam z tym problem.

W pliku rekordowym o nazwie 'dane.dat' umieszczono ciąg liczb całkowitych których wartości w założeniach miały być kolejno: większe i mniejsze od zera (równe zeru potraktować jak mniejsze). Napisać procedure lub funkcję z których:

a) pierwsza, sprawdzi czy rzeczywiście tak jest,

b) druga, przepisze do n elementowej tablicy A liczby dodatnie (n należy podać jako argument, proces przerwać po znalezieniu n-tego elementu).

Napisałem coś takiego i procedura z podpunktu b działa ale z funkcją z podpunktu a mam problem. A mianowicie funkcja działa dobrze jeśli wprowadzam parzystą ilość liczb, a dla nieparzystej ilości nie chce działać. Pisałem ten program w Lazarusie IDE v1.6.

 

Funkcja nazywa się Sprawdź. Pomoże ktoś??

program zestaw1_poprawka3;
uses Crt;
type Tplik=file of integer;
    Ttab=array[1..100] of integer;
var p:Tplik;
A:Ttab;
n:byte;
{...........}
procedure Wprowadz(var p:Tplik; n:integer);
var x:integer;
i:integer;
begin
Rewrite(p);
if n>=100 then exit;
for i:=1 to n do
begin
write(i,' liczba: '); readln(x);
write(p,x);
end;
Close(p);
end;
{............}
function Sprawdz(var p:Tplik):boolean;
var x,y:integer;
begin
Reset(p);
if not eof(p) then
read(p,x);
while not eof(p) do
begin
read(p,y);
if ((x>0) and (y<=0)) or ((x<=0) and (y>0)) then
Sprawdz:=True
else
Sprawdz:=False;
end;
Close(p);
end;
{..........}
procedure Wyswietl(var p:Tplik);
var x:integer;
begin
Reset(p);
while not eof(p) do
begin
    read(p,x);
    writeln(x:3);
    end;
Close(p);
end;
{................}
procedure Przepisz(var p:Tplik; var A:Ttab; var n:byte);
var x:integer;
begin
Reset(p);
n:=0;
while not eof(p) do
begin
if n>=100 then break;
read(p,x);
if x>0 then
begin
n:=n+1;
A[n]:=x;
end;
end;
Close(p);
end;
{................}
procedure Wyswietl_tab(var n:byte; var A:Ttab);
var i:integer;
begin
for i:=1 to n do
write(A[i]:5,' ');
end;
{...........}
begin
 ClrScr;
 write('Ile bedzie liczb: '); readln(n);
 Assign(p,'dane.dat');
 Wprowadz(p,n);
 writeln;
 Sprawdz(p);
 writeln(Sprawdz(p));
 Wyswietl(p);
 writeln;
 Przepisz(p,A,n);
 writeln('Przepisana tablica: ');
 Wyswietl_tab(n,A);
 Readkey;
end.

 

Share this post


Link to post
Share on other sites

Wklej kod na jakiś zewnętrzny pastebin, bo tutejszy rozwala formatowanie. Oczywiscie kod wrzucony sformatuj i sensowniej ponazywaj większość zmiennych. Teraz się na ten kod nie da spojrzeć, a kiedy się już będzie dawało to pewnie znajdzie się ktoś, kto pomoże Ci.

Share this post


Link to post
Share on other sites

Przecież jest napisane, że masz sprawdzić, czy kolejne liczby są na przemian albo dodatnie, a następna niedodatnia.

więc

1) ustalasz jaka jest pierwsza wartość

2) sprawdzasz, w zaleznosci od tego kolejne...

czyli powiedzmy zmienna

sprawdzamczydodatnia: boolean;

 

początkowa wartość po przeczytaniu pierwszej wartości (powiedzmy, ze wartości wczytujemy do Twojej zmiennej x) ustalamy:

 

sprawdzamczydodatnia := x <=0;

 

dodatkowo, jeśli warunek jest niespełniony w połowie bezsensownie jest sprawdzać dalej, wiec warunek stopu do poprawienia.

 

zamiast ifa, dałbym wtedy

result := (sprawdzamczydodatnia AND (x >0)) or (( not sprawdzamczydodatnia) AND (x <=0))

 

nie zapomnij po kazdej iteracji zmieic

sprawdzamczydodatnia := not sprawdzamczydodatnia

 

 

tyle podpowiedzi.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...