この前、学校の授業でマチンの公式による円周率の計算をするプログラムを以下の方針で考えました。ここで、atanを求めるユーザー定義関数を作りたいのですが、途中までは考えたのですが以下の空欄の部分が、よく分かりません。
【方針】1.数列a(k)=±(1/2k-1)*x^(2k-1)(k=1,2,…)の漸化式を作る。(a(k)のkは添え字です)
2.a(1)+a(2)+a(3)+…+a(N)の値をatan(x)の近似値とする。
(1,2,3,…,Nは添え字です)

(プログラムの一部)→atanの近似値を求める関数
double Atan(double x)
{
double s=_,a=_,kk;
int k; //添え字用
for(k=1;k<=x;k++)
{s_; //多分式が入る。
kk=(double)k;
a_; //多分式が入る。
}
return s;
}

下線部に適当な文字や式を入れて、この関数を完成させてください。(ヒントをください)
※できれば、このプログラムの形は変えないで、下線部のみを埋めてください。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

グレゴリ級数


Σ[n=0,∞]((-1)^n / (2n + 1)) * x^(2n + 1)
グレゴリ級数をN項まで展開する場合、n=0~N-1になります。
Σ[n=0,N-1]((-1)^n / (2n + 1)) * x^(2n + 1)

問題と成っている関数の下線を埋めてもプログラムは完成しません。
根本的に間違えがあります。

