• 締切済み

[C言語]試験問題の復習ができません[穴埋め]

2 次方程式の解を計算する方法に関するつぎの解説をよく読み,その空欄【 あ 】・ 【 え 】~【 こ 】 に適切な語句を埋めて文章を完成せよ。 2次方程式 x2+ax+b=0 を考える。その解の公式は D=a2-4b とおいてx=(-a±√D)/2 となる。 そこで,この2 解を変数 x1, x2 に計算するプログラムはつぎのように書きたくなる。 D= a*a-4.0*b; r= 【 あ 】; x1= (-a+r)/2.0; x2= (-a-r)/2.0; もちろん,このままプログラムとしたのではうまく動作しない。 【 あ 】 は D≧0 の場合に しか動作しないからである。つまり,このプログラムは,判別式が非負の場合にだけ動作する。 さて,この方程式が2 実解α,β をもつとする。このとき,a= -(α+β), b= αβ である。さらに, α≫0(α が大きな数), β≈0 (β が小さな数)であるとする。 上のプログラムでは 【 え 】にα の近似値が得られ,【 お 】にβ の近似値が得られるが,【 か 】は浮動小数点近似の精度に 近い精度の近似値になるものの,他方はそうはならない。桁落ちが生じるからである。これを避 けには,精度良く近似値が得られる【 か 】を使って,他方の解を“【 き 】”から乗除算で求 めることである。 この対策を完全に施して,解の公式で精度良く計算できる解をx1 にまず計算する形に仕上 げたプログラムでは,つぎのように書くことになる。 x1= (a>0.0 ? 【 く 】 : 【 け 】)/2.0; x2= 【 こ 】; __________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ ベクトルに行列による一次変換を施すプログラム,および,行列の2 乗を計算するプ ログラムに関するつぎの解説をよく読み,その空欄【 あ 】~【 か 】 に適切な語句を埋めて 文章を完成せよ。 ベクトルのデータ型 vector と(正方)行列のデータ型 matrix がつぎの通り宣言されて いるとする。 #define SIZE 3 typedef double vector[SIZE]; typedef double matrix[SIZE][SIZE]; ベクトルx に行列A による一次変換を施して得られるベクトルy = A x を計算するプログラム, および,行列A の2 乗 B= A2 を計算するプログラムを下に示す。ただし,つぎの通りに変数 (配列)が用意されているとする。 vector x; /* x の値が入れてある */ matrix A; /* A の値が入れてある */ vector y; /* ここにy の値を入れる */ matrix B; /* ここにB の値を入れる */ また, int 型の変数i,j,k も宣言してあるとする。 ベクトルに対する一次変換 for(i= 0; i!=SIZE; i++){ double w= 【 あ 】; for(j= 0; j!=SIZE; j++){ w= 【 い 】; } y[i]= 【 う 】; } 行列の2 乗 for(i= 0; i!=SIZE; i++){ for(j= 0; j!=SIZE; j++){ double w= 【 え 】; for(k= 0; k!=SIZE; k++){ w= 【 お 】; } B[i][j]= 【 か 】; } }

みんなの回答

  • ninoue
  • ベストアンサー率52% (1288/2437)
回答No.2

何れの問題も基本中の基本なので、自分で復習をして解いて下さい。 二次方程式の解法、 行列とベクトルの積などです。 自分で解説を読み、例題を辿って理解を深め、演習問題を自分で解いていく事を繰り返したりする事により理解して身に付けていって下さい。 それから "D=a2-4b" は数式の書き方が間違っています。 これでは 本来の D=a*a-4*b ではなく、 (a2 という単独の変数 -4*b) としてしか解釈されません。 例えば次等を参考に正しい書き方をして下さい。 http://www.su-gaku.jp/suken_bbs/form.html 数式の書き方 その他、αβγ等は あるふぁ べーた がんま 等と入力して変換操作する事で入力出来ます。 それから数学やC言語に関しては次等が参考になると思われます。 http://okwave.jp/qa/q8043298.html 数学(中学、高校、大学) の参考サイト等 C言語 入門 OR 初歩       等でサーチ ==> http://www5c.biglobe.ne.jp/~ecb/c/c00.html C言語入門 (左側のcontents ....) プログラミング言語C (カーニハン & リッチー) 等

回答No.1

で、ご質問は?

