Jump to content

Przetwarzanie danych w pliku rekordowym


gość123456789

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.

 

Link to comment
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.

Pozdrawiam: olesio

Link to comment
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.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...