C#' da Rastgele bir kavram yazdırmak

sürevvar

Hectopat
Katılım
24 Temmuz 2013
Mesajlar
565
Makaleler
1
Benim verdiğim 20 kadar kavramı(kavramlar programa tanımlanacak sabit değerler olacak) ben butona bastığımda rastgele birisini seçip yazdıran bir programa ihtiyacım var ve aynı kavramı tekrar yazdırmayacak ve bu kavramın açıklamasını da ekrana yazdırması gerek. Pazartesi günü son gün yardımlarınızı bekliyorum.
 
Bir tane liste değişkeni tanımla ve buna istediğin değerleri aktar. Daha sonra buton olayına rastgele sayı oluşturan bir değişken tanımla bunun listede ki eleman sayısı ile sıfır arasında değer atamasını sağla. Değeri tanımladığında ekrana nasıl yazdıracak isen Liste[Rastgele] şeklinde yazdır ve yazdırdığını listeden sil. Listenin boş olup olmadığını kontrol etmeyi unutma.

Genel değişkenler :
Kod:
List<String> liste = new List<String>(20);
        Random rastgele = new Random(20);
        int i;

Arayüz yükleniş sırasında çalıştırılacaklar :
Kod:
liste.Add("Değişken 1");
            liste.Add("Değişken 2");
            liste.Add("Değişken 3");
            liste.Add("Değişken 4");
            liste.Add("Değişken 5");
            liste.Add("Değişken 6");
            liste.Add("Değişken 7");
            liste.Add("Değişken 8");
            liste.Add("Değişken 9");
            liste.Add("Değişken 10");
            liste.Add("Değişken 11");
            liste.Add("Değişken 12");
            liste.Add("Değişken 13");
            liste.Add("Değişken 14");
            liste.Add("Değişken 15");
            liste.Add("Değişken 16");
            liste.Add("Değişken 17");
            liste.Add("Değişken 18");
            liste.Add("Değişken 19");
            liste.Add("Değişken 20");

Butona eklenecekler :
Kod:
 if (liste.Count >= 1)
            {
                i = rastgele.Next(0, liste.Count);
                MessageBox.Show("Değişken : " + i.ToString() + " \n " + liste[i]);
                liste.Remove(liste[i]);
            }
            else
            {
                MessageBox.Show("Liste boş!");
            }

Yerinde olsam direk kopyalayarak kullanmam. Biraz üstünde oyna TRY-Catch ekle mesaj kutularını geliştir vs. kendinden bir şeyler ekle ki tam puan alasın.
 
Verdiğiniz bilgi için çok sağ olun ancak şimdi de şöyle bir sorunum var butona bastığım zaman Değişken 9 ile başlıyor ve belli bir sıraya göre gidiyor ve her programı çalıştırdığımda sürekli bunu yapıyor. Bense her çalıştırdığımda farklı değerler yazdırmasını istiyorum.
 
Merhabalar,
Bu da benden olsun. Formunuza bir buton ve 2 adet label ilave edin. Kodlar için Form_Load ve Buton_Click olaylarını kullandım.

Kod:
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public class Kavram
        {
            public string Adi
            {
                get;
                set;
            }

            public string Aciklama
            {
                get;
                set;
            }

            public static List<int> kullanilanIndeksler = new List<int>();
        }


        private List<Kavram> Kavramlar;

        private void Form1_Load(object sender, EventArgs e)
        {
            //Listeyi Kavram sınıfı nesneleri ile dolduruyoruz.
            Kavramlar = new List<Kavram>();

            Kavramlar.Add(new Kavram
            {
                Adi = "Kavram1",
                Aciklama = "Aciklama1"
            });

            Kavramlar.Add(new Kavram
            {
                Adi = "Kavram2",
                Aciklama = "Aciklama2"
            });

            Kavramlar.Add(new Kavram
            {
                Adi = "Kavram3",
                Aciklama = "Aciklama3"
            });

            Kavramlar.Add(new Kavram
            {
                Adi = "Kavram4",
                Aciklama = "Aciklama4"
            });       
        }

        private void btnKavramGetir_Click(object sender, EventArgs e)
        {
            int indeks;

            //Tekrarlı olmayan rastgele indeks üretme sekansı
            while (true)
            {
                Random r = new Random();
                indeks = r.Next(Kavramlar.Count);

                /*Rastgele üretilen indeks, Kavram.kullanilanIndeksler'de mevcut ise daha önce kullanılmıştır.
                 Bu yüzden kullanılmamış bir indeks bulana kadar rastgele sayı üretmeye devam.
                 */

                bool kavramDahaOnceGösterilmismi=Kavram.kullanilanIndeksler.Contains(indeks);

                if (kavramDahaOnceGösterilmismi==false)
                {
                    //Kullanılmamış bir indeks bulduk.
                    Kavram.kullanilanIndeksler.Add(indeks);                 
                    break;
                }
            }

            //Daha önce kullanılmamış bir indeks elimizde olduğuna göre bilgileri gösterebiliriz.
            Kavram siradakiKavram = Kavramlar[indeks];
            label1.Text = siradakiKavram.Adi;
            label2.Text = siradakiKavram.Aciklama;

            /*
             Kullanılmamış tüm indeksler tükendiyse yeniden başlayabilmek için
             Kavram.kullanilanIndeksler listesini sıfırlarız.
             */
            if (Kavram.kullanilanIndeksler.Count == Kavramlar.Count)
            {
                MessageBox.Show("Tüm kavram ve açıklamaları gösterildi.\nGösterime en baştan başlanacak.","Mesaj");
                Kavram.kullanilanIndeksler.Clear();
            }
        }


    }
 