グレゴリ級数を素直に書いた場合。
double MyAtan(double x)
{
 double s = (1)___;
 int n;

 for (n = 0; n < N; n ++) {
  s (2)___
 }
 return s;
}
と言う形状が一般的です。
Σは総和です。
Σ[n=0,N-1]((-1)^n / (2n + 1)) * x^(2n + 1)
の場合、
> for (n = 0; n < N; n ++) {
の様に0~N未満までループさせます。
この時の各nで式「((-1)^n / (2n + 1)) * x^(2n + 1)」を計算し全てを加算したのが総和です。
よって、(2)の下線には式「((-1)^n / (2n + 1)) * x^(2n + 1)」が入る事になります。
「s = s + 加算式」or 「s += 加算式」
また、Σ[n=0,N-1]の初項(n=0)は0.0に対してn=0時の数値を加算したものと考えられます。
よって、(1)には0.0が入ります。
double MyAtan(double x)
{
 double s = 0.0;
 int n;

 for (n = 0; n < N; n ++) {
  s += 式
 }
 return s;
}
式には「((-1)^n / (2n + 1)) * x^(2n + 1)」が入ります。
乗数はpow関数を使用します。
・テクニックとして
初項がxと分かっているので
double MyAtan(double x)
{
 double s = x; <-- 初項(n=0)分が計算済み
 int n;

 for (n = 1; n < N; n ++) { <-- n = 1と成っている
  s += 式
 }
 return s;
}
とすると複雑な計算の回数が1回減り、少し速くなります。
この関数を大量に実行しない限り、測定誤差の範囲ですが。
また、「(-1)^n 」の部分も条件文にし、powを使わない方が速くなります。

まずは素直に作ってみるのが良いでしょう。
    • good
    • 0
この回答へのお礼

ありがとうございます。
皆さんのアドバイスのおかげで、何とか課題を完成することが出来ました!!

もしかしたら、また、別の問題で分からない所が出てくるかもしれません。
そのときは是非ともよろしくお願いいたします。

お礼日時:2007/11/23 14:01

円周率のプログラムとか懐かしい^^



何か間違えてないですか?
使用するのグレゴリ級数じゃないのかな?
この数列±あるし、課題をもう一度確認した方が良いと思います。
グレゴリ級数って
Σ[n=0,∞]((-1)^n / (2n + 1)) * x^(2n + 1)
です。
数列で書きたかったら
a(1) = x
a(2) = x - (1 / 3) * x^3
a(3) = x - (1 / 3) * x^3 + (1 / 5) * x^5
a(4) = x - (1 / 3) * x^3 + (1 / 5) * x^5 - (1 / 7) * x^7
この数列を漸化式にすると
a(n+1) = a(n) + ((-1)^n / (2n + 1)) * x^(2n + 1)
a(1) = x

普通にΣをループでぶん回せば良いだけかと。

この回答への補足

すみません。
間違えていました!
同じ課題の中にマチンの公式の紹介もしてあったので、勘違いをしていました。
もらったヒントを参考にもう一度考えてみたのですが、まだよく分かりません。
ループの部分を中心にもう少し詳しく教えてください。
(下線部にどんなものが入るのかなど・・・)

よろしくお願いします!

補足日時:2007/11/22 23:56
    • good
    • 0

> 変数sは、atanの値を入れる


> aは、forループで、方針のa(1),a(2),a(3),…,a(N)の値を順番に計算

なるほど。とすると、
> s_; //多分式が入る。
> kk=(double)k;
> a_; //多分式が入る。
ここの計算順番おかしくないですか?
「kk(kの値)」から、「a」を計算して、「s」に加算して行くのでは?

> kk=(double)k;
> a_; //多分式が入る。
> s_; //多分式が入る。
こういう順番に実行する必要があるのでは?

で、「a」は、
> a(k)=±(1/2k-1)*x^(2k-1)
を計算して、
「s」は、それを順に足しこんでいけばよさそうですけど・・・


> forループについてですが、これは、a(1),a(2),…の値を
> k=1からx(方針ではN)まで計算するために
って事ですが・・・

> 2.a(1)+a(2)+a(3)+…+a(N)の値をatan(x)の近似値とする。
つまり「atan(x)=a(1)+a(2)+a(3)+…+a(N)」で、精度(つまりループ回数)を決める「N」と、
個々の「a(k)」を計算するための「x」は、全く別物ですよね?

ループを「k=1からx」として大丈夫なんですか?

#例えば「Atan(0.576996400392873)」(答えは0.523333333333333ラジアン=30度)を求めようとした場合、
#「x=0.576996400392873」で、1より小さいので、全くループしないことに・・・

別に「N」を設定しなければ成らないって事ですよね?

#Nを、どうやって渡すか(引数で渡すとか、constで固定値にするか)は
#方針によるでしょうけど・・・
    • good
    • 0
この回答へのお礼

ありがとうございます。
皆さんのアドバイスのおかげで、何とか課題を完成することが出来ました!!

もしかしたら、また、別の問題で分からない所が出てくるかもしれません。
そのときは是非ともよろしくお願いいたします。

お礼日時:2007/11/23 14:03

> マチンの公式


は、ざっと調べただけで詳しくないので、「一般論」で申し訳ありません。


> 途中までは考えたのですが以下の空欄の部分が、よく分かりません。

どういう風に考えたんです?
途中まででよいでは、どう考えたか説明してもらえませんか?

特に、変数「s」や「a」には、何に使う(何の値を格納する)つもりで宣言したのでしょう?

後・・・
> for(k=1;k<=x;k++)
これ、間違ってると思うんですけど・・・
どうして(どういう考えで)、こういう式になったんでしょう?

この回答への補足

変数sは、atanの値を入れるために宣言しました。
また、aは、forループで、方針のa(1),a(2),a(3),…,a(N)の値を順番に計算するために宣言したものです。
forループについてですが、これは、a(1),a(2),…の値をk=1からx(方針ではN)まで計算するために、このようにしました(a(k)の値を求めるため)。違うような気がしてはいたのですがそのことをコメントしておくのを忘れました。そこも含め、何を入れたらよいのか分かりません。

残りの部分についてですが、「kk=(double)k」については、もとから、このようにヒントが書いてあったため、そのまま用いました。また、最後の「return s」は計算したatanの値をsとして返すということです。

補足日時:2007/11/21 20:45
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qプログラミングの初心者です。

プログラミングの初心者です。
簡単にプログラミングが出来るソフトがあれば
教えてください。
出来れば、フリーソフトがいいです。

Aベストアンサー

No.3で回答した後考えたのですが、先ほどの回答を取り消します。
全くの初心者の場合、プログラム言語の仕様以前の問題として、PCにさせたい事に対してどのような解決法を組めばよいのか身についていません。外国語を習得するように、ある程度考え方の習熟が必要です。
プログラミングに必要な基礎となるアルゴリズムが身についていないとVisual Basicですら挫折してしまうと思います。

以下のTiny Basicがおすすめです。サイト内に詳細な説明がありますので合わせて読んでください。

そして、自分に課題を作って、簡単なところからプログラムを作ってみてください。
例:1+2+・・・・+100まで順に足した結果を求める。
私は25年前、中学生の時これから始めました。(等差数列の和の公式を使うのは反則です)

Windows7ですが、問題なく動きました。習得の妨げになる余分な機能の無いクラシックなBASICです。パソコンがまだマイコンと呼ばれていた時代を知っている人には、非常に懐かしく感じられると思います。

Q円周率を求めるプログラム

428224593349304/136308121570117を解いて小数点以下30桁まで求めたいのですが、こういう場合どのようにしてやればいいんですか?
友達は、428224593349304を1桁ずつ配列に入れて手計算でやるようにすればできると言っていたのですが、考え方がさっぱりわかりません。
もし配列を使って求めるとしたらどのような計算をさせたらいいのかもう少し具体的に教えてください。

Aベストアンサー

例えば、掛け算と引き算は、

const int N = 2;
void multiply( int a[], int b, int c[] )
{
int x = 0;
for ( int i=N; i>=1; i-- ) {
x += a[i] * b;
if ( x < 10 ) {
c[i] = x;
x = 0;
}
else {
c[i] = x % 10;
x /= 10;
}
}
c[0] = x;
}

void substraction( int a[], int b[], int c[] )
{
for ( int i=N; i>=1; i-- ) {
c[i] = a[i] - b[i];
if ( c[i] < 0 ) {
c[i] += 10;
a[i-1] -= 1;
}
}
c[0] = a[0] - b[0]
}
int A[N+1] = { 0, 4, 2 };
int B[N+1] = { 0, 1, 9 };
int C[N+1] = { 0, 0, 0 };
int D[N+1] = { 0, 0, 0 };

multiply( B, 2, C );
substraction( A, C, D );

のような関数だと思います。ただ、これはあくまで考え方であって、実際にはNo.4の方が書かれているような問題を解決しなくてはならないと思います。

例えば、掛け算と引き算は、

const int N = 2;
void multiply( int a[], int b, int c[] )
{
int x = 0;
for ( int i=N; i>=1; i-- ) {
x += a[i] * b;
if ( x < 10 ) {
c[i] = x;
x = 0;
}
else {
c[i] = x % 10;
x /= 10;
}
}
c[0] = x;
}

void substraction( int a[], int b[], int c[] )
{
for ( int i=N; i>=1; i-- ) {
c[i] = a[i] - b[i];
if ( ...続きを読む

Q初心者がまず始めるプログラミング言語はなにはおすすめ?

こんにちは。
プログラムについてほぼまったくの初心者です。
シューティングゲームやファミコンの頃のようなマリオ系アクションがつくりたいです。また、就職時や特技として履歴書に書ける、役に立つプログラミング言語が学びたいです。
使っているOSはXPです。
C言語というものの初歩の初歩を本で学んだんですが、とても難しく感じ、途中で挫折してしまいました。
たくさんあるプログラミング言語の中から、初心者にもわかりやすくて、また、他のプログラミング言語への勉強にもなるようなプログラミング言語はあるでしょうか?
おねがいします。

Aベストアンサー

> C言語というものの初歩の初歩を本で学んだんですが、とても難しく感じ、途中で挫折してしまいました。

 厳しいですね。C言語の初歩程度でへこたれているようでは「就職時や特技として履歴書に書ける、役に立つプログラミング言語」のマスターはおぼつかないでしょう。が,C言語が初心者向きでないのもまた事実です。

 私としては,初心者には Python をお奨めします:

  ‐汚いプログラムが書きにくいような文法になっており,ああも書ける,こうも書けるといった,初心者を戸惑わせる文法事項が少ない
  ‐綺麗なプログラムを書かないと気持ち悪くなるという,良い習慣が身につく
  ‐文法が比較的単純
  ‐処理系が無料で手に入る
  ‐世界的に広く使われている
  ‐オブジェクト指向もできる

 その後で,JavaScript に進んでみてはいかがでしょうか。毛色の異なるいろいろな言語に慣れておく必要があり,将来,Java, C#, C, C++ などの言語に進むためにも。

 また,視野を広げるために Scheme, Common Lisp や ML, OCaml, Haskell, Erlang など関数言語のたぐいや,Perl や Ruby, sed, Awk などのスクリプト言語の本にも目を通されることをお勧めします(いずれも世界的に有名で,処理系が無料で手に入ります)。

 それから Java や C# などに取り組めば良いと思います。そして,C や C++ も勉強しておく必要があります。

 私自身は,仕事の都合でCOBOLとアセンブラを先に勉強し,かなり後になってC言語を勉強したので,C言語のポインタのどこが難しいのか分かりませんでした(C言語のポインタは簡単です(^^;)。ただし,アセンブラは余力があるときに限り取り組めばよいでしょう(でも,CASL関連の本には目を通しておくべき)。

> C言語というものの初歩の初歩を本で学んだんですが、とても難しく感じ、途中で挫折してしまいました。

 厳しいですね。C言語の初歩程度でへこたれているようでは「就職時や特技として履歴書に書ける、役に立つプログラミング言語」のマスターはおぼつかないでしょう。が,C言語が初心者向きでないのもまた事実です。

 私としては,初心者には Python をお奨めします:

  ‐汚いプログラムが書きにくいような文法になっており,ああも書ける,こうも書けるといった,初心者を戸惑わせる文法事項が少...続きを読む

Q円周率を求めるC言語のプログラム

int a=10000,b,c=8400,d,e,f[8401],g;main(){for(;b-c;)f[b++]=a/5;for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);

というのが本(「π魅惑の数」)に載っていたので
#include <stdio.h>

int main(void){
int a=10000,b,c=8400,d,e,f[8401],g;

for(;b-c;)f[b++]=a/5;
for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)
for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);
return 0;
}
としたのですが
円周率を表示してくれません。
(b=0にすると一応は出てくるのですが微妙に間違ってます(よく分からないですけどそのくらいの誤差のあるプログラムなのでしょうか?))

int a=10000,b,c=8400,d,e,f[8401],g;main(){for(;b-c;)f[b++]=a/5;for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);

というのが本(「π魅惑の数」)に載っていたので
#include <stdio.h>

int main(void){
int a=10000,b,c=8400,d,e,f[8401],g;

for(;b-c;)f[b++]=a/5;
for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)
for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);
return 0;
}
としたのですが
円周率を表示してくれません...続きを読む

Aベストアンサー

おそろしく読みにくくてわけのわからないプログラムですね。
(けなしてるのではなくて、書いた人に感心しています)
「こんなんでπが出るのか!?」と思ったけれど、
出るようで驚きました。

私には計算内容は理解できないので、
プログラム上の事だけ話します。
下の方のプログラムで変数を宣言しているところで、
b=0, ... ,e=0, ..
とすると、上のプログラムと同じ数値を出します。

main()などの関数の中で宣言されている変数(自動変数)は、
値が不定です。つまり最初どういう値になっているかわかりません。

対して、関数の外側で宣言されている変数(静的変数)は、
0で初期化されることになっています。
この違いのため、バグが出ることがあります。
ここではeの初期値が0でなかったので動作が違ってしまったのでしょう。

Qプログラミング用語を勉強したいのですが、本当に初心者なので何から学んだ

プログラミング用語を勉強したいのですが、本当に初心者なので何から学んだらいいのかわかりません。
とりあえずはじめは何言語を学べばいいのかとわかりやすい初心者講座っぽいURLを載せて頂けたらうれしいです。よろしくお願いします

Aベストアンサー

こんばんわ
私も初心者ですが、日系ソフトウェアって雑誌のC言語超入門って雑誌を買って勉強してます。
内容は、C言語の中級レベルまでと、C++が少しとRubyの学習ブックとiPhoneプログラミングについて載ってます。
結構解りやすく説明してくれているので個人的には気に入っています。

言語はやっぱりCからでしょうかね。覚える文法事項はたくさんありますが、かなり自由度が高いらしいので。私はまだ少しかじった程度しかやっていませんが。

QC言語で円周率を求めるプログラムを解読しています。

C言語で円周率を求めるプログラムを解読しています。

ウィキ(http://ja.wikipedia.org/wiki/%E5%86%86%E5%91%A8%E7%8E%87)にも載っていましたが、
π/6=で始まる式を使って、
一項一項を順に求めていき、
最後にすべての項を足したものに6をかけて
πを求めるという方法を使っています。

誤差が小さくなるまで繰り返すということで
while(a>=1e-10)
という表現をしているのですが、
ここのところが理解できません。

どなたか教えてくださいませんか?
また、eとは自然対数の底などに用いられるあのeのことでしょうか?

C言語初心者なのでお手柔らかに説明していただけると助かります。

Aベストアンサー

1e-10は10の-10乗です。
Cに限らず、表計算などでもよく使われる書式ですね。

Q初心者でiPad,iPhoneプログラミング

初心者でiPad,iPhoneプログラミング

プログラミング知識ゼロなのですが、iPad,iPhoneアプリ作成の勉強がしたいと思っております。
先ずは、書籍等で知識を得たいと考えているのですが、
超初心者の私に、iPad,iPhoneのプログラミング入門に最適の書籍はありませんでしょうか?
いくつか検索をしてみたのですが、レビューにC言語がわからないと理解出来ない等の口コミを読み、
どれがいいのか分からなくなっています。
おすすめの書籍等の情報がございましたら、
お教えいただけませんでしょうか?

よろしくお願い致します。

Aベストアンサー

書籍とは違いますが、SDK入手時などにアクセスすることになる
開発者向け情報のサイト上には、豊富なコンテンツがあります。
http://developer.apple.com/iphone/

これらの公開されたドキュメントや、ディスカッションフォーラムの
過去ログ検索を使うことでも情報が得られますし、豊富なサンプルコードも
入手できます。自分で使いながらトライアンドエラーを繰り返して
わからないことがあればディスカッションで聞いてみたりすると
頭に入りやすいかと思います。

iPhoneアプリケーション作成のチュートリアル
http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhone101/Articles/00_Introduction.html
オブジェクトCの概要
http://developer.apple.com/iphone/library/referencelibrary/GettingStarted/Learning_Objective-C_A_Primer/
詳細
http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html

アップルのデベロッパサイト自体がそうなのでもちろん全文英語なのですが
iPhoneアプリを開発するなら早かれ遅かれ利用するサイトなので、
どんな情報がどこにあるのかだけでも知っておくと良いかもしれません。

書籍とは違いますが、SDK入手時などにアクセスすることになる
開発者向け情報のサイト上には、豊富なコンテンツがあります。
http://developer.apple.com/iphone/

これらの公開されたドキュメントや、ディスカッションフォーラムの
過去ログ検索を使うことでも情報が得られますし、豊富なサンプルコードも
入手できます。自分で使いながらトライアンドエラーを繰り返して
わからないことがあればディスカッションで聞いてみたりすると
頭に入りやすいかと思います。

iPhoneアプリケーション作成のチュートリアル...続きを読む

QC言語で円周率を求めるプログラムを作りたいのですがわかりません。

C言語で円周率を求めるプログラムを作りたいのですがわかりません。
どなたか教えていただけないでしょうか。

Aベストアンサー

C言語と円周率をキーワードにして検索をかけると、参考になるサイトが検索できますよ。
以下のURLを参照してください。具体的な、コーディングの例ものっています。
http://www1.cts.ne.jp/~clab/hsample/Math/Math1.html
http://www.geocities.jp/kaname78web/pi.html
http://www.ss.cs.meiji.ac.jp/CCP051.html

Qプログラミングのまったくの初心者ですがiOSの開発

プログラミングのまったくの初心者ですがiOSの開発を学ぶにはどうすればよいでしょうか

大学に入学して入学直後のガイダンスのあと、学科についての質問をしようとしたら、教授と話が弾んで2時間くらいいろいろ盛り上がって進路のためにスマートフォンのアプリなどを作って名を上げてみればどうだろうか、となったのですが、今の私では、iOSの開発がしたいけど自分の学科には同志となる学生がいなくて嘆いている教授に教えを乞いに行っても相手されないだろうから、パソコンに触ったこともないのに入院中3ヶ月iPhoneアプリを書いて大ブレイクした人のように独学ですべきと言われました
しかしObjective-CをやるにはまずCをやるのがオーソドックスであり実際にiOS開発初心者向けのサイトはみなプログラミング自体の初心者は相手にしてなく学ぶ方法が分からず困っています

Cによるプログラミングの基本を学ぶにも学生のレベルが低い大学のため、前期のうちではそれすら学ぶことができません

私はコンピュータそのものについての知識は真っ当な普通科高校の優等生以上にある自身があり、WindowsとiPhoneをエンドユーザーとしては可能な限り使いこなせていますが、予備校モドキの管理教育高校で副教科などは教育困難校レベルの教育しか受けられておらずプログラミングやOfficeのような趣味でパソコンやってるだけでは身につかないことは一切できません

そんな私のようなプログラミング自体の初心者でCも書いたことないような人がiOS開発を学ぶのによい本はなにがあるでしょうか
また、13インチでi7にCTOしたMacBook Airを注文したのですがソースを書く際などに大きくて高解像度のモニターなどの周辺機器は必要ならば教えてください

プログラミングのまったくの初心者ですがiOSの開発を学ぶにはどうすればよいでしょうか

大学に入学して入学直後のガイダンスのあと、学科についての質問をしようとしたら、教授と話が弾んで2時間くらいいろいろ盛り上がって進路のためにスマートフォンのアプリなどを作って名を上げてみればどうだろうか、となったのですが、今の私では、iOSの開発がしたいけど自分の学科には同志となる学生がいなくて嘆いている教授に教えを乞いに行っても相手されないだろうから、パソコンに触ったこともないのに入院中3ヶ月i...続きを読む

Aベストアンサー

<<Cによるプログラミングの基本を学ぶにも学生のレベルが低い大学のため、前期のうちではそれすら学ぶことができません

基本どこでもそうです。大学はレベルの低い人に合わせて授業するため、本当に自分のやりたいことは教えてくれません。なので全部独学でやるしかないです。自分もしました。

前の回答でもいってましたが、C言語はすべての言語の基本なのでまずはこれを学んだ方がいいと思います。目安としてはscanfとprintfでオセロを作れるぐらいなるといいと思います。
教科書はやさしいCが安定です。

それができたらオブジェクト指向を学ぶべきです。オブジェクト指向はすべての言語に共通する考え方なので、避けては通れません。これを学ぶさいの言語は何でもいいとおもいます。

これも分かったらiPhoneプログラミングに挑戦してみるといいとおもいます。

QBorlandを使ってCプログラムをコンパイラしようとしてあるプログラ

Borlandを使ってCプログラムをコンパイラしようとしてあるプログラムを実行すると、
「Warning W8053 se.c 26: 'sleep(unsigned int)' is obsolete in function main」
とでました。これってどういう意味ですか?具体的にお願いします!!

Aベストアンサー

実行しようと…ではなく、コンパイルしようとすると…では?
# 「コンパイラしようと」というのもおかしな表現ですが。

「W8053」でググったら…
http://2ch.ac.la/read.php/tech/1187213990/794-993
が。(800番で見つかります)

英語ですが
http://forums.techguy.org/software-development/220086-c-sleep-obsolete-so-whats.html
というのも。

sleep()という関数は古いタイプだから使用しない方がイイよ。
って感じの警告でしょう。

あるプログラムとやらがどんなモノか不明ですので、その程度までですかね。
# 英語のページのヤツは、Sleep()というWindowsAPIの使用を勧めていますね。


人気Q&Aランキング

おすすめ情報