ページ 1 / 1
乱数
Posted: 2006年12月08日(金) 14:14
by こまってます
1から1000の乱数を1000個発生させ、文字にすることができる数字はいくつあるか、また、もじにできるものは文字に変換しファイルに保存する というもんだいで
int main (void)
{
int i,n;
srand ((unsigned)time(NULL));
printf("1~1000:\n");
for(i=1; i<=1000;i++)
1から1000の乱数を1000個発生させるという部分はこのような感じになるのではないかと予想してみたのですが、後の部分が教科書を見てもまったくわからずこまっています どなたかおねがいします
Re:乱数
Posted: 2006年12月08日(金) 14:19
by 管理人
こまってますさん、こんにちは。管理人です。
今回文字にすることが出来る数字はいくつかということですが、
数字はみな、文字に出来ると思います。
そこのとこ、「文字に出来る数字は」という意味がよくわからないのですが、
文字に出来ない数字とはたとえば何ですか?
Re:乱数
Posted: 2006年12月08日(金) 14:20
by 管理人
もしかして1~1000の数値は文字コードですか?
Re:乱数
Posted: 2006年12月08日(金) 14:32
by box
たぶん、こんなことがしたいのではないかという例です。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
int main(void)
{
FILE *fp;
int i, n;
/* 結果出力用ファイルのオープン */
fp = fopen("output.txt", "w");
if (fp == NULL)
fprintf(stderr, "file open error\n"), exit(1);
/* 乱数の初期化 */
srand((unsigned int) time(NULL));
for (i = 0; i < 1000; i++) /* 指定回数分だけ繰り返す */
if (isprint(n = rand() % 1000 + 1)) /* 1~1000の乱数が表示可能なら */
fprintf(fp, "%4d %c\n", n, n); /* ファイルに出力する */
/* ファイルを閉じて終了 */
fclose(fp);
return 0;
}
Re:乱数
Posted: 2006年12月08日(金) 14:42
by 管理人
int count=0;
を用意して、for文のif文の中でcount++;すれば、変換できる文字のカウントが出来ますね。
Re:乱数
Posted: 2006年12月08日(金) 14:46
by 管理人
boxさんのプログラムを実行するとこのようなエラーが・・。
Re:乱数
Posted: 2006年12月08日(金) 14:50
by Justy
MSVC7.1のその関数は引数は int型でも値が 255以下でないとそのアサートが出てしまいます。
もともと文字にできるかどうかの判定は、各環境に依存してしまうので、結構この問題は難しいです。
文字コードも SJIS/JIS/EUC/Unicodeとそれぞれによっても判定が異なりますし。
Re:乱数
Posted: 2006年12月08日(金) 14:55
by 管理人
なるほど。
とりあえず私の環境では、ASCIIを使って
こんな感じで表示は出来ます・・。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main () {
int i,n,count=0;
srand ((unsigned)time(NULL));
for(i=0;i<1000;i++){//1000回ループ
n=rand()%1000+1;//1~1000の乱数生成
if(n>=33 && n<=126){//ASCIIの文字範囲なら
printf("文字コード[%3d] 変換文字[%c]\n",n,(char)n);
count++;//文字数カウント
}
}
printf("\n%d個\n",count);
return 0;
}