• ベストアンサー

C++の行列について

3元3列の連立方程式の係数を格納し、格納された結果を表示するプログラムを作成せよ。ただし次の2つのパターンでプログラムせよ。 1.係数を『初期化』を使って配列に入力する 2.キーボードから入力する 聞いてみたら問題に、そうは書いてあるけど、連立方程式は考えないでよくて、下の1.2をやるみたいなんですが、どうやるか分かる人いますか? a00x+a01y+a02z=α a10x+a11y+a12z=β a20x+a21y+a22z=γ ここまでやりましたが、違うみたいなんですが、あとどこをどう修正すればいいんですか? #include <iostream> using namespace std; int main() { int i,j; double a00,a01,a02,a10,a11,a12,a20,a21,a22; double a[3][3]={{a00,a01,a02},{a10,a11,a12},{a20,a21,a22}}; for(i=0;i<3;i++) { for(j=0;j<3;j++) { cout("%9f",a[i][j]); } cout << '\n'; } cout << '\n'; for(i=0;i<3;i++) { for(j=0;j<3;j++) { cout << "a[%d][%d] = i,j\n"; cin >> "%lf",&a[i][j]; } } for(i=0;i<3;i++) { for(j=0;j<3;j++) { cout << "%9f",a[i][j]; } cout << "\n"; } cout << "\n"; return 0; } この辺りが多分違うんですよね cout("%9f",a[i][j]); cout << "%9f",a[i][j]);

noname#127615
noname#127615

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

  • ベストアンサー
回答No.4

疑ってばかりで申し訳ないので、問題の全文が掲示してあった場合の例示します。 #include <iostream> using namespace std; const int dim = 3; int main() { double temp[dim][dim]; for(int y = 0; y < dim; ++y){ for(int x = 0; x < dim; ++x){ cin >> temp[y][x]; } } cout << endl; double a[dim][dim]={{temp[0][0],temp[0][1],temp[0][2]},{temp[1][0],temp[1][1],temp[1][2]},{temp[2][0],temp[2][1],temp[2][2]}}; for(int y = 0; y < dim; ++y){ for(int x = 0; x < dim; ++x){ cout << temp[y][x]; cout << " "; } cout << endl; } cout << endl; return 0; }

noname#127615
質問者

補足

ありがとうございます。 dimとtempとは何でしょうか? あと、入力の方(2)はできたんですが、初期化する方(1)もあるんですが、これは2の方ですよね?

その他の回答 (5)

回答No.6

#3,4の補足への回答です。 > dimとtempとは何でしょうか? const int dim = 3; // 3行3列の3、分からない場合はdimの代わりに3を直接書く double temp[dim][dim]; // キーボードからの入力値を保存する配列 >あと、入力の方(2)はできたんですが、初期化する方(1)もあるんですが、これは2の方ですよね? ???、何のことやら意味が分かりません。 もしもキーボード入力するが、α、β、γだったら出題の文言がヒドイですが、 >ですが、連立方程式は無視して(解かなくていい)って事でやっていいって事です。 ということだと、出題者はをこの後、今回作ったプログラムを雛形にして、次回は連立方程式解くプログラムを作らせるつもりに思えます。キーボード入力するのは係数ではなく、α、β、γの可能性が高いと思います。出題者の回答が出たら、ぜひ教えてください。首を長くして待ってます。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.5

初期化は初期化でしかない思いますけど。 int a[3]={1,2,3}; ってのが初期化です。

回答No.3

再々度の補足要求です。 「代入の事だと思います」「係数みたい」とか言わないで、出題者に尋ねてください。あと、問題文の全文が掲示されていますか? 『初期化』と強調するくらいだから、初期化子を使用するのでしょう。手順としては、キーボードから係数を入力して、その値で配列を初期化することになります。1、2とは手順が逆です。またこのような無理やりなプログラムを出題するとは私には考えられないのです。 情報が欠落しているように思えますので、 プログラム内に生で書いた数値で配列を初期化し、 キーボードからα、β、γを入力し、 1.1x + 2.2y + 3.3z = 4.4 というふうな問題なのではないかと、勝手な妄想をしています。 全文が掲示されており、「代入の事だと思います」「係数みたい」が、本当なのか明確になれば、回答します。

