C言語初心者のための野球のピッチングのソースコードの変更方法

このQ&Aのポイント
  • C言語初心者が、野球のピッチングのソースコードを変更する方法について教えてください。
  • ソースコードは、投げてからキャッチャーに届くまでの軌道を出力するものです。
  • 変更したい数値は、ボールの重さ、大きさ、発射角度、初速度、揚力係数です。
回答を見る
  • ベストアンサー

C言語初心者です!詳しい方教えて下さい!

以下のソースコードは野球のピッチングで投げてからキャッチャーに届くまでの軌道を出力するもので、応用すればゴルフでボールを打ってから停止するまでの同様な数値が出力される。と言われて渡されたのですが、どこを変更すればいいのかわかりません。 変更したい数値は ボールの重さ、大きさ、発射角度、初速度 と 揚力係数 です。 void force(float cl, float cy, float cd, float ut, float vt, float wt, float *fx, float *fy, float *fz) { float g=9.8, rho=1.225, S=0.0042; float q, uv; q = sqrt(ut*ut + vt*vt + wt*wt); uv = sqrt(ut*ut + vt*vt); *fx = -0.5*rho*S*q*q*(ut/q*cd+vt/uv*cy+wt/q*ut/uv*cl); *fy = -0.5*rho*S*q*q*(vt/q*cd-ut/uv*cy+wt/q*vt/uv*cl); *fz = -MASS*g-0.5*rho*S*q*q*(wt/q*cd-uv/q*cl); } void integra(float cl, float cy, float cd, float *xt, float *yt, float *zt, float *ut, float *vt, float *wt, float dt) { float u1, v1, w1, u2, v2, w2, fx, fy, fz; force(cl, cy, cd, *ut, *vt, *wt, &fx, &fy, &fz); u1 = *ut + fx*dt/MASS; v1 = *vt + fy*dt/MASS; w1 = *wt + fz*dt/MASS; force(cl, cy, cd, u1, v1, w1, &fx, &fy, &fz); u2 = 0.5*(u1 + *ut + fx*dt/MASS); v2 = 0.5*(v1 + *vt + fy*dt/MASS); w2 = 0.5*(w1 + *wt + fz*dt/MASS); *xt += 0.5*dt*(*ut + u2); *yt += 0.5*dt*(*vt + v2); *zt += 0.5*dt*(*wt + w2); *ut = u2; *vt = v2; *wt = w2; } int main() { float x[256], y[256], z[256]; int i; float dt=0.01; float dis=18.44; float cy, cl, cd=0.5; float xt, yt, zt, ut, vt, wt, us; float va, la; int white[3] = {255, 255, 255}; int red [3] = {255, 0, 0}; int green[3] = { 0, 255, 0}; int blue [3] = { 0, 0, 255}; int grey [3] = { 64, 64, 64}; int j; float ye[10], ze[10]; float yst[5] = {-0.215, 0.215, 0.215, -0.215, -0.215}; float zst[5] = {0.5, 0.5, 1.2, 1.2, 0.5}; sleep(1); for (j=0;j<10;j++) { xt = 0.0, yt=0.0, zt=1.8; printf("初速度(~150)km/h==>"); scanf ("%g", &us); if (us<=0.0) exit(0); us = us*1000.0/3600.0; printf("上下角(-5~5)(deg.)==>"); scanf ("%g", &va); va = va*PI/180.0; printf("左右角(-5~5)(deg.)==>"); scanf ("%g", &la); la = la*PI/180.0; ut = us*cos(la)*cos(va); vt = us*sin(la); wt = us*cos(la)*sin(va); printf("CL(-1~1)==>"); scanf ("%g", &cl); printf("CY(-1~1)==>"); scanf ("%g", &cy); printf("t x t z\n"); for (i=0; xt<=dis; i++) { x[i] = xt; y[i] = yt; z[i] = zt; integra(cl, cy, cd, &xt, &yt, &zt, &ut, &vt, &wt, dt); printf("%g %g %g %g\n", dt*(float)(i+1), xt, yt, zt); } ye[j] = yt, ze[j] = zt; } }

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

  • ベストアンサー
  • endy7671
  • ベストアンサー率66% (6/9)
回答No.1

