Prog.Odevi: Her Vezir bir sonrakini yokediyor,sağ kalan tek?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
ALUCARD
Üye
Mesajlar: 1270
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Mesaj gönderen ALUCARD »

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
function SonKalaniBul(const ElemanSayisi:Integer):Integer;
begin
Result:=1;//2'nin sıfırıncı kuvveti
while Result<=ElemanSayisi do Result:=Result shl 1;//2'nin bir üst kuvveti
Result:=2*(ElemanSayisi-(Result shr 1))+1;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(inttostr(SonKalaniBul(strtoint(edit1.Text))));
end;

end.

label1 caption özelliği := vezir sayısını giriniz.
Edit1 e vezir sayısını gir
button1 e de hesapla yaz
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365. Üyesi
Hiç Bir Şey İnsan Kadar Yükselemez ve Alçalamaz

Erkan ÇAĞLAR
Kullanıcı avatarı
raikkonen21
Üye
Mesajlar: 49
Kayıt: 02 Nis 2007 10:02
Konum: Konya

Mesaj gönderen raikkonen21 »

cok tesekkur ederım ALUCART emegı gecen tum abılere tesekkurler..
ellerınıze saglık..
Kullanıcı avatarı
raikkonen21
Üye
Mesajlar: 49
Kayıt: 02 Nis 2007 10:02
Konum: Konya

Mesaj gönderen raikkonen21 »

kusura bakmayın ben bır noktayı daha kacırdım odevı gonderınce hoca bana kılıcı hep bıre vermeyecem kı dedı :S
ıstedıgıne verebılecekmıs
Kullanıcı avatarı
raikkonen21
Üye
Mesajlar: 49
Kayıt: 02 Nis 2007 10:02
Konum: Konya

Mesaj gönderen raikkonen21 »

yani sozun ozu 10 tane vezır den 7. ye verdıgımızde 1. kalıyor ben resultun karsısına 7 yazdıgımda 7 degerını verdı.bazen dogruluyor bazen dogrulamıyor
Kullanıcı avatarı
ALUCARD
Üye
Mesajlar: 1270
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Mesaj gönderen ALUCARD »

sen resultun karşısına neden 7 yazıyorsunki orası o amaçla kullanılmıyor
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365. Üyesi
Hiç Bir Şey İnsan Kadar Yükselemez ve Alçalamaz

Erkan ÇAĞLAR
Kullanıcı avatarı
raikkonen21
Üye
Mesajlar: 49
Kayıt: 02 Nis 2007 10:02
Konum: Konya

Mesaj gönderen raikkonen21 »

sabanakman hocam verdıgınız kodda 6 yazdıgım zaman 1 cıkıyor fakat cevap 5 yanı besıncı kalıyor..
halka seklınde dızdıgımız zaman vezırlerı 6 vezır saat yonunde 1 den baslayıp atlayarak kesmeye baslasak.1 2 yı keser 3 e veerır 3 4 u kese 5 e verır 5 6 yı keser 1 e verır 1 3 u keser 5 e verır 5 te 1 ı keser kendısı kalır..buna artı olarak bu kılıcı 2 ye versek mesela 6 vezır var yıne 2.cı vezıre versek..saat yonunde dondursek yıne 6. vezır kalır.
Kullanıcı avatarı
raikkonen21
Üye
Mesajlar: 49
Kayıt: 02 Nis 2007 10:02
Konum: Konya

Mesaj gönderen raikkonen21 »

programda sorun yok ozur dılerım.ben programı karıstırıken resultun baslangıc degerı oldugunu zannettım degıstırdım ettım falan ama bazen oluyor bazen olmuyor.su an kılıcı verecegım kısıyı secmek yanı bır edıt daha gerekıyor.oraya kacıncı kısı olacagını yazıp vezır sayısını yazıp buttona bastıgımızda yazacak ama ben hala bulamadım programı anlamaya calısıyıroum..fonksıyonları bız yenı gorduk..daha tam anlamıs degılız..shl shr olayını dagecen hafta gorduk tam denk geldı..ama hoca bıze baska sekılde anlatmıstı..arastırıp bakınca daha ıyı anladım

shl

Deger := 20;
Sonuc := Deger Shl 5; // 2^5*20=640
Caption:= FloatToStr(Sonuc); // 640 yazar

buymus bıze ıkılık sıstemde oteleme seklınde anlatmıstı gercı bıraz bakınca aynı ama bu daha anlasılır
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Mesaj gönderen Opt2000 »

