こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語の基礎 . 2乗値の差について

----------------------------------------------------------------
/*二つの整数の二乗の差を求める*/

#include<stdio.h>


/*二乗値を返す*/

intsqr(intx)
{

return (x*x);
}

/*--------差を返す-------*/

int diff(int x, int y)
{
return (x>y? x-y : y-x);
}

int main(void)
{

int kx,ky,kx2,ky2;

printf("二つの整数を入力してください");
printf("整数kx:");scanf("%d",&kx);
printf("整数ky:");scanf("%d",&ky);


kx2=sqr(kx);/* kxの二乗*/
ky2=sqr(ky);/*kyの二乗*/

printf("kxの二乗とkyの二乗の差は%dです。\n",diff(kx2,ky2));

return 0;

}

教えてください!
上のプログラミングの部分的にわからないです。

(1)最初の int sqr(int x)というのはどういう風に読めばいいのでしょうか?
sqrというのはintのようにきめられた語ですか???
あとどうしてカッコの中にint xというのが入ってるのでしょうか。
今まではint iとか int noとかしてあったのですが、急に難しくなりました
>_<

(2)そのあと、{}の中は return (x*x)となっています。
これはxかけるxだと思いますが、良く分かってません。
コンパイルして実行した後は、プログラムを上から読むと習ったのですが、
そうすると意味はどうなるのでしょうか?

(3)ここは多分重要なんだと思います
int diff(int x,int y)
return (x>y ? x-y : y-x);
ここも多分条件だと思います。もしxがyより大きければ、
そのあとの?の意味を教えてください。
あとx-y:y-xの間の:意味はなんでしょうか??
どうしても今まで単純にfor(i=2;i<no;i++)という単純な式だったのですが
関数の項目になった途端に難しくなりました。。上はiは二からスタートで
noまで行い、iの値は一つずつ増加していくです。

(4) in main (void)の下の分は大体OKです。(scanf)まで。

Kx2=sqr(kx);
ky2=sqr(ky);とありますが、int main(void)の中で int kx,ky,kx2,ky2と
4つの箱を作ったとイメージしてます。
その中で、整数kxの値を実行した際に数字を入力したとします。
たとえば10.そうした場合scanfの分が &kxとなってますので
kxに読み込みにいけという命令文になると思います。
では10の値をkxにいれたとして、

なぜkx2=sqr(kx);なのでしょう? sqr(kx)ってなんですか?
一番最初に作成した int sqr(int x)の部分に関連してますか?
先ほど10と入力したものは"kx"の箱の中には入ってると思いますので
kx2=sqr(10)とは多分ならないと思ったのですが。。。

ごめんなさい、良く分かってないです、ただ、関数を最初に作成して
diff(kx2,ky2)で読み込みに行ってるようには何となく本を読んで
理解してるのですが、まだよくわかってません。
どなたか、このプログラムの読み方を教えてください、お願いします!

投稿日時 - 2009-07-03 13:55:22

QNo.5094896

暇なときに回答ください

質問者が選んだベストアンサー

>(1)最初の int sqr(int x)というのはどういう風に読めばいいのでしょうか?

さあ(笑)。
敢えて言うと、

整数型xを(int x)を引数に持ち、整数型の返り値(int)を持つ関数sqr

かしら?
まあ、長ったらしく読めばそうなんのかな?

>sqrというのはintのようにきめられた語ですか???

違います。勝手にsqrと名づけただけ、です。

>あとどうしてカッコの中にint xというのが入ってるのでしょうか。

関数sqrの引数です。数学的に言うとint xってのは関数sqrの「独立変数」です。

>今まではint iとか int noとかしてあったのですが、急に難しくなりました
>_<

main関数内の整数宣言と勘違いしています。

>(2)そのあと、{}の中は return (x*x)となっています。

(2)に記述している事は正しいです。その通りですよ。

>(3)ここは多分重要なんだと思います
>int diff(int x,int y)
>return (x>y ? x-y : y-x);
>ここも多分条件だと思います。

その通り、です。単にx > yだったらx-yを返せ、そうじゃなかったらy-xを返せ、って事ですね。
幾分トリッキーな書き方ですが、意味は貴方が想像している通り、です。Cではこう言うトリッキーな書き方が可能です。
実際は、そこはC言語で言うとこの「条件"文"」じゃなくって条件演算子と呼ぶ模様で、+とか-とかの仲間ですね。詳しくはこちらを参照してください。

【C言語講座】演算子一覧表:
http://www.bohyoh.com/CandCPP/C/operator.html

