Computer Programming Çıkmış Sorular – 2

Bir diğer çıkmış soru. Bunda geometri yok o yönden biraz daha rahattı. 🙂 Soruyu verelim hemen :


Çeşit çeşit fonksiyon istenmiş. Önce sırayla fonksiyonları verelim açıklamasıyla beraber, sonra da çalışan tam kodu veririz. A şıkkında istenen olayı main fonksiyonunda yaptığım için direkt olarak b şıkkına geçiyorum.

B şıkkında istenen fonksiyon şu:

void rastgele(double maxs, double mins, double pop[])
{
       int i, a;
       float b;

     for(i = 0 ; i < par.num_POP ; i++)
     {
           a = rand() % 1000;
           b = (a / 1000.0) * (maxs - mins) + mins;
           
           pop[i] = b;
           }
}

En kolay olacağını tahmin ettiğim bölüm buydu, fakat biraz uğraştırdı. srand fonksiyonu çalışmadı, garip bir hata verdi onunla uğraştım yapamadım. Sonra rand fonksiyonuna döndüm, bu sefer de rand'in ürettiği değerin integer olması, benim limitlerimin double olmasından dolayı % (remain) operatörünü kullanamamam gibi sorunlar baş gösterdi. Onu da rand ile 0'dan 1000'e kadar bir integer üretip, sonra onu 1000'e bölüp 0 ile 1 arası bir double sayı üreterek ve sınırlama işlemlerini yaparak hallettim. maxs ve mins zaten main fonksiyonundan gönderdiğim değerler. pop dizisi de aynı şekilde mainde ürettiğimiz num_POP elemanlı dizi. Dizinin bütün elemanlarına rastgele değer atamak için for yapısını kullandım. Bütün elemanları tarayarak hepsine uzun uğraşlar sonucu oluşan rastgele değeri atamış oldum.

İkinci fonksiyona geçelim. Yani c şıkkına:

double cSikki(double a)
{
       double sonuc;
       sonuc = a * a * a + 3 * a * a - 5;
       return sonuc;
       }

Bu fonksiyona bir isim bulamadım cSikki koydum adını 🙂 Aslında gayet basit bir iş yapıyor. main'den gönderilen double X sayısını fonksiyonda a ile karşıladım. Sonrasında sonuc değişkenine de benden istenen X³ + 3X² - 5 işleminin sonucunu atamış oldum. Bu sonuc değişkenini de return ile fonksiyonun geri döndürdüğü değer yaptım.

D şıkkına geçelim. Son fonksiyonumuz da şu:

void sort(double pop[])
{
     int i, j;
     double temp;
     
     for(i = 0 ; i < par.num_POP ; i++)
     {
           for(j = 1 ; j < par.num_POP ; j++)
           {
                 if(cSikki(pop[j]) < cSikki(pop[j-1]))
                 {
                                   temp = pop[j-1];
                                   pop[j-1] = pop[j];
                                   pop[j] = temp;
                                   }
                 }
           }
     
     }

Fonksiyonumuz sort. İngilizce sırala anlamına geliyor. Bu fonksiyonda "Bubble Sort" algoritmasını kullandım.

Bubble sort algoritmasından biraz bahsedecek olursak, bu algoritmanın mantığı şu: Ard arda gelen iki elemanı karşılaştırarak, (küçükten büyüğe sıraladığım için) küçük olanı üst sırada tutmak. Eğer j'inci elemanım j+1'inci elemanımdan küçükse herhangi bir değişiklik yapmıyorum. Fakat j+1'inci elemanım j'inci elemanımdan küçükse, o zaman bunların yerlerini değiştiriyorum. Karşılıklı yer değiştirme yapamadığımdan temp isimli değişkenim var. Elemanları taşırken temp, benim için geçici olarak elemanın birini tutuyor. Bu kontrol ederek yer değiştirme işlemini yeteri kadar yaparsam (ki bu en fazla tüm diziyi eleman sayısı kere taramaktır) sonuç olarak dizi küçükten büyüğe sıralanmış olur.

Bubble sort'u anlattıktan sonra bu fonksiyondaki işleyişine bakalım. Bizden istenen direkt olarak diziyi sıralamamız değil. Dizinin elemanlarını, X³ + 3X² -5 işlemine soktuktan sonra çıkan sayıya göre bu sıralamayı yapacağız. O zaman karşılaştırmamız gereken değerler j'inci ve j+'inci değil, "j³ + 3j² -5" ve "[j+1]³ + 3[j+1]² -5" değerleridir. E biz bu işlemi zaten cSikki isimli fonksiyonda yaptırmıştık. O zaman j ve j+1'i cSikki fonksiyonuna sokup, dönen değerleri karşılaştırırsak doğru sıralamayı yapmış oluruz.

Son fonksiyonu da bu şekilde tamamladıktan sonra, bir de yazdığım kodun tamamını ekleyeyim:

#include 
#include 
#include 

void rastgele(double, double, double[]);
double cSikki(double);
void sort(double[]);

struct PAR{
int num_POP;
int num_CLD;
int num_ITER;
double maxS,minS;
double C_ratio;
double M_ratio;
};

PAR par;

typedef struct PAR PAR;

int main()
{
    int i;
    double x;
    
    printf("num_POP girin : ");
    scanf("%d", &par.num_POP);
    
    printf("num_CLD girin : ");
    scanf("%d", &par.num_CLD);
    
    double popDizisi[par.num_POP];
    double cldDizisi[par.num_CLD];
    
    printf("Diziler olusturuldu.\n----------------------\n");
    
    printf("maxS girin : ");
    scanf("%lf", &par.maxS);
    
    printf("minS girin : ");
    scanf("%lf", &par.minS);
    
    rastgele(par.maxS, par.minS, popDizisi);
    
    printf("Diziye degerler atandi.\n\n");
    
    // ekrana bas
    for(i = 0 ; i < par.num_POP ; i++)
    printf("%lf - %lf\n", popDizisi[i], cSikki(popDizisi[i]));
    //--------------
    
    printf("--------------------\nC sikki : \n");
    
    printf("double X degerini girin : ");
    scanf("%lf", &x);
    
    printf("C sikkinin cevabi = %lf", cSikki(x));
    
    sort(popDizisi);
    
    printf("\n-------------------\nDizi formule gore siralandi.\n\n");
    
    // ekrana bas
    for(i = 0 ; i < par.num_POP ; i++)
    printf("%lf - %lf\n", popDizisi[i], cSikki(popDizisi[i]));
    //--------------
    
    getch();
    return 0;
}

void rastgele(double maxs, double mins, double pop[])
{
       int i, a;
       float b;

     for(i = 0 ; i < par.num_POP ; i++)
     {
           a = rand() % 1000;
           b = (a / 1000.0) * (maxs - mins) + mins;
           
           pop[i] = b;
           }
}

double cSikki(double a)
{
       double sonuc;
       sonuc = a * a * a + 3 * a * a - 5;
       return sonuc;
       }

void sort(double pop[])
{
     int i, j;
     double temp;
     
     for(i = 0 ; i < par.num_POP ; i++)
     {
           for(j = 1 ; j < par.num_POP ; j++)
           {
                 if(cSikki(pop[j]) < cSikki(pop[j-1]))
                 {
                                   temp = pop[j-1];
                                   pop[j-1] = pop[j];
                                   pop[j] = temp;
                                   }
                 }
           }
     
     }

En altta kalan 20 puanlık soru hakkında yorum yapmıyorum. 🙂 Saat 05:51, iyi geceler dilerim... 🙂

Share

Yorum Yap


Not - Bunları KullanabilirsinizHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>