Selam,

Eğer programcılığa yeni başladıysan basit ama uzun bir kodla işi çözmek daha iyi olur. Aşağıda senin için güzel olacağını düşündüğüm bir örnek veriyorum.

dfm dosyası

Kod: Tümünü seç

object Form1: TForm1
  Left = 192
  Top = 122
  Width = 537
  Height = 545
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object btnListe: TButton
    Left = 20
    Top = 20
    Width = 113
    Height = 37
    Caption = 'Vezir Listesi Oluştur'
    TabOrder = 0
    OnClick = btnListeClick
  end
  object lvVezirListesi: TListView
    Left = 8
    Top = 80
    Width = 497
    Height = 409
    Columns = <
      item
        Caption = 'Vezir Adı'
        Width = 150
      end>
    ReadOnly = True
    TabOrder = 1
    ViewStyle = vsList
  end
  object edtVezirSayisi: TEdit
    Left = 144
    Top = 32
    Width = 69
    Height = 21
    TabOrder = 2
    Text = '50'
  end
  object btnKes: TButton
    Left = 232
    Top = 24
    Width = 113
    Height = 37
    Caption = 'Kesmeye Başla'
    TabOrder = 3
    OnClick = btnKesClick
  end
end
Pas dosyası

Kod: Tümünü seç

unit ViewerMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    btnListe: TButton;
    lvVezirListesi: TListView;
    edtVezirSayisi: TEdit;
    btnKes: TButton;
    procedure btnListeClick(Sender: TObject);
    procedure btnKesClick(Sender: TObject);
  private
    procedure ClearList;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnListeClick(Sender: TObject);
var
  I,Count:integer;
  Item:TListItem;
begin
  if not TryStrToInt(edtVezirSayisi.Text, Count) then
  begin
    MessageBox(Handle, 'Tam sayı giriniz!', PChar(Application.Title), MB_OK + MB_ICONINFORMATION);
    Exit;
  end;

  ClearList;

  lvVezirListesi.Items.BeginUpdate;
  for I:=1 to Count do
  begin
    Item := lvVezirListesi.Items.Add;
    Item.Caption := 'Vezir ' + IntToStr(I);
  end;
  lvVezirListesi.Items.EndUpdate;

end;

procedure TForm1.btnKesClick(Sender: TObject);
var
  Index:Integer;
  Item:TListItem;
begin
  lvVezirListesi.Items.BeginUpdate;

  if lvVezirListesi.SelCount = 0 then
    Item := lvVezirListesi.Items.Item[0]
  else
    Item := lvVezirListesi.Selected;

  while lvVezirListesi.Items.Count > 1 do
  begin
    //Elinde kılıç olan vezirin şu anki sırasını bul
    Index := lvVezirListesi.Items.IndexOf(Item);

    //Sonraki veziri bul
    Index := (Index + 1) mod lvVezirListesi.Items.Count;

    //Sonraki veziri sil
    lvVezirListesi.Items.Delete(Index);

    //Şu anki veziri tekrar bul (Aslında pek de gerek yok)
    Index := lvVezirListesi.Items.IndexOf(Item);

    //Kılıcın verileceği vezirin sırasını bul
    Index := (Index + 1) mod lvVezirListesi.Items.Count;

    //Kılıcı vezire ver
    Item := lvVezirListesi.Items.Item[Index];

    //Her adımda görmek istiyorsan aşağıda commenti iptal et
    //Ayrıca lvVezirListesi.Items.BeginUpdate ve lvVezirListesi.Items.EndUpdate; satırlarını da commentle
    //ShowMessage('Kontrol Et');
  end;

  lvVezirListesi.Items.EndUpdate;
end;

procedure TForm1.ClearList;
begin
  lvVezirListesi.Clear;
end;

end.
Vezirleri listelemek için TListView kullandım. Bunun en büyük sebebi eğer hocan vezirlere başka özellikler eklemeni isterse, TListItem'ın Data özelliğini kullanabilecek olmandır. Böylece çok fazla değişiklik yapmana gerek kalmayacak.

Kullanımına gelince: Önce Edit'e kaç tane vezir eklemek istediğini yazıyorsun ve "Vezir Listesi Oluştur" düğmesine basıyorsun. Listeye vezirler ekleniyor. Daha sonra kılıcı ilk olarak hangi vezire vermek istiyorsan listeden onu seçiyorsun. Eğer seçim yapmazsan kılıç ilk vezire veriliyor. Sonra da "Kesmeye Başla" düğmesine basıyorsun. Sonuçta listede bir tane vezir kalıyor. Zaten dikkat edersen döngü bir tane vezir kalana kadar devam ediyor.

