#include #include 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("http://www.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 */ }