[Çözüldü] Yanlış nedir?(İki boyutlu dizi)

Başlatan Pozitron, 28 Mart 2015 - 23:45:54

« önceki - sonraki »

0 Üyeler ve 10 Ziyaretçi konuyu incelemekte.

Pozitron

Arkadaşlar C dilini yeni öğrenmeye başladım ve dizi konusu için şöyle bir kod yazdım ama hatayı çözemedim:
#include <stdio.h>

int main(){
int sat;
int sut;
int grades;
int i=0;
printf("Öğrenci sayısı...");
scanf("%d",&sat);
printf("Sınav sayısı...");
scanf("%d",&sut);
int matris[sat][sut];
while(1){
  printf("Değer(Girdiğiniz sütun kadar yazdığınız ilk değerler birinci öğrencinin olacaktır> ");
  scanf("%d",&grades);
  if(grades<0){
   printf("%20d öğrencinin notları:%d\n",sat,matris);
   break;
  }
  else {
    i++;
    grades=matris[sat][i];
    }
}
}

Hata da şu şekilde:
div.c: In function 'main':
div.c:17:4: warning: format '%d' expects argument of type 'int', but argument 3 has type 'int (*)[(sizetype)(sut)]' [-Wformat=]
    printf("%d öğrencinin notları:%d\n",sat,matris);

Edit:Sorunum hallloldu;fakat peki değerleri {x1,x2,....xn} şeklinde nasıl gösteririz?
Edit 2:Bir de üstteki matrisi yazdıran fonksiyonda matrise rastgele değer atıyor,ama ben dediğim gibi {x1,x2,....xn} şeklinde göstermek istiyorum.
To follow the path,look to the master,follow the master,walk with the master,see through the master,become the master.

Amenofis

Ne yaptığını pek anlayamadım ama matrisi oluşturduğun zaman içinde rastgele değerler olur zaten. Sen diziyi doldurmadan onu kullanmaya çalışmışsın. Örnek olarak aağıdaki koda bakabilirsin. Önce matrisi dolduruyor sonra yazdırıyor. 10  10 girersen çarpım tablosunu yazdırır.

#include <stdio.h>

int main()
{
    int i, j, sat, sut;
    scanf("%d%d", &sat, &sut);
    
    int matris[sat][sut];
    for(i = 0; i < sat; ++i)
        for(j = 0; j < sut; ++j)
            matris[i][j] = (i + 1) * (j + 1);
    
    for(i = 0; i < sat; ++i) {
        for(j = 0; j < sut; ++j)
            printf("%d ", matris[i][j]);
        printf("\n");
    }
    return 0;
}

Pozitron

Evet rastgele değer kullanacağını ben de düşündüm.Benim istediğim kullanıcının doldurması matrisi.
To follow the path,look to the master,follow the master,walk with the master,see through the master,become the master.

-DıLgEş-

Alıntı yapılan: PozitronEvet rastgele değer kullanacağını ben de düşündüm.Benim istediğim kullanıcının doldurması matrisi.
Kullanıcının doldurması için bir örnek vereyim:
for(int i=0; i<10; i++)
{
for(int j=0; j<10 ; j++ )
{
scanf("%d ", &dizi[j])
}
}

Kod pek okunaklı olmadı ama idare eder. Böyle tanımlamayı denedin mi?
Aşkın; gözü kör, kulağı sağır, dili tutuk, aklı kıttır..! Hayır yani bu halde nasıl herkesi madara ediyor onu çözemedim..

Pozitron

Alıntı yapılan: nurullahisrgan - 29 Mart 2015 - 15:45:20
Alıntı yapılan: PozitronEvet rastgele değer kullanacağını ben de düşündüm.Benim istediğim kullanıcının doldurması matrisi.
Kullanıcının doldurması için bir örnek vereyim:
for(int i=0; i<10; i++)
{
for(int j=0; j<10 ; j++ )
{
scanf("%d ", &dizi[j])
}
}

Kod pek okunaklı olmadı ama idare eder. Böyle tanımlamayı denedin mi?
Bir deneyeyim öbür bilgisayara geçince
To follow the path,look to the master,follow the master,walk with the master,see through the master,become the master.

blackwidow

#5
Alıntı yapılan: Pozitron - 29 Mart 2015 - 14:48:20
Evet rastgele değer kullanacağını ben de düşündüm.Benim istediğim kullanıcının doldurması matrisi.

Hocam keşke 2 for içinde sırayla deneseymişsiniz doldurmayi .


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 30 Mart 2015 - 12:17:18