Kolay gelsin,
Bahadır Alkaç
Kullanıcı avatarı
raikkonen21
Üye
Mesajlar: 49
Kayıt: 02 Nis 2007 10:02
Konum: Konya

Mesaj gönderen raikkonen21 »

hocam cok tesekkur ederım fakat verdıgınız kodlardan pas da bır sorun var galıba..arastırım 2 saat ugrastım yıne yapamadım
ViewerMain; de takılıyor unıt yazdıgımda ekran acılıyor fakat calısmıyor...
Kullanıcı avatarı
raikkonen21
Üye
Mesajlar: 49
Kayıt: 02 Nis 2007 10:02
Konum: Konya

Mesaj gönderen raikkonen21 »

benım anladıgım ıtem lıstesı olustur demeden once edıte kac tane vezır olacak onu yazıyoruz.sonrasında lısteden bırını secıp kesmeye basla dıyoruz galıba..oyle ıse calısma prensıbı guzel..farklı dusunmussunuz.
ama oncekını anlamak hocaya anlatmak bıraz daha kolay gıbı geldı sızın yazdıgınız komutlardan bazılarını gormedık bız ama yınede calıstırıp bakıp calısacagım olursa..oncekı komutlar da cok ogretıcı oldu. bu sayede shll ve shr nın ne ıse yarradıgını tam oogrendım.
hala ugrasıyorum yapamadım ..
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Mesaj gönderen Opt2000 »

Selam,

Kod: Tümünü seç

unit ViewerMain;
Bu satırdaki ismin, formun dosya ismi ile aynı olması gerekiyor. Yani kodun çalışması için bu kodu yazdığınız dosyanın adı ViewerMain olmalı. (Yeni bir yardımcı programa başlıyordum ki, cevap yazmak istedim, bu yüzden böyle bir ismi var).
benım anladıgım ıtem lıstesı olustur demeden once edıte kac tane vezır olacak onu yazıyoruz.sonrasında lısteden bırını secıp kesmeye basla dıyoruz galıba..oyle ıse calısma prensıbı guzel..farklı dusunmussunuz.
Evet, çalışma mantığı tamamen böyle.
ama oncekını anlamak hocaya anlatmak bıraz daha kolay gıbı geldı sızın yazdıgınız komutlardan bazılarını gormedık bız ama yınede calıstırıp bakıp calısacagım olursa..oncekı komutlar da cok ogretıcı oldu. bu sayede shll ve shr nın ne ıse yarradıgını tam oogrendım.
hala ugrasıyorum yapamadım ..
Aslında kullanılan komutlar ve genel mantık çok basit. Yabancı gelebilecek sanırım sadece TListView bileşeni var ve bunun normal bir TListBox ile değiştirmek gerçekten de çok kolay. Kodu incelediğin zaman basit olduğunu göreceksin.

Kolay gelsin,
Bahadır Alkaç
Kullanıcı avatarı
raikkonen21
Üye
Mesajlar: 49
Kayıt: 02 Nis 2007 10:02
Konum: Konya

Mesaj gönderen raikkonen21 »

hocam ellerine emegıne saglık..gercekten cok guzel olmus..benım bıraz calısmam lasım ..bunu yaptıgıma ınanacagını sanmıyorum ama neyse calısıcaz
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

afferin...
gazı verdin ödevi arkadaşlara yaptırdın. :lol:
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Kod: Tümünü seç

function SonKalaniBul(const ElemanSayisi:Integer):Integer;
begin
  Result:=1;
  while Result<=ElemanSayisi do Result:=Result shl 1;
  Result:=ElemanSayisi-(Result shr 1);
  Result:=2*Result+1;
end;
raikkonen21 yazdı:sabanakman hocam verdıgınız kodda 6 yazdıgım zaman 1 cıkıyor fakat cevap 5 yanı besıncı kalıyor..
halka seklınde dızdıgımız zaman vezırlerı 6 vezır saat yonunde 1 den baslayıp atlayarak kesmeye baslasak.1 2 yı keser 3 e veerır 3 4 u kese 5 e verır 5 6 yı keser 1 e verır 1 3 u keser 5 e verır 5 te 1 ı keser kendısı kalır..buna artı olarak bu kılıcı 2 ye versek mesela 6 vezır var yıne 2.cı vezıre versek..saat yonunde dondursek yıne 6. vezır kalır.
Hayır 5 çıkıyor. Ayrıca ilk elemanın değişmesi sonucu sona kalanı bulmak çok zor olmasa gerek.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@aslangeri yazdı:afferin...
gazı verdin ödevi arkadaşlara yaptırdın. :D
:lol:

