ページ 11

文字列データの作成依頼

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;
}