-DıLgEş-

Arkadaşlar ben sadece nasıl kodlanacağını yazdım. Değişken isimlerini siz kendiniz koyarsınız.
Aşkın; gözü kör, kulağı sağır, dili tutuk, aklı kıttır..! Hayır yani bu halde nasıl herkesi madara ediyor onu çözemedim..

blackwidow


#include <stdio.h>
int main(){
int satir , sutun , grades ;
int i , j;

printf("Öğrenci sayısı...");
scanf("%d",&satir);
printf("Sınav sayısı...");
scanf("%d",&sutun);

int matris[satir][sutun];

for(i=0;i<satir;++i){
  for(j=0;j<sutun;++j)
  {
    scanf("%d",&matris[i][j]);
  }
}

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

  return 0;
}

-DıLgEş-

for döngüsünde neden ++i kullandınız ki böylece matrisin ilk değer indesi 0'a atama yapılmaz ve matris görünürken farklı farklı sayılar belirebilir.
Aşkın; gözü kör, kulağı sağır, dili tutuk, aklı kıttır..! Hayır yani bu halde nasıl herkesi madara ediyor onu çözemedim..

blackwidow

Alıntı yapılan: nurullahisrgan - 30 Mart 2015 - 17:27:10
for döngüsünde neden ++i kullandınız ki böylece matrisin ilk değer indesi 0'a atama yapılmaz ve matris görünürken farklı farklı sayılar belirebilir.

i++ ile ++i arasında aslında bir fark var birisi önce arttırıp atama yapıyor diğeri atama yaptıktan sonra artırıyor.

Ben öyle kullanıyorum ancak bu programda int girişi olduğu sürece bir sıkıntı olmaz.

i = 0 ' dan başladığı için her bir satır için sütun kadar eleman alıyor . Sonrasında ise sıfırlama işlemi yapıyor sütunda . Satır sayısıda 1 artıyor .

Pozitron

Kodu anladım gibi;fakat bunları nasıl görüntüleyebiliriz.Neden matrisi printf fonksiyonuyla gösterdiğimizde matrisi {x1,x2...} şeklinde falan göstermiyor?

Kodda da şöyle bir sorum olacaktı:neden iki for döngüsü kullandın?Ben mesela satırları öğrenci olarak düşünüp sadece sütunların değişmesini istiyorum ama yazdığınız kodda i'ler de j'ler de değişiyor sürekli.Ben bir değeri atarken 1.satır 1.sütun 1.satır 2.sütun şeklinde nasıl yaparım?Kodum bunu sağlar mı?Düşündüğümde yazdığım kod sağlıyor ama yanlış düşünüyor olabilirim
To follow the path,look to the master,follow the master,walk with the master,see through the master,become the master.

Reverser


#include <stdio.h>

int main(int argc, char *argv[])

  int i,j;
  int array[3][3] = {3, 5, 7, 9, 11, 13, 15, 17, 19};
  for(i = 0; i < 3; i++)
  {
       for(j = 0; j < 3; j++)
       {
         printf("%d ", array[i][j]);
       }
    printf("\n");
  }
  return 0;
}

XFCE ROCKS !
Powered by Thunar & XFWM4



blackwidow

#12
İki for kullanmamın sebebi iki boyutlu olması yani satır ve sütunda işlem yapabilmem için.

Diğer sorunuzu tam anlayamadım ama şöyle bir cevap vericem .

Sütuna verdiğimiz i değişkeni az artan değişken . Yani i 0 iken 0. sütunda ve aşağıdaki For'a gidiyor orada satır sayısı kadar dönüyor .

Bu döngü bitince Sütun artıyor ve 1 oluyor . Bu sefer 1. sütunun tüm satırlarını dolaşıyor . ( satırları dolaşma işini j yapıyor , işi bitince sütun artıyor )

2 tane for ile yapmasaydım 1 tane for'un içine 1 tane while koyardım o zaman dediğiniz gibi birşey olurdu

tam olarak şöyle yani. ( bu sanırım sizin anlatmaya çalıştığınız şey 2 for yerine 1 for ve 1 while ile 2 boyutlu dizide eleman ekleme scan etme vs. )


for ( i=0 ; i < sutunSayisi ; ++i)
{
  t = 0;
  while(t < satirSayisi)
  {
  printf("%d\n"array[i][t]);
  ++t;
  }

}



Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 30 Mart 2015 - 20:47:01