- Arkadaşlar basit düşünün...

- Neden hala basit bir Repeat Until döngüsü ile @Opt2000 gibi "sanal vezir arenası" kurmuyorsun anlamıyorum ? :wink: Formül de zaten tümden gelim metodu ile çıktı ki, bütünü irdeleyin program kendiliğinden oluşacaktır.

Kod: Tümünü seç

Function SagKalan( VezirSayisi, IlkVezir: Integer ):Integer;
Var
  Dizi  : Array of Integer;
  Konum, Sayac : Integer;
  Olsun : Boolean;
begin
  Result := -1;
  Setlength(Dizi, VezirSayisi);
  ...
  ...
  Repeat
    ...
    ...
  Until .....;
end;
- Toplam 20..25 satır kodlu bir fonksiyon tutuyor...

- Ben henüz kod yazmadım, çünkü @raikkonen21'in çabasını kod olarak daha göremedim. :idea:

- Yeni formül üretmek istenirse 100 vezir için aşağıdaki, ama sanal arena kurmakta fayda görüyorum.

- Konuyu kavradığınızı görmek, hem bizim hem de hocanızın; sizin hakkınızdaki öğrenci olarak fikrini olumlu kılacaktır. :wink:

Kod: Tümünü seç

09.04.2007 11:18:10
  100 Vezir'den  ilk Vezir =     1 ise kalan 73
  100 Vezir'den  ilk Vezir =     2 ise kalan 74
  100 Vezir'den  ilk Vezir =     3 ise kalan 75
  100 Vezir'den  ilk Vezir =     4 ise kalan 76
  100 Vezir'den  ilk Vezir =     5 ise kalan 77
  100 Vezir'den  ilk Vezir =     6 ise kalan 78
  100 Vezir'den  ilk Vezir =     7 ise kalan 79
  100 Vezir'den  ilk Vezir =     8 ise kalan 80
  100 Vezir'den  ilk Vezir =     9 ise kalan 81
  100 Vezir'den  ilk Vezir =    10 ise kalan 82
  100 Vezir'den  ilk Vezir =    11 ise kalan 83
  100 Vezir'den  ilk Vezir =    12 ise kalan 84
  100 Vezir'den  ilk Vezir =    13 ise kalan 85
  100 Vezir'den  ilk Vezir =    14 ise kalan 86
  100 Vezir'den  ilk Vezir =    15 ise kalan 87
  100 Vezir'den  ilk Vezir =    16 ise kalan 88
  100 Vezir'den  ilk Vezir =    17 ise kalan 89
  100 Vezir'den  ilk Vezir =    18 ise kalan 90
  100 Vezir'den  ilk Vezir =    19 ise kalan 91
  100 Vezir'den  ilk Vezir =    20 ise kalan 92
  100 Vezir'den  ilk Vezir =    21 ise kalan 93
  100 Vezir'den  ilk Vezir =    22 ise kalan 94
  100 Vezir'den  ilk Vezir =    23 ise kalan 95
  100 Vezir'den  ilk Vezir =    24 ise kalan 96
  100 Vezir'den  ilk Vezir =    25 ise kalan 97
  100 Vezir'den  ilk Vezir =    26 ise kalan 98
  100 Vezir'den  ilk Vezir =    27 ise kalan 99
  100 Vezir'den  ilk Vezir =    28 ise kalan 100
  100 Vezir'den  ilk Vezir =    29 ise kalan 1
  100 Vezir'den  ilk Vezir =    30 ise kalan 2
  100 Vezir'den  ilk Vezir =    31 ise kalan 3
  100 Vezir'den  ilk Vezir =    32 ise kalan 4
  100 Vezir'den  ilk Vezir =    33 ise kalan 5
  100 Vezir'den  ilk Vezir =    34 ise kalan 6
  100 Vezir'den  ilk Vezir =    35 ise kalan 7
  100 Vezir'den  ilk Vezir =    36 ise kalan 8
  100 Vezir'den  ilk Vezir =    37 ise kalan 9
  100 Vezir'den  ilk Vezir =    38 ise kalan 10
  100 Vezir'den  ilk Vezir =    39 ise kalan 11
  100 Vezir'den  ilk Vezir =    40 ise kalan 12
  100 Vezir'den  ilk Vezir =    41 ise kalan 13
  100 Vezir'den  ilk Vezir =    42 ise kalan 14
  100 Vezir'den  ilk Vezir =    43 ise kalan 15
  100 Vezir'den  ilk Vezir =    44 ise kalan 16
  100 Vezir'den  ilk Vezir =    45 ise kalan 17
  100 Vezir'den  ilk Vezir =    46 ise kalan 18
  100 Vezir'den  ilk Vezir =    47 ise kalan 19
  100 Vezir'den  ilk Vezir =    48 ise kalan 20
  100 Vezir'den  ilk Vezir =    49 ise kalan 21
  100 Vezir'den  ilk Vezir =    50 ise kalan 22
  100 Vezir'den  ilk Vezir =    51 ise kalan 23
  100 Vezir'den  ilk Vezir =    52 ise kalan 24
  100 Vezir'den  ilk Vezir =    53 ise kalan 25
  100 Vezir'den  ilk Vezir =    54 ise kalan 26
  100 Vezir'den  ilk Vezir =    55 ise kalan 27
  100 Vezir'den  ilk Vezir =    56 ise kalan 28
  100 Vezir'den  ilk Vezir =    57 ise kalan 29
  100 Vezir'den  ilk Vezir =    58 ise kalan 30
  100 Vezir'den  ilk Vezir =    59 ise kalan 31
  100 Vezir'den  ilk Vezir =    60 ise kalan 32
  100 Vezir'den  ilk Vezir =    61 ise kalan 33
  100 Vezir'den  ilk Vezir =    62 ise kalan 34
  100 Vezir'den  ilk Vezir =    63 ise kalan 35
  100 Vezir'den  ilk Vezir =    64 ise kalan 36
  100 Vezir'den  ilk Vezir =    65 ise kalan 37
  100 Vezir'den  ilk Vezir =    66 ise kalan 38
  100 Vezir'den  ilk Vezir =    67 ise kalan 39
  100 Vezir'den  ilk Vezir =    68 ise kalan 40
  100 Vezir'den  ilk Vezir =    69 ise kalan 41
  100 Vezir'den  ilk Vezir =    70 ise kalan 42
  100 Vezir'den  ilk Vezir =    71 ise kalan 43
  100 Vezir'den  ilk Vezir =    72 ise kalan 44
  100 Vezir'den  ilk Vezir =    73 ise kalan 45
  100 Vezir'den  ilk Vezir =    74 ise kalan 46
  100 Vezir'den  ilk Vezir =    75 ise kalan 47
  100 Vezir'den  ilk Vezir =    76 ise kalan 48
  100 Vezir'den  ilk Vezir =    77 ise kalan 49
  100 Vezir'den  ilk Vezir =    78 ise kalan 50
  100 Vezir'den  ilk Vezir =    79 ise kalan 51
  100 Vezir'den  ilk Vezir =    80 ise kalan 52
  100 Vezir'den  ilk Vezir =    81 ise kalan 53
  100 Vezir'den  ilk Vezir =    82 ise kalan 54
  100 Vezir'den  ilk Vezir =    83 ise kalan 55
  100 Vezir'den  ilk Vezir =    84 ise kalan 56
  100 Vezir'den  ilk Vezir =    85 ise kalan 57
  100 Vezir'den  ilk Vezir =    86 ise kalan 58
  100 Vezir'den  ilk Vezir =    87 ise kalan 59
  100 Vezir'den  ilk Vezir =    88 ise kalan 60
  100 Vezir'den  ilk Vezir =    89 ise kalan 61
  100 Vezir'den  ilk Vezir =    90 ise kalan 62
  100 Vezir'den  ilk Vezir =    91 ise kalan 63
  100 Vezir'den  ilk Vezir =    92 ise kalan 64
  100 Vezir'den  ilk Vezir =    93 ise kalan 65
  100 Vezir'den  ilk Vezir =    94 ise kalan 66
  100 Vezir'den  ilk Vezir =    95 ise kalan 67
  100 Vezir'den  ilk Vezir =    96 ise kalan 68
  100 Vezir'den  ilk Vezir =    97 ise kalan 69
  100 Vezir'den  ilk Vezir =    98 ise kalan 70
  100 Vezir'den  ilk Vezir =    99 ise kalan 71
  100 Vezir'den  ilk Vezir =   100 ise kalan 72
09.04.2007 11:18:10
Resim
Resim ....Resim
Cevapla