Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => C/C++ => Konuyu başlatan: Firzen - 28 Ağustos 2012, 03:18:11

Başlık: C de 2 boyut dizi yapımı hakkında?
Gönderen: Firzen - 28 Ağustos 2012, 03:18:11
Arkdaşlar dün bir kod yazmaya çalıştım ama bir türlü başaramadım sanırım kodu beya bir yanlış yazdım. size şimdi kodu gönderiyorum

yapmak istediğim aslında

100 100 100 100 ........ 100
100 0 0 0    .......  100
......
...
..
100 0       0    0    .......  100
100 0       0    0    .......  100
100 0       0    0    .......  100
100 100 100 100 ........ 100

şeklinde kenarları 100 olan bir KARE matris oluşturmak.fakat bir türlü yapamadım size şimdi yazdığım kodu gönderiyorum.

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

int main(int argc, char *argv[])
{
int A[22][22],i,j,x,y;

for(i=0;i<23;i++)
{
for(j=0;j<23;j++)
{
A[i][j]=0;
printf(" %d",A[i][j]);
}
printf(" \n");
}

if(A[0][y]==0 && A[22][y]==0)
{
for(y=0;y<23;y++)
{
   A[0][y]=100;
   A[22][y]=100;           
                  }             
              }

if(A[x][0]==0 && A[x][22]==0)
{
for(x=0;x<23;x++)
{
   A[x][0]=100;
   A[x][22]=100;           
                  }             
              }             

     
printf("% d",A[i][j]);
 
  system("PAUSE");
  return 0;
}


Yardımlarınız için şimdiden teşekkür ederim.
Başlık: Ynt: C de 2 boyut dizi yapımı hakkında?
Gönderen: ertsen - 28 Ağustos 2012, 06:12:55
if(A[0][y]==0 && A[22][y]==0)
komutuna kadar y'ye hiç atama yapmamışsın. Belki sorun buradadır.
Başlık: Ynt: C de 2 boyut dizi yapımı hakkında?
Gönderen: ArGeMaNiA - 28 Ağustos 2012, 06:24:53
Run-Time Check Failure #3 - The variable 'y' is being used without being initialized.
Başlık: Ynt: C de 2 boyut dizi yapımı hakkında?
Gönderen: berat23 - 28 Ağustos 2012, 10:26:58
x ve y yi başlangıçta 0 ata.
Başlık: Ynt: C de 2 boyut dizi yapımı hakkında?
Gönderen: GreeN - 28 Ağustos 2012, 11:34:42

for(i=0;i<22;i++)
{
for(j=0;j<22;j++)
{
if(i==0||j==0||i==22||j=22)
{
A[i][j]=100;
}
}
}




Bu işini görür. A....=1; şeklinde değiştirip çalıştır. sonuç daha net görünüyor.
Başlık: Ynt: C de 2 boyut dizi yapımı hakkında?
Gönderen: Erdem - 28 Ağustos 2012, 14:04:21
İşte bir örnek. Forumun kod renklendirme özelliği pek parlak olmadığı için gist'e yazdım:

https://gist.github.com/3497239 (https://gist.github.com/3497239)
Başlık: Ynt: C de 2 boyut dizi yapımı hakkında?
Gönderen: GreeN - 28 Ağustos 2012, 15:32:36
Alıntı yapılan: Erdem  - 28 Ağustos 2012, 14:04:21
İşte bir örnek. Forumun kod renklendirme özelliği pek parlak olmadığı için gist'e yazdım:

https://gist.github.com/3497239 (https://gist.github.com/3497239)

ilk mesajı okumadın mı ?


Kodu denedim , aşağıdaki gibi istediğini yapıyor .

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

void main(){

int A[22][22],i,j;


for(i=0;i<23;i++)
{
for(j=0;j<23;j++)
{
    A[i][j]=0;
        printf(" %d",A[i][j]);
}
printf(" \n");
}

for(i=0;i<22;i++)
{
for(j=0;j<22;j++)
{
if(i==0||j==0||i==21||j=21)
{
A[i][j]=100;
}
}
}

printf(" \n");
printf(" \n");

for(i=0;i<22;i++)
{
for(j=0;j<22;j++)
{

        printf(" %d",A[i][j]);
}
printf(" \n");
}
  getch();
}
Başlık: Ynt: C de 2 boyut dizi yapımı hakkında?
Gönderen: Erdem - 28 Ağustos 2012, 15:58:20
Alıntı yapılan: GreeN - 28 Ağustos 2012, 15:32:36
ilk mesajı okumadın mı ?

Okudum ama genellikle çözümün tamamını vermekten ziyade çözüm yolunu göstermeyi tercih ediyorum.

Alıntı yapılan: GreeN - 28 Ağustos 2012, 15:32:36
Kodu denedim , aşağıdaki gibi istediğini yapıyor .

Ben de denedim. Sonsuz kez sıfır yazıyor  :D

    for(i=0;i<23;i++)

Hızlıca görebildiklerim 22 yerine 23 yazmışsın, void'in doğrusu int main() olacak  ;)

mesaj birleştirme:: 28 Ağustos 2012, 16:50:25

Alıntı yapılan: Erdem  - 28 Ağustos 2012, 14:04:21
https://gist.github.com/3497239 (https://gist.github.com/3497239)

Kodu tekrar tam olarak istediğini yapacak şekilde düzenledim.

Bu göstergeleri de sırf yeşillik olsun diye sadece başka bir soru için yazdım. Bence de kodun okunabilir olması daha önemli :)
Başlık: Ynt: C de 2 boyut dizi yapımı hakkında?
Gönderen: ozgurelkt - 28 Ağustos 2012, 17:03:27
Benimki biraz basit gibi duruyor ama yine de çalışıyor :)