関連するQ&A

  • 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言語の問題がわかりません。

    出来れば7月25日7:30頃までに回答を頂ければ幸いです。 問題は次の通りです。 Write program that uses a function and do following -------------------------- main program calculates matrix A(3x3) as: Aij = (i+1)*(j+1), i=0,1,2; j=0,1,2; print matrix A by rows to get spatially correct A, calls function -------------- that read A by pointer reference, copies matrix A[N][N] to vector B[N*N] by Bk = Aij, k=i*(N+1)+j, and returns B to main program also by pointer reference -------------- prints vector B and addresses of all B[k]. 私の作ったプログラムは次の通りです。 #include <stdio.h> void func(int *pt); int A[3][3], B[9]; int *pt; int main(void) { int A[3][3], B[9]; int *pt; int i, j, k ; for(i=0;i<=2;i++) { for(j=0;j<=2;j++) { A[i][j] = (i+1) * (j+1); printf("A[%d][%d]=%d\t", i, j, A[i][j]); } printf("\n"); } func(&A); return 0; } void func(int *pt) { int k, i, j ; int *pt; k = i * (2 + 1) + j; B[k] =A [i][j]; pt =B; for(k=0;k<=8;k++) { printf("B[%d]=%d\t", k, pt); } printf("\n"); for(k=0;k<=8;k++) { printf("addresses of B[%d] = %p\n", k, pt); } } エラーが出てしまいます。修正、編集もしくはプログラムを教えてください お願いします。

  • 部分行列の抜き出し(C言語)

    部分行列の抜き出し(C言語) ある行列から、任意の部分行列を抜き出すような関数を作りたいのですが、わからないので手助けをお願いしたいです。 たとえば4行4列の行列Aがあった場合、その2行2列、2行3列、3行2列、3行3列目の 4つの(2行2列の)要素を抜き出すような関数です。 枠組みは出来ているので載せておきます。 #include <stdio.h> #include <stdlib.h> #include <math.h> typedef struct matrix{ double *data; int size[2]; }MATRIX; MATRIX create_matrix(int m,int l,int a); //行列の作成 void print_matrix(MATRIX A); //行列の表示 MATRIX submatrix(MATRIX matrix_A,int m,int n,int l,int k); //任意の部分行列の抜き出し int main(int argc,char **argv) { //構造体の初期化 MATRIX matrix_A={NULL,NULL,NULL}; MATRIX matrix_B={NULL,NULL,NULL}; MATRIX matrix_C={NULL,NULL,NULL}; int m=0; //行列の行 int l=0; //行列の列 int a=1; //要素 double det=0; //行列計算 //行列Aの作成 m=4;//行 l=4;//列 matrix_A = create_matrix( m, l, a); //関数 matrix_C = submatrix(matrix_A,2,2,3,3); //行列結果出力 printf("\n\tmatrix input"); print_matrix(matrix_A); printf("\n\tmatrix output"); print_matrix(matrix_C); //行列の開放 free(matrix_A.data); matrix_A.data=NULL; free(matrix_C.data); matrix_C.data=NULL; printf("終了!\n\n"); return 0; } MATRIX create_matrix(int m,int l,int a) { MATRIX matrix_A={NULL,NULL,NULL}; int i=0; //サイズの確保 行;size[0] 列;size[1] matrix_A.size[0]=m; matrix_A.size[1]=l; //メモリの確保 matrix_A.data=(double *)malloc(sizeof(double)*matrix_A.size[0]*matrix_A.size[1]); if(matrix_A.data == NULL){ printf("メモリ確保失敗!![matrix_A]\n"); exit(1); } //行列Aの作成 for(i=0; i<((matrix_A.size[0])*(matrix_A.size[1])) ;i++){ *(matrix_A.data+i)=a+i; } return(matrix_A); } /*行列の表示*/ void print_matrix(MATRIX matrix_A) { int i=0; int j; //行 int k; //列 printf("\n行列の表示\n"); //行列Aのプリント for(j=0;j<matrix_A.size[0];j++){ for(k=0;k<matrix_A.size[1];k++){ printf("%f\t",*(matrix_A.data+k*matrix_A.size[0]+j)); } printf("\n"); } return; } MATRIX submatrix(MATRIX matrix_A,int m,int n,int l,int k) { MATRIX matrix_C = {NULL,NULL,NULL}; int i,j; //サイズの確保 行;size[0] 列;size[1] matrix_C.size[0]=l-m+1; matrix_C.size[1]=k-n+1; //メモリの確保 matrix_C.data=(double *)malloc(sizeof(double)*matrix_C.size[0]*matrix_C.size[1]); if(matrix_C.data == NULL){ printf("メモリ確保失敗!![matrix_C]\n"); exit(1); } //任意の部分行列の抜き出し (ここがわかりません。) } よろしくお願いします。

  • 行列の和、積、乗算について(C言語)

    まだC言語の勉強を始めて1か月の初心者なのですが、みなさんにお聞きしたいことがあります。 任意の行列に対して和、積、乗算の関数を作り出力するプログラムを 作りたいのですが、試しに和の関数を作ってビルトしてみたら、 31個もエラーが出て、困っています。 ↓参考書を見ながら、自分なりに考えたプログラムです。 #include <stdio.h> typedef struct matrix{ int m; int n; double data[100][100]; } MATRIX; int main(void) { MATRIX a; MATRIX b; a.m=2; a.n=3; a.data[100][100]={{1,2,1},{2,3,3}}; b.m=2; b.n=3; b.data[100][100]={{2,3,1},{1,2,1}}; kekka=add_mat(MATRIX a,MATRIX b); printf("和:%f,kekka.data); //行列和関数 MATRIX add_mat(MATRIX a,MATRIX b){ MATRIX sum; int i,j; sum.m=a.m; sum.n=a.n; sum.data[100][100]={{0,0,0}{0,0,0}}; for(i=0;i<sum.m;i++){ for(j=0;j<sum.n;j++){ sum.data=(a.data)+(b.data); return sum; } } } return 0; } おそらく相当ダメな感じなのでしょうが、エラー文を読んでも なかなか解決できません。 ちなみに、積の関数は mul_mat(MATRIX c,MATRIX a,MATRIX b){ int i,j,k; for(i = 0; i < a.m; i++){ for(j = 0; j < b.n; j++){ for(k = 0; k < a.n; k++){ C[i][j] = C[i][j] + A[i][k] * B[k][j]; } } } という風に考えました。みなさまのお力を借りたいです。 よろしくお願いします

  • 行列の和、積、乗算(C言語)

    まだC言語の勉強を始めて1か月の初心者なのですが、みなさんにお聞きしたいことがあります。 任意の行列に対して和、積、乗算の関数を作り出力するプログラムを 作りたいのですが、試しに和の関数を作ってビルトしてみたら、 31個もエラーが出て、困っています。 ↓参考書を見ながら、自分なりに考えたプログラムです。 #include <stdio.h> typedef struct matrix{ int m; int n; double data[100][100]; } MATRIX; int main(void) { MATRIX a; MATRIX b; a.m=2; a.n=3; a.data[100][100]={{1,2,1},{2,3,3}}; b.m=2; b.n=3; b.data[100][100]={{2,3,1},{1,2,1}}; kekka=add_mat(MATRIX a,MATRIX b); printf("和:%f,kekka.data); //行列和関数 MATRIX add_mat(MATRIX a,MATRIX b){ MATRIX sum; int i,j; sum.m=a.m; sum.n=a.n; sum.data[100][100]={{0,0,0}{0,0,0}}; for(i=0;i<sum.m;i++){ for(j=0;j<sum.n;j++){ sum.data=(a.data)+(b.data); return sum; } } } return 0; } おそらく相当ダメな感じなのでしょうが、エラー文を読んでも なかなか解決できません。 ちなみに、積の関数は mul_mat(MATRIX c,MATRIX a,MATRIX b){ int i,j,k; for(i = 0; i < a.m; i++){ for(j = 0; j < b.n; j++){ for(k = 0; k < a.n; k++){ C[i][j] = C[i][j] + A[i][k] * B[k][j]; } } } という風に考えました。みなさまのお力を借りたいです。 よろしくお願いします。

  • C言語の問題で一部分からないところがあります。

    C言語の問題で2つの4x4行列の2次元配列に格納し、それらの積を求めるというプログラムで以下のような関数を作成しました。 #include <stdio.h> void m_ena(int a0[4][4], int a1[4][4], int result[4][4]); int main(void) { } void m_ena(int a0[4][4], int a1[4][4], int result[4][4]) { int a[4][4], b[4][4], r[4][4]; int i, j; for(i=0; i<4; i++){ for(j=0; j<4; j++){ scanf("%d", &a[i][j]); } } for(i=0; i<4; i++){ for(j=0; j<4; j++){ scanf("%d", &b[i][j]); } } for(i=0; i<4; i++){ for(j=0; j<4; j++){ r[4][4] = a[i][j]*b[i][j]; } } } ここまで出来たのはいいのですが、これ以降どのようにメイン関数に書けばいいのか分からず困っています。 この問題は必ず上記関数を使う必要がありますのでどうぞよろしくお願いします。

  • C言語のscanf関数についての質問です。

    閲覧ありがとうございます。 C言語についての質問です。 nと、2つのn×n行列の各成分をキーボードから入力し、 その和を計算するプログラムを作ろうとして i,j,と行列二つの配列(a[n][n]とb[n][n])をintで定義した後、 printf("行列aの成分を入力してください。\n"); for(i=0; i<=n-1; n++) {for(j=0; j<=n-1; j++) { scanf("%d",&a[i][j]); } } printf("行列bの成分を入力してください。\n"); for(i=0; i<=n-1; n++) {for(j=0; j<=n-1; j++) { scanf("%d",&b[i][j]); } } というプログラムを書いてn=3としたのですが、 「行列aの成分を入力してください」と表示されて 例えば「1 2 3 4 5 6 7 8 9」と入力してEnterキーを押しても 「行列bの成分を入力してください」という文が表示されません。 C言語を学び始めてまもないので、 まだ基本的なところが理解できていないかもしれません。 何が原因だかわかる方、解答頂けると嬉しいです。

  • 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言語です。 実行結果 式 3 X1 + 2 X2 + 1 X3 = &g 2 X1 + 5 X2 + 2 X3 = &g 1 X1 + 4 X2 + 1 X3 = &g 解 X1 = 1 X2 = 2 X3 = 3 を 式 3 X1 + 2 X2 + 1 X3 = 10 2 X1 + 5 X2 + 2 X3 = 18 1 X1 + 4 X2 + 1 X3 = 12 解 X1 = 1 X2 = 2 X3 = 3 に直したいのですが&gの所をどのようにしたら10.18.12になりますか? #include <stdio.h> #include <float.h> #define N 3 double A[N][N] = {{3,2,1}, {2,5,2}, {1,4,1}}; double b[N] = { 10, 18, 12 }; void Gauss_J( int, double*, double* ); void main(void) { int i; printf( "%d式\n", N ); for( i = 0; i < N ; i++ ) { printf( "%g X1 + %g X2 + %g X3 = &g \n", A[i][0], A[i][1], A[i][2], b[i] ); } printf("解\n"); Gauss_J(N, (double *)A, (double *)b ); printf("X1 = %g \n", b[0]); printf("X2 = %g \n", b[1]); printf("X3 = %g \n", b[2]); } void Gauss_J(int n, double *a, double *b) { int p, i, j,I ; double pivot, c ; for ( p = 0 ; p < n ; p++ ) { pivot = a[ p*n + p ]; for ( i = p ; i < n ; i++ ) { a[ p*n + i ] /= pivot; } b[ p ] /= pivot; for ( I = 0 ; I < n ; I++) { if (I != p) { c = a[ I*n + p]; for ( j = p ; j < n; j++ ) { a[ I*n + j] -= c * a[ p*n + j ]; } b[ I ] -= c * b[ p ]; } } } return ; }

  • c言語のプログラムで行列の積を計算する

    指定された行・列数(それぞれ10以下とする)の行列 X, Y の積 Z = X × Y を求めるプログラムを作成せよ.行列の要素はすべて整数とする. このプログラムで行と列の成分を入力するときに、1列になってしまうのですがどうしたらちゃんと入力できますか? int main(void) { double A[10][10]; double B[10][10]; int i,j,m,n,p,k; printf("行列xの行数は?:"); scanf("%d",&m); printf("行列xの列数(行列yの行数)は?:"); scanf("%d",&n); printf("行列yの列数は?:"); scanf("%d",&p); printf("行列xを入力してください。\n"); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { scanf("%d", &A[i][j]); } } printf("行列yを入力してください。\n"); for (i = 0; i < n; i++) { for (j = 0; j < p; j++) { scanf("%d", &B[i][j]); } }

専門家に質問してみよう