電子書籍の厳選無料作品が豊富!

C言語で戻り値を使った正方形の面積と直方体の体積の表示について分からずに困っています。

C言語ラストの問題が一番難しくて、全然分からずに困っています。

以下の点に留意して、一辺の長さを入力すると、正方形の面積と直方体の体積を計算するプログラムを作成する。main内
1)整数型の変数length、men、taiを宣言する。
2)実行例と同様の表示になるように、“一辺の長さを入力してください。”を表示し、入力された値を、変数lengthに読み込む。
3)作成する関数名は、titleとし、lengthを引数とし、関数titleを使う。
4)正方形の面積を計算する関数の関数名は、squareとし、lengthを引数とし、戻り値をmen に代入する。
5)直方体の体積を計算する関数の関数名は、qubeとし、lengthを引数とし、戻り値をtai に代入する。
6)“一辺○○の正方形の面積は ○○です。”と表示する。
7)“一辺○○の直方体の体積は ○○です。”と表示する。

関数title内
1)引数を変数名xとする。
2)下記の実行例の様になるように、表示を行う。

関数square内
1)引数を変数名xとする。
2)整数型の変数valを宣言する。
3)正方形の面積を計算し、valに代入する。
4)valの内容が戻り値となるようにする。

関数qube内
1)引数を変数名xとする。
2)整数型の変数valを宣言する。
3)直方体の体積を計算し、valに代入する。
4)valの内容が戻り値となるようにする。

という問題です。

考えて作ってみたのが下のですが、間違いだらけでどうしようもありません。

#include <stdio.h>

void main(void)
{
int length,men,tai;

printf("一辺の長さを入力してください。\n");
scanf("%d",&length);
men=square(length);
tai=qube(length);
printf("***********************************\n");
printf("* 一辺%d *,&lenght);
printf("*正方形の面積*")
printf("*直方体の体積*")
printf("*を計算します。*")
printf("*************************\n");



}
int square(x)
{

int val;

val=x*x;

return val;
}
int qube(y)
{
int val;
val=x*x*x

return val;

}

どなたかよかったら教えてください。
よろしくお願いします。

A 回答 (2件)

基本の流れは大体あってるのですから、細かいところをもう少し理解しましょう。



○ ;(セミコロン)が無い行があちらこちらにあります。C言語では ;までで一つの命令になります。改行文字はただの空白と同じ扱いです。
このような場合、エラーメッセージは次の行で出ることが多いので見付けにくいです。

○ C言語では、関数を定義して使いたいときは、次の2つのどちらかの方法を使います
方法1) 使用するより前に定義する。
今回の例なら、main関数で使うので、それより前に定義を記述します。

方法2)使用する前に、プロトタイプ宣言と呼ばれる、関数の戻り値や引数の型だけを予め記述しておく。定義部はどこに記述してもよい。
今回の例なら、mainの前に
int square(int) ;
と宣言だけしておけば、関数本体は現在の位置でもかまいません。

○最近の関数宣言のやりかたは
戻り値の型 関数名(引数の型1 仮引数名1,引数の型2 仮引数名2,.....)
です。
int square(x)
では、引数の型が抜けています。型が省略された場合はint型とみなすため、今回の例では大丈夫ですが、省略しないようにしましょう。
int square(int x)

○また、 int qube(y) では、引数にyを使っているのに関数中ではyは使われておらず、宣言されていないxが使われているためエラーになります。

○ printf("* 一辺%d *,&lenght);
lenghtがlengthのミスだとして。
scanfとprintfを混同しています。この2つは非常によく似た書式を使いますが、細かい点で違うので、混同しないようにすることが大切です。

「printf」で「%d」に対応するのは「int型(および、暗黙の型変換でint型になる整数)」です。
「&length」は「変数lengthへのポインタ」であって、lengthが格納している整数ではありません。

○また、このあたりのprintfは、問題にある「関数title」として定義しなければならないところではないでしょうか?

○printfの書式のしくみがわかれば、 6),7)は簡単ではないでしょうか?
書式には%による変換を複数記述できます。%が出てきた順番に、引数の前から対応します。

○> 考えて作ってみたのが下のですが、間違いだらけでどうしようもありません。
とありますが、現在のところ、論理的な間違いは「関数titleが無い(けど、同等の処理は入っている」「6),7)の表示部が無い」の2つだけで、あとの間違いは、コンパイル時にエラーや警告としてメッセージが出るものばかりです。

エラーメッセージを読む癖をつけましょう。
また、メッセージを検索にかければ、原因や対処方が見付かるケースも多いです。
    • good
    • 0

・実行例が示されていないので、何を表示すればいいか分からない。


・関数mainの型が正しくない。
・関数mainの中で"一辺%d"をprintfしようとしている行で、文字列を閉じるダブルクオーテーションがない。変数名の綴りに間違いがある。不要な&演算子がある。
・行の終わりにセミコロンがないprintfがある。
・関数titleを作っていない。
・6)と7)の表示部分を作っていない。
・関数squareの定義で、引数xの型を宣言していない。
・関数qubeの定義で、引数の変数名はxと指定されているのにyを使っている。その上、引数の型を宣言していない。
・関数qubeの定義で、valに計算結果を代入している行の終わりにセミコロンがない。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!