noname#127615
質問者

補足

行列への値の設定とその表示をさせるって事です。   問題文は 3元3列の連立方程式の係数を格納し、格納された結果を表示するプログラムを作成せよ。ただし次の2つのパターンでプログラムせよ。 1.係数を『初期化』を使って配列に入力する 2.キーボードから入力する ですが、連立方程式は無視して(解かなくていい)って事でやっていいって事です。つまり、3*3行列を、1と2に従って作るんです。

回答No.2

再度質問です。 2.キーボードから入力する 問題文には「何を入力する」と記述されていますか。ひょっとして、係数ではなく、x、y、z、α、β、γなのでは。

noname#127615
質問者

補足

係数みたいです a00x+a01y+a02z=α a10x+a11y+a12z=β a20x+a21y+a22z=γ a00=9 a01=8 … a22=4 みたいな感じですね

回答No.1

逆に質問です。この問題文は正確でしょうか? 1.係数を『初期化』を使って配列に入力する 初期化子を使えというのは本当ですか。代入の間違えということはないですか。 2.キーボードから入力する 何を入力するのですか。ひょっとして、係数ではなく、x、y、z、α、β、γなのでは。 「下の1.2」とは何処を見ればよいのですか? 格納された結果を表示したとき、どのように表示されることを期待しているのか示してください。

noname#127615
質問者

補足

1と2の問の事です。 問題文はそう書いてあるけど、代入の事だと思います。 そして、2つ目のプログラムでは、 多分、 1つ目の係数を入力してください 6 2つ目の係数を入力してください 9 … 9つ目の係数を入力してください 5 結果的に 6 9 3 4 8 2 8 9 5 (今は3つ目から8つ目は適当なんですが。) って感じで出ればいいんじゃないでしょうか?

