ページ 1 / 1
文字列データの作成依頼
Posted: 2009年10月16日(金) 23:01
by 星
char* data[61]={"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
"0","1","2","3","4","5","6","7","8","9"};
配列dataに入ってる文字を1~12文字ランダムで取得し
事前に用意しているtest.txtというファイルにその文字列を格納する。
ただし、作成された文字列がtest.txtのなかに存在するものならば格納はせず
もう一度文字列を作成しなおす。
確立的にはかなり低いですが
ランダムで作成された文字列が
abcdeでtest.txtの中に同じ
abcdeという文字列があれば
作成した文字列はファイルに書き込まず
もう一度ランダムで文字列を作り直す。
さらにtest.txtの中の文字列が1000個になったときは
test2.txtを作成してその中に次の文字列を格納する。
そのとき上記と同じ条件でtest.txt又はtest2.txtの中に
同じ文字列があるときは格納しない。
test2.txtが1000個になったときはtest3.txtを作成して格納する
test3.txtが1000個になったときはtest4.txtを作成して格納する
この繰り返しです。
トリップを作成するときに使うキーにしたいデータを作成したいのですが、
うまくいきません・・・・
トリップはCではなくWeb上のPHPでやるので作れるのですが、Cに関してはまったく初心者で・・・
どなたか変わりに作っていただける方がいましたらお願いします。
私のコンパイル環境は
VC++2008
です。
よろしくお願いします。
Re:文字列データの作成依頼
Posted: 2009年10月16日(金) 23:11
by softya
規約と注意事項を読んでいただくと分かるのですが、
>課題の丸投げ(問題文だけ書く事)は禁止です。
となっています。
それにPHPのコードが書けるなら、コマンドライン上でPHPで実行しても作れると思うのであえてCを使う必要はないんじゃ無いでしょうか?
Re:文字列データの作成依頼
Posted: 2009年10月16日(金) 23:47
by ☆
失礼しました(>_<)
Webで作成すると長い時間処理できないんです・・・
サーバーが落ちてしまいますので・・・
もう少し勉強して頑張ってみます。
Re:文字列データの作成依頼
Posted: 2009年10月16日(金) 23:51
by box
> Webで作成すると長い時間処理できないんです・・・
> サーバーが落ちてしまいますので・・・
softyaさんの回答は、Webサーバ上でPHPスクリプトを動かすことを
想定されていません。
ご自分のPC上にPHPをインストールしてある状態にして、
Webサーバで動かすためのスクリプトをご自分のPC上で
動かしてみてはいかがですか?とおっしゃっています。
Re:文字列データの作成依頼
Posted: 2009年10月17日(土) 00:46
by たかぎ
意外なことに、PHPプログラマであってもコマンドラインでPHPが使えることを知らない人が多いんですよね。
普通に、
php hoge.php
のようにして呼び出せばよいだけなんですが、コマンドラインツールの使い方がそもそも分からないのかもしれません。
あるいは、環境変数の設定の仕方がわからないとか...
Re:文字列データの作成依頼
Posted: 2009年10月17日(土) 17:16
by バグ
文字列のチェックは全てのファイルに対して行うのですか?
それとも最新のファイルだけで構わないのですか?
Re:文字列データの作成依頼
Posted: 2009年10月17日(土) 20:40
by dic
手順は違いますが動くだけなら作ってみました
#pragma warning( disable: 4786 )
#include <windows.h> // for GetTickCount
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
static vector<string> gvStr;
#define DEF_CREATE_TRIP_NUM 250000 // 作成するトリップの数
#define DEF_CREATE_TRIP_SIZE 12 // 作成するトリップの文字列の長さ
void Now()
{
static vector<char> data;
int i;
for( i=0; i<26; i++ )
{
printf( "%c", 'A'+i );
data.push_back( 'A'+i );
}
for( i=0; i<26; i++ )
{
printf( "%c", 'a'+i );
data.push_back( 'a'+i );
}
for( i=0; i<10; i++ )
{
printf( "%c", '0'+i );
data.push_back( '0'+i );
}
printf( "\n" );
for( i=0; i<data.size(); i++ )
printf( "%c", data.at(i) );
// 何個作成するか?
int num = DEF_CREATE_TRIP_NUM;
printf( "\n%d個作成する\n", num );
int loop;
for( loop=0; loop<num; loop++ )
{
// 作成される文字列
char str[DEF_CREATE_TRIP_SIZE+2];
// ひとつ作成
// 作成する文字列の長さ
int len = rand()%DEF_CREATE_TRIP_SIZE+1;
memset( str, 0, sizeof(str) );
for( i=0; i<len; i++ )
{
int r = rand()%data.size();
str = data.at(r);
}
gvStr.push_back( str );
// printf( "%s\n", str );
}
// 重複要素を削除する
vector<string>::iterator p;
sort( gvStr.begin(), gvStr.end() );
p = unique( gvStr.begin(), gvStr.end() );
gvStr.erase( p, gvStr.end() );
printf( "実際に作成されたトリップの数:%d\n", gvStr.size() );
// ファイルに出力する
int o_f_num; // 出力するファイルの数
o_f_num = gvStr.size()/1000;
int o;
for( o=0; o<=o_f_num; o++ )
{
char out_filename[80];
sprintf( out_filename, "test%02d.txt", o );
FILE *file = fopen( out_filename, "wt" );
for( i=o*1000; i<(o+1)*1000; i++ )
{
if( i>=gvStr.size() )
break;
char out_str[DEF_CREATE_TRIP_SIZE+2];
memset( out_str, 0, sizeof(out_str) );
strcpy( out_str, gvStr.at(i).c_str() );
strcat( out_str, "\n" ); // 見やすいようにする
fputs( out_str, file );
}
fclose( file );
}
}
int main()
{
remove( "*.txt" );
srand(GetTickCount());
Now();
return 0;
}