2次関数のグラフを作るには?

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

2次関数のグラフを作るには?

#1

投稿記事 by » 17年前

こんにちは、始めてのカキコです。。
私は、今年の6月から大学でプログラミングをならうよーになったんですか、まったく苦手なんです。。考えかたは思い浮かんでもなかなかC言語にして表せれないんです。なので、こちらでしばらくいろいろ勉強できれば、なぁーと思ってます。よろしくお願いします。

質問です。学校の課題です。
『y = x*x (-8<= x <= 8)のグラフを出力するプログラムを関数を用いて作成せよ.ただし,横軸がy軸,縦軸がx軸で良いものとする』
と言う問題です。

-8 <= x <= 8 の範囲で:
1) x の"値"(-8, -7, ... 7, 8)を出力
2) x*x の"値"(64,49,36,..49,64)を出力
して、その計算結果を配列に格納して、
表示はfor文を使う・・

というような雰囲気を考えてるんですが、本当によくわかりません。。教えてください。お願いします。

keichan

Re:C言語得意になりたい

#2

投稿記事 by keichan » 17年前

回答例を書いてみました。
どこか疑問に思うところがあれば何でも質問してください。
#include <stdio.h>

#define MIN_VALUE    (-8)
#define MAX_VALUE    (8)

/**
 *  @brief    引数で渡された値の2乗した値を適正な位置に出力する
 *  @param    in_x : x座標値
 */