Alıntı yapılan: Pozitron - 30 Mart 2015 - 20:27:10
Kodu anladım gibi;fakat bunları nasıl görüntüleyebiliriz.Neden matrisi printf fonksiyonuyla gösterdiğimizde matrisi {x1,x2...} şeklinde falan göstermiyor?

Kodda da şöyle bir sorum olacaktı:neden iki for döngüsü kullandın?Ben mesela satırları öğrenci olarak düşünüp sadece sütunların değişmesini istiyorum ama yazdığınız kodda i'ler de j'ler de değişiyor sürekli.Ben bir değeri atarken 1.satır 1.sütun 1.satır 2.sütun şeklinde nasıl yaparım?Kodum bunu sağlar mı?Düşündüğümde yazdığım kod sağlıyor ama yanlış düşünüyor olabilirim

Hocam o matrisi öyle yazdırmak kesinlikle size kalmış , yani yanyana yazdırabilirsiniz

Ben her sütun atladığında \n koydum ki sütunları belli olsun diye :)

isterseniz daha iyi bir şekilde yapabilirsiniz (adres göstermek gibi )


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 30 Mart 2015 - 20:48:26

Düzeltme Yapmam lazım .

Hocam Satir ile Sutun'u karıştırdım onları tam tersi düşünebilirsiniz :)

Pozitron

Alıntı yapılan: Reverser - 30 Mart 2015 - 20:39:43

#include <stdio.h>

int main(int argc, char *argv[])

  int i,j;
  int array[3][3] = {3, 5, 7, 9, 11, 13, 15, 17, 19};
  for(i = 0; i < 3; i++)
  {
       for(j = 0; j < 3; j++)
       {
         printf("%d ", array[i][j]);
       }
    printf("\n");
  }
  return 0;
}

Bu yazdığınız gayet sade ve okunabilir olmuş teşekkürler :) Peki o main fonksiyonuna verdiğiniz parametreler ne işe yarıyorlar?

Alıntı yapılan: blackwidow - 30 Mart 2015 - 20:44:37
İki for kullanmamın sebebi iki boyutlu olması yani satır ve sütunda işlem yapabilmem için.

Diğer sorunuzu tam anlayamadım ama şöyle bir cevap vericem .

Sütuna verdiğimiz i değişkeni az artan değişken . Yani i 0 iken 0. sütunda ve aşağıdaki For'a gidiyor orada satır sayısı kadar dönüyor .

Bu döngü bitince Sütun artıyor ve 1 oluyor . Bu sefer 1. sütunun tüm satırlarını dolaşıyor . ( satırları dolaşma işini j yapıyor , işi bitince sütun artıyor )

2 tane for ile yapmasaydım 1 tane for'un içine 1 tane while koyardım o zaman dediğiniz gibi * bir şey olurdu

tam olarak şöyle yani. ( bu sanırım sizin anlatmaya çalıştığınız şey 2 for yerine 1 for ve 1 while ile 2 boyutlu dizide eleman ekleme scan etme vs. )


for ( i=0 ; i < sutunSayisi ; ++i)
{
  t = 0;
  while(t < satirSayisi)
  {
  printf("%d\n"array[i][t]);
  ++t;
  }

}



Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 30 Mart 2015 - 20:47:01

Alıntı yapılan: Pozitron - 30 Mart 2015 - 20:27:10
Kodu anladım gibi;fakat bunları nasıl görüntüleyebiliriz.Neden matrisi printf fonksiyonuyla gösterdiğimizde matrisi {x1,x2...} şeklinde falan göstermiyor?

Kodda da şöyle bir sorum olacaktı:neden iki for döngüsü kullandın?Ben mesela satırları öğrenci olarak düşünüp sadece sütunların değişmesini istiyorum ama yazdığınız kodda i'ler de j'ler de değişiyor sürekli.Ben bir değeri atarken 1.satır 1.sütun 1.satır 2.sütun şeklinde nasıl yaparım?Kodum bunu sağlar mı?Düşündüğümde yazdığım kod sağlıyor ama yanlış düşünüyor olabilirim

Hocam o matrisi öyle yazdırmak kesinlikle size kalmış , yani yanyana yazdırabilirsiniz

Ben her sütun atladığında \n koydum ki sütunları belli olsun diye :)

isterseniz daha iyi bir şekilde yapabilirsiniz (adres göstermek gibi )


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 30 Mart 2015 - 20:48:26

Düzeltme Yapmam lazım .

