💻 Bilgisayar, 💾 Programlama

Genel Seçim Sonuçları

Dördüncü algoritma ödevimiz ve benim çözümüm… Bu ödev 90 almış. 10 puan nereden gitti hiç bir fikrim yok ve öğrenmeye de niyetim yok. =)

Ödevi indirmeden ve incelemeden önce bazı notlar:

  • Girdi olarak kullanılacak secim.dat dosyası örnek dosyada verilen yapıda olmalıdır. En son satırdan sonra satır sonu karakteri (ASCII:33) olmadığına lütfen dikkat ediniz.
  • Bu ödevi uzun uzun kontrol etme şansını bulamadım. Özellikle sağolsun pazartesi sabahı söylenen oyların eşit olması durumunda iktidar partisi seçimi ve birden fazla ana muhalefet partisi olma durumlarını yazdıktan sonra hiç test etmedim. Bu kadar geç söylenmesine sinir oluyor ve yazdığım kodda hata olmamasını umuyorum.

Kaynak kodunu incelemek ve fikir sahibi olmak amacıyla kullanabilirsiniz. Ama doğrudan kopyala yapıştır yapmak veya kendinize mal etmek yasak. Kopya çekmeyelim =)

Bu günlerde kendimi bomboş, amaçsız ve hafif tedirgin hissediyorum… Bomboş yaşıyormuşum gibi… Sizin böyle hissetmemeniz dileklerimle. Mutlu olun, nasıl olabiliyorsanız onu yaparak

Kaynak kodlarının bir kopyasını aşağıda bulabilirsiniz:

#include <stdio.h>
#include <stdlib.h>

void sirala(int *sirala, char *karakter) {

    /* Bu foksiyon int girdilerini büyükten küçüğe sıralarken char dizisinde de
       aynı indise sahip elemanlarınn yerlerini değiştirir.
       Bu fonksiyonda girdide eşitlik olması durumu gözardı edilmiştir.       */

    char sayac1, sayac2;                  /* Önce karakter dizisinin elemanlarını sıfırlayalım. */
    int gecici;                           /* Aslında bu sıfırlama kullanılmasa fonksiyon daha   */
                                           /* genel olurdu. Ancak sıralama partiler dışında bir  */
    for (sayac1=0; sayac1<8;sayac1++) {   /* yerde kullanılmayacağından burada sıfırlamayı daha */
        karakter[sayac1] = sayac1;        /* uygun gördüm.                                      */
    }

    for (sayac1=0; sayac1<7;sayac1++) {                   /* SIRALAMA ALGORITMASI (Selection Sort)             */
        for (sayac2=sayac1 + 1; sayac2<8;sayac2++) {      /* Selection Sort algoritması'nın 8 elemanlık diziye */
            if (sirala[sayac1] < sirala[sayac2]) {        /* uyarlanmış versiyonu.                             */
                gecici = sirala[sayac1];
                sirala[sayac1] = sirala[sayac2];
                sirala[sayac2] = gecici;

                gecici = karakter[sayac1]; // integer'a char atiyorum ama sorun olmuyor. integerin tanim araligi daha büyük nasilsa.
                karakter[sayac1] = karakter[sayac2];
                karakter[sayac2] = gecici; // char'a integer atiyorum ama iki satir ustte integer'e char kadar küçük bir değer atadığımı biliyorum.

            }

        }
    }

}

void mvsay (int *parti_oy, int *mvsay, int kontenjan) {

    /* Bu foksiyon milletvekili sayılarını hesaplayarak mvsay dizisinde geri
       gönderir. Hangi milletvekili sayısının hangi partiye ait olduğunun
       sırası parti oy sayılarının geldiği dizi ile aynıdır.              */

    int azaltilan_oy[8];  // Asıl parti oy sayısı setinin etkilenmemesi için tüm girdiler bu değişkene kopyalanacak.
    char sayac;

    for (sayac=0;sayac<8;sayac++) {
        azaltilan_oy[sayac] = parti_oy[sayac];  // Asıl parti oy sayısı setinin etkilenmemesi için tüm girdiler bu değişkene kopyalanacak.
    }

    for (sayac=0;sayac<8;sayac++) {
        mvsay[sayac] = 0; // Değişken sıfırlama
    }

    /* Milletvekili sayısı hesaplama algoritması BAŞLANGICI */
    for (sayac=1;sayac<=kontenjan;sayac++) {
        mvsay[enbuyuk(azaltilan_oy)]++;
        azaltilan_oy[enbuyuk(azaltilan_oy)] = azaltilan_oy[enbuyuk(azaltilan_oy)] / 2;
    }
    /* Milletvekili sayısı hesaplama algoritması SONU */

}

