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.
if(A[0][y]==0 && A[22][y]==0)
komutuna kadar y'ye hiç atama yapmamışsın. Belki sorun buradadır.
Run-Time Check Failure #3 - The variable 'y' is being used without being initialized.
x ve y yi başlangıçta 0 ata.
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.
İş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)
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();
}
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 :)
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");
}
}
}
}
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 ...
hangi derleyicide çalıştırdınız bilmiyorum ama bende de sonsuz kez sıfır yapıyor. derleyici olarak Code::Block kullanıyorum.
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)
Arkadaşlar yardımlarınız için gerçekten teşekkür ederim klavyeniz dert görmesin :)
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.
İ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 ;)
: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.
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.
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
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]);