mieszanie wyrazow tablice dynamiczne delphi PILNE

0

Mam za zadanie zrobic mieszanie wyrazow ktore ma na celu:

przykładowo wylosowalismy ze zbioru liczb od 0 do 5, dwie cyfry: 1 i 4

Chce je pomieszać między sobą tak, żeby reszta została na swoim miejscu: 0 na 0, 2 na 2, 3 na 3, 5 na 5, a tamte chce zamienić tak, że 4 na 1, a 1 na 4.

Napisałem taki kod i nie mogę sobie poradzić z tą zamianą. Gdyż wypisuje jedynie '-'

procedure TForm1.MieszajWyrazyTylkoWylosowane;
type
  tablicaWykorzystanych = array of boolean;
var
  i:integer;
  iloscWyrazow,wylosowano:Cardinal;
  wykorzystane,wylosowane : tablicaWykorzystanych;
begin
  Randomize;
  SetLength(wykorzystane,ComboBox1.Items.Count{-1});
  SetLength(wylosowane,ComboBox1.Items.Count{-1});
  iloscWyrazow:=ListBox1.Items.Count;
  ListBox2.Items.Clear;
  Form1.Caption:='';
  for i:=0 to iloscWyrazow-1 do begin
    ListBox2.Items[i]:=ListBox1.Items[i];
  end;
  if ComboBox1.ItemIndex<2 then begin
    ShowMessage('Drugim sposobem można wymieszać co najmniej dwa wyrazy!');
  end
  else begin
    for i := 0 to ComboBox1.ItemIndex-1 do begin
      repeat
        wylosowano:=Random(iloscWyrazow)
      until (wykorzystane[wylosowano] = false){ and (wylosowano<>i)};
      wykorzystane[wylosowano]:=true;
      wylosowane[wylosowano]:=true;
      ShowMessage('Wybrano (lewa strona): '+ListBox1.Items[wylosowano]);
    end;

    for i := 0 to iloscWyrazow-1 do begin
      if wykorzystane[i] = true then begin
        Form1.Caption:=Form1.Caption+' '+IntToStr(i);
        ListBox2.Items[i]:='-';
        repeat
          repeat
            wylosowano:=Random(iloscWyrazow)
          until (wylosowane[wylosowano] = true) and (wylosowano=i);
        until (wylosowano=i);
        ShowMessage('Po zamianie(prawa strona): '+ListBox1.Items[wylosowano]);

        //ListBox2.Items[i]:=ListBox1.Items[wylosowano];
      end;

    end;
  end;
end;                       
0

Siedze i siedze i nie mam pomyslu jak to wypisac.