int enbuyuk (int *girdi) {

    /* 8 elemanlık girdi[] dizisinin en büyük elemanının kaçıncı eleman
       olduğunu döndürür. 0 ile 7 arası bir değer döndürür.
       Bu fonksiyonda girdide eşitlik olması durumu gözardı edilmiştir.       */

    char sayac;
    int enbuyuk=0; // İlk başta en büyük 0. eleman kabul edilir.

    for (sayac=0; sayac<8;sayac++) {
        if (girdi[enbuyuk] < girdi[sayac]) { // Daha büyüğü varsa değiştirilir.
            enbuyuk=sayac;
        }
    }

    return enbuyuk;

}

int main()
{

    /* Acilis yazilari BASLANGICI */
    printf("Umut BENZER\n");
    printf("05-06-7670\n");
    printf("Ege Universitesi Bilgisayar Muhendisligi 1. Sinif\n");
    printf("https://ubenzer.com\n");
    printf("Genel Secim Sonuclari 1.1\n\n"); /* Etkinliği artırılmış ve enbuyuk fonksiyonunda hatalar ayıklanmış ikinci sürüm */
    /* Acilis yazilari SONU */

    /* Dosyayı bir nedenden dolayı açamama durumunda hata mesajı verme de dahil olmak üzere dosya açma işlemi BASLANGICI */
    FILE *fp;

    if((fp=fopen("secim.dat","r")) == NULL) {
        printf ("secim.dat dosyasi acilamadi. Umarim nedeni yazilimim degildir ve sifir almam. :(");
        return 0;
    }
    /* Dosyayı bir nedenden dolayı açamama durumunda hata mesajı verme de dahil olmak üzere dosya açma işlemi SONU */


    /* Sehir bazinda islem yapilacak olan degiskenler */
    int sehirno;
    int kontenjan;
    int sehir_oy;
    int parti_oy[8];
    char parti_id[8];
    int mvsay_sehir[8];

    /* Ulke bazinda islem yapilacak olan degiskenler */
    int kontenjan_ulke=0;
    int oy_ulke=0;
    int parti_oy_ulke[8] = {0};
    int mvsay_ulke[8] = {0};
    int ildebirinci[8] = {0};

    /* Diger degiskenler */
    char sayac; // Bellekde integerden daha az yer kapladığı için tüm sayaçları char olarak kullanıyorum.
                // Alt tarafi 8 eleman dondurecegim, fazla kapasiteye gerek yok.

    /* Şehir bazında hesaplama BAŞANGICI */
    while(!feof(fp)) {  // Dosya sonu gelmediği (iller bitmediği sürece dön)

        // Önce girdi diskten okunur
        fscanf(fp,"%d %d %d %d %d %d %d %d %d %d",&sehirno,&kontenjan,&parti_oy[0],&parti_oy[1],&parti_oy[2],&parti_oy[3],&parti_oy[4],&parti_oy[5],&parti_oy[6],&parti_oy[7]);

        sirala(parti_oy,parti_id); // Oy çokluğuna göre sıralanır.
        mvsay(parti_oy,mvsay_sehir,kontenjan); // Milletvekili sayıları hesaplanır.

        /* Güncel şehirdeki geçerli oy sayısı hesabının BAŞLANGICI */
        sehir_oy = 0;
        for (sayac=0;sayac<8;sayac++) {
            sehir_oy += parti_oy[sayac];

            parti_oy_ulke[parti_id[sayac]] += parti_oy[sayac];
            mvsay_ulke[parti_id[sayac]] += mvsay_sehir[sayac];
            /* Bu iki satır güncel şehirdeki geçerli oy sayısının hesabı ile alakalı */
            /* değil. Bunlar daha sonra Türkiye genelinde kullanılmak üzere toplanan */
            /* parti bazında MV ve oy sayıları.                                      */
            /* indislerin [parti_id[sayac]] olmasının anlamı: doğrudan sayac diye    */
            /* kullanamam, çünkü üstte sıraladığım için sayac ile parti nosu aynı    */
            /* değil. Örneğin sayac = 0 'A' partisine işaret etmiyor olabilir, çünkü */
            /* sirala(parti_oy,parti_id); ile sıralamayı değiştirdik.                */
            /* Oy sayıları ve MV sayılarını partilere doğru kaydedebilmek için       */
            /* parti_id[sayac] ile sıralarken partinolarını da sıraladığım diziden   */
            /* faydalanıyorum.                                                       */
            /*                                                                       */
            /* Böylece Türkiye geneline ait tüm verilerde 0. indis A, 1. B... parti- */
            /* sine ait olacaktır.                                                   */
        }
        /* Güncel şehirdeki geçerli oy sayısı hesabının SONU */

        ildebirinci[parti_id[0]]++; // Yukarıdaki uzun açıklama burada da geçerli. Birinci partiye 1 ekler.

        /* Çıktı BAŞLANGICI */
        printf("Il Plaka Kodu           : %d\n",sehirno);
        printf("Milletvekili Kontenjani : %d\n",kontenjan);
        printf("Gecerli Oy Sayisi       : %d\n",sehir_oy);
        printf("Parti Adi  Oy Sayisi  Oy Yuzdesi  MV Sayisi\n");
        printf("---------  ---------  ----------  ---------\n");

        for (sayac=0;sayac<8;sayac++) {
            printf("        %c  %9d  %10.3f %10d\n",parti_id[sayac] + 65,parti_oy[sayac], parti_oy[sayac] * 100.0 / sehir_oy,mvsay_sehir[sayac]);
        }
        /* Çıktı SONU */

        /* Önemli Comment: Program genelindeki +65 'lerin anlamı:                                              */
        /* --------------- ----------------------------------------------------------------------------------- */
        /* Program genelinde parti_id[] dizisinde A partisi için 0, B partisi için 1... değerlerini kullandım. */
        /* A partisi için kullandığım 0'ı rakam olarak alıp yanına 65 eklersem A'nın ASCII kodunu elde ederim. */
        /* Bu diğer harfler için de değerli. ASCII kodları ardışık olduğu için harf indislerinin 65 fazlası    */
        /* harfi veriyor.                                                                                      */
        /* Böylece programın herhangi bir yerinde rakamı alıp harf döndüren bir fonksiyon yazmaktan kurtulu-   */
        /* yorum. Programım daha etkin ve kısa oluyor.                                                         */
        /* --------------------------------------------------------------------------------------------------- */

        /* Bir sonraki şehire hazırlık BAŞLANGICI */
        printf("\n\nDevam etmek icin bir tusa basiniz...\n");
        getche();
        system("cls");
        printf("\n\n\n\n\n\n");
        /* Bir sonraki şehire hazırlık SONU */
    }
    /*    Şehir bazında hesaplama SONU    */
    /* -----------------------------------*/
    /* Türkiye geneli hesaplama BALANGICI */
    /* Toplam oy ve kontenjan sayılarını hesaplama BAŞLANGICI */
    for (sayac=0;sayac<8;sayac++) {
        oy_ulke += parti_oy_ulke[sayac];     /* Bu iki veriyi her şehirde bir defa toplamaktansa burda toplamak daha etkin. */
        kontenjan_ulke += mvsay_ulke[sayac]; /* Eğer her şehirde toplasaydım şehir sayısı kadar işlem yapardım. Burda ise   */
    }                                        /* 8 işlem yapıyorum. Ülkenin 8'den fazla ile sahip olduğunu kabul ediyorum.   */
    /* Toplam oy ve kontenjan sayılarını hesaplama SONU */

    /* Çıktı BAŞLANGICI */
    printf("Turkiye Geneli\n");
    printf("Milletvekili Kontenjani : %d\n",kontenjan_ulke);
    printf("Gecerli Oy Sayisi       : %d\n",oy_ulke);
    printf("Parti Adi  Oy Sayisi  Oy Yuzdesi  MV Sayisi  MV Yuzdesi\n");
    printf("---------  ---------  ----------  ---------  ----------\n");

    for (sayac=0;sayac<8;sayac++) {
        printf("        %c  %9d  %10.3f  %9d  %10.3f\n",sayac + 65,parti_oy_ulke[sayac], parti_oy_ulke[sayac] * 100.0 / oy_ulke,mvsay_ulke[sayac],mvsay_ulke[sayac] * 100.0 / kontenjan_ulke);
    }

    printf("\n\n");
    printf("Iktidar Partisi       : %c\n", enbuyuk(parti_oy_ulke)+ 65);

    parti_oy_ulke[enbuyuk(parti_oy_ulke)] = 0;

    printf("Ana Muhalefet Partisi : %c\n\n", enbuyuk(parti_oy_ulke) + 65);
    printf("Partilerin Oy Sayilarina Gore Il Birincilikleri\n");

    for (sayac=0;sayac<8;sayac++) {
        if (ildebirinci[sayac] != 0) { // Eğer birinci olamadıysa niye ekranı 0'larla doldurayım?
            printf("%c partisi : %d\n",sayac + 65,ildebirinci[sayac]);
        }
    }
    /* Çıktı SONU */

    /* Kapanış işlemleri BAŞLANGICI */
    fclose(fp); //Dosyayı kapat
    return 0;
    /* Kapanış işlemleri SONU */
}
👋 🚨 Yeni yazılardan haberdar olmak ister misiniz? 👇

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir