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

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

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

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

Q&A

解決済

2回答

2224閲覧

C言語 球の体積を求めたい

nekoatsume

総合スコア7

C

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

0グッド

2クリップ

投稿2020/05/09 06:34

編集2020/05/09 07:07

C言語初心者です。
スクラッチで球の体積を求めるプログラムをつくり、
それに沿ったプログラムを書きたいのですがうまくいきません。

コードは以下の通りです。(スクラッチでは添付画像のように作り、動きました)

#include <stdio.h> #include <stdlib.h> #include <math.h> int main(int argc,char *argv[]) { double r;//半径 double V;//体積 double X;//分割数 double P;//床面の数 double x;//sqの中心 double y;//sqの中心 double No_x;//番号x double No_y;//番号y double h;//高さ double c;//中心 double D;//x方向の分割数 r=1; V=0; X=1000000; P=r/X; c=P/2; D=X;    No_x=No_y=0;       while(No_x<X){ x=No_x*P+c; y=No_y*P+c; h=(sqrt(r*r)-sqrt((x*x)+(y*y))); V+=(V+((P*P)*h)); No_x=No_x+1; } while(No_y<X){ No_x=0; D=(sqrt(r*r)-((No_y*P)*(No_y*P))); No_y=No_y+1; } V=V*8; printf("球の体積は%0.10fです。\n",V); return 0; }

【表示される警告】
variable 'D'set but not usedと表示されDが機能していないようですが、
その原因も分かっておりません。
結果は”球の体積はinfです”と表示されてしまっています。

【開発環境】
Linuxのubuntu上で開発しています。

while文の使い方から間違えているのかと思い、
ループ位置の変更など試してみましたがうまくいかない状況です。

超初心者質問で申し訳ありませんが、教えていただけますと幸いです。

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

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

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

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

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

cateye

2020/05/09 06:41 編集

行番号を削除して<code>で出てくる ```と```の間に貼り付けて下さい。 検証が出来ません。
cateye

2020/05/09 06:52

No_x = No_y = 0;とwhile(No_x < X)の前に全角空白が有ります。修正しましょう。
jimbe

2020/05/09 07:01 編集

> variable 'D'set but not used 変数 'D' が代入される(式の左辺に出てくる)だけで使われていない(右辺に出てくる式が無い)という意味ですが, Dは何のために求めているのでしょうか?
guest

回答2

0

ベストアンサー

それなりにテコ入れが必要でした。

  • 元々の質問にあったループについては、xとyで二重ループにする必要があります。
  • yで求めたDは分割数ではなく、yの移動により短くなっていくxに対応する半径だと思います。
  • これに伴い、xはDを半径としてXで分割してPx、cxで計算するようにしました。
  • sqrt(rr)-sqrt(... ではなくsqrt(rr-...)と思います。
  • V+=V+と二重に足しこんでいました。
  • 分割数は10回にしています。

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <math.h> 4 5int main(int argc, char* argv[]) 6{ 7 double r;//半径 8 double V;//体積 9 double X;//分割数 10 double P;//床面の数 11 double Px;//床面の数 12 double x;//sqの中心 13 double y;//sqの中心 14 double No_x;//番号x 15 double No_y;//番号y 16 double h;//高さ 17 double c;//中心 18 double cx;//中心 19 double D;//x方向の分割数 20 r = 1; 21 V = 0; 22 X = 10; 23 P = r / X; 24 c = P / 2; 25 D = X; 26 No_x = No_y = 0; 27 while (No_y < X) { 28 No_x = 0; 29 y = No_y * P + c; 30 D = sqrt(r * r - y * y); 31 Px = D / X; 32 cx = Px / 2; 33 while (No_x < X) { 34 x = No_x * Px + cx; 35 h = sqrt(D * D - x * x); 36 V += Px * P * h; 37 No_x = No_x + 1; 38 } 39 No_y = No_y + 1; 40 } 41 V = V * 8; 42 printf("球の体積は%0.10fです。\n", V); 43 return 0; 44}

こういった場合、直接コードを書くべきかわからないですが、参考になればと思います。

投稿2020/05/09 09:29

etsuhisa

総合スコア416

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

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

nekoatsume

2020/05/10 05:40

いつも丁寧に教えてくださりありがとうございます。 コードをみて理解していってる段階なので、大変助かります。 きちんと理解できるようにご回答をみて勉強します!
etsuhisa

2020/05/10 07:29

お役に立ててよかったです。底面が正方形(正四角柱)ではなくなっているので、ご注意ください。
nekoatsume

2020/05/11 12:54

かしこまりました! 本当にいつもありがとうございます。勉強がんばります!
guest

0

回答ではありません。

体積計算がおかしいです。(半径1の球の体積≒4.186)
X = 100;とした時の結果です。
球の体積は997552441040734743674486784.0000000000です。

投稿2020/05/09 07:08

cateye

総合スコア6851

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問