C de 2 boyut dizi yapımı hakkında?

Başlatan Firzen, 28 Ağustos 2012, 03:18:11

Firzen

 :o arkadaşlar teşekkürler hepinizin dediği gibi çalışıyor yani bunu yapabilmek için bir sürü yöntem var farkettim de bunu ekranda tam kare olarak nasıl gösterebiirim? sonuçta bunlar 3 basamaklı kare gibi gözükmüyor benim hocam da kare istiyor.
Kararsız...

Erdem

Tam milimetrik olması gerekmiyorsa:
    printf("%2d", sayi);

şeklinde boşluk miktarını ayarlayabilirsin.

Bu arada ilk C kitabım Stephen Prata'nın C Primer Plus kitabı elime ulaştı  :) İlk izlenimlerin çok iyi.

Şans eseri açtığım ilk sayfalarda da daha önce bahsettiğim konuyla ilgili olarak bir örnek çıktı.

  int (*gosterge)[2]; // gösterge 2 tane int'den oluşan bir diziyi gösteriyor.

Peki parantezler neden? Bunun nedeni [ ve ] işleçlerinin işlem önceliği *'a göre daha yüksek. Bu yüzden şu şekilde bir ifadede:
    int * gostergedizisi[2];
ilkönce köşeli parantezleri uyguluyoruz ve ilkönceifadeyi bir dizi yapıyoruz sonra * işlecini uyguluyoruz.

DumrulBey

Alıntı yapılan: Erdem  - 29 Ağustos 2012, 10:29:16
İnsan bu konuları tam anlamadan da hayatınızı sürdürebilir :)

Ama gene de anlatmakta fayda görüyorum.
    int * dizi[8];  // 8 tane int göstergesinden oluşan bir dizi
    int (*dizi)[8]; // 8 tane tamsayıdan oluşan bir dizi için gösterge

Örneğin alttaki göstergenin türü int (*)[8] ve 8 tane tamsayıdan oluşan bir diziyi gösteriyor.

Yazdığım örneği yapabilmemizin nedeni  nedeni sayilar[2] aslında *(sayilar + 2) demek.
Teşekkürler Erdem, bütün bunlar ufuk açıyor ve sayende ben de çok şey öğreniyorum...:)

Örneğin C ile D'nin dizilere bakış açısı gerçekten farklıymış. Hatırlarsan, D forumunda en son, D dizilerinin satırları arasında 16 bayt boşluk olduğunu (tabi mutlak boş değil, burada derleyicinin ihtiyaç duyduğu bir şeyler olmalı!) söylemiştim. C'de ise böyle bir şey söz konusu olmadığı gibi (koddan anlayacağanız üzere veriler peş peşe) ters de dizilmiyormuş. O yüzden iç içe çift döngüye ihtiyaç yokmuş:
#include <stdio.h>

int main()
{
    int dizimiz [3][5] = { {-1, -3, -5, -7, -9 }, // Negatif tek sayılar kümesinin başı
                           { 1,  3,  5,  7,  9 }, // Pozitif tek sayılar kümesinin başı
                           { 0,  2,  4,  6,  8 }  // Pozitif çift sayılar kümesinin başı
                         };
    int i;
    for(i = 0; i < sizeof(dizimiz) / sizeof(int); i++) {
        printf("%d\t", *(&dizimiz[0][0] + i));
        if((i+1) % 5 == 0)printf("\n"); // Her 5 elamandan sonra satır başı yap
    }

    return 0;
}

Alıntı yapılan: Çıktısı-1   -3   -5   -7   -9   
1   3   5   7   9   
0   2   4   6   8   
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

Erdem

#18
Alıntı yapılan: DumrulBey - 29 Ağustos 2012, 15:39:11
Teşekkürler Erdem, bütün bunlar ufuk açıyor ve sayende ben de çok şey öğreniyorum... :)

Beraber öğreniyoruz! Benim de C konusunda bilgim ucundan köşesinden Ali bey'in anlattıklarından  :)

Alıntı yapılan: DumrulBey - 29 Ağustos 2012, 15:39:11
C'de ise böyle bir şey söz konusu olmadığı gibi (koddan anlayacağanız üzere veriler peş peşe) ters de dizilmiyormuş. O yüzden iç içe çift döngüye ihtiyaç yokmuş:

Bunun nedeni aslında çok boyutlu C dizilerinin gerçekte bir boyutlu olması.
    int * gosterge = dizimiz[0];

Bu şekilde bir gösterge oluşturup senin yazdığın tek döngüde
        printf("%d\t", *(gosterge + i));

yerine koymak da iş görüyor sanırım.
Hatta üstteki ifade alttakinin aynısı olduğu için  bunlardan kurtulup köşeli parantezlerle böyle de yazılabiliyor  :D
        printf("%d\t", gosterge[i]);