Şimdi Ara

C problemi yardım

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
27
Cevap
0
Favori
1.224
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 12
Sayfaya Git
Git
sonraki
Giriş
Mesaj
  • okuldan ödev veriler ugrastım ama bir turlu yapamadım.

    5 5 5 5 5
    5 3 3 3 5
    5 3 1 3 5
    5 3 3 3 5
    5 5 5 5 5

    böyle bir çıktıyı tum tek satılara göre veren program. Nasıl yapabilirim yardımcı olurmusunuz.



  • 5 -3-1 diye dıştan içe doğru çevreleyen bir yapı görüyorum.

    Uğraşmaya başlyıyorum şu an yaptığımda burada paylaşırım.
  • Yaptığım uygulamayı paylaşıyorum , program çalışmaktadır. cpp olarak kaydedin aşağıdaki kodları.

    Saygılarımla
     

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



    int main(void)
    {
    int i;
    int j;
    int a =0;
    int b=0;
    int boyut =5;

    int arr [boyut][boyut];

    do {
    arr[a][b]=boyut;
    b++;

    if(b==5)
    {a=1;}

    }while(a==0);

    a=0;
    b=0;

    do {
    arr[b][a]=boyut;
    b++;

    if(b==5)
    {a=1;}

    }while(a==0);

    b=0;
    a=4;

    do {
    arr[b][a]=boyut;
    b++;

    if(b==5)
    {a=5;}

    }while(a==4);

    a = 4;
    b = 0;

    do {
    arr[a][b]=boyut;
    b++;

    if(b==5)
    {a=5;}

    }while(a==4);



    a=1;
    b=1;

    do {
    arr[a][b]=boyut-2;
    b++;

    if(b==4)
    {a=2;}

    }while(a==1);


    a=1;
    b=1;

    do {
    arr[b][a]=boyut-2;
    b++;

    if(b==4)
    {a=2;}

    }while(a==1);


    a=3;
    b=1;

    do {
    arr[b][a]=boyut-2;
    b++;

    if(b==4)
    {a=4;}

    }while(a==3);

    a=3;
    b=1;

    do {
    arr[a][b]=boyut-2;
    b++;

    if(b==4)
    {a=4;}

    }while(a==3);

    arr[boyut-3][boyut-3]=boyut-4;



    //EKRANA BASMA

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





    getchar();
    getchar();
    return 0;



    }






  • okuldan ödev vermişlerse üstteki kod yardımcı olmayabilir, ödev buysa 2boyutlu diziler bilmiyorsunuz demektir çünkü.
    for döngüsü ve printf ile yapmanız gerekecek sanırım, uğraşın, kodunuzu paylaşın yardımcı olalım.
  • Ayrıca dinamik boyutlu dizi oluşturmak C için malesef o şekilde geçerli olmayacaktır.

    Ki Arquitecto *.cpp olarak kaydedin demiş, yani C++ için ödev hazırlamış.

    Aman diyim, hocan farkeder forumlardan aldığını, başın belaya girer.
  • Evet Arquitecto'nun kodunun normalde derlenmemesi gerek ama gcc uyarı bile vermeden derleyerek beni hayal kırıklığına uğrattı. Elimdeki başka bir derleyici ise "Expression must be constant" diyerek doğru kararı verdi.
  • neden ki , derleyip çalışıyor. DEVCPP derlemesi yeterli ? Doğrusunu biliyorsan buyrun paylaşın
    quote:

    Orijinalden alıntı: elektro_gadget

    Evet Arquitecto'nun kodunun normalde derlenmemesi gerek ama gcc uyarı bile vermeden derleyerek beni hayal kırıklığına uğrattı. Elimdeki başka bir derleyici ise "Expression must be constant" diyerek doğru kararı verdi.
  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
  • c uzantılı olarak kaydetse bile çalışır. Sorun olmaz Ki bu verilen ödevin iki boyutlu olmadan yapamaz.

    2. dinamik dizi tanımlanabilir. Tanımlamayı bileceksin hocam,

    örnek vereyim laf havada kalmasın..

    int a =5;

    int dizi[a];

    şeklinde tanımlanabilir ve dinamik olur. Saygılarımla
    quote:

    Orijinalden alıntı: qamyoncu

    Ayrıca dinamik boyutlu dizi oluşturmak C için malesef o şekilde geçerli olmayacaktır.

    Ki Arquitecto *.cpp olarak kaydedin demiş, yani C++ için ödev hazırlamış.

    Aman diyim, hocan farkeder forumlardan aldığını, başın belaya girer.


  • İki boyutlu dizi olmadan tek boyutlu dizi ile nasıl yapılabilir buyrun paylaşın

    if 5 e eşitse aşağı in prnitf("\n") ile kandırmaca mı yapacaksın, bence dikkat edin içten dışa doğru bir sarmal var verilen ödevde ve KESİNLİKLE İKİ BOYUTLU DİZİ ÖDEVİ İDDAYA GİRELİM İSTERSEN.
    quote:

    Orijinalden alıntı: qamyoncu

    okuldan ödev vermişlerse üstteki kod yardımcı olmayabilir, ödev buysa 2boyutlu diziler bilmiyorsunuz demektir çünkü.
    for döngüsü ve printf ile yapmanız gerekecek sanırım, uğraşın, kodunuzu paylaşın yardımcı olalım.
  • Normalde buraya ödevini yazıp cevap bekleyenlere kesinlikle cevap atmam ama baktım yalan yanlıs bilgiler havada ucusuyor, dayanamadım.

    @qamyoncu
    for döngüsü biliyorsa %90 dizi de biliyordur. Ayrıca ben baya düsündüm, dizisiz bir cözüm bulamadım. Yok demiyorum, ama programlamaya yeni girisi yapan bir ögrenci icin ekstrem zor.

    @elektro_gadget
    seni gcc değil kendi gcc bilgin hayal kırıklıgına ugratmıs. Eğer gcc'de compile ederken iso-c standartlarına göre error almak istiyorsan -pedantic-errors parametresiyle derlemelisin.

    @Arquitecto
    Senin postlarını gezerken görüyorum, cidden iyi niyetini takdir ediyorum ama yine de baskasının ödevini yapmanı tavsiye etmem. Etik değil felan nutuk atmıycam ama çoğu durumda bence yardım etme niyetindeyken ödev sahibinin ugrasmadan cevaba ulasmasını saglıyorsun ve de bu durum ögrenmeyi imkansız hale getiriyor. Senin bileceğin iş tabi gene de.

    Ayrıca yazdıgın kod yanlıs, boyut'u 7 veya 9 gibi farklı bir değer yaparak görebilirsin, her kosulda 5-5 bir dizin basıyor. Ayrıca int a=5;int b[a]; dinamik dizin yaratma değildir. Standart C'de de yasaktır böyle bir durum. Dinamik bir şekilde dizin yaratmak istiyorsan pointer şeklinde declare edip malloc veya new gibi bir operatörle yer almalısın, örnek için koda bakabilrsin.

    //dizi.cpp 


    #include <stdio.h>
    #include <stdlib.h>
    int main(){
    int boyut = 9;
    int ** array;
    array=(int **)malloc(sizeof(int *)*boyut); //dinamik dizi
    for (int i=0;i<boyut;i++){
    array[i]=(int *)malloc(sizeof(int)*boyut);
    }
    int i,j;
    int half=boyut/2;
    array[half][half]=1;
    int offset=0;
    for(int dsay=0;dsay<half;dsay++)
    {
    offset++;
    for(int i=half-offset;i<=half+offset;i++)
    for(int j=half-offset;j<=half+offset;j++)
    {
    if(i-offset==half||i+offset==half||j-offset==half||j+offset==half) array[i][j]=2*offset+1;
    }
    }
    for (int i=0;i<boyut;i++){
    for(int j=0;j<boyut;j++){
    printf("%d",array[i][j]);
    }
    printf("\n");
    }
    }





  • OnurJAM
    iso-c standartlarına göre error almakta nedir?
    Bir derleyicinin yazılan kodu standarda göre derlemesi için parametre alması normalmidir?
    Derleyici, değişken ile dizi tanımlamaya izin veriyor ve uyarı bile vermiyorsa, kodu yazan arkadaş bu durumda dinamik dizi oluşturduğunu zannetmeyipte ne yapsın?

    gcc iyi hoşta bazı davranışları insanı çileden çıkarmıyorda değil.
  • quote:

    Orijinalden alıntı: elektro_gadget

    OnurJAM
    iso-c standartlarına göre error almakta nedir?
    Bir derleyicinin yazılan kodu standarda göre derlemesi için parametre alması normalmidir?
    Derleyici, değişken ile dizi tanımlamaya izin veriyor ve uyarı bile vermiyorsa, kodu yazan arkadaş bu durumda dinamik dizi oluşturduğunu zannetmeyipte ne yapsın?

    gcc iyi hoşta bazı davranışları insanı çileden çıkarmıyorda değil.


    Bu tür standarttan sapmalar gcc'nin daha genis kullanım alanı olmasını saglıyor, cünkü ISO C tek C standartı (C99 vs) değil ve farklı platformlar farklı standartlar gerektirebiliyor. Ek olarak, neredeyse C dısında bütün dillerde izin verilen bu tür ibarelerin, 30 senesini doldurmus bir standart yüzünden dilin yapısını bozmama cercevesinde dil syntaxına eklenememesi oldukca mantıksız. Zaten principle of least surprises da (http://stevesmithblog.com/blog/principle-of-least-surprise/) bunu gerektiriyor. 2-2.5 ay java ve pythonla ugrastıktan sonra C'ye gecince böyle ufak tefek şeylerden hız kesmek bence cok sinir bozucu.




  • quote:

    Orijinalden alıntı: OnurJAM

    Ayrıca yazdıgın kod yanlıs, boyut'u 7 veya 9 gibi farklı bir değer yaparak görebilirsin, her kosulda 5-5 bir dizin basıyor. Ayrıca int a=5;int b[a]; dinamik dizin yaratma değildir. Standart C'de de yasaktır böyle bir durum. Dinamik bir şekilde dizin yaratmak istiyorsan pointer şeklinde declare edip malloc veya new gibi bir operatörle yer almalısın, örnek için koda bakabilrsin.

    C89 a göre bu şekilde olması lazım zaten bütün itirazımız bunun üzerineydi ama c99 da işler biraz değişmiş.

    Yeni standarta göre değişken uzunlukta diziler mümkünmüş, şahsen benim bundan haberim yoktu. Derleyici, dizi tanımında bir değişken görürse oraya dinamik yer ayırıcı bir kod ekliyor. Bulunduğu kapsamdan çıkıncada ayırdığı yeri serbest bırakıyor. Bu durumda arkadaşın yazdığı kod c99 için ok. Dizinin hep 5-5 gözükmesi sadece ilk 5 satırın yazdırılmasından kaynaklanıyor.

    Fakat derleyicilerin çoğunun (gcc hariç) c99 u adamdan saymadığını ve doğru düzgün desteklemediğini düşünürsek bence c de eski usül malloc ile halledilmeli bu iş. C++ ta zaten vector var.

    Birde ek olarak;
    gcc ye -std=c89 da versem, -ansi de versem yinede kodu derlemekten vazgeçmiyor. Sadece -pedantic-errors buna engel oluyor. Bu bilgi içinde teşekkürler.




  • malloc komutunu da biliyorum, Veri yapıları hakkında detaylı bilgiye sahibin, malloc komutu sadece bir dizi için değil , 65K lık C belleğinin yetmedeği zamanlarda, Dinamik bellekten, yani RAM BELLEKTEN yer ayırmak için kullanılan bir komuttur. Sizin anldığınız dinamik dizi mantığı bence bunun üzerine , benim dediğim dinamik dizi ise boyutu değişen dizi tabi diziyi günümüz java da yeniden boyutlandırmak mümkündür. AMA POINTER da yoktur :) C çok temel bir dil ama ana bir dil. Yani herşeyin fardındayım problem yok.
  • Amaç sadece output/ekran çıktısını elde etmek ise aşağıda c++ kodu.C koduna kolayaca çevirebilirsiniz.

     
    #include <iostream>

    using namespace std;

    int main()
    {
    const int BOYUT=5;
    int Dizi[BOYUT][BOYUT]={0};


    for( int i=0;i<BOYUT;i++)
    {
    for( int j=0 ;j<BOYUT;j++)
    {
    if(i==0 || i==4 || j==0 || j==4)
    Dizi[i][j]=5;
    else if(i==2 && j==2)
    Dizi[i][j]=1;
    else
    Dizi[i][j]=3;
    }
    }

    for(int i=0;i<BOYUT;i++)
    {
    for (int j=0;j<BOYUT;j++)
    {
    cout<<Dizi[i][j];
    }

    cout<<endl;
    }

    return 0;

    }








    veya kısaca

     

    #include <iostream>

    using namespace std;

    int main()
    {
    const int BOYUT=5;

    for( int i=0;i<BOYUT;i++)
    {
    for( int j=0 ;j<BOYUT;j++)
    {
    if(i==0 || i==4 || j==0 || j==4)
    cout<<5<<" ";
    else if(i==2 && j==2)
    cout<<1<<" ";
    else
    cout<<3<<" ";
    }
    cout<<endl;
    }

    return 0;

    }





  • Aslında aşağıdaki kodu yollayacatım.

    Kod birazcık kirli ,isteyen temizleyip kullanabilir.


     

    #include <iostream>
    #include <iomanip>

    using namespace std;

    int main()
    {
    int N;

    const int BOYUT=100;

    int Dizi[BOYUT][BOYUT]={0};

    //int TekSayiDizi[BOYUT]={0};
    int sayac=0;
    int solyukari=0;
    int sagyukari=0;
    /*int solasagi=0;
    int sagasagi=0;*/
    int donum=0;
    int temp=0;

    cout<<"Lutfen 3-99 arasi tam sayi giriniz:"<<endl;
    cin>>N;

    if(N<3 || N>99)
    {
    cout<<"Girdigiz sayi 3-99 arasi olmalidir"<<endl;
    return 1;
    }


    if(N%2==0)
    temp=N-1;
    else
    temp=N;
    int dongu=temp;



    for(int i=0;i<=N;i++)
    {
    if(i%2!=0)
    {
    // TekSayiDizi[sayac]=i;
    ++sayac;

    }
    }


    /* for(int i=0;i<sayac;i++)
    {
    cout<<TekSayiDizi[i]<<endl;
    }*/

    int ssayac=temp;
    for(int i=1;i<sayac;i++)
    {


    Dizi[dongu/2][dongu/2]=1;

    for(/*sagyukari;*/;sagyukari<ssayac-1;sagyukari++)
    Dizi[solyukari][sagyukari]=temp;
    for(/*solyukari*/;solyukari<ssayac-1;solyukari++)
    Dizi[solyukari][sagyukari]=temp;;
    for(/*sagyukari*/;sagyukari>donum;sagyukari--)
    Dizi[solyukari][sagyukari]=temp;
    for(/*solyukari*/;solyukari>donum;solyukari--)
    Dizi[solyukari][sagyukari]=temp;



    ++donum;
    ++sagyukari;
    ++solyukari;
    temp=temp-2;
    --ssayac;



    }


    system("Color F6");
    cout<<"Dizi icerigi"<<endl;
    for(int i =0;i<dongu;i++)
    {
    for(int j=0;j<dongu;j++)
    {

    cout<<setw(3)<<Dizi[i][j];

    }

    cout<<endl;
    }

    return 0;

    }








    Output/ekran çıktısı


     

    Lutfen 3-99 arasi tam sayi giriniz:
    17
    Dizi icerigi
    17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
    17 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 17
    17 15 13 13 13 13 13 13 13 13 13 13 13 13 13 15 17
    17 15 13 11 11 11 11 11 11 11 11 11 11 11 13 15 17
    17 15 13 11 9 9 9 9 9 9 9 9 9 11 13 15 17
    17 15 13 11 9 7 7 7 7 7 7 7 9 11 13 15 17
    17 15 13 11 9 7 5 5 5 5 5 7 9 11 13 15 17
    17 15 13 11 9 7 5 3 3 3 5 7 9 11 13 15 17
    17 15 13 11 9 7 5 3 1 3 5 7 9 11 13 15 17
    17 15 13 11 9 7 5 3 3 3 5 7 9 11 13 15 17
    17 15 13 11 9 7 5 5 5 5 5 7 9 11 13 15 17
    17 15 13 11 9 7 7 7 7 7 7 7 9 11 13 15 17
    17 15 13 11 9 9 9 9 9 9 9 9 9 11 13 15 17
    17 15 13 11 11 11 11 11 11 11 11 11 11 11 13 15 17
    17 15 13 13 13 13 13 13 13 13 13 13 13 13 13 15 17
    17 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 17
    17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
    Press any key to continue . . .







  • Öncelikle şaşırdığımı belirtmeliyim. Dizisiz yapılamayacağını düşünmeniz üzücü.

     
    int boyut;
    scanf("%d",&boyut);
    int i,j;
    for (i=0;i<boyut/2+1;i++)
    {
    for (j=0;j<i;j++)
    printf("%2d",boyut-2*j);

    for (j=0;j<boyut-2*i;j++)
    printf("%2d", boyut-2*i);

    for (j=i-1;j>-1;j--)
    printf("%2d",boyut-2*j);

    printf("\n");
    }
    for (i=boyut/2-1;i>-1;i--)
    {
    for (j=0;j<i;j++)
    printf("%2d",boyut-2*j);

    for (j=0;j<boyut-2*i;j++)
    printf("%2d", boyut-2*i);

    for (j=i-1;j>-1;j--)
    printf("%2d",boyut-2*j);

    printf("\n");
    }

    (Şekil bozukluğu ile uğraşmadım %2d ile geçip gittim)

    @OnurJAM, üstteki kodun extreme zor olduğunu sanmıyorum. Çevremde birçok yeni başlayan arkadaşım var, herhangi birtanesi 1 günlük uğraşma ile bunu yazabilir.

    Ayrıca for'un dizilerden önce öğretildiği kanısındayım.

    Sanıyorumki bir üniversitede ders olarak C veriliyorsa, orada kullanılan derleyicinin bir standartı olması lazım. Ben olsam ANSI C(pedantic-error ile) kullanırdım. Ve arkadaşın böyle bir durumla karşılaşabileceğini düşünerek uyarımı yaptım.


    Düzeltme : pedantic-error eklemeyi unutmuşum.



    < Bu mesaj bu kişi tarafından değiştirildi qamyoncu -- 16 Nisan 2011; 8:58:24 >




  • quote:

    Orijinalden alıntı: Arquitecto

    malloc komutunu da biliyorum, Veri yapıları hakkında detaylı bilgiye sahibin, malloc komutu sadece bir dizi için değil , 65K lık C belleğinin yetmedeği zamanlarda, Dinamik bellekten, yani RAM BELLEKTEN yer ayırmak için kullanılan bir komuttur. Sizin anldığınız dinamik dizi mantığı bence bunun üzerine , benim dediğim dinamik dizi ise boyutu değişen dizi tabi diziyi günümüz java da yeniden boyutlandırmak mümkündür. AMA POINTER da yoktur :) C çok temel bir dil ama ana bir dil. Yani herşeyin fardındayım problem yok.


    realloc benim bildiğim bu işe yarıyor. Ne çok yanlış bilgim varmış.
  • @qamyoncu

    Bu sorunun dizisiz yapılamayacağını söylemedim, benim 10-15 dakika düşünmeme ragmen bulamadığımı söyledim. Tebrik ederim sen bulmuşsun, lakin bu durum benim acımda üzücü değil zira rüştümü ispat etmek durumunda hissetmiyorum kendimi.

    for'un mu arraylerin mi önce öğretildiğini hatırlamıyorum kendi eğitimimden, araştırırsan paylaşırsın biz de ögrenmis oluruz.

    gcc tamamen C standartları dahilinde, ansi'yi zorlamak istiyorsan -pedantic-errors ile kullanırsın. Ancak tabii ki de compiler geçerliliğini korumak için son standardlara adapte olabilmesi lazım. Detaylar;
    http://gcc.gnu.org/onlinedocs/gcc/Standards.html




  • quote:

    Orijinalden alıntı: Arquitecto

    malloc komutunu da biliyorum, Veri yapıları hakkında detaylı bilgiye sahibin, malloc komutu sadece bir dizi için değil , 65K lık C belleğinin yetmedeği zamanlarda, Dinamik bellekten, yani RAM BELLEKTEN yer ayırmak için kullanılan bir komuttur. Sizin anldığınız dinamik dizi mantığı bence bunun üzerine , benim dediğim dinamik dizi ise boyutu değişen dizi tabi diziyi günümüz java da yeniden boyutlandırmak mümkündür. AMA POINTER da yoktur :) C çok temel bir dil ama ana bir dil. Yani herşeyin fardındayım problem yok.


    RAM BELLEKTEN yer ayırmak mı? Hocam ram bellek dediğiniz bellekten baska zaten bir bellek yok bilgisayarda (cache bu duumda alakasız). C'de bellek kullanımı ikiye ayrılmıstır, stack ve heap olmak üzere. Local değişkenler vs stackte tutulur bu yüzden bunların fonksiyon terminasyonundan sonra sürerliliği yoktur. Global değişkenler ve malloc, new, realloc komutları kullanılarak alınan yerler heap'te tutulurlar. Bunlar free'yle veya delete'le bırakılmadığı sürece program sonuna kadar sürerliliklerini korurlar. Java'da da aynı durum gecerli, fakat garbage collector mekanizmasından dolayı alınan yerlere referans kalmadığı takdirde otomatik olarak JVM tarafından toplanırlar.




  • 
Sayfa: 12
Sayfaya Git
Git
sonraki
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.