Son düzenleme:
Bu kadar karmaşık hazırlamaya gerek yok. Ben sizin istediğiniz şeyi çok basit hazırladım. Sadece kod kısmını size buraya yazıyorum. Projenin tamamına bu bağlantıdan ulaşabilirsiniz.
Microsoft OneDrive - Access files anywhere. Create docs with free Office Online.
Kod:
        //ObservableCollection olmasının sebebi ListBox'ların değişimi algılaması
        public ObservableCollection<string> İlkListe { get; set; }
        public ObservableCollection<string> SonListe { get; set; }

        public MainWindow()
        {
            InitializeComponent();

            İlkListe = new ObservableCollection<string>() { "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20" };
            SonListe = new ObservableCollection<string>();

            ListBox_İlk.ItemsSource = İlkListe;
            ListBox_Son.ItemsSource = SonListe;
        }

        private void Button_Aktar_Click(object sender, RoutedEventArgs e)
        {
            if(SonListe.Count < İlkListe.Count)
            {
                Random random = new Random();
                string eklenecek;

                do
                {
                    int rastgelesayı = random.Next(İlkListe.Count);
                    eklenecek = İlkListe.ElementAt(rastgelesayı);
                } while (SonListe.Contains(eklenecek));

                SonListe.Add(eklenecek);
            }
            else
            {
                MessageBox.Show("Aktarılacak Değer Kalmadı", "HATA");
            }
        }
 
Son düzenleme:
Verdiğiniz bilgi için çok sağ olun ancak şimdi de şöyle bir sorunum var butona bastığım zaman Değişken 9 ile başlıyor ve belli bir sıraya göre gidiyor ve her programı çalıştırdığımda sürekli bunu yapıyor. Bense her çalıştırdığımda farklı değerler yazdırmasını istiyorum.
Ben programı denedim ve sonra paylaştım yapmanız gerek tek şey buton ekleyip kodları olması gereken yere eklemek. Dikkatli olun.
 
Bir tane liste değişkeni tanımla ve buna istediğin değerleri aktar. Daha sonra buton olayına rastgele sayı oluşturan bir değişken tanımla bunun listede ki eleman sayısı ile sıfır arasında değer atamasını sağla. Değeri tanımladığında ekrana nasıl yazdıracak isen Liste[Rastgele] şeklinde yazdır ve yazdırdığını listeden sil. Listenin boş olup olmadığını kontrol etmeyi unutma.

Genel değişkenler :
Kod:
List<String> liste = new List<String>(20);
        Random rastgele = new Random(20);
        int i;

Arayüz yükleniş sırasında çalıştırılacaklar :
Kod:
liste.Add("Değişken 1");
            liste.Add("Değişken 2");
            liste.Add("Değişken 3");
            liste.Add("Değişken 4");
            liste.Add("Değişken 5");
            liste.Add("Değişken 6");
            liste.Add("Değişken 7");
            liste.Add("Değişken 8");
            liste.Add("Değişken 9");
            liste.Add("Değişken 10");
            liste.Add("Değişken 11");
            liste.Add("Değişken 12");
            liste.Add("Değişken 13");
            liste.Add("Değişken 14");
            liste.Add("Değişken 15");
            liste.Add("Değişken 16");
            liste.Add("Değişken 17");
            liste.Add("Değişken 18");
            liste.Add("Değişken 19");
            liste.Add("Değişken 20");

Butona eklenecekler :
Kod:
 if (liste.Count >= 1)
            {
                i = rastgele.Next(0, liste.Count);
                MessageBox.Show("Değişken : " + i.ToString() + " \n " + liste[i]);
                liste.Remove(liste[i]);
            }
            else
            {
                MessageBox.Show("Liste boş!");
            }

Yerinde olsam direk kopyalayarak kullanmam. Biraz üstünde oyna TRY-Catch ekle mesaj kutularını geliştir vs. kendinden bir şeyler ekle ki tam puan alasın.

Tam olarak hangi kodu nereye yazacağımızı söyleyebilir misiniz?
 
Tam olarak hangi kodu nereye yazacağımızı söyleyebilir misiniz?
Öncelikle burada ki amacım yardımcı olmak. Daha bu kodu nereye ekleyeceğini bilmeyen bir insana yardımcı olup iyi not almasını kesinlikle istemem. Ondan sonra kalkıp eğitim sistemini kendimiz eleştiriyoruz. Benim size bu kadarını söylemem bile fazla, eğer bu bölümü okuyorsanız lütfen biraz çaba gösterip laiği ile yapın.
 
@beGi Yazım hatanızı düzeltmek isterim. Siz "laik" kelimesiyle "layık" kelimesini karıştırmışsınız. "laiği" kelimesinin doğrusu "layığı" olmalıydı. "layıkı" diyenler de var ama TDK sitesinde "layığı" diye yazılmış. Zaten Türkçe dil bilgisine uyan kelime "layığı" kelimesidir. Yumuşama kuralı bozulmamış oluyor.
Konuya dönecek olursak size tamamen katılıyorum. Ben kendisine projenin tamamının bağlantısını verdim. Visual Studio yüklüyse zaten çift tıkladığı anda çözüme ulaşacak.
Daha kodun nereye nasıl yazıldığı bilmeden kod talep etmek. Söyleyecek söz bulamıyorum doğrusu.
 
Son düzenleme:
Uyarı! Bu konu 10 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Yeni konular

Geri
Yukarı