PDA

Tam Sürümünü Görmek İçin : cpp de rastgele 7 basamakli sayi stringi uretme


Lewissi
10/10/2005, 11:44
herkese merhabalar,
C++ dili kullanarak 7 basamakli tamsayi iceren string uretmek istiyorum.
mesela:

string a,b,c,d,e;
a="1000000";
b="1000001";
c="1000002";
d="1234567";
e="1345256";

string uret(){
.
.
.
.
}

bu fonksiyonu nasil yazabilirim?


Lewissi
10/10/2005, 11:45
pardon bu arada belirtmeyi unutmusum uretilen sayilar mutlaka birbirinden farkli olmali

asoza
10/10/2005, 12:47
Benzeri bir yöntemler dosya adı ürettiğim bir fonksiyonum var.
Üzerinde çalışırsanız işinizi görebilir.
Gerçi emsalsiz dosya adı üreten hazır fonksiyonlar da var ama bu benim işime daha uygundu...

//---------------------------------------------------------------------------
String RandomDosyaAdi(int iUzunluk = 8, String sPath = "oooo", String sExt = "oooo")
{ //iUzunluk uzunluğunda ve sExt soyadında random dosya adı üret...
//örnek: iUzunluk = 5.. ve sExt = ".bmp" .. dosya adı : a01rt.bmp
//sExt noktası ile fonksiyona gönderilecek.. örnek: sExt = ".bmp"
time_t t;
srand((unsigned) time(&t));
if(sPath == "oooo") sPath = ExtractFilePath(Application->ExeName);
String sRakam = sRakam.StringOfChar('9', iUzunluk);
unsigned int iSayi = 0;
String sDosyaAdi = "";
do {
iSayi = rand() % sRakam.ToInt();
sDosyaAdi = IntToHex(static_cast <int> (iSayi), iUzunluk).LowerCase();
}
while(FileExists(sPath + sDosyaAdi));
if(sExt != "oooo") sDosyaAdi += sExt;
return sDosyaAdi;
}
//---------------------------------------------------------------------------

Euclides
10/10/2005, 16:52
asoza'unun yöntemini uyguladığımızı düşünelim.
(10**7 - 2) tane sayıyı hali hazırda üretmiş olalım, son sayıyı bulmamız stdlib'deki "rand()" fonskiyonun rasgeleliğe yaklaşma oranı ve şansımıza göre saniyeler veya yıllar sürebilir. :S
@Lewissi:
Size Google'da "Generating all combinations"'ı aratmanızı öneririm.

asoza
10/10/2005, 18:26
Üzerinde çalışırsanız işinizi görebilir.
Gerçi emsalsiz dosya adı üreten hazır fonksiyonlar da var ama bu benim işime daha uygundu...

asoza'unun yöntemini uyguladığımızı düşünelim.


Benimki foruma katıkı olsun. Sizinki de son cümleniz itibarıyla ona benziyor biraz.
:p

Lewissi
13/10/2005, 22:35
yapmak istedigim asagidaki gibi birsey.ama sorun cikartiyor.nasil char* olan bir degiskeni string yaparim?


// bu kod verilen tamsayiyi karakter arrayine donusturur daha sonra bu karakter arrayini string sinifina // donusturur.
#include<iostream>
#include<string>
using namespace std;
using std::string;
int main()
{
char array[7];
static int x=1000000;
char a,b,c,d,e,f,g;
x++;
a=(char)((x%10)+48);
x/=10;
b=(char)((x%10)+48);
x/=10;
c=(char)((x%10)+48);
x/=10;
d=(char)((x%10)+48);
x/=10;
e=(char)((x%10)+48);
x/=10;
f=(char)((x%10)+48);
x/=10;
g=(char)((x%10)+48);

array[0]=g;
array[1]=f;
array[2]=e;
array[3]=d;
array[4]=c;
array[5]=b;
array[6]=a;

char* cp;
for(int j=0;j<7;j++)
cp[j]=array[j];
string s=(string) cp;
cout<<s<<endl;

acehreli
13/10/2005, 23:15
std::string'in char* alan bir kurucusu var. string, kendisine verilen char*'i degistirmeyecegini gostermek icin kurucusunda 'char const *' alir. Ayrica, o char*'in bir C-dizgisi oldugunu varsayar; yani sonunda bir dizgi sonlandirma karakteri ('\0') olduguna guvenir.

Yapilacak sey cok kolay: string'i kurarken o dizgiyi vermektir:


string s0("dizgi0"); // <-- derleme zamaninda bilinen bir dizgiyle

char * dizgi1 = /* bir sekilde elde edilsin */;
string s1 = dizgi1; // <-- bir dizgi ile


Kodunda gordugum bir kac aksaklik:

1) array zaten bir C dizgisi olarak kullanilabilecegi icin, ayrica cp gibi bir araciya gerek yok

2) cp nereyi gosteriyor? cp[j] yaptigin zaman hangi karaktere erisiyorsun?

3) cp olsa da olmasa da, string'e verdigin dizginin sonunda '\0' karakteri yok. Programini array'i 8 uzunlukta tanimlayarak ve array[6]=a; satirindan sonrasini su kodda goruldugu gibi degistirerek duzeltebilirsin:


char array[8];

/* ... */
array[6]=a;
array[7] = '\0';

string s = array;
cout << s << '\n';


4) main icinde tekrarlanan mantigi bir for dongusu icine alman gerekiyor. O zaman hersey guzel olacak! :) Oyle yapinca a,b,vs. nesnelerine de gerek kalmayacak.

5) using namespace std; dedikten sonra ayrica using std::string; demeye gerek yok.

Ali

acehreli
13/10/2005, 23:18
Tabii aslinda s'ye de gerek yok; array'i dogrudan da yazdirabilirsin:

cout << array << '\n';

Ali

Lewissi
22/10/2005, 17:23
C++ dilinde rastgele 7 basamaklı sayi ureten bi fonksiyon nasil yazarim?

Lewissi
22/10/2005, 17:26
belirtmeyi unutmusum arka arkaya cagrildiginda da farkli 7 basamakli sayilar uretecek

acehreli
22/10/2005, 21:24
Lewissi, senden once Lewissi adli birisi daha ayni seyi sormustu. ;) Verilen cevaplar yukarida...

Ali