ページ 1 / 1
for文を使用した2次関数のグラフ表示
Posted: 2022年6月18日(土) 16:13
by グーナー
- スクリーンショット 2022-06-18 12.38.18.png (42.7 KiB) 閲覧数: 11064 回
添付の演習をやっておりますが、下記コードを記述するのが精一杯です。
演習のような2次関数のグラフを作成するにはどうしたらよろしいでしょうか。ご教示願います。
コード:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
double x(double y){ //y = (x * x) / 2 の解
return sqrt(y * 16);
}
int main() {
double y = 49;
double kai;
for (double y = 49; y > -1; y--)
{
for (kai = x(y); kai > -1; kai--)
{
printf(" ");
}
printf("*\n");
}
return 0;
}
Re: for文を使用した2次関数のグラフ表示
Posted: 2022年6月18日(土) 17:26
by box
こんな感じ?
コード:
#include <stdio.h>
#include <math.h>
#define YMAX (49)
int func(double y)
{
return sqrt(16 * y) + 1;
}
void plot(int y)
{
int x = func((double) y), i;
static int mx;
if (y == YMAX) mx = x;
for (i = -mx; i <= mx; i++) {
if (i == 0) putchar('|');
else if (i == -x || i == x) putchar('*');
else putchar(' ');
}
putchar('\n');
}
int main(void)
{
int y;
for (y = YMAX; y >= 0; y--) {
plot(y);
}
return 0;
}
Re: for文を使用した2次関数のグラフ表示
Posted: 2022年6月18日(土) 19:25
by box
何か暇だったので遊んでみた。
コード:
#include <stdio.h>
#include <math.h>
#define YMAX (49)
void plot(void)
{
int y, mx, i;
for (y = YMAX; y >= 0; y--) {
int x = sqrt(16 * y) + 1;
if (y == YMAX) mx = x;
for (i = -mx; i <= mx; i++) {
putchar((i == 0) ? '|' : (i == -x || i == x) ? '*' : ' ');
}
putchar('\n');
}
}
int main(void)
{
plot();
return 0;
}
Re: for文を使用した2次関数のグラフ表示
Posted: 2022年6月18日(土) 19:34
by 参照魚
表示と計算を別々に考えて、それぞれがそれぞれの役割に集中すると簡単かもしれません。
コード:
#define MAX_Y (49+1)
#define MAX_X (28*2+1) /* 28 <- sqrt( 49 * 16 ) */
int main(){
int i,j;
int x,y;
char plot[MAX_Y][MAX_X]; /* (x,y)が取り得る範囲の配列を用意してしまう */
/* スペースで初期化*/
for ( i = 0; i < MAX_Y; i++ ) {
for ( j = 0; j < MAX_X; j++ ) {
plot[i][j] = ' ';
}
}
/* Y軸の初期化 */
for ( i = 0; i < MAX_Y; i++ ) {
plot[i][MAX_X/2] = '|';
}
/* 計算部分は素直にxからyを導く */
for ( x = -MAX_X/2; x <= +MAX_X/2; x++ ) {
y = int( x*x/16.f + 0.5f );
/* 結果を領域に転写する */
i = -y + MAX_Y-1; /* Y軸は上下反転させる */
j = +x + MAX_X/2; /* X軸は0を中心に持ってくる */
plot[i][j] = '*';
}
/* 配列を全部出力する */
for ( i = 0; i < MAX_Y; i++ ) {
for ( j = 0; j < MAX_X; j++ ) {
putchar( plot[i][j] );
}
putchar( '\n' );
}
return 0;
}
Re: for文を使用した2次関数のグラフ表示
Posted: 2022年6月18日(土) 22:28
by box
表示と計算を別々に考えて、それぞれがそれぞれの役割に集中すると簡単かもしれません。
何か結果おかしくないですか?
Re: for文を使用した2次関数のグラフ表示
Posted: 2022年6月18日(土) 22:55
by box
コード:
y = int( x*x/16.f + 0.5f );
intっていう関数がある処理系をお使いなんですか?
Re: for文を使用した2次関数のグラフ表示
Posted: 2022年6月18日(土) 23:14
by 参照魚
>何か結果おかしくないですか?
あれ、何か間違えたかな...
yからxを求めるのと、xからyを求めるのだと微妙に違う?
>intっていう関数がある処理系をお使いなんですか?
C++でコンパイルしてました。Cだと関数形式のキャストできないですね。
Re: for文を使用した2次関数のグラフ表示
Posted: 2022年6月19日(日) 10:25
by グーナー
boxさん
ご教示ありがとうございます。
#define YMAX (49)はまだ勉強しておりませんが、
素人の私でもおおむね文法を読み解くことができました。
感謝です。
1点以下質問です。
>int x = sqrt(16 * y) + 1;
なぜ末尾に+ 1しているのでしょうか。
すみませんが教えて下さい。
box さんが書きました: ↑1年前
何か暇だったので遊んでみた。
コード:
#include <stdio.h>
#include <math.h>
#define YMAX (49)
void plot(void)
{
int y, mx, i;
for (y = YMAX; y >= 0; y--) {
int x = sqrt(16 * y) + 1;
if (y == YMAX) mx = x;
for (i = -mx; i <= mx; i++) {
putchar((i == 0) ? '|' : (i == -x || i == x) ? '*' : ' ');
}
putchar('\n');
}
}
int main(void)
{
plot();
return 0;
}
Re: for文を使用した2次関数のグラフ表示
Posted: 2022年6月19日(日) 13:15
by box
>int x = sqrt(16 * y) + 1;
なぜ末尾に+ 1しているのでしょうか。
+1を省いて実行してみてください。
最下行の表示が、要求されている仕様と異なってしまうはずです。