#include <stdio.h>

void main(){

int A[10][10],i,j;


for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
    if(i==0 || j==0)
     {
        A[i][j]=1;
     }
      else if(i==9 || j==9)
      {
          A[i][j]=1;
      }
      else
      {
        A[i][j]=0;

      }
        printf(" %d",A[i][j]);
    if(j==9){
              printf("\n");
            }


}

}
}
Başlık: Ynt: C de 2 boyut dizi yapımı hakkında?
Gönderen: GreeN - 28 Ağustos 2012, 18:38:18
Alıntı YapBen de denedim. Sonsuz kez sıfır yazıyor

Sonsuz kez sıfır mı ? Paylaştığım kodun çıktısı aşağıda ...

[IMG]http://i1114.photobucket.com/albums/k538/lordex06/sonsuzkeresifir.jpg[/img]


Hızlıca görebildiklerim 22 yerine 23 yazmışsın

Farkındaysan bunu soruyu soran arkadaş yazmış ,  ben onun kodu üzerinde değişikliler yaptım. Ama hata mı evet hata ...


Başlık: Ynt: C de 2 boyut dizi yapımı hakkında?
Gönderen: ozgurelkt - 28 Ağustos 2012, 18:48:48
hangi derleyicide çalıştırdınız bilmiyorum ama bende de sonsuz kez  sıfır yapıyor. derleyici olarak Code::Block kullanıyorum.
Başlık: Ynt: C de 2 boyut dizi yapımı hakkında?
Gönderen: Erdem - 28 Ağustos 2012, 19:19:02
Alıntı yapılan: ozgurelkt - 28 Ağustos 2012, 17:03:27
Benimki biraz basit gibi duruyor ama yine de çalışıyor :)

Evet bende kodun okunabilir olmasını daha doğru bulduğumu belirtmiştim. Yukarıdaki örneği sırf başka bir soru için yazmıştım.

Alıntı yapılan: GreeN - 28 Ağustos 2012, 18:38:18
Sonsuz kez sıfır mı ? Paylaştığım kodun çıktısı aşağıda ...

Evet  hatta kendi makinemde şimdi denediğimde şu hataları aldım:

gcc -Wall test.c -o test

Alıntı Yaptest.c:3:19: ölümcül hata: conio.h: Böyle bir dosya ya da dizin yok
derleme sonlandırıldı.
test.c:5:6: UYARI: return type of 'main' is not 'int' [-Wmain]
test.c: 'main' fonksiyonunda:
test.c:43:3: UYARI: 'getch' işlevinin örtük bildirimi [-Wimplicit-function-declaration]
/tmp/ccNBax1x.o: In function `main':
test.c:(.text+0x193): undefined reference to `getch'
collect2: ld çıkış durumu 1 ile döndü
test.c: 'main' fonksiyonunda:
test.c:44:1: UYARI: control reaches end of non-void function [-Wreturn-type]

getch, conio.h'ı iptal ettikten sonra 23'leri de 22 yaptım ve gcc altında programı derlediğimde ekran görüntüsü şu şekildeydi:

(http://ehobi.org/resim/resim/dizihata.png)

Bu arada benim derleyicim gcc  4.6.3 ve kullandığım editor de tabi ki emacs!   8)
Başlık: Ynt: C de 2 boyut dizi yapımı hakkında?
Gönderen: Firzen - 28 Ağustos 2012, 23:06:05
Arkadaşlar yardımlarınız için gerçekten teşekkür ederim klavyeniz dert görmesin :)
Başlık: Ynt: C de 2 boyut dizi yapımı hakkında?
Gönderen: GreeN - 29 Ağustos 2012, 09:45:13
Alıntı yapılan: ozgurelkt - 28 Ağustos 2012, 18:48:48
hangi derleyicide çalıştırdınız bilmiyorum ama bende de sonsuz kez  sıfır yapıyor. derleyici olarak Code::Block kullanıyorum.

Borland C Builder 6 kullanıyorum.
Başlık: Ynt: C de 2 boyut dizi yapımı hakkında?
Gönderen: 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.

#include <stdio.h>

int main()
{
    int sayilar[5] = {10, 20, 30, 40, 50};
    int * ptr;
    ptr = sayilar;

    printf("%d", sayilar[2]);
    printf("%d", ptr[2]); // göstergeyi dizi gibi kullanıyorum

    printf("%d", *(sayilar + 2));
    printf("%d", *(ptr + 2)); // sayilar[2] demekle aynı şey
   
    printf("%d", 4[sayilar]); // bu da sayilar[4] ;-)
}


Yukarıdaki gibi bir yazım şeklini kullanabilmemizin nedeni sayilar[4] derleyici tarafından şu şekilde yorumlanıyor:
*(sayilar + 4)
ve 4[sayilar] şu şekilde yorumlanacak.
*(4 + sayilar)
İlkokul matematiğinden de bu ikisinin birbirine eşit olduğunu biliyoruz  ;)
Başlık: Ynt: C de 2 boyut dizi yapımı hakkında?
Gönderen: Firzen - 29 Ağustos 2012, 13:40:23
 :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.
Başlık: Ynt: C de 2 boyut dizi yapımı hakkında?
Gönderen: Erdem - 29 Ağustos 2012, 15:24:26
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.
Başlık: Ynt: C de 2 boyut dizi yapımı hakkında?
Gönderen: DumrulBey - 29 Ağustos 2012, 15:39:11
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   
Başlık: Ynt: C de 2 boyut dizi yapımı hakkında?
Gönderen: Erdem - 29 Ağustos 2012, 16:21:36
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]);