Duyuruyu Kapat
Facebook Gözat
Twitter Gözat

ders programı düzenleyen programla ilgili yardım?

Konu, 'C / C++' kısmında koka tarafından paylaşıldı.

  1. koka

    koka Yeni Üye

    Kayıt:
    27 Haziran 2008
    Mesajlar:
    4
    Beğenilen Mesajlar:
    0
    merhabalar, input olarak öğrenci id lerini, öğrencilerin aldığı dersleri ders isimlerini ve derslerin haftalık kaç saat olduğunu alan ve buna uygun olarak hiç bir öğrencinin iki dersi çakışmayacak şekilde düzenleyen bir program yazıyorum. ama programı düzenleyen fonksiyonu hangi mantıkla yazacağımı bulamadım..


    bir ders eğer sekiz saat ise haftada,default olarak pazartesiden başlayarak ilk 8 saate yerleştiriyorum. bütün dersleri böyle yerleştridikten sonra, öğrencinin dersilerinin çakışmaması için dersleri hangi mantıkla yerlerini değiştirmeliyim. programı değil sadece mantığını istiyorum yardımcı olursanız sevinirim..

    veya en azından, haftalık slotları belirten bir 2d arrayin ( program[5][6] - 5 iş günü 6 ders- ) içinden benim yasakladığım noktalar dışında rastgele nokta seçecek bir fonksiyon varmı c++ libalrylerinde?
     
  2. Coldplay

    Coldplay Daimi Üye

    Kayıt:
    23 Haziran 2008
    Mesajlar:
    1,448
    Beğenilen Mesajlar:
    0
    Benim görüsüm bir matik cevabi yazabilmek icin soruda eksikler var. Cünkü tam olarak ne istiyorsan sinirlandirici $artlari belli degil. Eger haftada 8 saatlik bir dersi haftaya rastgele dagitmak istiyorsan bu cesitli sartlara bagli olmali ve ben bu sartlari burada göremedim. Mesela bir ögrenci ayni gün bir dersi 6 saat üst üste alabilir mi yoksa hergün o dersten maksimum 2 saat mi alabilir? Bir günde bir dersten 1 saat alabilir mi yoksa 2 saat gibi belli bir minimum deger var mi? Bunlari bilmeden bir mantik yürütmek zor gibime geliyor.

    Eger her ders saati teker teker ele alinabilirse, o zaman mesela sali günü 1. ders fizik ama ikinci ders raslanti eseri herhangi bir ders olabilir. Ama eger o gün 2 saat fizik dersi varsa bu 2. saat hemen bir sonraki saatte mi olmak zorunda? Bunun gibi sartlarin olup olmadigi da belirsiz.

    Eger her ders saati bagimsiz ele alinabilirse 5x6'lik bir array icin 1-30 arasi bir random sayi belirle. Bunun hangi günün kacinci saatine denk geldigini hesapla. Sonra tekrar bir random sayi belirle, ayni sayi ciktiysa yeni bir random sayi belirle. Böyle böyle bu islemi 30 defa yaparak her defasinda cikan sayinin daha önce cikmadigindan emin olduktan sonra array'e yerlestir. Tabi ki bu yukaridaki gibi sartlari bilmeden yapilabilecek en basit cözüm.
     
  3. koka

    koka Yeni Üye

    Kayıt:
    27 Haziran 2008
    Mesajlar:
    4
    Beğenilen Mesajlar:
    0
    bir öğrencinin iki dersinin aynı saate denk gelmemesi dışında bir şart yok. 1-30 aralığında bir random sayı seçmek en basiti bu durumda ama c++ da belli aralıkta random sayı seçen fonksiyon varmı?(vardır elbet ama ben bilmiyorum hali hazırda) hangi libraryde? ve nasıl kullanılıyo? biliyorsan yardımcı olurmusun?
     
  4. Coldplay

    Coldplay Daimi Üye

    Kayıt:
    23 Haziran 2008
    Mesajlar:
    1,448
    Beğenilen Mesajlar:
    0
    Selam, tabi ki yardimci olurum. Pazar günü disari cikip gezmek varken oturdum bilgisayarin basinda örnek bir program yazdim.:D

    Evet rand() fonksiyonuyla böyle rastgele sayilar üretebilirsin. Ama algoritma hep ayni sayi siralamasini verdiginden srand() fonksiyonuyla rand()'i bir kereye mahsus baslatman gerek (initialize). Bunun icin de her seferde kendini degistiren bir sayiyi srand() fonksiyonuna parametre olarak vermen gerek. Bunu 1970'den beri gecen süreyi saniye cinsinden geri veren time() fonksiyonuyla yapman mümkün. Sonucta her saniye bu deger degistigi icin programin ürettigi sayilarin siralamasi hep farkli olacak. Rand() fonksiyonunun verdigi sayiyi mod30'a göre degerlendirirsen ( sayi = rand()%30 $eklinde ) 0-29 arasi sayilar elde edersin.

    Asagida verdigim program 30 elemanlik bir array'e birden otuza kadar sayilari hic iki array elemani esit olmayacak sekilde rastgele dolduruyor. Bu örnekteki mantigi kullanarak sayilarla dersler arasindaki baglantilari tanimlayip, array elemanlarini altisar altisar günlere göre guruplayabilirsin.

    Örnekte anlamadigin veya kendi programina aktarirken zorlandigin yerler olursa her zaman yardim isteyebilirsin.

    Kod:
    #include <iostream>
    #include <cstdlib>
    #include <time.h>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        int array[30];
        int randomSayi;
        bool sayiKayitli = false;
        
        // (initialize)
        srand ( (unsigned)time( NULL )  );
    
        for (int i=0; i<30; i++)
            array[i] = 0;
    
        for (int i=0; i<30; i++)
        {
            do
            {
                sayiKayitli = false;
    
                randomSayi = rand()%30+1;
    
                for (int j=0; j<=i; j++)
                {
                    if (array[j] == randomSayi)
                        sayiKayitli = true;
                }
                
            }
            while(sayiKayitli == true);
    
            array[i] = randomSayi;
    
        }
    
        cout<<endl<<"30 farkli kutuya 30 farkli sayiyi hic iki sayi ayni olmayacak sekilde yerlestirdik:"<<endl;
        //cout<<"\n";
        for (int i=0; i<30; i++)
        {
            cout<<"Array["<<i<<"] = "<<array[i]<<endl;
        }
    
        return 0;
    }
    Bu arada dikkat cekmek istedigim bir konu. Bütün arrayi önce sifir yerine -1'le doldursam daha iyiydi. Cünkü eger 1-30 sayilari yerine 0-29 sayilarini kaydetmek istesek sifiri kaydetmek hic mümkün olmazdi. Rand() 0-29 sayilarini vermesine ragmen ben hep bir ekleyip 1-30 arasi degerleri kaydettigim icin bu konuda sans eseri hata yapmamisim.
     
  5. acehreli

    acehreli Ali Çehreli

    Kayıt:
    19 Ekim 2002
    Mesajlar:
    4,973
    Beğenilen Mesajlar:
    2
    Diziyi ilklemek icin bir dOngU kullanmak da ancak 0 disinda bir deger kullanildiginda gerekirdi zaten. Yoksa en kolayi bu isi derleyiciye birakmaktir:

    Kod:
    int array[30] = { 0 };
    Ama tabii gercekten C++ yaziyorsak dizi yerine vector kullanmayi da dusunebilirdik.

    Coldplay'in algoritmasi 30 gibi kucuk bir sayida yeterince hizli calisir ama daha buyuk dizilerde cok uzun zaman alabilir. Bu isin cok daha hizli bir algoritmasi da var: diziyi 1'den 30'a kadar degerlerle doldur; sonra rastgele iki tanesini yer degistir. Bu isi "yeterli sayida" yaparsak karisik bir dizimiz olur.

    Ali
     
  6. Coldplay

    Coldplay Daimi Üye

    Kayıt:
    23 Haziran 2008
    Mesajlar:
    1,448
    Beğenilen Mesajlar:
    0
    Tabi ki array'le yapabilecegimiz pekcok seyi vektörle de yapabiliriz. Burada soru soran her arkadasin programlama düzeyini bilmedigim icin herkesin anlayabilecegi sekilde yapmaya calisiyorum.

    Performans konusunda haklisiniz, yazdigim programda eger array büyükse if sorgulari zaman alir. Ama bu metod en azindan kesinlikle arraydeki degerlerin %100 homojen olmasini sagliyor. Eger sizin dediginiz gibi degistirme metodunu uygularsak ve %100 homojenlik istiyorsak her elemanin yerinden oynatildigindan emin olmak icin yine benzer sekilde if sorgulariyla performans sorunu yasayabiliriz.
     
  7. acehreli

    acehreli Ali Çehreli

    Kayıt:
    19 Ekim 2002
    Mesajlar:
    4,973
    Beğenilen Mesajlar:
    2