>なぜkx2=sqr(kx);なのでしょう? sqr(kx)ってなんですか?

最初、kx2には「何も入っていません」。そこにsqr関数の「計算結果」を代入しているんです。
sqr関数はこの場合、具体的な引数(実引数と呼ぶ)kxを取っています。nana070707さんの例に従えばkxは10ですよね。
sqrと言う関数が「引数10」を取った、と言う事は何らかの計算を行って数値を返します。つまりこの場合は100が返ってきます。
(何故なら、sqrはsquare、つまり「二乗」を意味しています。その定義が一番最初のint sqr(int x)で成されています。)
つまり、kx2に代入される値は100なんです。
従って、ここは、計算とすれば

kx2 = 100;

の事で、まさしくnana070707さんが言う通り、

>kx2=sqr(10)とは多分ならないと思ったのですが。。。

いや、なるんです(笑)。勘が良いですね。

>ただ、関数を最初に作成して
>diff(kx2,ky2)で読み込みに行ってるようには何となく本を読んで
>理解してるのですが、まだよくわかってません。

いや、全くその通りですよ。
main関数から関数sqrと関数diffを「呼んで」いるんです。
間違って無いですよ。

投稿日時 - 2009-07-03 15:13:33

お礼

返事書いていただいて、ありがとうございました!

すごく説明がわかりやすくて、理解度が深まりました。

本当にありがとうございました!!!

投稿日時 - 2009-07-04 06:58:40

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

ご自分で動作確認をする手段として、printf関数を各処理の後につけて変数がどのように変化しているのかを確認することができます。
例えばこのプログラムの場合、
sqr関数の中でreturnする前に
printf("***x=%d in sqr function.\n",x);
diff関数の中でreturnする前に
printf("***x=%d, y=%d in diff function.\n",x,y);
main関数の中でprintf("整数ky:"); scanf("%d", &ky);の後に
printf("***kx=%d, ky=%d, kx2=%d, ky2=%d\n", kx, ky, kx2, ky2);
main関数の中でkx2 =sqr(kx); /* kxの二乗*/の後に
printf("***kx=%d, ky=%d, kx2=%d, ky2=%d\n", kx, ky, kx2, ky2);
main関数の中でky2 =sqr(ky); /*kyの二乗*/の後に
printf("***kx=%d, ky=%d, kx2=%d, ky2=%d\n", kx, ky, kx2, ky2);

これでsqr関数を呼ぶ前と呼んだ後での変数の変化が分かるんじゃないかと思います。

最後の
printf("kxの二乗とkyの二乗の差は%dです。\n", diff(kx2,ky2));
では、変数を使わずにこの場でdiff関数を呼び出し、その戻り値(返り値とも言います)を参照しています。戻り値とは、diff関数内のreturnの右に書かれている値のことです。

投稿日時 - 2009-07-03 17:53:09

お礼

返事ありがとうございました!!
最初、難しすぎてわかりませんでした。。>_<
でも、プログラミングの中に記入してみれば変化がみれるというので
やってみたら、実行結果がでました!
10から100に変化している部分がみえました!!>_<
ごめんなさい、最初とても難しい事が書いてあるので
わからなかったのですが、試しにやってみたら驚く結果になりました!!
すごく、感謝しています、本当にありがとうございました!!!!!

投稿日時 - 2009-07-04 08:30:30

ANo.2

関数、サブルーチンについてよくわかっていないみたいですね。
http://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%96%E3%83%AB%E3%83%BC%E3%83%81%E3%83%B3
を読んでおくといいでしょう
また、引数( http://ja.wikipedia.org/wiki/%E5%BC%95%E6%95%B0 )も参考になるはずです。

(1)について
sqrはC言語における関数を定義している部分です。
プログラミング言語では同じことをする部分を関数として分けることができます。今回は数の2乗を計算する部分を関数としています。
なので、sqrは2乗を示すsquareを縮めたものでしょう

コードの読み方で上から読むのはそのとおりですが、関数を使っている場合は異なります。
まずはmainを読み、そこで呼ばれている関数を読みます。
通常、関数には処理の意味を表す名前がついているので、大体の理解ができるはずです

投稿日時 - 2009-07-03 15:36:46

お礼

返事書いていただいて、ありがとうございました。
Wikipediaとても参考になりました!
もう少し、理解度を増やさないとただ、プログラミングを入力してるだけでは
駄目だと思いました>_<
ありがとうございました!!!

投稿日時 - 2009-07-04 07:00:29