Hocam Satir ile Sutun'u karıştırdım onları tam tersi düşünebilirsiniz :)
Sağolasın hocam gayet iyi anlattın olayı :) Peki bastırma işini nasıl yapacağım?Sanırım onun için ayrı bir liste falan yapmalıyım çünkü sonda gözükecekler kullanıcı girdiğinde değil,değil mi?
To follow the path,look to the master,follow the master,walk with the master,see through the master,become the master.

Reverser

Alıntı yapılan: Pozitron - 30 Mart 2015 - 22:00:51
Bu yazdığınız gayet sade ve okunabilir olmuş teşekkürler :) Peki o main fonksiyonuna verdiğiniz parametreler ne işe yarıyorlar?

Aslına bakılırsa örnek kod üzerinde hiç bir işe yaramıyorlar. :)

XFCE ROCKS !
Powered by Thunar & XFWM4



blackwidow

Bastırma işlemini de aynı şekilde yapıcaksın (scan yaptığın gibi.)

Burada benim yazdığım kodda veya kendi kodunda artık 2 boyutlu diziyi dolduruğumuzu düşünürsek.

şu şekilde ;


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


veya şu şekilde :


for ( i=0 ; i < satirSayisi ; ++i)
{
  t = 0;
  while(t < sutunSayisi)
  {
  printf("%d "array[i][t]);
  ++t;
  }
  printf("\n");
}


genel mantığı bu .
Bu seferde yapman gereken artık 2 boyutlu bir dizi var elinde. Park yeri gibi de düşünebilirsin buraları doldurdun ve veri var belli şekilde.
Satır = 0 dan başlayıp o satırın satır = 0 sutun = 0 elemanı sonra satır = 0 sutun 1 elemanı ve sutun bitene kadar bastırıyorsun .
Sonra For sağolsun Satır = 1 oluyor ve aynı dongu satır 1 için yapılıyor vs vs.

/* Sutun bitislerinde \n koyup aşağı inerek 2 boyutlu diziyi güzel bir şekilde bastırıyoruz */

Pozitron

Alıntı yapılan: Reverser - 30 Mart 2015 - 22:19:25
Alıntı yapılan: Pozitron - 30 Mart 2015 - 22:00:51
Bu yazdığınız gayet sade ve okunabilir olmuş teşekkürler :) Peki o main fonksiyonuna verdiğiniz parametreler ne işe yarıyorlar?

Aslına bakılırsa örnek kod üzerinde hiç bir işe yaramıyorlar. :)
Peki,gerçekte ne işe yarıyorlar? :)
Alıntı yapılan: blackwidow - 30 Mart 2015 - 22:42:00
Bastırma işlemini de aynı şekilde yapıcaksın (scan yaptığın gibi.)

Burada benim yazdığım kodda veya kendi kodunda artık 2 boyutlu diziyi dolduruğumuzu düşünürsek.

şu şekilde ;


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


veya şu şekilde :


for ( i=0 ; i < satirSayisi ; ++i)
{
  t = 0;
  while(t < sutunSayisi)
  {
  printf("%d "array[i][t]);
  ++t;
  }
  printf("\n");
}


genel mantığı bu .
Bu seferde yapman gereken artık 2 boyutlu bir dizi var elinde. Park yeri gibi de düşünebilirsin buraları doldurdun ve veri var belli şekilde.
Satır = 0 dan başlayıp o satırın satır = 0 sutun = 0 elemanı sonra satır = 0 sutun 1 elemanı ve sutun bitene kadar bastırıyorsun .
Sonra For sağolsun Satır = 1 oluyor ve aynı dongu satır 1 için yapılıyor vs vs.

/* Sutun bitislerinde \n koyup aşağı inerek 2 boyutlu diziyi güzel bir şekilde bastırıyoruz */

Çok sağol üzerinde uğraşıp pratik yapmalıyım,Pythonum iyidir C'ye yeni başlayınca...Aslında ikisinde de mantık aynı ama C daha orta seviye bir dil olduğu için bazı şeyler daha "manual" :)
To follow the path,look to the master,follow the master,walk with the master,see through the master,become the master.

Reverser

@Pozitron, aslında her ikiside kullanılabilir

int main(int argc, char *argv[]);
int main();

eğer program argüman alarak başlıyorsa
int main(int argc, char *argv[]);
kullanılır.

Mesela şöyle bir kod yazmıştım


//Reversed source code - Reverser

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

int pass_control (char *unk_0);

//0x080484fd
int main(int argc, char *argv[])
{

if(argc <= 1 )
{
printf("Kullanim %s <parola>\n",argv[0]);
}
else
{
if (pass_control(argv[1]) == 0)
{
printf("\nGiris Basarili");
}
else
{
    printf("\nGiris basarisiz");
}

}
return 0;
}

