[Çözüldü] Random sayı kontrolü

Başlatan M4DMAX, 23 Aralık 2015 - 19:06:24

« önceki - sonraki »

0 Üyeler ve 2 Ziyaretçi konuyu incelemekte.

M4DMAX

yapmak istediğim şey 20 tane random sayıyı 20lik bir array'in içine yazdırmak. random olcak sayılar  1-20 (1-20 dahil) aralığında olmalı. Ama aynı sayıları kontrol eden bi sistem *olacak yani array içinde aynı sayı olmayacak. 

    int randomfilled()
    {
     int a,b,c,d,e,randombox[rndm];
     int swp;

    srand(time(NULL));

    for(e=0; e<20; e++)
    {
        randombox[e] = 1+rand()%20;
    }
    for(a=0; a<20; a++)
    {
        for(d=0; d<19; d++)

        {
            if(randombox[a] == randombox[d+1])
            {
                randombox[a] = 1+rand()%20;
            }
            if(a == d)
               continue;
        }
    }

    printf("randombox[20]={");
    for(a=0; a<20; a++){
     printf(" %d",randombox[a]);
    }
    printf("}");
    printf("\n\n");
    return main();


burda kontrol sisteminin çalışma mantığı arraydeki her sayıyı diğer tüm elemanlar ile karşılaştırıp aynı olması halinde yeniden random atacak.Ama öyle olmuyor genelde aynı sayıları basıp duruyor. Nasıl düzeltebilirim.??

iskenderoguz

if(randombox[a] == randombox[d+1])
{
    randombox[a] = 1+rand()%20;
}


çünkü burada bir kere kontrol yapıyorsun. dizide aynı sayı varsa tekrar random sayı alıp sonra bu yeni sayıyı doğrudan diziye yazıyorsun. 2 kez kontrol yapmıyorsun.

M4DMAX

o kısmı while yapınca bi sorun cıkıyor.bu fonksiyona yani randomfilled() e gidince menüden orda kalıyo ne arrayi yazıyo ne başka bişey.

iskenderoguz

while'lı halini gönderebilimisin?

M4DMAX

int randomfilled()
    {
     int a,b,c,d,e,randombox[rndm];
     int swp;

    srand(time(NULL));

    for(e=0; e<20; e++)
    {
        randombox[e] = 1+rand()%20;
    }
    for(a=0; a<20; a++)
    {
        for(d=0; d<19; d++)

        {
            while(randombox[a] == randombox[d+1])
            {
                randombox[a] = 1+rand()%20;
            }

        }
    }

    printf("randombox[20]={");
    for(a=0; a<20; a++){
     printf(" %d",randombox[a]);
    }
    printf("}");
    printf("\n\n");
    return main();
    }


bu şekilde menüde siyah ekranda kalıyor.

Amenofis

Yapmaya çalıştığınız şey belirsiz ertelemedir, yanlış bir yöntemdir. Farklı sayı çıkmadığı sürece program çalışır, teoride sonsuza kadar sürebilir. Yapman gereken şey istediğin sayıları sırayla diziye doldurmak ve sonra da diziyi karıştırmak. Çok basit bir algoritması var şurada yazıyor. https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

Biraz alta inerseniz sahte kodunu görebilirsiniz.

ShangriLa

#6
while dongusunde d'yi hic degistirmedigin icin sonsuza bagliyor.

Bunun disinda amenofis'in dedigi gibi program sonsuza kadar calismasa da hayli etkisiz bir yöntemle sorununu cozmeye calisiyorsun.

Ben soyle yaptim (senin istedigin sekliyle):

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

#define LIM 20

int main (int argc, char *argv[]) {
    int rs[LIM], i, j;

    srand(time(NULL));

    for (i = 0; i < LIM; ++i) {
        rs[i] = rand() % LIM + 1; // 0 dahil degil
        for (j = 0; j < i; ++j)
            rs[i] == rs[j] ? --i : i;
    }

    for (i = 0; i < LIM; ++i)
        printf("%d\n", rs[i]);

    return 0;
}
Ubuntu Mate Trusty

iskenderoguz

while(randombox[a] == randombox[d+1])
{
     randombox[a] = 1+rand()%20;
}


bu kodda bir kere while'a girerse çıkamaz çünkü while koşulu sürekli true gelir. while içinde d'yi arttirman gerek.
bir de döngü içinde döngü iyi bir tasarım değil. sen for içinde for içinde while çağırıyorsun.
bence yazmak istediğin algoritmayı ilk önce tüm ihtimalleri ile kağıt üzerinde deneyip öyle kodlamaya başlaman gerek.

M4DMAX

Alıntı yapılan: Amenofis - 23 Aralık 2015 - 20:55:48
Yapmaya çalıştığınız şey belirsiz ertelemedir, yanlış bir yöntemdir. Farklı sayı çıkmadığı sürece program çalışır, teoride sonsuza kadar sürebilir. Yapman gereken şey istediğin sayıları sırayla diziye doldurmak ve sonra da diziyi karıştırmak. Çok basit bir algoritması var şurada yazıyor. https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

Biraz alta inerseniz sahte kodunu görebilirsiniz.

Random atıp düzeltme yapmam gerekli yoksa bunun gibi farklı yöntemlerle halledilirdi saol ))


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 23 Aralık 2015 - 23:07:38

Alıntı yapılan: ShangriLa - 23 Aralık 2015 - 21:19:55
while dongusunde d'yi hic degistirmedigin icin sonsuza bagliyor.

Bunun disinda amenofis'in dedigi gibi program sonsuza kadar calismasa da hayli etkisiz bir yöntemle sorununu cozmeye calisiyorsun.

