Pascal - zbiory

Marika
Użytkownik
Użytkownik
Posty: 3
Rejestracja: 26 lis 2005, o 20:00
Płeć: Kobieta
Lokalizacja: Białogard

Pascal - zbiory

Post autor: Marika »

mam problem z napisaniem procedury liczącej różnicę 2 losowych zbiorów poniżej zamieszczam całą resztę programu (poza tą jedną procedurą)

pomógł by mi ktos pomóc to skończyć???

Kod: Zaznacz cały

program RoznicaZb;           
const zbior = 10;
type zb = record
            liczba       : array [1..zbior] of integer;                {elementy zbioru}  
            poz          : array [1..zbior] of boolean;
            calyZbior    : integer;
       end;
procedure st(var X: zb);                                                 {normalizacja}
var i, j: integer;
begin
  for i:=1 to -1 do
    if (X.poz[i]=true) then
      for j:=i+1 to zbior do
        if (X.poz[j]=true) and (X.liczba[i]=X.liczba[j]) then begin
          X.poz[j]:=false;
          Dec(X.calyZbior);
        end;
end;

procedure LosLicz(var X: zb);
var i: integer;
begin
  for i:=1 to zbior do begin
    X.liczba[i]:=random(zbior)-(zbior mod 2);
    X.poz[i]:=true;
  end;
  X.calyZbior:=zbior;
  st(X);
end;

procedure DrukujZbior(X: zb);
var i: integer;
begin
  for i:=1 to zbior do
    if (X.poz[i]=TRUE) then Write(X.liczba[i]:3);
  Writeln;
  Writeln;
end;

var A,B,C: zb;
begin
  Randomize;
  LosLicz(A);
  LosLicz(B);
  DrukujZbior(A);
  DrukujZbior(B);
  readln;
end.
Ostatnio zmieniony 27 lis 2005, o 10:03 przez Marika, łącznie zmieniany 1 raz.
Fibik
Użytkownik
Użytkownik
Posty: 971
Rejestracja: 27 wrz 2005, o 22:56
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 11 razy
Pomógł: 75 razy

Pascal - zbiory

Post autor: Fibik »

Nie wiem co tam tworzysz z tymi rekordami - zbiór n-elementowy definiuje się jako tablicę binarną:

const N = 10;
type TZbior = array[1..N] of boolean; { lepiej zrobić to na bitach - mniejszy rozmiar }

var i : integer;

procedure roznica(var r, a,b : TZbior); { r = a - b }
begin
for i := 1 to N do r := a and not b;
end;

procedure los(var z : TZbior); { 'robi' zbiór losowy }
begin
for i := 1 to N do z := random(2);
end;

Może nie o to chodzi... ale zbiór to zbiór, a nie jakieś liczby.
Marika
Użytkownik
Użytkownik
Posty: 3
Rejestracja: 26 lis 2005, o 20:00
Płeć: Kobieta
Lokalizacja: Białogard

Pascal - zbiory

Post autor: Marika »

chodzi o różnicę dwóch zbiorów liczbowych (chyba każdy wie co to jest zbiór liczbowy??? dla przykładu może podam: załóżmy że zostały wylosowane takie 2 zbiory: X={1,2,3,14,35) Y={2,3,14) z tego co mi wiadomo różicą zbiorów bedzie X / Y = {1,35} ale jak kolwiek probóję to napisac w pascalu jakies brednie mi ciągle wychodza... )
Fibik
Użytkownik
Użytkownik
Posty: 971
Rejestracja: 27 wrz 2005, o 22:56
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 11 razy
Pomógł: 75 razy

Pascal - zbiory

Post autor: Fibik »

masz tam taką pętlę: for i := 1 to -1 ... wykona się to zero razy.

Kod: Zaznacz cały

{ sprawdzenie czy, elem nalezy do z }
function nalezy(var z : zb; elem : integer) : boolean; 
var i : integer; 
begin
  
  i := zbior+1;
  repeat
    dec(i); 
  until (i = 0) or z.poz[i] and (z.liczba[i] = elem);
  
  nalezy := i > 0;
end;

procedure sub(var r, a, b: zb);   { r = a - b } 
var i : integer; 
begin 
  r.calyZbior := 0;
  for i := 1 to zbior do with r do begin
    liczba[i] := a.liczba[i]; 
    poz[i] := a.poz[i] and not nalezy(b, a.liczba[i]); { jest w a i nie jest w b }
    if poz[i] then inc(calyZbior);
  end;      
end; 
Ciekawe jak wykonasz sumowanie przy takiej reprezentacji zbiorów - łączna liczba różnych elementów (liczb) może być większa od 10.
Marika
Użytkownik
Użytkownik
Posty: 3
Rejestracja: 26 lis 2005, o 20:00
Płeć: Kobieta
Lokalizacja: Białogard

Pascal - zbiory

Post autor: Marika »

dzięki za pomoc:)

ja sie chyba poddaje...
u mnie nawet to nie działa... albo ja jestem tak głupia i tępa:(
Fibik
Użytkownik
Użytkownik
Posty: 971
Rejestracja: 27 wrz 2005, o 22:56
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 11 razy
Pomógł: 75 razy

Pascal - zbiory

Post autor: Fibik »

Wszystko działa prawidłowo.

Popraw pętlę w procedurze normalizującej 'st'
jest tam:
for i := 1 to -1 do
powinno być:
for i := 1 to zbior-1 do

Jeszcze można zmienić sposób przekazywania parametru w procedurze wydruku:
DrukujZbior(X: zb) na DrukujZbior(var X: zb)
ODPOWIEDZ