for文を使用した2次関数のグラフ表示

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
グーナー
記事: 2
登録日時: 1年前

for文を使用した2次関数のグラフ表示

#1

投稿記事 by グーナー » 1年前

スクリーンショット 2022-06-18 12.38.18.png
スクリーンショット 2022-06-18 12.38.18.png (42.7 KiB) 閲覧数: 10473 回
添付の演習をやっておりますが、下記コードを記述するのが精一杯です。
演習のような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;

}

box
記事: 2002
登録日時: 13年前

Re: for文を使用した2次関数のグラフ表示

#2

投稿記事 by box » 1年前

こんな感じ?

コード:

#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;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: for文を使用した2次関数のグラフ表示

#3

投稿記事 by 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;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

参照魚
記事: 109
登録日時: 6年前

Re: for文を使用した2次関数のグラフ表示

#4

投稿記事 by 参照魚 » 1年前

表示と計算を別々に考えて、それぞれがそれぞれの役割に集中すると簡単かもしれません。

コード:

#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;
}

box
記事: 2002
登録日時: 13年前

Re: for文を使用した2次関数のグラフ表示

#5

投稿記事 by box » 1年前

表示と計算を別々に考えて、それぞれがそれぞれの役割に集中すると簡単かもしれません。
何か結果おかしくないですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: for文を使用した2次関数のグラフ表示

#6

投稿記事 by box » 1年前

コード:

	y = int( x*x/16.f + 0.5f );
intっていう関数がある処理系をお使いなんですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

参照魚
記事: 109
登録日時: 6年前

Re: for文を使用した2次関数のグラフ表示

#7

投稿記事 by 参照魚 » 1年前

>何か結果おかしくないですか?
あれ、何か間違えたかな...
yからxを求めるのと、xからyを求めるのだと微妙に違う?

>intっていう関数がある処理系をお使いなんですか?
C++でコンパイルしてました。Cだと関数形式のキャストできないですね。

グーナー
記事: 2
登録日時: 1年前

Re: for文を使用した2次関数のグラフ表示

#8

投稿記事 by グーナー » 1年前

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;
}

box
記事: 2002
登録日時: 13年前

Re: for文を使用した2次関数のグラフ表示

#9

投稿記事 by box » 1年前

>int x = sqrt(16 * y) + 1;
なぜ末尾に+ 1しているのでしょうか。
+1を省いて実行してみてください。
最下行の表示が、要求されている仕様と異なってしまうはずです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

返信

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