確かに、計算式はC言語ですが、元を辿ると、単純な物理の運動方程式です。 C言語を御存じないとすれば、何のコメントもないコードで、どこを直せばよいのやら?となる気持ちは分かります。いちばん簡単なのは、運動方程式とコードを照らし合わせることです。そうすれば、どこで何の式を実装しているのかが分かります。 もし、物理を御存じないとすると、本件をこなすのは、非常に難しいです。物理を学ぶには、微分、積分他、数学を「道具」として扱える程度の知識が必要です。要は、大工さんが家を建てるのに、大工道具(とんかち、のこぎり他)を使えなければ、話にならないのと同じとお考えいただければわかりやすいかと。この場合は、このプログラムを作成された方に、「運動方程式とは何ぞや?」から尋ねるしかありません。 #ご質問された方の、「運動方程式をC言語で処理させる」にあたっての基本的な知識が、どの程度かが不明なため、ピンポイントで回答できないのが心苦しいです

その他の回答 (1)

回答No.2

- 野球のピッチングで投げてからキャッチャーに届くまで と - ゴルフでボールを打ってから停止するまで で、何が違うのかがわからない限り変更箇所がわかるはずありません。 # それはプログラムの問題でもないし。

関連するQ&A

  • C言語初心者です。

    大学に入ってからC言語を授業で習い始めました。なので、すごい初歩的なことですが丁寧に教えてくださると嬉しいです。いくつか分からないことがあるので教えてください。   1・よくprintf("");なので%dや%fを使いますが、これはint(整数)の時が%dで、double(小数点付)の時に%fを使えばいいのか。 2・mul(呼び出す)、return(戻る)の意味、使い方 3・if(aaaa%4==0){ if(aaaa%100!=0)printf("閏年である。\n"); else{if(aaaa%400==0)printf("閏年である。\n"); else printf("閏年ではない。\n"); の意味は、もしaaaaが4で割り切れ、100で割り切れなかったら閏年で、そうではなく100で割り切れ400で割り切れたら閏年である。という意味でいいのか。 4・andとor,whileの使い方が分からない。 5・授業でやったことなのですが、 # include<studio.h>  int passWordInput(); main(){    int a, pw=1234, a=passWordInput(); if(a==pw)printf("ok\n"); else{a=passWordInput(); if(a==pw)printf("ok\n"); else{a=passWordInput(); if(a==pw)printf("ok\n"); else printf("Byw!!\n"); } } } int passWordInput(){ int wk; printf("パスワード:");scanf("%d",&wk); return wk; } がよく分かりませんでした。特にwkが出てくるあたりからです。 一応全て自分なりに本とか見てみましたが、あまり理解出来なかったので詳しい回答をしてくださると嬉しいです。よろしくお願いします。

  • C言語初心者の私・・・・。

    NO.277714の質問とほぼ同じ内用になってしまうのですが・・・。 4月から大学のほう(情報系の学部です)でC言語を習い始めたのですが、もう右も左もわからない状況で困っています(ToT) 何か本当”激ド素人”でもきちんとC言語を学べるような参考書、問題集、もしくはサイト、どれでもかまいません、皆様のおすすめ、”私も初めて勉強するときはこれを使った!”などなどぜひ教えてください!!!!!! 勉強方法や、苦労した話とかもいろいろ教えていただきたいです(^^)>

  • C言語(初心者です

    C言語(超初心者です) 二重ループを中断する 2 通りの方法についてのソースコード を書きたいのですが 方法 1:フラグだけを使い,ジャンプを使わない. 方法 2:ジャンプだけを使い,フラグを使わない. #include <stdio.h> int main() { int f = 0; char *ans; printf("Loop {\n"); while ( ... ) { ... printf(" Loop {\n"); while ( ... ) { ... printf(" Break ? "); scanf("%s", ans); if (ans[0] == 'y') ... else if (ans[0] == 'q') ... ... } printf(" }\n"); } ... printf("}\n"); printf("Done.\n"); return (0); } 実行例: % ./a.out Loop { Loop { Break ? no Break ? no ... Break ? yes } Loop { Break ? no ... Break ? quit } } Done. % このソースコードをどう変えればいいのでしょうか 方法1のフラグを使って2重ループを脱出するっていうのどういうことかちょっとわからないです。 方法2ではbreakを使うのですか。 yesが入力されたら外にでる?みたいな感じでしょうか。

  • c言語の初心者です

    c言語の初心者です 2進数を入力して10進数を表示するプログラムを作りたいのですが まったくできません それなので2進数の入力のヒントだけでも教えてもらえないでしょうか?

  • C言語初心者ですが……

    C言語初心者ですが…… すみません。C言語を初めてやろうと考えています。それでいくつか分からない点があり、皆さんに相談した次第です。 まず初心者おなじみの「Hello,world!」を表示させるプログラムをつくってみました。 構文とか拡張子とかは完璧です。自信あります。 しかし、いざexeファイルを開いたところ、なぜかウインドウが一瞬で閉じてしまいました。そのため、本当に画面に「Hello,world!」が表示されているのかどうかとても心配です。 こういうとき、どうすればいいのでしょうか。もしよろしければ答えて頂けると幸いです。 ちなみに私はMicrosoft Visual C++ 2010 Expressとやらを使っています。

  • C言語初心者ですが……

    C言語初心者ですが…… すみません。このたびC言語を学び始めるにあたって一つ困ったことが起きましたので、助けてください。 はじめての人御馴染みの「Hello,world!」を画面に表示させるプログラムをつくりました。拡張子も構文も完璧に作ることができました。しかし、exeファイルを開いて確認しようとしたところ、一瞬で画面が閉じてしまい、「Hello,world!」が表示されているかどうか確認できずにいます。 この原因が何なのか、対処法とあわせてご指導していただけると幸いです。 なお、自分はWindows7でMicrosoft Visual C++ 2010 Expressを使っています。

  • C言語初心者です。

    C言語初心者です。 Macを使用しています。 概要を理解したいので教えてください。 コードをかく   ↓ 実行する   ↓ 結果が表示される というようなイメージなのですが違うでしょうか? gcc コンパイラ ターミナル X-code などが必要だというのはわかります。 しかしそれらをどのように、つかうかわかりません。 どなた様か初心者にもわかるように簡単に一から教えてください。 よろしくお願いいたします。

  • C言語 初心者です。

    以下のソースの中でわからないことがあります。 詳しく説明してもらえないでしょうか? よろしくお願いします。 #include <stdio.h> #define NUMBER 80 /* 人数の上限 */ int main(void) { int i,j; int num; int tensu[NUMBER]; int bunpu[11] = {0}; printf("人数を入力してください。:"); do{ scanf("%d",&num); if (num < 0 || num > NUMBER) printf("\a要【1以上%d以下】:", NUMBER); }while (num > 0 || num < NUMBER); puts("点数を入力してください。"); for (i = 0; i < num; i++){ printf("%2d番:", i + 1); do { scanf("%d",&tensu[i]); if (tensu[i] < 0 || tensu[i] > 100) printf("\a要 【0以上100以下】:"); }while (tensu[i] < 0 || tensu[i] > 100); bunpu[tensu[i] / 10]++; } 上記のソースの中の bunpu[tensu[i] / 10]++; の部分がどうなっているのかわかりません。 教えてください。

  • C言語初心者です。

    C言語初心者の者です・・。カレンダーを表示するというプログラムを 作成して下さい。という問題でソースが途中まで出来ていてこれを元に 作成するみたいなのですが、今まで、こちらのサイトで同じような質問は無いかなぁと検索してみたのですが、年数やうるう年の計算もされていて、どこをどの様に変えれば良いのかも分かりません。どなたか教えて頂けないでしょうか? 〖問題〗 以下のように、カレンダーを表示するプログラムを書いてください。 int main (void) { /* 1月表示 */ dispCalender(1); return 0; } void dispCalender(int month) { /* 2007年:月毎の最終日を管理する配列 */ int lastday[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30,31}; /* 2007年:各月が何曜日から始まるか管理する配列 */ int week[12] = {1, 4, 4, 0, 2, 5, 0, 3, 6, 1, 4, 6} /* ※0:日、1:月、2:火 ・・・ 6:土 */ (ここにいっぱいコード書く) } (実行結果) --------------------- [2007年1月] --------------------- 日 月 火 水 木 金 土 --------------------- 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ---------------------

  • c言語超初心者です。教えてください

    基本的だと思いますが教えてください。 #include <stdio.h> int main(void) { int na, nb: puts("二つの整数を入力してください."); printf("整数A:”); scanf("%d",&na); printf("整数B:”); scanf("%d",&nb); printf("それらの平均は%fです。\n,(na+nb)/2.0); return(0); } これでintの形で最後のprintfが%fなのですがintは%dとなるはずなのですがこれは2。0という実数値で割るから答えは実数値になりますよ。という意味で%fとしたのでしょうか?確かにこうしないと正しい値がでてこないのです。教えてください。

専門家に質問してみよう