関連するQ&A

  • C++の連立方程式のプログラム

    3元3列の連立方程式の係数を格納し、格納されて結果を表示するプログラムを表示せよ。ただし以下の2通りで行う事 係数を『初期化』を使って配列に入力する キーボードから入れる 上に書いたやつを参考にできると思って載せたんですが、分かる人いますか? 問題の意味って 連立方程式の係数を入力して(9つの係数)それを3*3のマトリックスで出すってだけで解くわけじゃないんですかね?どこにも連立方程式を解くって書いてないわけだし。 つまり 『1つ目の係数を入力せよ 2 2つめの係数を入力せよ 3 … 9つ目の係数を入力せよ 9 2 3 4 8 8 0 4 5 9』 みたいな ヒントの所には、 3*3のマトリックス作って初期化を自分で行う っていうのと 連立方程式の形が書いてありますが a00x+a01y+a02z=α a10x+a11y+a12z=β a20x+a21y+a22z=γ そして、とりあえず、3*3行列はこれで出来ました。 #include <iostream> using namespace std; int main() { int i,j; int vector[]={10,20,30,40}; int matrix[][3] = {{1,2,3},{4,5,6},{7,8,9}}; for(i=0;i<3;i++) { for(j=0;j<3;j++) { cout << matrix[i][j] << ' '; } cout << '\n'; } return 0; } しかし、問題の連立方程式の係数を格納とかキーボードから入力ができないんですよね 多分上に書いたプログラムくらいのレベルだからそんなに複雑にならないはずなんですが

  • C++で行列とベクトルの積を求める

    行列とベクトルの掛け算 y=Ax (A(3*3行列以上)とxを適当に初期化) を作成せよ これが分からないんですが誰か分かる人いませんか?下は行列の和と積をそれぞれ求めてるんですが、こんな感じになりそうなんですよね #include<iostream> using namespace std; int main() { double A[3][3]={{1,1,6},{5,3,2},{2,2,2}}; double B[3][3]={{4,1,3},{2,4,3},{5,9,2}}; double temp; int i,j,k; for(i=0;i<3;i++){ for(k=0;k<3;k++){ } } for(i=0;i<3;i++){ for(k=0;k<3;k++){ } } cout<<"和:A+B="<< '\n'; for(i=0;i<3;i++){ cout<<" { "; for(j=0;j<3;j++){ cout<< (A[i][j]+B[i][j]); if(j!=2) cout<<" , "; } cout<< " }" << '\n'; } cout<< '\n'; cout<<"積:A*B="<< '\n'; for(i=0;i<3;i++){ cout<<" { "; for(j=0;j<3;j++){ temp=0.0; for(k=0;k<3;k++) temp += A[i][k]*B[k][j]; cout<< temp; if(j!=2) cout<< " , "; } cout<< " }" << '\n'; } return 0; }

  • C++ プログラミング

    連立方程式の逆行列と解を出そうとしたのですが /*n=4と定義nは元の数*/ #define n 4 int main() { /*係数マトリクスAと単位マトリクスと右辺ベクトルの定義*/ double a[n][n+5]={{4,1,3,2,1,0,0,0,23}, {1,4,3,3,0,1,0,0,30}, {5,5,10,5,0,0,1,0,65}, {4,4,2,6,0,0,0,1,42}}; double x,y; int i,j,k; /*#1ピボットの演算を行うためのループ*/ for(k=0;k<n;k++) { /*ピボット係数*/ x=a[k][k]; /*#2ピボットをにするための演算を行うためのループ*/ for(j=k;j<n+5;j++) /*ピボット行をxで割る*/ a[k][j]=a[k][j]/x; /*#3ピボット列の掃き出しを行うためのループ*/ for(i=0;i<n;i++) { /*#4iがkではないとき*/ if(i!=k) { y=a[i][k]; /*#5ピボット以外をにする演算を行うためのループ*/ for(j=k;j<n+5;j++) a[i][j]=a[i][j]-y*a[k][j]; } } } /*結果を表示*/ printf("係数マトリクスAの逆行列を表示\n"); for(i=0;i<n;i++){ for(j=4;j<n+4;j++){ printf("a[%d][%d]=%f",i+1,j-3,a[i][j]); } printf("\n"); } printf("連立方程式の解を表示\n"); for(i=0;i<n;i++) printf("x%d=%f\n",i+1,a[i][n+4]); return 0; このプログラムを打って 1>z:\win\personal\visual studio 2008\projects\課題2.cpp(35) : error C3861: 'printf': 識別子が見つかりませんでした 1>z:\win\personal\visual studio 2008\projects\課題2.cpp(38) : error C3861: 'printf': 識別子が見つかりませんでした 1>z:\win\personal\visual studio 2008\projects\課題2.cpp(40) : error C3861: 'printf': 識別子が見つかりませんでした 1>z:\win\personal\visual studio 2008\projects\課題2.cpp(42) : error C3861: 'printf': 識別子が見つかりませんでした 1>z:\win\personal\visual studio 2008\projects\課題2.cpp(44) : error C3861: 'printf': 識別子が見つかりませんでした 1>z:\win\personal\visual studio 2008\projects\課題2.cpp(46) : fatal error C1075: 左側 中かっこ '{' に対応するものが 'z:\win\personal\visual studio 2008\projects\課題2.cpp(4)' で見つかる前に EOF が検出されました。 とエラーがでました.printfはちゃんと定義されてると思うんですが何がおかしいのでしょうか・・・?

  • 配列を使ったC++(マトリックス)

    3元3列の連立方程式の係数を格納し、格納されて結果を表示するプログラムを表示せよ。ただし以下の2通りで行う事 係数を『初期化』を使って配列に入力する キーボードから入れる 上に書いたやつを参考にできると思って載せたんですが、分かる人いますか? 上のプログラムを参考になるっぽいんですが分かる人いますか? 連立方程式の形はこんな感じです a00x+a01y+ao2z=α a10x+a11y+a12z=β a20x+a21y+a22z=γ #include <iostream> using namespace std; int main() { から始まって return 0; } で終わる感じで教えてくれませんか

  • C++ ソートのやり方

    僕が作ったプログラムで、これはバブルソートなのかわからないので教えてください。 また、ほかのソートの仕方も教えてください。 よろしくお願いします。 汎用関数を使っているのでわかりにくいかもしれないですがお願いします。 #include <iostream> using namespace std; template <class X>void Sort(X *data, int size) { X temp; for (int i = 0; i < size; i++){ for (int j = i + 1; j < size; j++){ if (data[i]>data[j]){ temp = data[i]; data[i] = data[j]; data[j] = temp; } } } } int main() { int i[10]{1, 4, 3, 5, 2, 10, 2, 7, 6, 8}; char c[10]{'c', 'b', 'z', 'a', 'x', 'y', 'j', 'n', 'm', 'r'}; Sort(c, 10); Sort(i, 10); for (int j = 0; j < 10; j++){ cout << i[j] << ' '; } cout << endl; for (int j = 0; j < 10; j++){ cout << c[j] << ' '; } cout << endl; getchar(); return 0; }

  • C言語で連立1次方程式

    C++で連立1次方程式を解くプログラミングを作りたいのですが何回やっても出来なかったので質問します。 N=3; n=N; 0<=i<=N-1, 0<=j<=N-1, A(3×3行列)= 1 -8 -6 8 7 8 -2 -2 7 a[0][0]*X+a[1][0]*Y=(-1)*a[2][0]; (1X+8Y=-(-2)) a[0][1]*X+a[1][1]*Y=(-1)*a[2][1]; (-8X+7Y=-(-2)) (行をi、列をj、a[0][0]=a[i][j]) (XとYや関数名は適当に決めてもらって構いません) X、Yを求める。 XとYが求まったら1行目をX倍した数と2行目をY倍した数と3行目を足した数を、3行目に入れる。(計算は列ごとにやる(3回計算)) 3行目の成分は分数で表示させる。(整数の形にできるのなら整数の形にしたい) 表示させる関数は↓のように作りました(型はintでなくてもいいです) void matrix_print(int n, int a[N][N]){ int i, j; for(i=0; i<n; i++){ for(j=0; j<n; j++) printf("%5d \n",a[i][j]); } printf("\n"); return; } 私はX、Yで分数が出てきたところでうまく分数表示が出来ずに(整数で表せるなら整数で表したい)そこで詰まってしまいます。 何方かわかる方はプログラムを作ってください。お願いします。

  • ガウスの消去法を用いたC言語のプログラムについて

    現在あらかじめ与えられた連立方程式をガウスの消去法を用いて、 求めるというプログラムをC言語で作っています。 しかし学校ではまだ行列のやっておらず、 ガウスの消去法についても説明があやふやでした。 一応プログラムは出来たのですが明らかに無駄が多すぎて困っています。 与えられた方程式は下記の通りです。 2x + 3y + 4z = 20 3x - 2y + 5z = 14 5x + 4y - 7z = -8 プログラムは以下の通りです。 #include <stdio.h> int main(void){ double a[3][3] = {{2, 3, 4}, //(1) {3, -2, 5}, //(2) {5, 4, -7}}; //(3) double b[3] = {20, 14, -8}; double x = 0; double y = 0; double z = 0; int i; //前進消去 //(1)÷2 ・・・(1)' for(i = 0; i < 3; i++){ a[0][i] = a[0][i] / 2; } b[0] = b[0] / 2; //(2)-(1)'×3 ・・・(2)' for(i = 0; i < 3; i++){ a[1][i] = a[1][i] - a[0][i] * 3; } b[1] = b[1] - b[0] * 3; //(3)-(1)'×5 ・・・(3)' for(i = 0; i < 3; i++){ a[2][i] = a[2][i] - a[0][i] * 5; } b[2] = b[1] - b[0] * 5; //(2)'÷6.5 ・・・(2)'' for(i = 0; i < 3; i++){ a[1][i] = a[1][i] / 6.5; } b[1] = b[1] / 6.5; //(2)''×3.5 + (3) ・・・(3)'' for(i = 0; i < 3; i++){ a[2][i] = a[2][i] + a[1][i] * 3.5; } b[2] = b[2] + b[1] * 3.5; //(3)''÷3.53846でzを求める z = b[2] / a[2][1]; //後退代入 //(2)''にzを代入してyを求める a[1][1] = a[1][1] * z; y = b[1] - a[1][1]; //(1)'にyとzを代入してxを求める a[0][1] = a[0][1] * y; a[0][2] = a[0][2] * z; x = b[0] - a[0][1] - a[0][2]; printf("\n x = %f \n y = %f \n z = %f \n", x, y, z); return 0; } 制作はvc++を用いています。 ここからどうやって短くしていけばよいかがわかりせん。 アドバイスや指摘があればお願いいたします。

  • プログラミングのことで困っています。助けて下さい。

    プログラミングの問題がどうしても分からず、本当に困っています。 ・2x+y+3z=13 ・x+3y+2z=13 ・3x+2y+z=10 (解:x=1,y=2,z=3) を掃き出し法で解くプログラミングの問題で、次の(1)~(5)が何が当てはまるかどうしても分からないんです。 #include <stdio.h> #define N 3 /*未知数の個数*/ int main(void) { int i,j,k; double pivot,del; double a[N][n+1]={{2,1,3,13},{1,3,2,13},{3,2,1,10}}; /*係数行列*/ for(i=0;i<N;i++) { (1)____ /*ピボット係数*/ for(j=0;j<N+1;j++) /*ピボット行をピボットで割る*/ (2)____ for(k=0;k<N;k++) /*ピボット列の掃き出し*/ { if((3)____) { del=a[k][i]; for(j=i;j<N+1;j++) (4)____ } } } for(i=0;i<N;i++) (5)____ /*計算結果の表示*/ return 0; } 実行結果は x0=1.00 x1=2.00 x2=3.00 と表示させたいのですが、(1)~(5)の所がどうしても分からず、困っています。どなたか助けて下さい。お願いします。

  • C言語のプログラムで質問です。

    C言語のプログラムで質問です。 これは、2元1次連立方程式の解を求めるプログラムです。 このプログラムを (1)3元1次連立方程式の解を求めるプログラムにする (2)係数行列、定数行列(6、7行目)をキーボードからの入力にする。 ようにしたいのですが、どうすればよいでしょうか。 前半の部分を変えれば良いようなのですが分かりません。教えてください。 #include <stdio.h> #include <math.h> /* gauss22.c */ #define N 2 main(){ double A[N][N]={1.,4.,3.,2.}, Aa[N][N]; /*簡単のため係数行列を予め指定*/ double b[N]={4.,5.}, x[N], bb[N], e[N]; /*簡単のため定数ベクトルを予め指定*/ int n=2; int i, j, k; double akk, aik, s; /* save original coefficients */ for (i=0; i<n; i++){ for (j=0; j<n; j++){ Aa[i][j]=A[i][j]; } bb[i]=b[i]; } /* forward operation */ for (k=0; k<n-1; k++){ akk=1/A[k][k]; for (i=k+1; i<n; i++){ aik=-A[i][k]*akk; for (j=k+1; j<n; j++){ A[i][j]+=aik*A[k][j]; } b[i]+=aik*b[k]; } for (j=k+1; j<n; j++){ A[k][j]*=akk; } b[k]*=akk; } /* backward operation */ x[n-1]=b[n-1]/A[n-1][n-1]; for (k=n-2; k>=0; k--){ s=0.0; for (j=k+1; j<n; j++){ s+=A[k][j]*x[j]; } x[k]=b[k]-s; } /* chek */ for (i=0; i<n; i++){ s=0.0; for (j=0; j<n; j++){ s+=Aa[i][j]*x[j];} e[i]=s-bb[i]; printf("x(%d)=%f error=%f?n",i, x[i], e[i]); } }

  • C言語、行列の積を求めるプログラムについて

    「次に示す行列x,yの積を求めるプログラムを作成せよ。   x[2][3]={{1,2,3},{4,5,6}} y=[3][2]={{1,5},{5,3},{81}}」 という問題です。自分ではとりあえず、 #include<stdio.h> int main(void) { int i,j; int x[2][3]={{1,2,3},{4,5,6}}; int y[3][2]={{1,5},{5,3},{8,1}}; int xy[3][3]={0}; for(i=0;i<3;i++) for(j=0;j<3;j++) xy[i][j]=x[i][j]*y[i][j]; for(i=0;i<3;i++){ for(j=0;j<3;j++) printf("%3d",xy[i][j]); putchar('\n'); } return 0; } というプログラムを作ってみましたが、ダメでした。 ちゃんと積の表示が出るようにするにはどこをどう変えるべきでしょうか?