Jedyna mozliwosc na jaka wpadlem to wziac te co wylosowane i stworzyc z nich tablice z ktorej bedzie wypisywane na poszczegolne pozycje, ale to tak komplikuje kod ze nie potrafie tego napisac :(

0

nie wiemy co to jest combobox1, combobox2, listbox1, listbox2 itd... mamy się domyślać co jest od czego i jak wygląda Twój program?
jesli chcesz w listboxie zamienis dwa itemy miejscami, to jest od tego odpowiednia funkcja.
tak napisales ze wlasciwie nie wiadomo co chcesz osiagnac. napisz konkretnie jaki masz problem, bez wklejania polowy kodu programu.

i jeszcze kilka rzeczy:

for i:=0 to iloscWyrazow-1 do begin
    ListBox2.Items[i]:=ListBox1.Items[i];
  end;

po pierwsze: jesli masz tylko jedna instrukcje do wykonania to nie musisz jej zamykac w begin..end.
po drugie: nie musisz tego robic petla. wystarczy np:

ListBox2.Items:=ListBox1.Items; //listbox2.clear - niepotrzebne.

po trzecie: tablicaWykorzystanych - nazwa niewiele mowi, moim zdaniem nazwa typu powina brzmiec bardziej w stylu "tablicaBoolean".

0

sorki nie napisalem tak to jest listbox, a co do nazw to wiesz to przyzwyczajenie kazdy ma swoje

musze wypisac te wyrazy ktore zostaly wybrane do pomieszenia w losowej kolejnosci, a reszta wyrazow ma pozostac na swoim miejscu

0
mati napisał(a)

sorki nie napisalem tak to jest listbox, a co do nazw to wiesz to przyzwyczajenie kazdy ma swoje

to dla siebie mozesz pisac nawet sdkjhruruuurkjah4455kkk4l.Items.Add() ale licz sie z tym, ze jak ktos inny ma zerknąć na Twoj kod to nie bedzie mu sie chcialo tego czytac. Jak z wypracowaniem. Jesli dajesz komus do przeczytania to chyba starasz sie zeby bylo wyraznie napisane, nie?
Inna sprawa ze nauczyciel powinien Ci za cos takiego obnizyc ocene (u mnie za takie rzeczy sie nie zaliczalo).
moglbys chociaz w komentarzu do kodu napisac ktory komponent jest od czego.

0

W dziale praca widziałem jakiś post ze zleceniem na program, ale autor nie podaje szczegółów, a nick jest inny, więc nie wiem czy to ta sama osoba. Jednak tutaj podajesz dziwny przykład, bo na taki kod jak wkleiłeś nie chce się patrzeć choćby z powodu takiego nieprecyzyjnego nazewnictwa jak napisał cimak. Podajesz w tytule wyrazy a przykład z liczbami, rozumiem, że wyrazy mają różną długość i skłądają się z róznych znaków, no i teraz jeżeli chcemy sobie ułatwić to można zalożyć że jeżeli mieszamy tylko słowa a nie jakieś duże pliki tekstowe to można skorzystać ze zbioioru który w Pascalu/Delphi może liczyć maksymalnie 256 elementów. Może ktoś wpadnie na coś lepszego. Oczywiście Randomize dałem w tym miejscu jako przykład, ale powinieneś go użyć w kodzie tylko raz przed losowaiem najlepiej jeżeli piszesz w VCL to w OnCreate głownej formatki. Kod może nie jest najwydajniejszy, nie chciało mi się kombinować aż nad innym sposobem, a Twój problem zainteresował mnie na tyle, że napisałem to co napisałem. Jak widać dla 10000 wywołań czas około 850 dla 10000 takich samych słów przy założenia mieszania wszystkich ich 14 liter.

//...
type
  Tstring255 = string[255];
  TSetOfByte = set of Byte;

function MixCharsInWord(AWord : Tstring255; WhichChars : TSetOfByte) : string;
var
  I, R, Cnt : integer;
  MixStr, TmpStr, S : string;
begin
  Cnt := 0;
  Result := '';
  TmpStr := '';
  Randomize; // <- olaj sobie to w OnCreate
  if (Length(AWord) > 1) and (Length(AWord) < High(Byte)) then
  begin
    for I := 1 to High(Byte) do
    begin
      if I in WhichChars then
      begin
        Cnt := Cnt + 1;
      end;
    end;
    if Cnt > 1 then
    begin
      for I := 1 to Length(AWord) do
      begin
        if (I in WhichChars) then
        begin
          TmpStr := TmpStr + AWord[I];
        end;
      end;
      S := TmpStr;
      MixStr := '';
      repeat
        R := Random(Length(S)) + 1;
        MixStr := MixStr + S[R];
        Delete(S, R, 1);
      until S = '';
      for I := 1 to Length(AWord) do
      begin
        if (I in WhichChars) then
        begin
          if MixStr <> '' then
          begin
            Result := Result + MixStr[1];
            Delete(MixStr, 1, 1);
          end;
        end
        else
        begin
          Result := Result + AWord[I];
        end;
      end;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender : TObject);
var
  I, Start, Stop : Cardinal;
begin
  Start := GetTickCount;
  for I := 1 to 10000 do
  begin
    Edit2.Text := MixCharsInWord(Edit1.Text, [1..14]);
  end;
  Stop := GetTickCount;
  Form1.Caption := IntToStr(Stop - Start);
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1