アプリ版:「スタンプのみでお礼する」機能のリリースについて

自分は今大学でC言語を習っていますが、ポインターと配列のところがさっぱりわかりません。
問題で、連立一次方程式a_11*x_1+a_12*x_2=b_1,a_21*x_1+a_22*x_2=b_2の解x_1,x_2を求めよ。
このプログラミングで、
void sol1(double a[][2],double b[]){
double det ,x[2];int j;
det=a[0]*a[1][1]-a[0][1]*a[1][0];
x[0]=(a[1][1]*b[0]-a[0][1]*b[1])/det;
x[1]=(-a[1][0]*b[0]+a[0][0]*b[1])/det;
for(j=0;j<2;j++)b[j]=x[j];
return;
}
void main(){
double a[2][2],b[2];
a[0][0]=a11;a[0][1]=a12;
a[1][0]=a21;a[1][1]=a22;
sol1(a,b);
・・・・・・・・・・・・・
    ・・・・・・・・・・・・・
}
という感じになってるんですが。
でも自分は先ず第一に(1)for文のカッコのあとのb[j]=x[j]の意味がわかりません。
また(2)main関数の定義からが意味が不明です。なにをすればいいのかがわかりません。(3)これはあとでf(x,y)=x^3-5xy+y^2-150 g(x,y)=x^2+6xy-y^3+30の(4.0、-3.0)の近傍の零点をもとめるプログラムを作らないといけないんです。もちろん配列を使って。それを求められるようにするにはどこをどうキチンと理解しておかないといけないかよければおしえてください。初心者ですのでやさしくお願いします。

A 回答 (4件)

まず、一次の配列はわかりますか?


b[2]
という奴です。
で、
a[2][2]
というのは、二次元の配列です。

それと、
変数の代入はわかりますか?
b=x;
とかですね。

大学ですと、テキストにその辺書いてありませんか?
難しそうに見えることでも、
簡単なことの積み重ねだと思います。
    • good
    • 0

まず、連立一次方程式の問題と、(3)の問題を、プログラムではなく、


自分の手で解く方法についてはよろしいでしょうか?
線型代数の教科書などを読めば載っているはずです。

さて、関数sol1は、連立方程式をクラメールの公式で解くものです。

問題の方程式は行列表現では以下のようになります。
(見にくいですが、行列だと思ってください。)

( a[0][0] a[0][1] )( x[0] )=( b[0] )
( a[1][0] a[1][1] )( x[1] )=( b[1] )

関数中の
det=a[0][0]*a[1][1]-a[0][1]*a[1][0];
x[0]=(a[1][1]*b[0]-a[0][1]*b[1])/det;
x[1]=(-a[1][0]*b[0]+a[0][0]*b[1])/det;

の部分が、まさにクラメールの公式で解を求めたところです。

この段階で、連立方程式の解の値はx[0], x[1]に入っていますが、
これらは関数sol1内の変数であるため、その中の値を関数の外側から
知ることは出来ません。

そのため、
for(j=0;j<2;j++)b[j]=x[j];

として、外(main関数)から見ることの出来るb[0], b[1]に値を
入れなおしているのです。

つまり、関数sol1を実行した後、方程式の解はb[0], b[1]に入っているのです。

(1)のご質問については、以上のような感じです。

/*補足

プログラム内では考慮されていませんが、
det=a[0][0]*a[1][1]-a[0][1]*a[1][0];
の値が0になるときは注意が必要です。

*/

この回答への補足

では、b[]=x[]のb[]は行列の成分とは別物と考えたほうがいいのですか?また、sol1(a,b)はいったい何をさすのでしょうか?すいませんが解説お願いします。

補足日時:2002/06/04 16:47
    • good
    • 0

ご質問は「ポインターと配列のところがさっぱりわかりません。


とありましたのでNo.2では配列関連の事ばかりを書いてしまいましたが。

○変数、代入
○C言語の関数とは

などといったことはご理解されていますでしょうか?

上記のソースコードで、どの部分が理解できて、
どの部分が分からないかを教えて頂ければと思います。

この回答への補足

どうもすいません。上記のソースコートでは、何とかsol1の定義までは理解できたのですが、問題はmain関数以降のプログラムの書き方そのものが分からないのです。で、この際ですので、(3)で述べた2つの関数の零点を求めるプログラムに変更してもらいたいです。そちらのほうが具体的ですし。でずばり本当に初心者なので一度プログラミングを書いてくれませんか?大変迷惑ですが。で、そのプログラミングを見て分からないところを聞いたりするのはどうですか?まだC初めて2ヶ月なので作り方、どうすればいいのかがわからないので、回答例があったほうがいいきがします。どうかよろしくおねがします。わがままいってすいません。

補足日時:2002/06/07 00:33
    • good
    • 0

 初めに、大事な事を1つ。


 ちゃんと回答を何回も読み、理解を使用とされましたか?
 また、読む前から、「解らない」「理解なんてできない」って、思っていませんか?
 ANo.#2の補足で書かれている質問は、ANo.#2の中に答えがありますよ。
 それでも、解らないのでしたら、どこまで理解出来たかを書いて、質問する方がいいですよ。

 さて、本題ですが、(1)及び(3)の質問は、ANo.#2で回答されているので、がんばって下さい。

 (2)のmain()という定義ですが、どんなC言語の本にも載っているのでよく読めば解るとは思いますが、説明します。
  ソースをコンパイル・リンクする(コンパイラというツールを使って、実行ファイルを作ること)と実行ファイルが出来上がります。それを実行するとプログラムが処理されます。
  その処理がどのように行われるかは単にソースで書いた通りに動作しますが、ソースのどこから始めるかを決めておかないと、処理しようがないですよね!C言語の場合、関数単位に動作しますから、初めに実行する関数名を定める必要があります。これが、main()という関数に当たります。(これは、世界共通の文法規格で決まっています)
  また、C言語で初めに実行する関数を定めることになっているのは、何故かというと、C言語文法を守っている限り、関数は、ソースファイルの中で、先頭の方にあっても、ファイルの末にあっても、どこにあってもOKになっています。(習ったとは思いますが)そのため、main()という関数名で定めています。

 以上で理解出来ましたでしょうか?

 C言語特有の単語がいくつか出てきたかも知れませんが、それも、学習の一環だと思って調べて下さい。本やインターネットで簡単に見つかる表現しかしていないと思いますので。。。

 がんばって下さい。

この回答への補足

大変親切なアドバイスありがとうございます。少し自分の書き方が悪かったことを後悔してます。(2)で言いたかった事は、main関数以降のプログラミングをどのように作っていけばいいのかがわからないので教えて欲しいという意味合いだったのですが自分の書き方がわるかったのでどうもすいません。そもそも2ヶ月前にCを習い始めたばかりなので、プログラミングの仕方そのものがわかりません。要約main関数や演算子が分かり始めたくらいで。ずばりプログラミングの書き方を教えてください。

補足日時:2002/06/07 00:27
    • good
    • 0

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