乱数のファイル出力、配列読み込み

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

乱数のファイル出力、配列読み込み

#1

投稿記事 by ビスタ » 18年前

学校の課題で、
・乱数を生成しファイル出力するプログラム
・↑のファイルを配列に読み込み、値の平均を標準出力するプログラム

を求められたのですが…乱数生成プログラム以外はどうしたらいいのか
全く手もつけられない状態です…。

講師には30分もあればできるとまで言われてるのに本を読んでも何を
見ればいいのか分からないとか正直かなり落ち込んでるんですが…
どうかお願いします。

ビスタ

Re:書き忘れです

#2

投稿記事 by ビスタ » 18年前

基本的に学校でプログラムを実行してるんですが演習環境は

OS:Linux
コンパイラ:gcc 3.3.5

です。Linuxのバージョンは分かりませんでした。家のPCはwin vistaですが
こちらには演習環境作ってません。

管理人

Re:書き忘れです

#3

投稿記事 by 管理人 » 18年前

まず、家にコンパイルできる環境を作りましょう。
学校だけでやってたんじゃ、絶対詳しくなれないですから。

ビスタさんが、どこまでおわかりか、知りたいのですが、配列の使い方はおわかりですか?
例えば、以下のプログラムを1~3に示すように完成させてください、といったら出来ますか?
#include <stdio.h>

int main(){
	int a[3];
	a[0]=2;
	a[1]=6;
	a[2]=4;
	printf("平均は");
}
 
1、これをfor文を使って書き換えてください。
2、小数点以下が表示されるように変更してください。
3、さらにrand関数を使って、2,6,4の代入の部分にランダムな数値を入れてください。

もしここまで出来れば、半分終わりです。

ファイルに書き込むにはfopenとfprintf関数を使って見ましょう。
ここや
http://www9.plala.or.jp/sgwr-t/c/sec17.html
ここの12章
http://www5c.biglobe.ne.jp/~ecb/c/c00.html
を見て勉強してください。
もしわからなければまた聞いてください。

管理人

Re:書き忘れです

#4

投稿記事 by 管理人 » 18年前

コンパイラはここからダウンロードできます。

http://www.microsoft.com/japan/msdn/vst ... s/visualc/
(修正済)

使い方がちょっとややこしいので説明します。
私が持っている種類と少し違うので、いかに示す方法と全く同じかどうかわからないですが、

まず
「ファイル」>「新規作成」>「プロジェクト」
でプロジェクト生成画面を出します。

左画面の「VisualC++」のカテゴリの中の「Win32」を選択。
右画面の「Wind32コンソールアプリケーション」を選択。
プロジェクト名に好きな名前をいれ、好きな場所に保存してください。
このままの場所でも結構です。

次に出てくるヴィザード画面で「次へ」を選択します。
「空のプロジェクト」を選択して完了を押します。

するとプロジェクトを作成出来ました。

ソリューションエクスプローラーが左か右に表示されていると思います。
なければメニューから表示させてください。
ソリューションエクスプローラーに先ほど決めたプロジェクト名が表示されている場所で右クリックし
「追加」>「新しい項目」
で、画面を出し、
左画面に「コード」が選択されている事を確認し、「.cpp」のファイルが右画面に選択されている事を確認します。
好きなファイル名を書いてファイルを作ると、何か書き込める画面が出てきます。
ここにソースコードを書いて、

Ctrl + F5 を押すと、コンパイルして実行してくれます。

tk-xleader

Re:書き忘れです

#5

投稿記事 by tk-xleader » 18年前

管理人さん、それVBのダウンロードになってますよ。VCはこっちのはずです。

http://www.microsoft.com/japan/msdn/vst ... s/visualc/

ここからダウンロードしてください。

ビスタ

Re:できませんでした…

#6

投稿記事 by ビスタ » 18年前

> まず、家にコンパイルできる環境を作りましょう。
> 学校だけでやってたんじゃ、絶対詳しくなれないですから。

そうですよね…コンパイラは、何度かやってみたのですが保存時に行方不明にしてしまって
使えなかったのと設定方法がよくわからなかったことでPCに入れるのを敬遠してました…。
もう一度やってみます。
#include <stdio.h>
 
  int main(){

         int a=2;
         int b=6;
         int c=4;

         for(.....)

  	printf("平均は");
  }
ええと…ここまででした…。何か根本的に間違ってるような気がします。
これでは初期値も条件式も出てこないのでforでループさせられませんよね…。
しかも本も見ててこんな状態です…。forの使い方は載ってますが…

乱数のほうもアルゴリズム的には全く理解できてないのでコピペ状態です。

管理人

Re:できませんでした…

#7

投稿記事 by 管理人 » 18年前

