Skocz do zawartości
gość123456789

Przetwarzanie danych w pliku rekordowym

Polecane posty

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.

 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

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.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

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.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się

×