//0x0804849b
int pass_control (char *unk_0)
{

     char buffer[256];
strcpy(buffer,unk_0);

if(strcmp(buffer, "1453") == 0)
{
return 0;
}
else if (strcmp(buffer, "istanbul") == 0)
{
return 0;
}
else
{
return 1;
}
}



bu kod derlendiğinde konsoldan şu şekilde başlatılıyor

./program_adi <şifre>

umarım açıklayıcı olabilmişimdir.

XFCE ROCKS !
Powered by Thunar & XFWM4



blackwidow


Pozitron

Alıntı yapılan: Reverser - 30 Mart 2015 - 23:00:52
@Pozitron, aslında her ikiside kullanılabilir

int main(int argc, char *argv[]);
int main();

eğer program argüman alarak başlıyorsa
int main(int argc, char *argv[]);
kullanılır.

Mesela şöyle bir kod yazmıştım


//Reversed source code - Reverser

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

int pass_control (char *unk_0);

//0x080484fd
int main(int argc, char *argv[])
{

if(argc <= 1 )
{
printf("Kullanim %s <parola>\n",argv[0]);
}
else
{
if (pass_control(argv[1]) == 0)
{
printf("\nGiris Basarili");
}
else
{
    printf("\nGiris basarisiz");
}

}
return 0;
}

//0x0804849b
int pass_control (char *unk_0)
{

     char buffer[256];
strcpy(buffer,unk_0);

if(strcmp(buffer, "1453") == 0)
{
return 0;
}
else if (strcmp(buffer, "istanbul") == 0)
{
return 0;
}
else
{
return 1;
}
}



bu kod derlendiğinde konsoldan şu şekilde başlatılıyor

./program_adi <şifre>

umarım açıklayıcı olabilmişimdir.
Bash de girdiğimiz komutlar gibi yani anladım sağolasın :)
Alıntı yapılan: blackwidow - 30 Mart 2015 - 23:05:06
Kolay gelsin o zaman :)
Şimdilerde tıkandım gerçi,eski python örneklerimi bir de C ile yazdım o kadar sonra tıkandım.
To follow the path,look to the master,follow the master,walk with the master,see through the master,become the master.

blackwidow


Tıkandığın yerde sorabilirsin .
Python güzel dil de bir nasip olmadı *bir şeyler yapalım :)

Pozitron

Alıntı yapılan: blackwidow - 30 Mart 2015 - 23:26:56

Tıkandığın yerde sorabilirsin .
Python güzel dil de bir nasip olmadı *bir şeyler yapalım :)
Sorarım tabi ki sağol.
Aynen ben de bir türlü birşey de yer alamadım,sourceforge,github aranıp duruyorum;parmaklarım kaşınıyor birşey yapmak için :)
To follow the path,look to the master,follow the master,walk with the master,see through the master,become the master.

blackwidow

Alıntı yapılan: Pozitron - 30 Mart 2015 - 23:39:33
Sorarım tabi ki sağol.
Aynen ben de bir türlü * bir şey de yer alamadım,sourceforge,github aranıp duruyorum;parmaklarım kaşınıyor * bir şey yapmak için :)

Python bilgin iyi ise bence bir adım öndesindir demektir.
Kullan derim dostum inşallah iyi şeyler yaparsın :)

Pozitron

Alıntı yapılan: blackwidow - 30 Mart 2015 - 23:42:00
Alıntı yapılan: Pozitron - 30 Mart 2015 - 23:39:33
Sorarım tabi ki sağol.
Aynen ben de bir türlü * bir şey de yer alamadım,sourceforge,github aranıp duruyorum;parmaklarım kaşınıyor * bir şey yapmak için :)

Python bilgin iyi ise bence bir adım öndesindir demektir.
Kullan derim dostum inşallah iyi şeyler yaparsın :)
İlk başladığım programlama dili o.İyi aslında ama bir yerlerde kullanma imkanı bulamadım kendim için küçük şeyler yaptım,1 bayt uzunluğunda binary kodu ondalık sayıya çevirip ASCLL tablosunda arayan küçük bir araç yazmıştım konsol ekranında çalışan mesela.
Ben de umuyorum.Aslında donanıma yakın işler daha cazip geliyor bana ama kodlamanın her türlüsü güzel :)
To follow the path,look to the master,follow the master,walk with the master,see through the master,become the master.