Ben soyle yaptim (senin istedigin sekliyle):

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

#define LIM 20

int main (int argc, char *argv[]) {
    int rs[LIM], i, j;

    srand(time(NULL));

    for (i = 0; i < LIM; ++i) {
        rs[i] = rand() % LIM + 1; // 0 dahil degil
        for (j = 0; j < i; ++j)
            rs[i] == rs[j] ? --i : i;
    }

    for (i = 0; i < LIM; ++i)
        printf("%d\n", rs[i]);

    return 0;
}


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

kısmında neden char ile tanımladın ?

Reverser

@M4DMAX, alışkanlıktır belki ? Mesela ben hep bu şekilde yazarım main'i özellikle commandline argument parsing için gerekli olabiliyor.

XFCE ROCKS !
Powered by Thunar & XFWM4



Sh4oTT

main fonkisyonuna o parametleri neden yazıyorlar bende hala anlamadım, ileri seviye diyip geciyorum ilerde ögreniriz heralde simdilik gereksinim duymadım :) :)

iskenderoguz

main e yazılan değişkenler konsol uygulamasında parametre olarak verilen değerleri alabilmek için. argc parametre sayısı argv parametrelerin değerleridir.
konsolda şöyle yazarsan

./program merhaba dunya

argv ve argc değerleri

argc = 3
argv[0] = "./program".
argv[1] = "merhaba"
argv[2] = "dunya"


olur.

Sh4oTT


Reverser

programa direkt olarak argüman girebiliyorsun. Aslında iskenderoguz gayet güzel açıklamış.
Şu şekilde düşün bir programımız olsun ve girilen ad, soyad, yaş değerlerini alıyor daha sonrada ekrana basıyor olsun.
$./Program ad soyad yaş
program çıktısı:
$ adınız: xxy soyadınız: xxz yaşınız: 32
[1] https://www.google.com.tr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0ahUKEwja-KWb__LJAhXGVSwKHSTpANYQFggiMAE&url=http%3A%2F%2Fwww.thegeekstuff.com%2F2013%2F01%2Fc-argc-argv%2F&usg=AFQjCNFbNtO8CH8k5pCfOOiHeynsp8MnqQ&bvm=bv.110151844,d.bGg&cad=rja
[2] http://stackoverflow.com/questions/9642732/parsing-command-line-arguments
[3] https://en.wikipedia.org/wiki/Command-line_argument_parsing

XFCE ROCKS !
Powered by Thunar & XFWM4



Sh4oTT

Asıl amacını pek anlayamadım, bunu zaten scanf gıbı fonksıyorunlarla yapıyoruz

M4DMAX

Alıntı yapılan: iskenderoguz - 23 Aralık 2015 - 23:49:21
main e yazılan değişkenler konsol uygulamasında parametre olarak verilen değerleri alabilmek için. argc parametre sayısı argv parametrelerin değerleridir.
konsolda şöyle yazarsan

./program merhaba dunya

argv ve argc değerleri

argc = 3
argv[0] = "./program".
argv[1] = "merhaba"
argv[2] = "dunya"


olur.
array gibi alıp içindemi saklıyor ? işlevi nedir?


Reverser

aşağıdaki kodu derleyip çalıştırmak istediğinde <filename> direkt olarak konsoldan programı başlatırken girersin.

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

int main(int argc, char *argv[]) {
if (argc != 2) {
printf("\nUsage: %s <filename>\n",argv[0]);
}
else
{
FILE *file = fopen(argv[1],"r");

if (file == 0) {
printf("\nCould not open file\n");
}
else {
int x;
int filesize;
fseek(file,0,SEEK_END);
filesize = ftell(file);
fseek(file,0,SEEK_SET);
while (( x = fgetc(file)) != EOF)
{
printf("%c",x);
}
printf("\nsize of %s : %d byte(s)\n",argv[1],filesize);
fclose(file);
}
}
  return 0;
}

bu şekilde ise, programı başlattıktan sonra.

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

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

                char buff[100];
printf("\nUsage: <filename>\n");
scanf("%s",&buff);

FILE *file = fopen(buff,"r");

if (file == 0) {
printf("\nCould not open file\n");
}
else {
int x;
int filesize;
fseek(file,0,SEEK_END);
filesize = ftell(file);
fseek(file,0,SEEK_SET);
while (( x = fgetc(file)) != EOF)
{
printf("%c",x);
}
printf("\nsize of %s : %d byte(s)\n",buff,filesize);
fclose(file);
}
return 0;
}

ikisini de derleyip bak daha iyi anlayacaksın.

XFCE ROCKS !
Powered by Thunar & XFWM4



Amenofis

Haha linux kullanıp komut satırı argümanlarını bilmemek olur mu.:)

Ubuntuya firefox kuralım.
apt-get install firefox

argc = 3
argv[0] = apt-get
argv[1] = install
argv[2] = firefox

Herhalde ne işe yaradığı anlaşılmıştır.

M4DMAX

#18
cahiliz hocam öğrenmeye geldik :D


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 24 Aralık 2015 - 02:41:31

for (i = 0; i < LIM; ++i) {
        rs[i] = rand() % LIM + 1; // 0 dahil degil
        for (j = 0; j < i; ++j)
            rs[i] == rs[j] ? --i : i;



rs == rs[j] ? --i : i;  kısmındaki ? ne işe yarıyor


M4DMAX

peki onun yerine başka bir şey yapabilir miydik onun işlevini görücek ?

Sh4oTT

Verdıgım adreste yazıyor zaten :)



M4DMAX

İf else düzeltmeyi yorumu attıktan sonra düşündüm denedim çalıştı.Genelde sorduktan sonra cevabı bulurum :) saolun

Sh4oTT