void print_pow(const int in_x)
{
    const int print_pos = in_x * in_x;
    int i;

    printf([color=#0000ff">"%2d|"[/color], in_x);   /* x座標値を出力 */

    [color=#009900">/* "*"を表示したい位置まで" "を出力 */[/color]
    for( i=0; i<print_pos; i++ ) {
        printf(" ");
    }

    [color=#009900">/* 適正な位置まで来たので"*"を出力 */[/color]
    printf("*");

    /* 改行を出力して完了 */
    printf("\n");
}

int main()
{
    int i;
    for( i=MIN_VALUE; i<=MAX_VALUE; i++ ) {
        print_pow(i);
    }
    return 0;
}

Re:C言語得意になりたい

#3

投稿記事 by » 17年前

ありがとうございます。
では、さっそく質問です。
きっと、のちのち習って行くんだとおもうんですけど。。
まだ。。
『#define』とか『const』を見たことがないんですが。。
説明してもらえますか??

管理人

Re:C言語得意になりたい

#4

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

☆さんこんにちは^^
最近管理人は卒論真っ盛りで夜も眠れない日々をすごしております;
ここにおこしになってらっしゃる方々にはご迷惑をおかけし、申し訳ございませんm(_ _|||)m

回答ですが、まず、アルゴリズムの説明をしますね。

写真のような出力をするプログラムでしたら
64回空白を表示して*を表示。 改行後
49回空白を表示して*を表示。 改行後
36回空白を表示して*を表示。 改行後
・・・・・
0回空白を表示して*を表示。 改行後
・・・・・
64回空白を表示して*を表示。 改行後
とすれば書けますよ!
ループは二重ループを使うとよいでしょう。

サンプルプログラムを書きました。これを実行してみてください。
#include  <stdio.h>
void main(){
	for(int i=-8;i<=8;i++){
		for(int j=0;j<i*i;j++){
			printf(" ");
		}
		printf("*\n");
	}
}
2重ループは最初は難しく感じるでしょう。
しかし順をおってみていけば簡単ですから!

管理人

Re:C言語得意になりたい

#5

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

keichanさんが先に回答してくださってましたね^^;
keichanさんのプログラムはとても綺麗にかいてあるものですが、
きっとはじめて読むと難しく思うと思うので、
まず、私のプログラムを先にごらんになるといいと思います。
両者のプログラムとも、二重ループなんでやってることは一緒です。
私のプログラムで感覚をつかんだあと、keichanさんの綺麗なプログラムで完璧にされるとよろしいかと思います^^

二重ループはfor文のなかにfor文がはいっているプログラムの事で、
最初
for(int i=-8;i<=8;i++){
のループからiが-8で始まります。
for(int j=0;j<i*i;j++){
すぐにここのループにはいります。
iの2乗回空白を表示するわけですから
最初-8なんで64回空白が表示されますね。
64回空白が表示された後は*そして改行が表示されて
ループが戻ります。
処理は最初のループ
for(int i=-8;i<=8;i++){
こちらに戻り、今度はiが-7です。
処理はすぐ次のループ
for(int j=0;j<i*i;j++){
こちらにうつり、iは-7ですから49回空白が表示されたのち
ループをぬけ
*と改行が表示されます。
iが-8から8になるまで
これが実行され続けるわけですから
写真のような実行結果になるわけですね^^

わからなかったらまた聞いてください♪

Re:C言語得意になりたい

#6

投稿記事 by » 17年前

ありがとうございます。
『アルゴリズム』という言葉はきいたことありますよ☆
なるほど!!!
8*8=64、7*7=49の所に*印がくるようにすればいいんですね!!
で、それ以外は、空白ということですね!!

Re:C言語得意になりたい

#7

投稿記事 by » 17年前

連続投稿でごめんさい。

ほっっんとによく分かりました。

実は、私はC言語が本当によくわからなくて・・知り合いや兄弟でも教えてくれる人がいないため、掲示板で前質問をした時に、すっごく難しいことを言われて、挙げ句の果てに、キツイ文句を言われてしまいました。それで、ますますいやになってしまったんです。。

でも、今回ここで質問したら、とっても分かりやすく教えてもらえました☆もちろん『ブックマークに追加』しましたょ(笑)
もしよければ、これからも、わからないことがあれば、質問してもよろしいでしょうか??

管理人

Re:C言語得意になりたい

#8

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

☆さん、すみません><;
専門用語を日々使い続けていると専門用語に思えなくなってくるっていう現象が起きるんですよね><;
さらっとわかりにくい言葉を使ってました!
アルゴリズムっていうのは端的に言うと「順序」という意味です。
つまりプログラムのアルゴリズムというとプログラムがどのように処理が行われているのかその順序、処理の工程という事です。
いつの間にかわかりにくい言葉を並べてしまうような事がないように、とにかくわかりやすくに重点を置いて説明をしてきたつもりですが、
段々侵食されてしまっているようです^^;
アルゴリズムっていうのはプログラム書いてると必ず出てくるので覚えておく必要大です!
是非この機会に覚えておいてください^^

使用例:
for文のアルゴリズムは
for(i=0;i<10;i++)
の場合、iは0から始まってループが一度終わるとiは1加算され、10になるまでループ処理を行う。
for文のアルゴリズムはそういうアルゴリズムです。

と言った感じです^^

Re:C言語得意になりたい

#9

投稿記事 by » 17年前

はいはいはいはい!!!!
なるほどなるほど!!!
今本当にパソコンの前で首縦に振ってましたから^^
すごい!!!すごいですね!!
よーくわかりました☆
+@まで教えてもらえて本当に光栄です♪
いますっごく感動してます(笑)
私も得意になって、ここの掲示板で、質問に答えれるよーになりたいなぁ(笑)

管理人

Re:C言語得意になりたい

#10

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

☆さん

>実は、私はC言語が本当によくわからなくて・・知り合いや兄弟でも教えてくれる人がいないため、掲示板で前質問をした時に、すっごく難しいことを言われて、挙げ句の果てに、キツイ文句を言われてしまいました。

過去に掲示板でよく同じ事を言ったんですが、私も同じ経験があるので、是非今の初心者さんにはそんな思いをしてほしくない!
と思ってこのHPをたてたんです^^
掲示板で質問すると「わざと」難しく説明する人がいます。
どや!俺はこんなプログラムかけるんだぞ!
みたいな?
質問者の立場になって考えて回答してくれるような人には出会えませんでした。
友達にも詳しい人がいず、教授にも聞きにくく・・。途方にくれました。
質問者の立場としては「とにかくわかりやすく」に重点おいてほしいんですよね。
人の書いたプログラムってただでさえよみにくいのに、
それが上級者の書いたものだと余計にわからない!
ましてやわざと難しく書いたプログラムなんてわかるわけない!

>それで、ますますいやになってしまったんです。。

そういう流れで私もですw
しかしある時プログラム面白さがわかったんです。
それからというもの、ネットに質問することがなくなり、一人でひたすら本読んで勉強しました。
好きこそものの上手なれ。
頑張ってください^^


追伸ですが、
プログラムっていうのは定数は
#define で書くのが一番いいです。
そしてループするような処理は本当はkeichanさんのお書きになったように関数化すると
綺麗になります。
私は綺麗なプログラムっていうよりわかりやすくプログラムを書いたので完全ではありません。
keichanさんのお書きくださったプログラムも是非参考にしてください^^
もし#defineや関数化はまだ習っていなかったらもうちょっと自分で勉強してみてからでいいですので、
一度みなおしてみてはいかがでしょうか^^

Re:C言語得意になりたい

#11

投稿記事 by » 17年前

本当にありがとうございました。
よくお分かりになさっていて、嬉しかったです。

今学校では、配列や関数をやりかけたところなので、もっと勉強して理解できるように頑張ります。

管理人さんも卒論頑張ってくださいね♪
でもしっかり、睡眠とってくださいよぉー(笑)

お忙しいのにどーもありがとうございましたm(_)m

管理人

Re:C言語得意になりたい

#12

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

はい、ありがとうございます^^

またいつでもお越しください☆

頑張ってくださいね^^

keichan

Re:C言語得意になりたい

#13

投稿記事 by keichan » 17年前

『#define』とか『const』を見たことがないんですが。。
#defineは定数(プログラム内で変化することのない数値)を人間が見て理解しやすいように特定のキーワードに置き換えることをしてくれます。
今回の例では MIN_VALUE と MAX_VALUE ですね。

作ったときは直値でも問題はないのですが、何ヶ月か経った後に自分の書いたコードを見直したときに、「ん?この数値は何を意味してるんだっけ??」みたいな事に陥らない様に設けた"保険"です。
後は、他人にコードを見せる場合にも有効です。(当然ですね)

const に関しても#defineと同等の役割(定数)をしていますが、
使い方が違っています。
どこが違うのかと言うと、プログラム内でconstで定義された変数の値が毎回変わっていくということです。
[code]
void print_pow(const int in_x)
{
    const int print_pos = in_x * in_x;
[/code]
ここで print_pos は関数の引数の値によって値が決定します。
in_x に関しても、呼び出し元のmain()内で毎回引数で渡している値が変化しています。





こんな説明でわかりますか?(難しく書いてませんか?)

Re:C言語得意になりたい

#14

投稿記事 by » 17年前

こちらこそ、ありがとうございます♪

嬉しいです。またおじゃまさせていただきます☆

keichanさんも、管理人サンもありがとうございました♪

私もがんばります(*^皿^*)

バグ

Re:C言語得意になりたい

#15

投稿記事 by バグ » 17年前

細かいツッコミですが…

for( i = 0 ; i < 10 ; i++ )

の場合、厳密には『iが10になるまで繰り返す』ではなく、『iが10より小さい値である間、繰り返す』が正しいです。

管理人

Re:C言語得意になりたい

#16

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

そうですね^^

ただ実際にループを抜けるときにはiは10になっているのでそういう気持ちで書きました。

実際にはi=10の時にはループしませんから、間違わないようにしないといけませんね☆

閉鎖

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