C dilinde diziler istenen çıktıyı tam olarak alamama

Şuna gerek yok eğer güncel compiler kullanılıyorsa. int kackez[10] = {}; dediğinizde hepsini default yapıyor. Ek olarak yine loop içinde de dönülüp yine assign edilebilir.
Bu kısım çalışmamış ama güncel bir compiler kullanmıyor olabilir arkadaş. O yüzden saçmalamış bence o kısım.

Anladım, güzel bir çözüm yoluymuş.
Teşekkür ederim. Daha detaylı da açıklayayım belki de başkalarına faydası olur.

Burada sıklığını kontrol etmek istediğimiz sayıların 1 ile 10 arasında tam sayı olması bizim için çok güzel bir avantaj.
1 den x tane, 2 den y tane .... 10 dan z tane diye saymamız gerekiyor. Ama her birisinin sayısı için ayrı bir değişken oluşturmak yerine, bunu sayıları da 10 elemanlı bir array (listeden mantık olarak hiçbir farkı yok. sadece bellekte tutuluşları farklı) ile tutalım.

Sayılarımızın denk geldiği indexleri kontrol edelim. 1'in kaç tane olduğunu dizinin ilk elemanı belirleyecek. Yani 0. index. 2 nin kaçta ne olduğunu 1. index .... n in kaç tane olduğunu n-1. index belirleyecek.

O zaman biz bu oyların hepsini gezersek, ve her gördüğümüz sayı için ilgili indexi 1 arttırırsak dizimizin içinde hangi elemandan kaç tane olduğunu tutabilmiş oluruz. Bunu sağlamak için tüm diziyi gezip, dizinin her bir elemanına geldiğimizde o eleman için değerinin 1 eksiği indexe sahip kısmı güncellemeliyiz.

Dolayısıyla döngünün içi
Kod:
for(int i = 0;i<dizi.Length;i++)
{
    kackez[dizi[i] - 1]++;
}
 
Son düzenleme:
Bu kısım çalışmamış ama güncel bir compiler kullanmıyor olabilir arkadaş. O yüzden saçmalamış bence o kısım.
Initialize etmemiş zaten attığı kodda. int kackez[10]; yazınca init olmadığı için random value geliyor. Ancak int kackez[10] = {}; yapınca initialize yapıyor. Adı initializer list zaten.
 
İkinci for döngüsünü şu şekilde değiştirince doğru çıktı elde edebilirsin.
C:
for (i = 1; i <= 10; i++)
{
    printf ("%d oyu veren kisi sayisi %d'dir.\n", i, kackez[i]);
}

C'de diziler 0-indexed'dir. Önerdiğiniz kod, kackez[10]'a erişmeye çalışıyor son iterasyonda. Oysaki son eleman kackez[9]. Dikkatli incelerseniz konu sahibinin kodunun o kısmında bir yanlışlık olmadığını görebilirsiniz.



Bir dizi oluşturduğunuz zaman bellekte halihazırda kullanılmayan yerleri size atıyor. İçinde hangi değer var bilmiyorsunuz...

Ufak bir istisna var: Statik diziyi global scope'ta tanımlamak, dizinin elemanlarının ilk değerinin 0 olmasını garantiliyor:

C:
#include <stdio.h>

int kackez[10];

int main() {
    int dizi[40] = {5, 8, 4, 9, 10, 1,  2, 7, 6, 5, 4, 9, 4, 6, 8, 10, 2, 5, 7, 9,
                    4, 6, 1, 7, 9,  10, 5, 7, 6, 1, 3, 3, 4, 9, 4, 6,  7, 3, 5, 4};
    int i;

    for (i = 0; i < 40; i++) {
        kackez[dizi[i] - 1]++;
    }

    for (i = 0; i < 10; i++) {
        printf("%d oyu veren kisi sayisi %d'dir.\n", i + 1, kackez[i]);
    }

    return 0;
}

Bunun geçerli olmadığı bir senaryo varsa bilmiyorum. Durumun neden böyle olduğunu da pek bilmiyorum, sadece bu istisnadan haberdarım. Bilgili arkadaşlar aydınlatabilir. : )



Şuna gerek yok eğer güncel compiler kullanılıyorsa. int kackez[10] = {}; dediğinizde hepsini default yapıyor. Ek olarak yine loop içinde de dönülüp yine assign edilebilir.

Sanırım yeterince eski derleyiciler C'de {0} yerine {} yazımına izin vermiyor. Nereden duyduğumu hatırlamıyorum ama duymuştum. Şimdi araştırınca şunu gördüm:

1715267636591.png


Ne var ki ben buna yönelik bir hata almıyorum derleyince.

Sunduğunuz yöntemin çok daha pratik olduğunu düşünmekle birlikte memset(kackez, 0, sizeof(kackez)); yöntemini de paylaşmış olayım. string.h kütüphanesini include etmek gerekiyor.
 
Kod:
int main(){

int dizi[40]={5, 8, 4, 9, 10, 1, 2, 7, 6, 5, 4, 9, 4, 6, 8, 10, 2, 5, 7, 9, 4, 6, 1, 7, 9, 10, 5,

 7, 6, 1, 3, 3, 4, 9, 4, 6, 7, 3, 5, 4};

int i, j;

int kackez[10] = {0,0,0,0,0,0,0,0,0,0};

for(i = 0; i<10;i++){
    for(j = 0; j<40 ;j++){
        if(i+1 == dizi[j])
            kackez++;    
    }
}


for(i=0;i<10;i++){

    printf("%d oyu veren kisi sayisi %d'dir.\n",i+1,kackez);

}
    return 0;

}
teşekkür ederim bunu ekleyince kod düzeldi.
 

Yeni konular

Geri
Yukarı