自分は今大学で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)の近傍の零点をもとめるプログラムを作らないといけないんです。もちろん配列を使って。それを求められるようにするにはどこをどうキチンと理解しておかないといけないかよければおしえてください。初心者ですのでやさしくお願いします。
No.1
- 回答日時:
まず、一次の配列はわかりますか?
b[2]
という奴です。
で、
a[2][2]
というのは、二次元の配列です。
それと、
変数の代入はわかりますか?
b=x;
とかですね。
大学ですと、テキストにその辺書いてありませんか?
難しそうに見えることでも、
簡単なことの積み重ねだと思います。
No.2
- 回答日時:
まず、連立一次方程式の問題と、(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:47No.3
- 回答日時:
ご質問は「ポインターと配列のところがさっぱりわかりません。
」とありましたのでNo.2では配列関連の事ばかりを書いてしまいましたが。
○変数、代入
○C言語の関数とは
などといったことはご理解されていますでしょうか?
上記のソースコードで、どの部分が理解できて、
どの部分が分からないかを教えて頂ければと思います。
この回答への補足
どうもすいません。上記のソースコートでは、何とかsol1の定義までは理解できたのですが、問題はmain関数以降のプログラムの書き方そのものが分からないのです。で、この際ですので、(3)で述べた2つの関数の零点を求めるプログラムに変更してもらいたいです。そちらのほうが具体的ですし。でずばり本当に初心者なので一度プログラミングを書いてくれませんか?大変迷惑ですが。で、そのプログラミングを見て分からないところを聞いたりするのはどうですか?まだC初めて2ヶ月なので作り方、どうすればいいのかがわからないので、回答例があったほうがいいきがします。どうかよろしくおねがします。わがままいってすいません。
補足日時:2002/06/07 00:33No.4ベストアンサー
- 回答日時:
初めに、大事な事を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お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- C言語・C++・C# プログラミングを教えて欲しいです。 配列aは、int a[9]={7,6,12,8,3,5,10,9 4 2022/12/19 23:27
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 10人分の生徒の英語の点数{32,34,41,38,40,26,14,46,42,50} と数学の点 2 2022/05/26 21:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
先頭アドレスとは何ですか?
-
配列を使わずに、変数名を動的...
-
unsigned char配列への入力の仕方
-
Excel、VBAのユーザーフォーム...
-
【C言語】配列の中に配列を入れ...
-
ExcelVBAで質問です。離れた二...
-
テキストファイルから文字列を...
-
パイソンの
-
C言語で巨大配列を作るにはどう...
-
【速いブラインドタッチ】手を...
-
複数の選択範囲の行番号を個別...
-
C# 配列の変数宣言について。
-
配列の参照渡しで型が一致しま...
-
【VBS】 フォルダ直下のファイ...
-
プログラムが書けません。
-
配列同士の文字列の比較
-
配列を空にすること.
-
C言語でのカンマ区切りについて
-
ポインタの配列のコンマについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
配列で格納したものをmsgboxで...
-
配列の参照渡しで型が一致しま...
-
C# Listを使わずに2次元配列の...
-
VBで構造体の配列を関数に渡す...
-
複数の選択範囲の行番号を個別...
-
パイソンの
-
先頭アドレスとは何ですか?
-
【速いブラインドタッチ】手を...
-
C# 配列の変数宣言について。
-
C言語初心者 ポインタについて...
-
unsigned char配列への入力の仕方
-
テキストファイルから文字列を...
-
ExcelVBAで質問です。離れた二...
-
Redimした動的配列はEraseする...
-
C言語で特定列だけを抽出して配...
-
擬似コード 長さがmの配列でな...
-
メモリの初期値
-
C言語初心者 構造体 課題について
おすすめ情報