Şimdi Ara

C'de Dizi Elemanlarının Yerini Değiştirmek

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
19
Cevap
0
Favori
8.108
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • 5 elemanlı ve elemanları belirli bir dizimiz var;

    dizi[5]={1,2,3,4,5};
    burada dizi[0]=1,dizi[1]=2... şeklinde gidiyor.

    Programı tekrar çalıştırdığımda bu kez;
    dizi[0]=2,dizi[1]=3,dizi[2]=1... gibi dizi elemanlarının yerleri değişsin.

    Böylece programı her çalıştırdığımda elemanların yeri değişmiş olsun.Bunu nasıl yapabilirim?



  • Random olarak mı değişmesini istiyosun?
  • quote:

    Orijinalden alıntı: bm_emreakyil

    Random olarak mı değişmesini istiyosun?

    evet rastgele olacak.
    dizi[5]={1,2,3,4,5};
    dizi bu şekilde tanımlı.
    programı bir daha ki çalıştırdığımda dizi[5]={3,2,4,5,1}; gibi değişsin.
    bi daha çalıştırınca dizi[5]={5,3,1,4,2}; gibi.
    elemanlar aynı kalacak ama program he çalıştığında yerleri rastgele değişsin.
  • bu elemanlar sadece 1,2,3,4,5 ise bunları random a atayıp sonrada diziye atarsın öylelikle hep farklı olur
  • quote:

    Orijinalden alıntı: wmware

    bu elemanlar sadece 1,2,3,4,5 ise bunları random a atayıp sonrada diziye atarsın öylelikle hep farklı olur

    aslında 20 elemanlı bir dizi olacak.random ile nasıl yapabiliriz 5liyi?
  • kabaca yazim sana
     
    Random rnd = new Random();

    int[] RasgeleDizi = new int[20];

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

    {

    RasgeleDizi[i] = rnd.Next(0, 19);

    Console.WriteLine(RasgeleDizi[i]);



    }
    birden yazdım ama bunun gibi bişi olucak rasgele diye bi dizi oluşturdum 20 tane değeri olabilecek sonra aşşağıda da rasgeleifadesinde randomla 0 ile 19 arasındaki sayılardan bir tanesini rasgele diziye atadım

    edit : imla



    < Bu mesaj bu kişi tarafından değiştirildi wmware -- 30 Aralık 2011; 18:20:32 >
  • quote:

    Orijinalden alıntı: ysfbkrcn

    5 elemanlı ve elemanları belirli bir dizimiz var;

    dizi[5]={1,2,3,4,5};
    burada dizi[0]=1,dizi[1]=2... şeklinde gidiyor.

    Programı tekrar çalıştırdığımda bu kez;
    dizi[0]=2,dizi[1]=3,dizi[2]=1... gibi dizi elemanlarının yerleri değişsin.

    Böylece programı her çalıştırdığımda elemanların yeri değişmiş olsun.Bunu nasıl yapabilirim?

    Aşağıdaki c++ kod parçası 0-19 arasi tam sayi içeren dizi elemanlarinin yerleri üretilen 0-19 arasi rastgele sayilar ile yerleri değiştiriliyor.




     
    #include <iostream>
    #include <cstdlib>
    #include <ctime>

    using namespace std;

    int main()
    {
    srand((unsigned)time(NULL));
    const int BOYUT=20;
    int rastgeleSayi;

    //bool dongu=true; while() donusu icin dusunmustum,burda kalmis.

    int dizi [BOYUT];
    int yeniDizi [BOYUT];


    //yeniDizi elemalarini baslangic degerlerini -1 yap
    fill_n(yeniDizi,BOYUT,-1);

    //dizi elemalarini 0-19 arasi sirali sayi ile doldur
    for(int i=0;i<BOYUT;i++)
    {
    dizi[i]=i;

    }

    for(int i=0;i<BOYUT;i++)
    {



    while(true)
    {


    //0-19 arasi rand sayi uret
    rastgeleSayi=rand()%20;

    //eger yeniDizi elemani varsayilan degerde ise islem yap
    if(yeniDizi[rastgeleSayi]<0)
    {
    yeniDizi[rastgeleSayi]=dizi[i];


    //while dongusunden cik
    break;

    }

    }

    }



    //eski dizi elemanlarini goster
    cout<<"*** Eski Dizi ***"<<endl;

    for(int i=0;i<BOYUT;i++)
    {
    cout<<"Eski dizi["<<i<<"]:"<<dizi[i]<<endl;
    }


    //yeniDizi elemanlarini goster
    cout<<"*** Yeni Dizi ***"<<endl;

    for(int i=0;i<BOYUT;i++)
    {
    cout<<"Dizi["<<i<<"]:"<<yeniDizi[i]<<endl;
    }


    system("pause");
    return 0;
    }








    Edit:Sen sormadan ben yazayım.

     
    Yeni bir for dongusu kur,dizi[i]=yeniDizi[i]; yap



    < Bu mesaj bu kişi tarafından değiştirildi fenasi44 -- 30 Aralık 2011; 20:40:33 >




  • Aşağıdaki C++ kod parçasını da bir incele...

    1-52 arasi tam sayilari tutan bir 52'lik dizi(deste) de, elemanlarinin yerleri rastgele değiştiriliyor.

    İleride iskambil kağıt tarzı oyun yapmaya karar verirsen en azından sana fikir verir.



     

    #include <iostream>
    #include <cstdlib>
    #include <ctime>

    using namespace std;

    int main()
    {
    srand((unsigned)time(NULL));
    const int BOYUT=52;
    int rastgeleSayi;
    bool dongu=true;

    int dizi [BOYUT]={0};





    for(int i=1;i<=BOYUT;i++)
    {

    while(true)
    {

    rastgeleSayi=rand()%52;

    if(dizi[rastgeleSayi]==0)

    {
    dizi[rastgeleSayi]=i;
    break;

    }


    }

    }




    cout<<"*** Dizi ***"<<endl;
    for(int i=0;i<BOYUT;i++)
    {
    cout<<"dizi["<<i<<"]:"<<dizi[i]<<endl;
    }


    system("pause");
    return 0;
    }




    < Bu mesaj bu kişi tarafından değiştirildi fenasi44 -- 30 Aralık 2011; 19:59:39 >




  • teşekkürler arkadaşlar,incelemeye başlıyorum.
  • Fikir vermesi açısından C++ array/dizi yapısı kullanılarak yazdığım basit bir "sayisal" uygulamasi..

    Dizilerin kullanilmasina dair güzel,basit,sade bir örnek....

    1-48 arasi benzeri olmayan sayilar üretip dizi içine yerleştirdikten sonra,dizi içindeki ilk 6 sayi sıralanıp ekrana gösteriliyor.

     
    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    #include<algorithm>
    #include<iomanip>

    using namespace std;

    int main()
    {
    srand((unsigned)time(NULL));
    const int BOYUT=48;
    int rastgeleSayi;
    int dizi [BOYUT]={0};


    for(int i=1;i<=BOYUT;i++)
    {

    while(true)
    {
    rastgeleSayi=rand()%48;

    if(dizi[rastgeleSayi]==0)
    {
    dizi[rastgeleSayi]=i;
    break;

    }

    }

    }

    sort(dizi,dizi+6);
    system("Color 1A");

    cout<<"********** Bu hafta'nin sansli numaralari **********"<<endl;

    for(int i=0;i<6;i++)
    {

    cout<<setw(7)<<dizi[i]<<" ";
    }

    cout<<endl;
    cin.get();
    return 0;
    }





  • quote:

    Orijinalden alıntı: fenasi44

    Fikir vermesi açısından C++ array/dizi yapısı kullanılarak yazdığım basit bir "sayisal" uygulamasi..

    Dizilerin kullanilmasina dair güzel,basit,sade bir örnek....

    1-48 arasi benzeri olmayan sayilar üretip dizi içine yerleştirdikten sonra,dizi içindeki ilk 6 sayi sıralanıp ekrana gösteriliyor.

     
    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    #include<algorithm>
    #include<iomanip>

    using namespace std;

    int main()
    {
    srand((unsigned)time(NULL));
    const int BOYUT=48;
    int rastgeleSayi;
    int dizi [BOYUT]={0};


    for(int i=1;i<=BOYUT;i++)
    {

    while(true)
    {
    rastgeleSayi=rand()%48;

    if(dizi[rastgeleSayi]==0)
    {
    dizi[rastgeleSayi]=i;
    break;

    }

    }

    }

    sort(dizi,dizi+6);
    system("Color 1A");

    cout<<"********** Bu hafta'nin sansli numaralari **********"<<endl;

    for(int i=0;i<6;i++)
    {

    cout<<setw(7)<<dizi[i]<<" ";
    }

    cout<<endl;
    cin.get();
    return 0;
    }






    benzeri olmayan sayılar üretmesini sağlayan kod: srand((unsigned)time(NULL)); içindeki unsigned mı?




  • Evet "unsigned"...

    srand(time(NULL)) şeklinde de kullanabilirsin..




    C ile yazılmış basit bir örnek...


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

    int main ()
    {
    srand(time(NULL));
    printf ("0- 99 arasi rastgele tam sayi: %d\n", rand() % 100);

    system("pause");

    return 0;
    }





    Edit:1-100 yazmışım 0-99 olarak düzeltim..Isteyen" rand() %100 +1" şeklinde ekleme yapıp 1-100 arasi sayi üretebilir...

    Bilgi notu:Her ne kadar srand() fonksiyonu rastgele sayi üretse de,gerçek anlamda(teknik olarak) rastgele sayi üretmemektedir.Network dersimize gelen hoca ,konuyu sinyallere ordan random sayilara getirdi.1 dönem boyunca bilgisayarların gerçek anlamda random sayi üretmediğini ispatlayıp durdu.

    Mezun olunca aklımda kala kala bu kalmıştı.


    Meselenin daha iyi anlaşılması için ,srand() fonksiyonuna "seed" degeri olarak sabit bir tam sayi degeri atıyoruz.
    Benim pc' de sürekl 41 degerini üretti.

    Aşağıda ,yukarıdaki basit c örneğinin şikeli hali...

     

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

    int main ()
    {
    srand(1);
    printf ("0- 99 arasi rastgele tam sayi: %d\n", rand() % 100);

    system("pause");

    return 0;
    }






    < Bu mesaj bu kişi tarafından değiştirildi fenasi44 -- 31 Aralık 2011; 20:23:04 >




  • quote:

    Orijinalden alıntı: fenasi44

    Evet "unsigned"...

    srand(time(NULL)) şeklinde de kullanabilirsin..




    C ile yazılmış basit bir örnek...


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

    int main ()
    {
    srand(time(NULL));
    printf ("0- 99 arasi rastgele tam sayi: %d\n", rand() % 100);

    system("pause");

    return 0;
    }





    Edit:1-100 yazmışım 0-99 olarak düzeltim..Isteyen" rand() %100 +1" şeklinde ekleme yapıp 1-100 arasi sayi üretebilir...

    Bilgi notu:Her ne kadar srand() fonksiyonu rastgele sayi üretse de,gerçek anlamda(teknik olarak) rastgele sayi üretmemektedir.Network dersimize gelen hoca ,konuyu sinyallere ordan random sayilara getirdi.1 dönem boyunca bilgisayarların gerçek anlamda random sayi üretmediğini ispatlayıp durdu.

    Mezun olunca aklımda kala kala bu kalmıştı.


    Meselenin daha iyi anlaşılması için ,srand() fonksiyonuna "seed" degeri olarak sabit bir tam sayi degeri atıyoruz.
    Benim pc' de sürekl 41 degerini üretti.

    Aşağıda ,yukarıdaki basit c örneğinin şikeli hali...

     

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

    int main ()
    {
    srand(1);
    printf ("0- 99 arasi rastgele tam sayi: %d\n", rand() % 100);

    system("pause");

    return 0;
    }





    srand(time(NULL)); kullanımını biliyorum ama bu fonksiyon rastgele sayılar üretiyor ama aynı sayıları bir daha üretebiliyor.bana ürettiği sayıyı bir daha üretmemesi gerek.
    ama benim aradığım dizi elemanları belli olan bir dizinin elemanlarının yerini değiştirmek.böyle bir fonksiyon bulursam çok iyi olacaktı ama kendim oluşturmak zorunda kalacağım sanırım.




  • quote:

    Orijinalden alıntı: ysfbkrcn

    quote:

    Orijinalden alıntı: fenasi44

    Evet "unsigned"...

    srand(time(NULL)) şeklinde de kullanabilirsin..




    C ile yazılmış basit bir örnek...


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

    int main ()
    {
    srand(time(NULL));
    printf ("0- 99 arasi rastgele tam sayi: %d\n", rand() % 100);

    system("pause");

    return 0;
    }





    Edit:1-100 yazmışım 0-99 olarak düzeltim..Isteyen" rand() %100 +1" şeklinde ekleme yapıp 1-100 arasi sayi üretebilir...

    Bilgi notu:Her ne kadar srand() fonksiyonu rastgele sayi üretse de,gerçek anlamda(teknik olarak) rastgele sayi üretmemektedir.Network dersimize gelen hoca ,konuyu sinyallere ordan random sayilara getirdi.1 dönem boyunca bilgisayarların gerçek anlamda random sayi üretmediğini ispatlayıp durdu.

    Mezun olunca aklımda kala kala bu kalmıştı.


    Meselenin daha iyi anlaşılması için ,srand() fonksiyonuna "seed" degeri olarak sabit bir tam sayi degeri atıyoruz.
    Benim pc' de sürekl 41 degerini üretti.

    Aşağıda ,yukarıdaki basit c örneğinin şikeli hali...

     

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

    int main ()
    {
    srand(1);
    printf ("0- 99 arasi rastgele tam sayi: %d\n", rand() % 100);

    system("pause");

    return 0;
    }





    srand(time(NULL)); kullanımını biliyorum ama bu fonksiyon rastgele sayılar üretiyor ama aynı sayıları bir daha üretebiliyor.bana ürettiği sayıyı bir daha üretmemesi gerek.
    ama benim aradığım dizi elemanları belli olan bir dizinin elemanlarının yerini değiştirmek.böyle bir fonksiyon bulursam çok iyi olacaktı ama kendim oluşturmak zorunda kalacağım sanırım.

    Alıntıları Göster
    quote:



    srand(time(NULL)); kullanımını biliyorum ama bu fonksiyon rastgele sayılar üretiyor ama aynı sayıları bir daha üretebiliyor.bana ürettiği sayıyı bir daha üretmemesi gerek.
    ama benim aradığım dizi elemanları belli olan bir dizinin elemanlarının yerini değiştirmek.böyle bir fonksiyon bulursam çok iyi olacaktı ama kendim oluşturmak zorunda kalacağım sanırım.


    Tama işte srand(time(NULL)) fonskiyonu kullanabilirsin.

    Dikkat etmen gerekn srand() fonskiyonu main fonskiyonu içinde en tepede 1 kez tanımlaman.

    Ayrıca ilk mesajımda yazdığım örneğe bak.

    O örnekte dizinin elemanlarini for() dongusu içinde sırali bir şekilde tam sayilar ile doldurdum,örnek olsun diye.

    Sen istediğin şekilde doldurabilirsin.Istersen konsoldan kullanicidan al değerleri,istersen dosyadan okut.

     
    #include <iostream>
    #include <cstdlib>
    #include <ctime>

    using namespace std;

    int main()
    {
    srand((unsigned)time(NULL));
    const int BOYUT=20;
    int rastgeleSayi;



    int dizi [BOYUT];
    int yeniDizi [BOYUT];


    //yeniDizi elemalarini baslangic degerlerini -1 yap
    fill_n(yeniDizi,BOYUT,-1);

    //dizi elemalarini 0-19 arasi sirali sayi ile doldur
    for(int i=0;i<BOYUT;i++)
    {
    dizi[i]=i;

    }

    for(int i=0;i<BOYUT;i++)
    {



    while(true)
    {


    //0-19 arasi rand sayi uret
    rastgeleSayi=rand()%20;

    //eger yeniDizi elemani varsayilan degerde ise islem yap
    if(yeniDizi[rastgeleSayi]<0)
    {
    yeniDizi[rastgeleSayi]=dizi[i];


    //while dongusunden cik
    break;

    }

    }

    }



    //eski dizi elemanlarini goster
    cout<<"*** Eski Dizi ***"<<endl;

    for(int i=0;i<BOYUT;i++)
    {
    cout<<"Eski dizi["<<i<<"]:"<<dizi[i]<<endl;
    }


    //yeniDizi elemanlarini goster
    cout<<"*** Yeni Dizi ***"<<endl;

    for(int i=0;i<BOYUT;i++)
    {
    cout<<"Dizi["<<i<<"]:"<<yeniDizi[i]<<endl;
    }


    system("pause");
    return 0;
    }









    Programim devamında ise,rastgele yerleri değiştirlmiş 2. bir dizi oluşturuldu(2. dizi elamalari ile 1. dizi elamlari aynı,bir farkı yok ,sadece yerleri rastgele değiştirilmiş).

    İstersen 2. diziyi kullanabilirisn.Ya da aşağıdaki şekilde atama yaparak orjinal diziyi kullanabilirsin.

     

    for(...)
    {
    eskidizi[i]=yenidizi[i];
    }



    Eğer amacın belli sayı aralığında unique/birbirinden farklı rastgele sayilar üretmek ise, daha önce yazmış olduğum kod parçası.
    1'den 48 'e kadar benzersiz/unique tam sayilar üretiyor.

     
    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    #include<algorithm>
    #include<iomanip>

    using namespace std;

    int main()
    {
    srand((unsigned)time(NULL));
    const int BOYUT=48;
    int rastgeleSayi;
    int dizi [BOYUT]={0};


    for(int i=1;i<=BOYUT;i++)
    {

    while(true)
    {
    rastgeleSayi=rand()%48;

    if(dizi[rastgeleSayi]==0)
    {
    dizi[rastgeleSayi]=i;
    break;

    }

    }

    }

    sort(dizi,dizi+6);
    system("Color 1A");

    cout<<"********** Bu hafta'nin sansli numaralari **********"<<endl;

    for(int i=0;i<6;i++)
    {

    cout<<setw(7)<<dizi[i]<<" ";
    }

    cout<<endl;
    cin.get();
    return 0;
    }



    Yok eğer amacın unique sayilar üreten bir fonskiyon olsun ,çalışma zamanında ne zaman fonskiyonu çağırsam ürettiği sayilar sürekli farklı olsun,daha önce ürettiği sayilari üretmesin diyorsan,yazılabilir...

    Kolay gelsin...



    < Bu mesaj bu kişi tarafından değiştirildi fenasi44 -- 31 Aralık 2011; 21:02:05 >




  • kendim çok basit bir fonksiyon geliştirerek problemimi çözdüm.yardımcı olan arkadaşlara tekrar teşekkür ederim.
  • Ben de aynı dertten muzdaribim. C ile satranç yazıyorum,8e 8lik bir dizideki elemanların yerini nasıl değiştirebilirim?
  • fenasi44 F kullanıcısına yanıt
    C programlamada desteyi karıstırma islemini fonksıyon olarak nasıl yazabılırım
  • Bradypus variegatus B kullanıcısına yanıt
    6 yıldır foruma girmeyen birinden yardım istemek neyin kafasıdır. Konu da konu olsa bari. Aynı kodu tekrar tekrar yazıp durmuşlar. 2010 civarı foruma geyik amaçlı hesap açanların dönemi, onların C/C++ bilgisinden ne bekliyorsun ki?

    < Bu ileti mini sürüm kullanılarak atıldı >
  • Bradypus variegatus B kullanıcısına yanıt
    ..



    < Bu mesaj bu kişi tarafından değiştirildi seyfi84 -- 24 Mayıs 2020; 23:20:39 >
    < Bu ileti mini sürüm kullanılarak atıldı >
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.