C++初心者で全くわかりません.

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kurouma

C++初心者で全くわかりません.

#1

投稿記事 by kurouma » 15年前

0 からa-1 までの整数の乱数をn 個発生させ、発生した整数のヒストグラムを
プリントアウトして下さい。
a とnはコマンドラインから引き渡します。

この問題では、乱数および配列の使い方を勉強します。特にヒストグラムに使う配列につ
いては、本を見て、よく理解して下しさい。

ヒント:0 からa-1 までの整数を発生する乱数の書き方は
(int)((double)rand()/((double)RAND_MAX+1) *a);

です。

プログラム内で

printf(“%d\n”, RAND_MAX);
とすれば、RAND_MAX の値が分かります。皆さんのPC では、RAND_MAX がいくつに
なっているかも調べて報告して下さい。

たとえば、プログラムをRandHist としたとき
RnadHist 10 1000

と入力すれば

0 982
1 1035
2 956
3 1102


9 971

などと。出力されるようなプログラムを作る問題です。a とn は、任意に変えられるように
して下さい。

配列に関する解説を追加します。説明はshort の配列になっていますが、他のタイプ(char,
int, float)でも同じ事です。


一般に、領域(配列)の確保には2つの方法があります。short で先頭番地b から10 個の
要素(20 バイト)を確保する場合を例にとって説明します。

1 コンパイル時に確保する。

short b[10];
要素数が少ないとき(大体2000 個くらいまで)に主に使います。


2 実行時に確保する。

short *b;

b を使う前に、
b=new short[10];

を実行します。
new 関数で、[/url]の中に書かれた要素数だけ領域を確保し、この時、領域の先頭番地がb の中
に代入されます。画像では、この方法を使います。また、実行してみなければ、配列の要
素数が確定しない場合などは、必須の方法です。

方法1でも2でも、確保した後の使用法は全く同じです。たとえば、

b[5]=200;

などと使います。

この問題には、1と2 の両方のプログラムを作って下さい。ただし、1 の方法を使えば、a
の最大値に制限が付きます。

というものです.お願いします.

やっくん

Re:C++初心者で全くわかりません.

#2

投稿記事 by やっくん » 15年前

<規約と注意事項>からの転載です。
1. 自分は今何がしたくて
2. どう取り組んで(作ったプログラムはどれで
3. どのようなエラーやトラブルで困っていて
4. 自分は何が解らないのか、知りたいのか
5. 今のCの知識はどの程度なのか
この5点をしっかりと明記して下さい。
環境に依存する場合やライブラリを使っているときは
使っているOS名・コンパイラ名・ライブラリ名も明記しましょう。
コンパイルエラーの質問時は必ず最低限のエラーメッセージも書きましょう。

--------

全くわからないとありますが、どの辺りまで理解しているのでしょうか??
本当に全くわからないのであれば教科書、参考書などを最初から読むことをお勧めします。

kurouma

Re:C++初心者で全くわかりません.

#3

投稿記事 by kurouma » 15年前

現在このようなプログラムを書いています.
しかし,思ったように乱数表示,ヒストグラムのプリントアウトができず困っています.

配列については静的確保,動的確保については多少理解できましたがアドバイスいただけると幸いです.

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

int main(int argc, char *argv[/url])
{
int a[10]={0,1,2,3,4,5,6,7,8,9}; //配列(静的確保)
int n; //乱数の数用
int i,j,k,m; //forループ用変数

a[10]=atoi(argv[1]); //atoi関数
n=atoi(argv[2]);  //atoi関数

//引数のチェック
if(argc!=3)
{
printf("引数の数が違います\n");
exit(0);
}

//引数の表示
for(j=0; j<argc; j++)
{
printf("argv[%d]=%s\n",j,argv[j]);
}

//乱数
for(k=0; k<n; k++)
{
n=(int)((double)rand()/((double)RAND_MAX+1) * a[10]);

}

for(m=0; m<a[10]; m++)
{
printf("%d %d\n",m,a[k]);
}
}

たかぎ

Re:C++初心者で全くわかりません.

#4

投稿記事 by たかぎ » 15年前

> プリントアウトができず困っています.

環境に依存しない方法はありません。

Dixq (管理人)

Re:C++初心者で全くわかりません.

#5

投稿記事 by Dixq (管理人) » 15年前

まず、円滑に情報交換する為には、回答者さんの質問に漏れなく答える事が不可欠ですので、
なるべく聞かれている事に漏れが無いか確認して下さいね。
(とくにやっくんさんに聞かれた事)


1.
「プリントアウト」とはプリンターで印刷することを意味しますが、そうしたいのですか?
で、あればより環境についての補足が必要になります。

それともプリントアウトという言葉が誤用で、たんに画面に出したいだけでしょうか?
ヒストグラムはどうやって出力するのでしょうか?
アスタリスク?エクセル?本当に画像か何かにしてプリントアウト?


2.
わざわざstdlibインクルードしてexit使わなくてもreturnで終われますよ。


3.
main関数の最後にreturnが必要です。


4.
RnadHist 10 1000
と入力して何故1000以上の値が出るのか解りません。
どういう仕様なのでしょうか?


5.
乱数をnに入れているようですが、nはループの上限にも使っています。
生成した乱数はどこに入れるべきですか?


6.
for文のカウンタ変数を全て分ける必要はありません。全て同じiで統一して大丈夫です。


7.
int a[10];
で確保すると、10個の入れ物が出来ます。

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

さて、[10]はあるでしょうか?
そう、a[10]に値を代入することは出来ません。


8.
a宣言時に入れている値はどこで使う予定ですか?


9.
atoi(argv[1]);とatoi(argv[2]);はそれぞれ何を意味し、何の変数に入れなければならないですか?


まずはこの辺を整理してみましょう。
しかし

>本を見て、よく理解して下しさい。

こういうとこまではいらないのでは・・

たかぎ

Re:C++初心者で全くわかりません.

#6

投稿記事 by たかぎ » 15年前

> main関数の最後にreturnが必要です。

C++(またはC99)では、mainの最後のreturn文を省略すると、return 0;が記述されたものとみなされます。

Dixq (管理人)

Re:C++初心者で全くわかりません.

#7

投稿記事 by Dixq (管理人) » 15年前

C++でしたか・・。

たかぎ

Re:C++初心者で全くわかりません.

#8

投稿記事 by たかぎ » 15年前

> C++でしたか・・。

まあ、タイトルは「C++初心者で全くわかりません.」ですが、C++初心者なのはkuroumaさんの状態であって、いま対象にしているのは別の言語という可能性もないわけではありませんね。

Dixq (管理人)

Re:C++初心者で全くわかりません.

#9

投稿記事 by Dixq (管理人) » 15年前

それから

>ヒント:0 からa-1 までの整数を発生する乱数の書き方は
>(int)((double)rand()/((double)RAND_MAX+1) *a);

というのはすごく抵抗があるのは私だけでしょうか・・。

現在はaがRAND_MAXまでである事を想定しているのでしょうから問題ないのでしょうが、
RAND_MAXよりaが十分大きい時は0~a-1にはならないですよね。

それにaがRAND_MAXまでだったとしても、わかりにくい計算式のような気がします。

私なら0~aの生成は

(double) rand() / RAND_MAX * a

と書くでしょうか。
aが大きくなくて、RAND_MAXがINT_MAXより十分小さければintだけで計算出来るように

rand() * a / RAND_MAX

もありでしょうが、今回はしない方が良いでしょうね。

閉鎖

“C言語何でも質問掲示板” へ戻る