[Pascal] Przeszukiwanie tablicy

Wszystko co dotyczy tworzenia i optymalizacji stron internetowych oraz programowania
Awatar użytkownika
voluu

Ekspert
Posty: 1061
Rejestracja: 16 kwie 2010, 20:47
Kontaktowanie:

[Pascal] Przeszukiwanie tablicy

Post19 mar 2012, 19:23

Witam.
Jak w języku Turbo Pascal napisać program, który wpisze do tablicy jedowymiarowej 6 losowych liczb nie powtarzających się.
Rozumiem, że podczas wpisywania wartości to tablicy trzeba ją przeszukać.
Doszedłem to tego miejsca:

Kod: Zaznacz cały

program zad3;
uses crt;
var
tab:array[1..6] of integer;
i,j,k,z: byte;
a,b,c: integer;
begin
randomize;
repeat
writeln ('Podaj maksymalna wartosc');
readln(a);
until (a>6);
for i:=1 to 6 do
begin
tab[i]:=random(a-1)+1;

     for j:=1 to 6 do
     while (tab[i]=tab[j]) do
     begin
     tab[i]:=random(a-1)+1;
     end;
write(tab[i],' ');
end;
end.


Jednak program się crashuje.
Mam dobry tok rozumowania czy źle myślę.

Skrócony plan działania:
1. Sprawdzenie, czy zakres podany przez usera jest większy od 6 (tablica 6 miejscowa)
2. Wylosowanie wartości do danego miejsca w tablicy
3. Przeszukanie tablicy, czy taka wartość już jest:
4. Jeśli jest, to ponowne losowanie i powrót do sprawdzania warunku
5. Jeśli nie wpisanie jej do tablicy.

Mogę od razu wpisać tą wartość do tablicy i sprawdzać tablicę, czy np. wpisać tą wartość do zmiennej/drugiej tablicy i tą dopiero przeszukiwać?

Pozdrawiam,
v.
Obrazek
Sounds Better

Indoor: AKG K514 + Denon PMA-480R
Outdoor: SoundMagic PL10 + Sansa Clip+

Awatar użytkownika
cosik_ktosik

Administrator
Posty: 21398
Rejestracja: 13 lis 2008, 01:17
Lokalizacja: Szczecin
Kontaktowanie:

[Pascal] Przeszukiwanie tablicy

Post19 mar 2012, 22:26

Witam, mam trochę mało czasu, więc na szybko kod w C:

Kod: Zaznacz cały

#include <stdio.h>

int main(int argc, char *argv[]){
    int tab[6]; //tablica z danymi
    int i, j; //indeksy pomocnicze
    int wstaw, pozycja; //wstaw to liczba losowana, pozycja przechowa tymczasowo czy mamy liczbę w tablicy
   
   
    i=0;
    while (i<6){
          wstaw=rand()%100;
          pozycja=-1;
          for (j=0; j<i; j++){
              if (tab[j]==wstaw)
                 pozycja=j;
          }
          if (pozycja==-1){
             tab[i]=wstaw;
             i++;
          }
     }
             
      for (i=0; i<6; i++)
         printf("%i ", tab[i]);
     getchar();
}
Hotfix
Pozdrawiam, cosik_ktosik :)

Awatar użytkownika
voluu

Ekspert
Posty: 1061
Rejestracja: 16 kwie 2010, 20:47
Kontaktowanie:

[Pascal] Przeszukiwanie tablicy

Post19 mar 2012, 22:31

Dzięki, ale musi to być zrobione w Pascalu. Spróbuję to jakoś zrozumieć, ale wątpię, że dam radę...
Obrazek
Sounds Better

Indoor: AKG K514 + Denon PMA-480R
Outdoor: SoundMagic PL10 + Sansa Clip+

mir

Stały bywalec
Posty: 617
Rejestracja: 01 kwie 2009, 15:23

[Pascal] Przeszukiwanie tablicy

Post19 mar 2012, 22:45

mam inną propozycję, stwórz kolejną tablicę boolean 1..6
Na początku programu, pętla która "sfalsuje" tablicę.
Jeśli wylosujesz liczbę 2 to zaznaczasz to is[2] = true;
Potem będziesz mógł w czasie stałym odpowiadać, czy była wylosowana czy nie.
A po co druga pętla w pętli?

Awatar użytkownika
voluu

Ekspert
Posty: 1061
Rejestracja: 16 kwie 2010, 20:47
Kontaktowanie:

[Pascal] Przeszukiwanie tablicy

Post19 mar 2012, 23:08

Mogę to zrobić za pomocą dwóch tablic, ale jedynie co mogę zrobić to drugą wyzerować, i sprawdzać jak mówisz.
Obrazek
Sounds Better

Indoor: AKG K514 + Denon PMA-480R
Outdoor: SoundMagic PL10 + Sansa Clip+

Awatar użytkownika
cosik_ktosik

Administrator
Posty: 21398
Rejestracja: 13 lis 2008, 01:17
Lokalizacja: Szczecin
Kontaktowanie:

[Pascal] Przeszukiwanie tablicy

Post19 mar 2012, 23:49

Kod: Zaznacz cały

program zad3;
uses crt;
var
tab:array[1..6] of integer;
i,j,a: byte;
wstaw,pomocna:byte;
begin
clrscr;
randomize;
repeat
writeln ('Podaj maksymalny zakres');
readln(a);
until (a>=6);
       i:=1;
while (i<=6)  do
begin

     wstaw:=random(a-1)+1;
     pomocna:=0;
   for j:=1 to i do
   begin

        if (tab[j]=wstaw) then
          begin
               pomocna:=j;
          end;

      end;
   if (pomocna=0) then
    begin
      tab[i]:=wstaw;
         i:=i+1;
    end;


end;   

for i:=1 to 6 do
begin
write (tab[i],' ');
end;


readln;
end.
Hotfix
Pozdrawiam, cosik_ktosik :)

Awatar użytkownika
voluu

Ekspert
Posty: 1061
Rejestracja: 16 kwie 2010, 20:47
Kontaktowanie:

[Pascal] Przeszukiwanie tablicy

Post20 mar 2012, 06:38

Miałem program różniący się tylko pętlą FOR na początku od pętli WHILE... I to powodowało crashe i zawieszenia programu.
Dziękuję!
Obrazek
Sounds Better

Indoor: AKG K514 + Denon PMA-480R
Outdoor: SoundMagic PL10 + Sansa Clip+



  • Reklama

Wróć do „Webmastering i programowanie”



Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość