[PASCAL] Losowanie liczb i eliminacja powtórzeń


(bartex9) #1

Witam,

Mam pewien problem. Otóż mam do szkoły napisać pewien program i nie wiem jak mam to zrobić. Ma on wylosować losowe liczby dla każdego elementu tablicy dwuwymiarowej(1..10 i 1..6). Następnie ma je wypisać a potem wyeliminować powtórzenia danej liczby i znowu całość wypisać. Zacząłem to robić ale coś mi się wydaje, że jest to wszystko źle. Z góry dzięki za szybką pomoc.


([alex]) #2

Zastanów się jeszcze raz nad zadaniem, tablica ma 60 komórek 6*10, więc losując z przedziału 1..48 na 100% będą powtórzenia.

Usunąć liczbę z tablicy dwuwymiarowej nie da się (można usunąć wiersz bądź kolumnę).

Więc w jaki sposób masz "wyeliminować powtórzenia"?


(Marcin 110) #3
program jakis_dziwny;


{ uses crt; <---- jesli tylko po clrscr, to nie polecam.

nie wiem, jak inni, ale ja nie lubie jak prosty program

konsolowy przerzuca mi ekran }


const

   n = 10;

   p = 6;

   r = 49;


type

   tkupon = array[1..p] of byte; { skad wiem, ze to kupony duzego lotka oO? }


var

   tab : array[1..n] of tkupon;

   pom : array[1..r] of boolean;

   i, j, k : byte;


procedure wypisz();

var i, j : integer;

begin

   for i := 1 to n do

   begin

      for j := 1 to p do

         { if not (tab[i, j] = 0) then } { nie wypisze zer }

         write(tab[i, j]:4); { wlasciwie powinno byc

                             write(tab[i, j]:round((ln(r) / ln(10) + 0.5)) + 2)}

      writeln;

   end;

   writeln;

end;


begin

   randomize; { <----- to wazne, jesli chcesz miec "losowosc" }

   j := 0;


   for i := 1 to n do

   begin

      for k := 1 to p do

         tab[i, k] := random(r - 1) + 1; { losuje liczbe }

   end;

   wypisz;


   { teraz będę próbował usunąć każdą liczbę z przedziału od 1 do 49 jeżeli

   powtórzy się więcej niż raz - to tutaj coś jest chyba nie tak }


   { mozesz zamiast tego sprobowac przy deklaracji pom:

   pom : array[1..r] of boolean := [r of false];

   jest w specyfikacji Pascal 3.0.2, ale u mnie nie dziala }

   for i := 1 to r do

      pom[i] := false;


   for i := 1 to n do

      for j := 1 to p do

         if not pom[tab[i, j]] then

            pom[tab[i, j]] := true { zaznacza pierwsze odwiedziny }

         else

            tab[i, j] := 0; { zeruje komorke, jesli nie byla pierwsza }

   wypisz;


   { do usuniecia, ale warto zobaczyc wynik }

   j := 0;

   writeln(j);

   j := 200;

   writeln(j);

   j := j + 60;

   writeln(j); { OMG }


end.

Powyższy program nie usuwa, tylko zeruje komórki z powtórzeniami. Nie wiem, jak sobie wyobrażać usuwanie komórki, może tak jak w stringu przy pomocy delete - czyli zmienić "zerowe" pole z długością, przesunąć komórki z prawej w lewo i udawać, że dalej nic nie ma. Nie potrzeba dużo kodu, żeby napisać własne delete.

BTW: nie pisz z CAPS'em, rób wcięcia.