下記に記載したプログラムは一定時間、時刻を周期Tで割った物を整数化する事で得た周期外時刻分を引いて周期内数値に変え、周期前半なら1後半なら-1を格納しているだけだそうです。
このプログラムを理解したいのですが、各行に説明が書いてないのでいまいちよくわかりません。
なので、どなたか各行に「//」を書いたのでその横にその行のソースの説明を書いて頂けませんか?
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define rint(x) ((int)((x)+0.5))//
#define trunc(x) ((int)(x))//
int main(void){//
/* (1) definition */
double tstep = 0.01, last_time = 5.00;//
int max_step; max_step = rint(last_time/tstep);//
double i, REtime, time, *output = new double[max_step];//
output[max_step], time;//
double T = 1.0; /* wave cycle *//
int j=0, multi;//
/* (2) generating square wave */
// amplitude : 1
// time cycle : T = 1.0[sec]
// time step : 0.01[sec]
// last time : 5[sec]
for (time = 0.0; time < (last_time+tstep); time = time+tstep){//
i = time/T; multi = trunc(i);//
REtime = time - T*multi;//
if (REtime <= T/2.0)//
output[j] = 1;//
else//
output[j] = -1;//
j = j+1;//
}
/* (3) file out */
int t1;//
FILE *f1;//
f1 = fopen("square.csv","w");//
for(t1 = 0; t1 < 500; t1++)//
fprintf(f1,"%f,\n",output[t1]);//
fclose(f1);//
return 0;
}
No.1ベストアンサー
- 回答日時:
説明を分かりやすくするため、時間の単位を「秒」とします。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define rint(x) ((int)((x)+0.5))//小数点以下四捨五入
#define trunc(x) ((int)(x))//小数点以下切り捨て
int main(void){//プログラムの開始
/* (1) definition */
// tstep・・・波形を記録する時間間隔
// last_time・・・記録終了の時間
// ⇒下の場合、0.01秒毎に5秒になるまで記録します。
double tstep = 0.01, last_time = 5.00;
// max_step・・・終了時間まで記録する為に必要なレコード数。
// 0.01秒毎に5秒間記録するから、500個のレコードを保存する事になります。
// ⇒「四捨五入」で整数化していますが、これに+1するか、あるいは「切り上げ」
// の方がいいと思います。入れ物は大きいにこした事はないです。
int max_step; max_step = rint(last_time/tstep)+1; //←勝手に+1を追加しました。
// i・・・波数(1周期を1.0として、何周回ったか)
// REtime・・・単周期内の経過時刻(1周期経過するごとに0.0になる)
// time・・・記録開始からの経過時間
// output・・・記録を保存するバッファ
double i, REtime, time, *output = new double[max_step];
output[max_step], time;// いらない行です。
// T・・・1周期の時間
// j・・・何個記録したかのカウンタ
// multi・・・何周期進んだか(iの整数部)
double T = 1.0; /* wave cycle *//
int j=0, multi;//
/* (2) generating square wave */
// amplitude : 1
// time cycle : T = 1.0[sec]
// time step : 0.01[sec]
// last time : 5[sec]
// 0.0秒から5.0秒まで、0.01秒毎に記録していきます。
// ぴったり5.0秒の場合も記録したいので、5.01秒までループさせます。
for (time = 0.0; time < (last_time+tstep); time = time+tstep){
// i=現在の波数(1周期を1.0として、何周回ったか)
// multi=現在何周目か(iの整数部)
// T*multi=現在の周期に入った時間
// REtime=現在の周期に入ってからの経過時間
i = time/T; multi = trunc(i);
REtime = time - T*multi;
// 現在の周期に入ってからの経過時間が半周期以内なら、1を、
// そうでなければ-1をバッファに格納し、バッファの格納位置を1つ進める。
if (REtime <= T/2.0)
output[j] = 1;
else//
output[j] = -1;
j = j+1;
}
/* (3) file out */
int t1; // ループカウンタ
FILE *f1; // 保存するファイルのポインタ
f1 = fopen("square.csv","w");// ファイルを開きます。
// output[]に格納した値を1つずつファイルに保存します。
// ⇒個数を500としていますが、各パラメータが変更された場合に修正する必要があるので、
// 500の代わりに、jを使った方が良いです。
// (jにはoutput[]に格納された数が入っています)
for(t1 = 0; t1 < j; t1++)//
fprintf(f1,"%f,\n",output[t1]);//
fclose(f1);//
delete[] output;// ※outputはdeleteしないといけません。
return 0;
}
last_timeやtstepの値を変更する場合は、
for (time = 0.0; time < (last_time+tstep); time = time+tstep)
でループする回数が、max_step の数値以下になっているかどうか注意が必要です。
微妙な場合は、とにかくmax_stepを大きめにとりましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# プログラミングを教えて欲しいです。 配列aは、int a[9]={7,6,12,8,3,5,10,9 4 2022/12/19 23:27
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
c言語で、繰り返し文の中で、0....
-
sin(x)の近似について
-
2次方程式の解を求めるプログ...
-
Cで3乗根を求める方法
-
関数におけるif文とreturn文に...
-
int とdoubleの比較
-
相互相関関数
-
C言語でポインタを用いた平均,...
-
MATLABで画像のヒストグラムを...
-
C言語で直角三角形の斜辺を求め...
-
C言語を実行すると-infが出てき...
-
C言語の問題です。
-
至急です! マクロ定義で #defi...
-
ボール同士の衝突
-
関数のプログラム
-
C言語の型による処理速度の違い
-
C#イベント中の戻り値の設定の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
C 開放してるのにエラー(doubl...
-
Cで3乗根を求める方法
-
float型とdouble型の変数の違い...
-
至急です! マクロ定義で #defi...
-
C言語の型による処理速度の違い
-
int とdoubleの比較
-
関数におけるif文とreturn文に...
-
C言語初心者 構造体 課題について
-
c言語のコンパイルエラー canno...
-
C言語 関数プロトタイプ宣言の...
-
C言語を実行すると-infが出てき...
-
float?数字の後にLがつくもの
-
数値を指数部と仮数部に分離したい
-
difftime()について
-
浮動小数点数が表示されないん...
-
たくさんの数の平均を求める方...
-
DWORDの警告
-
-1.#IND00と出てしまうのですが...
おすすめ情報