質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

3919閲覧

C言語で配列に格納した値が0になる。

man_

総合スコア45

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/07/10 08:08

#やりたいこと
C言語で、円の面積と面積の分散を求めるコードを書いていました。
そこで、算出した面積を配列に格納するのですが、printfで格納した値を表示すると0と出力されます。
その原因は何でしょうか?ご教授お願いします。
コードと出力結果を以下に示します。

c

1 2#include <stdio.h> 3 4double Menseki(double r) 5{ 6 double S; 7 S = 3.14*r*r; 8 return S; 9} 10 11double Bunsan(double x, double t) 12{ 13 double L; 14 L = (x-t)*(x-t); 15 return L; 16} 17int main(){ 18 19 int i; 20 double area[6], mensekigokei=0, bunsangokei=0, heikin, bunsan; 21 22 for (i=1; i<=5; i++) { 23 double R, area[i]; 24 printf("半径を入力せよ:"); 25 scanf("%lf", &R); 26 area[i]=Menseki(R); 27 printf("%5.2lf\n",area[i]); 28 mensekigokei+=area[i]; 29 } 30 heikin = mensekigokei/5; 31 32 for (i=1; i<=5; i++) { 33 bunsangokei+=Bunsan(area[i],heikin); 34 } 35 bunsan=bunsangokei/5; 36 printf("面積の平均は%5.2lf\n",heikin); 37 printf("面積の分散は%5.2lf\n",bunsan); 38 39 for (i=1; i<=5; i++) { 40 printf("%d番目の円の面積は%5.2lf\n", i, area[i]); 41 } 42}

# 出力結果

半径を入力せよ:1 3.14 半径を入力せよ:2 12.56 半径を入力せよ:3 28.26 半径を入力せよ:4 50.24 半径を入力せよ:5 78.50 面積の平均は34.54 面積の分散は1193.01 1番目の円の面積は 0.00 2番目の円の面積は 0.00 3番目の円の面積は 0.00 4番目の円の面積は 0.00 5番目の円の面積は 0.00

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

main()の最初のforループ内で求めた面積を表示したいのでしょうが、そのforループ内で求めた面積は、ループ内でdouble R, area[i];として定義された配列area内に格納され(この定義自体もマズいのですが)、この配列areaのスコープはこのループ内に限定されるので、ループが終わるとこの配列も消滅してしまいます。

そしてprintfで表示するために参照している配列areaは、main()関数の最初のほうで定義されているので、コンパイルはエラーになっていないわけですが、その値は明示的に代入されてはいないので不定値です。たまたま 0.0 になっているだけ。

投稿2021/07/10 08:21

itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

for (i=1; i<=5; i++) { double R, area[i];

ここでローカル変数のシャドーイングが行われています。
よってこのブロックの中ではareaはブロックの外のareaとは別の変数になっています。

投稿2021/07/10 08:15

asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

man_

2021/07/10 08:16

ありがとうございます。実行できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問