>tkさん
あらら、寝起きだったんで寝ぼけてました^^;(遅っ
ありがとうございます。

>ビスタさん
なるほど、まずファイルオープンウンヌンより、まず、コンパイラを導入すること、そして完全に入門分野を見直すことからはじめたほうがよさそうです。
でも、大丈夫です、みんなそこから始まりました。
私もコンパイラの導入でよくわからなくなって止めてしまった事のある人間の一人です。

でも、くじけてしまったらそこまでです。頑張っていきましょう。出来れば楽しいものですから。

では、先ほど2つ目に紹介したリンク先、
http://www5c.biglobe.ne.jp/~ecb/c/c00.html
ここはかなりつかえます。参考書などかわなくても、ウェブで十分勉強出来る世の中ですし、その辺で勉強してください。

勉強する時のコツは、ただダラダラ解説を見て進まないこと。
書いてあるサンプルプログラムを実際に自分でコンパイルして実行してみること、少し数値を変えたりしてどのように結果が変化するのか、自分が期待する結果になったかどうか確認しながら進めることです。
そして「完全に理解できなかった」「少しでも疑問がわいた」時はそれを調べるなり、質問するなりして、疑問を残さないことです。

とにかく演習が大事です。
プログラミングは社会のような暗記科目じゃなく、数学のように演習で身につける科目です。
リンク先を1章から順番に4章の最後までしっかり読んで身に付けてください。
for文や配列の使い方がわかってくるはずです。

tk-xleader

Re:できませんでした…

#8

投稿記事 by tk-xleader » 18年前

>乱数のほうもアルゴリズム的には全く理解できてないのでコピペ状態です。

乱数アルゴリズムに付いては、説明しましょう。たぶん課題の内容から考えて、アルゴリズムは何でもいいはずです。なので、線形合同法に付いて説明します。

線形合同法とは、簡単に言えば、割り算のあまりを乱数とするアルゴリズムです。そして、漸化式以下によって与えられます。

[color=White" size="5">X[/color][color=White" size="3">n[/color][color=White" size="5">=(X[/color][color=White" size="3">n-1[/color][color=White" size="5]×A+B)%M+1
(A,B,Mは定数、A<M B<M A>0 B>0)[/color]

となります。それで、A,B,Mの決め方がポイントになります。Mは簡単です。得たい乱数の範囲の最大値をMとすればいいのです。

Aの決め方ですが、Mが4の倍数でなければ、条件は一つになります。Mが持つ全ての素因数をA-1が持つ事が条件となります。例えば、M=50であれば、50の素因数は2と5ですから、A-1は、2×5=10の倍数であればいいのです。
簡単に言うと、Mが割り切れる全ての素数を掛け算したものの倍数に、+1した数をAとすればいいのです。
ところが、Mの値が4の倍数の場合、A-1も4の倍数倍数であるという条件もクリアする必要があります。

Bの決め方は、B,Mが共に割り切れる数が1しかないようにすればいいのです。

後は、これをC言語のプログラムにしてください。とりあえず、エクセルで出力した結果を添付します。ご参考までに。

ビスタ

Re:切羽詰る

#9

投稿記事 by ビスタ » 18年前

>管理人さん
参考URLその他でとにかくがんばってみます。課題が提出できないと進級できないのが
つらいですが…。来週までに間に合うことを願うしかないですね…。
またつまづいたら来ます。とりあえず解決済みにしておきます。

>tkmakwins15さん
アルゴリズムの説明までしてくださってありがとうございます。
数学的なことですっきりと分かった、とこまでいかないのが悔しいですが
追々理解していきたいです。

管理人

Re:切羽詰る

#10

投稿記事 by 管理人 » 18年前

おそらくプログラムは課題だけすませようとするような勉強方法では全く身に付きません。
きっとビスタさんはこの分野に興味があったから入学されたのだと思いますし、今の機会に是非勉強してください。
先ほどのリンク先の1章分は熟読したとしても1時間もかからないでしょう。
4時間あったら出来ることですし、それ全てについて詳しく調べていったとしても3日もあれば出来るはずです。
焦って飛ばしたり、サンプルを実行しなかったりすると結局時間を無駄にしただけになってしまうので、
じっくりやれば必ず出来ますから、じっくり頑張ってください。

この課題を完成させるための橋渡しとして、課題を作ってみますので、勉強しながらといていってみてください。
こういう場合は、順をおって完成させるのが一番です。



課題A 以下のプログラムを作ってください。

1、配列要素10個の配列を一つ作り、その中に何でもいいので、値を代入し、配列要素3番目の値を表示するプログラムを作ってください。
2、先ほど入れた値を全て足し、平均を表示するプログラムを作ってください。
3、配列に代入する値をrand()による乱数に変更し、乱数の平均を表示するプログラムを作ってください。
4、先ほどのプログラムの代入部分をfor文によって書き換えてください。

ここまで出来れば前半終了です。

課題B

1、fopenでファイルオープンし、閉じるだけのプログラムを作ってください。(開けなかった時のエラー処理も書きましょう)
2、ファイルオープンした時、fprintf関数を使って、数字の「5」を書き込み、閉じるプログラムを作ってください。
3、ファイルオープンした時、乱数を10個書き込み、閉じるプログラムを作ってください。

ここまで出来れば最初の課題が終わりです。
2つ目の課題はここまで出来ればすぐ出来ます。
頑張ってください。

管理人

Re:切羽詰る

#11

投稿記事 by 管理人 » 18年前

課題Aの1番の答えのサンプルです。参考にしてください。

#include <stdio.h>

void main(){

	int a[10];

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

	printf("3番目は %d \n",a[2]);
}
 

管理人

Re:切羽詰る

#12

投稿記事 by 管理人 » 18年前

課題Aの2の回答のサンプルです。範囲指定で見れますので、
もし答えが出たら答えあわせをしてください。


#include <stdio.h>

void main(){

	int a[10],t;
	t = 0;
	a[0]=2;
	t = t + a[0];
	a[1]=6;
	t = t + a[1];
	a[2]=4;
	t = t + a[2];
	a[3]=2;
	t = t + a[3];
	a[4]=6;
	t = t + a[4];
	a[5]=4;
	t = t + a[5];
	a[6]=2;
	t = t + a[6];
	a[7]=6;
	t = t + a[7];
	a[8]=4;
	t = t + a[8];
	a[9]=4;
	t = t + a[9];
	t = t/10;

	printf("平均は %d \n",t);
}

管理人

Re:切羽詰る

#13

投稿記事 by 管理人 » 18年前

課題Aの3

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

void main(){

	int a[10],t;

	t = 0;
	a[0]=rand();
	t = t + a[0];
	a[1]=rand();
	t = t + a[1];
	a[2]=rand();
	t = t + a[2];
	a[3]=rand();
	t = t + a[3];
	a[4]=rand();
	t = t + a[4];
	a[5]=rand();
	t = t + a[5];
	a[6]=rand();
	t = t + a[6];
	a[7]=rand();
	t = t + a[7];
	a[8]=rand();
	t = t + a[8];
	a[9]=rand();
	t = t + a[9];
	t = t/10;

	printf("平均は %d \n",t);
}

管理人

Re:切羽詰る

#14

投稿記事 by 管理人 » 18年前

課題Aの4

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

void main(){

	int a[10],t,i;

	t = 0;

	for(i=0;i<10;i++){
		a=rand();
		t = t + a;
	}

	t = t/10;

	printf("平均は %d \n",t);
}

管理人

Re:切羽詰る

#15

投稿記事 by 管理人 » 18年前

課題B_1

#include <stdio.h>

void main(){
	FILE *fp;

	fp = fopen("test.txt", "w");//書き込みw形式でファイルオープン

	if ( fp == NULL ){//開けなかったらNULLが入るのでエラー
		printf("ファイルオープンエラー\n");
		return;
	}

	fclose(fp);
}

管理人

Re:切羽詰る

#16

投稿記事 by 管理人 » 18年前

課題B_2
#include <stdio.h>

void main(){
	FILE *fp;

	fp = fopen("test.txt", "w");//書き込みw形式でファイルオープン

	if ( fp == NULL ){//開けなかったらNULLが入るのでエラー
		printf("ファイルオープンエラー\n");
		return;
	}
	
	fprintf( fp , "%d" , 5);//5をファイルfpに書き込む

	fclose(fp);
}

管理人

Re:切羽詰る

#17

投稿記事 by 管理人 » 18年前

課題B_3


・・・は出来たらそれが学校の課題の完成プログラムですっ。

夢幻

無題

#18

投稿記事 by 夢幻 » 18年前

今、VC++でFpsの表示を行う関数を例を元に作ったのですが
コンパイルはされるものの、表示がかなり細かく点滅してしまいました。
おそらく、この関数が原因だと思うのですが・・・
何が原因でしょうか?


#include "DxLid.h"

void Fps (void)
{
static int Time1,Time2;
static int Count;
double Fps;
int White;

if(Count == 0){
Time1=GetNowCount();
}

if(Count == 49){
White=GetColor(225,225,225);
Time2=GetNowCount();
Fps=(double)(1000/((Time2-Time1)/50));
DrawFormatString(0,0,White,"Fps %2.1f",Fps);
Count=0;
}else{
Count++;
}

return ;
}

管理人

Re:無題

#19

投稿記事 by 管理人 » 18年前

点滅するのは裏画面処理をせずにループさせてるからじゃないでしょうか?
http://dixq.net/g/#12
ココを参考にしてみてください。

しりうす~

Re:無題

#20

投稿記事 by しりうす~ » 18年前

単純に、 Count == 49 のFPS更新時の中に描画処理をいれちゃってるからかな。
DrawFormatString をif文の外に出すだけで問題ないかな。

管理人さんの仰ってるように描画周りも確認してみてくださいな。

夢幻

Re:無題

#21

投稿記事 by 夢幻 » 18年前

回答ありがとうございます。
あぁ、なるほど、そういうことですか・・・
ためしてみます

夢幻

Re:無題

#22

投稿記事 by 夢幻 » 18年前

main関数内の、ScreenFlip関数を、Fps関数内に
取り込んだところ無事、正常に表示されました。

お世話になりました、ありがとうございました。

閉鎖

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