potrebujem opravit program

Programovacie jazyky, rady, poradňa...
lusia15
Amateur
Amateur
Príspevky: 10
Registrovaný: 23 feb 2008, 11:14
Kontaktovať používateľa:

potrebujem opravit program

Príspevok od používateľa lusia15 »

Zdravim, zadanie programu je, že mám 3 listboxy. V prvom mám čísla, v treťom mám jedno číslo a podľa tohoto čísla budem posúvať čísla z prvého listboxu do druhého. Myslím to tak,(ak číslo v treťom listboxe je 1) že napr. prvé číslo v prvom listboxe bude druhé číslo v druhom listboxe ... až posledné číslo v prvom listboxe bude prvé v druhom listboxe). Číslo v treťom listboxe môže byť hociaké. Mám tu niečo. Len to nejako nefunguje.

Kód: Vybrať všetko

procedure TForm1.Button3Click(Sender: TObject);
var i,b,a,cislo,k,n:Integer;
begin
listbox2.Items.clear;
n:=listbox1.items.Count-1;
k:=listbox1.Items.Count;
cislo:=strtoint(listbox3.Items.Strings[0]);

if cislo >=k then
cislo:=cislo-k;

b:=k-cislo;

for i:=0 to n do
begin
a:=strtoint(listbox1.items.strings[i]);
if i < (k div 2) then
Listbox2.Items.insert(i+cislo,inttostr(a))   else
// if i>= k div 2 then
Listbox2.Items.insert(i-b,inttostr(a));

end;
end;

end.
Za pomoc vopred ďakujem.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: potrebujem opravit program

Príspevok od používateľa BX »

Co tam robia tie funkcie strtoint. Robíš to moc zložito:

Máš priemiestniť prvky z jedného listboxu do druhého a len im prehodiť poradie. Pri tom ťa obsah listboxu vôbec nezaujíma. Zaujíma ťa len počet prvkov a číslo posunu (3. listbox). Tak môžeš jednoducho každý prvok presunúť na odpovedajúci index.
Blbé je, že máš len funkciu insert, ktorá prilepí prvok na koniec. To sa dá ale jednoducho vyriešiť tým, že zistíš, ktorý prvok bude po posune prvý a začneš pekne od neho :)
Poznámka: modulo je kľúč
lusia15
Amateur
Amateur
Príspevky: 10
Registrovaný: 23 feb 2008, 11:14
Kontaktovať používateľa:

Re: potrebujem opravit program

Príspevok od používateľa lusia15 »

Troška som si to upravila. Našla som si chybu v cykle. Len neviem ako mám docieliť aby mi to zapisovalo, tak aby zistil, ktoré číslo bude prvé a zapísať ho.

Kód: Vybrať všetko

procedure TForm1.Button1Click(Sender: TObject);
var i,b,a,cislo,k,n:Integer;
begin
listbox2.Items.clear;
n:=listbox1.items.Count-1;
k:=listbox1.Items.Count;
cislo:=strtoint(listbox3.Items.Strings[0]);

if cislo >=k then
cislo:=cislo-k;

b:=k-cislo;

for i:=0 to n do
if i + cislo <=n  then
a:=i+cislo
else
a:=i-b;

for i:=n downto 0 do
Listbox2.Items.Add(listbox1.items.Strings[i]);



end;

end.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: potrebujem opravit program

Príspevok od používateľa BX »

Zaujímavo si to obišla podmienkou. A máš to predsa dobre, nie? Len nechápem, načo tam je ten poslednú for cyklus.
Veď predsa stačí napísať

Kód: Vybrať všetko

for i:=0 to n do
begin
if i + cislo <=n  then a:=i+cislo
else a:=i-b;

listbox2.Add(listbox1.item[a]);
end;
a malo by to ísť, nie? :)
lusia15
Amateur
Amateur
Príspevky: 10
Registrovaný: 23 feb 2008, 11:14
Kontaktovať používateľa:

Re: potrebujem opravit program

Príspevok od používateľa lusia15 »

Este som tam mala chybu. Posuvalo to opacnym smerom. Uz mi to ide. Diky ze si mi pomohol. :)
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: potrebujem opravit program

Príspevok od používateľa BX »

Neni zač :)

Každopádne si si tie podmienky mohla kľudne odpustiť a napísať to nejako takto:

Kód: Vybrať všetko

for i := 1+posuv to n+posuv do
begin
 listbox2.insert := listbox1.items[i mod n];
end;
(V prípade, že sa listbox indexuje od jednej. To si nie som istý)
lusia15
Amateur
Amateur
Príspevky: 10
Registrovaný: 23 feb 2008, 11:14
Kontaktovať používateľa:

Re: potrebujem opravit program

Príspevok od používateľa lusia15 »

Lenze ked pouzijem modulo budem tam mat viackrat tu istu hodnotu. Napr. mam posuv o 2. Cyklus pojde od 2 po 6. (listbox indexuje od 0). Cize to nie je dobre.
ak n:=4, posuv:=2,
tak 2 mod 4 = 2
3 mod 4 = 3
4 mod 4 = 0
5 mod 4 = 1
6 mod 4 = 2
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: potrebujem opravit program

Príspevok od používateľa BX »

Preto som napísal, že v prípade, že indexuje od jednej :)
Ak od nuly, tak to upravím takto:

Kód: Vybrať všetko

for i := (1-1)+posuv to (n-1)+posuv do
begin
listbox2.insert := listbox1.items[i mod n];
end;
a teda

Kód: Vybrať všetko

for i := posuv to n+posuv-1 do
begin
listbox2.insert := listbox1.items[i mod n];
end;
lusia15
Amateur
Amateur
Príspevky: 10
Registrovaný: 23 feb 2008, 11:14
Kontaktovať používateľa:

Re: potrebujem opravit program

Príspevok od používateľa lusia15 »

Skús si to nasimulovať. On neposunie všetky čísla, posunie len n-1 čísiel. A insertom to nejde. ide to prikazom Listbox2.items.Add(listbox1.items.strings[]). Zaujimalo by ma ako sa to da jednoduchsie spravit.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: potrebujem opravit program

Príspevok od používateľa BX »

Delphi nemám, spravil som to v C# a všetko ide ako má. Veď predsa, mám listbox:

Kód: Vybrať všetko

index, hodnota
0. 21
1. 22
2. 23
3. 24
4. 25
5. 26
posun = 2
n + posuv -1 = 6 + 2 - 1;

for i := 2 to 7 do (Cyklus bezi 6 krat od 2 do 7)
begin...
add(2 mod 6 = 2 => 23),
add(3 mod 6 = 3 => 24),
add(4 mod 6 = 4 => 25),
add(5 mod 6 = 5 => 26),
add(6 mod 6 = 0 => 21),
add(7 mod 6 = 1 => 22)
end;


Ak je v delphi nejaká záludnosť, záhada, prečo by to takto nemalo ísť, tak sa ospravedlňujem. Logika ja ale jasná.
lusia15
Amateur
Amateur
Príspevky: 10
Registrovaný: 23 feb 2008, 11:14
Kontaktovať používateľa:

Re: potrebujem opravit program

Príspevok od používateľa lusia15 »

Nechcem otravovat ale este nieco mi v tom nesedi. Tebe to posuva o 2 dozadu. Ked chcem dopredu tak sa to da ako upravit?
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: potrebujem opravit program

Príspevok od používateľa BX »

Jednoducho upravím začiatok rozsahu na číslo, ktoré by malo byť prvé a druhé doplním tak, aby sa cyklus vykonal práve n krát.
Takže nejako takto:

Kód: Vybrať všetko

for i := n-posuv to 2*n-posuv-1 do
begin
listbox2.add:= listbox1.items[i mod n];
end;
Napísať odpoveď