Skocz do zawartości


Przetwarzanie danych w pliku rekordowym


3 odpowiedzi w tym temacie

#1 gość123456789

    Nowy na forum

  • Użytkownicy
  • 4 Postów:

Napisano sob, 18 lut 2017 - 11:57

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ś??


delphi
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.
 


#2 gość123456789

    Nowy na forum

  • Użytkownicy
  • 4 Postów:

Napisano nie, 19 lut 2017 - 12:08

pomoże ktoś??

#3 olesio

    Ekspert

  • Super użytkownicy
  • 363 Postów:
  • Gadu-Gadu:478088

Napisano wto, 21 lut 2017 - 05:40

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.

#4 Kaczus

    Bywalec

  • Użytkownicy
  • 36 Postów:

Napisano pon, 27 lut 2017 - 09:39

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.