C言語での行列計算に関する問題
- セグメントエラーが発生している C 言語の行列計算関数とプログラムについて相談しました。
- 関数 matprod の引数やループ処理に問題がある可能性があります。
- 間違いを見つけることができる方にお教えいただきたいです。
- ベストアンサー
C言語★
012 012 123 × 123 234 234 を計算させるために以下の関数と表示するプログラムを作りました。 しかし、セグメントエラーで実行できません。 関数 void matprod(int nrow,int ncol,double **a,double **b,double ** prod){ int i,j,k; for(i=0;i<nrow;i++){ for(j=0;j<ncol;j++){ for(k=0;k<ncol;k++){ prod[i][j]=a[k][j]*b[i][k];} } } return ; } 表示部分 matprod(3,3,a,b,prod); for(i=0;i<nrow;i++){ for(j=0;j<ncol;j++){ printf("%d",prod[i][j]); //3*3の計算をして、答えを表示する。 }} この中に間違えがあると思うのですが、いくらチェックしても分かりません。>< お願いです。 どなたか、間違いを分かる方がいらっしゃったら教えてください!!
- danzania
- お礼率56% (62/110)
- C・C++・C#
- 回答数4
- ありがとう数2
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
★追記。 ・ちょっと同じような処理を書いてみました。 解説はしませんのでソースを読み取ってみて下さい。 でも注目して欲しい点は (1)new_matrix 関数の行列確保 (2)free_matrix 関数の行列解放 (3)disp_matrix 関数の行列表示 の3つです。 ・2次配列を動的に確保していますが malloc(calloc)、free の回数が少ないです。 この方法ならメモリ不足で free したり、行列解放の free の回数がわずか 2 回です。 過去質問を参考にどうぞ。 http://oshiete1.goo.ne.jp/qa3022605.html→『callocで二次元配列を作成するには?』 ・では下のソースをご覧下さい。 ソース: #include <stdio.h> #include <stdlib.h> // 行列の確保 double **new_matrix( int nrow, int ncol ) { double **aa; double *a; int i; if ( (aa = (double **)calloc(nrow + 1,sizeof(double*))) != NULL ){ if ( (a = (double *)calloc(nrow * ncol,sizeof(double))) != NULL ){ for ( i = 0 ; i < nrow ; i++ ){ aa[ i ] = &a[ i * ncol ]; } aa[ nrow ] = NULL; // 行数の末尾判定の工夫 return aa; // 正常 } free( aa ); } return NULL; // 確保エラー } // 行列の解放 void free_matrix( double **a ) { if ( a != NULL ){ free( a[0] ); free( a ); } } // 行列の表示 void disp_matrix( double **a, int nrow, int ncol ) { int x, y; for ( y = 0 ; y < nrow ; y++ ){ for ( x = 0 ; x < ncol ; x++ ){ printf( "%.f ", a[y][x] ); } printf( "\n" ); } printf( "\n" ); } // 行列の初期化(ダミーセット) void dummy_matrix( double **a, int nrow, int ncol ) { int x, y; for ( y = 0 ; y < nrow ; y++ ){ for ( x = 0 ; x < ncol ; x++ ){ a[ y ][ x ] = ncol * y + x; } } } // 行列処理 void matprod( int nrow, int ncol, double **a, double **b, double **prod ) { int i, x, y; for ( y = 0 ; y < nrow ; y++ ){ for ( x = 0 ; x < ncol ; x++ ){ for ( i = 0 ; i < ncol ; i++ ){ prod[ y ][ x ] = a[i][x] * b[y][i]; } } } } // メイン関数 int main( void ) { int success = 0; // 成功フラグ int nrow = 3; // 行数 int ncol = 3; // 列数 double **a, **b, **prod; // 3×3行列を3つ確保 if ( (a = new_matrix(nrow,ncol)) != NULL ){ if ( (b = new_matrix(nrow,ncol)) != NULL ){ if ( (prod = new_matrix(nrow,ncol)) != NULL ){ // aの初期化,表示 dummy_matrix( a, nrow, ncol ); disp_matrix( a, nrow, ncol ); // bの初期化,表示 dummy_matrix( b, nrow, ncol ); disp_matrix( b, nrow, ncol ); // 行列の計算,表示 matprod( nrow, ncol, a, b, prod ); disp_matrix( prod, nrow, ncol ); success = 1; free_matrix( prod ); } free_matrix( b ); } free_matrix( a ); } if ( success == 0 ){ printf( "3×3行列をメモリ確保できませんでした。\n" ); return 1; } return 0; } 以上。
その他の回答 (3)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★追記。 >肝心の計算結果が出てきません。。><・・。 ↑ これって計算結果が正しくないという意味ですか? ・matprod 関数は行列の掛け算ですよね? だとすると行列の計算ロジックが間違っていますね。 間違い⇒prod[ y ][ x ] = a[i][x] * b[y][i]; 正しい⇒prod[ y ][ x ] += a[i][x] * b[y][i]; となりませんか。 ・以上。回答 No.3 の matprod 部分も修正して下さい。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス >肝心の計算結果が出てきません。。><・・。 ↑ これは正しい計算結果が出ないのでしょうか? それとも全く計算結果が表示されないのでしょうか? どういう意味? >助けてください!!!! ↑ どこの何を。 せめてどの関数のどの場所か補足してくれないとね。 行列プログラムのようですね。 行列の計算方法を忘れてしまいました。 ・とりあえず prod がメモリ確保されていないのでバグとなっています。 行列の為に2次配列を動的確保しているのならば matprod 関数の引数は最初の方法に 戻して下さい。それであっているので。 ちなみに『セグメントエラーで実行できません。』というのは prod が確保されていない エラーです。これが原因でした。 まずはソースを最初の『double **a』に引数を戻してから prod を new_matrix 関数で 確保して下さい。 ・以上。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★関数の引数定義を修正しましょう。 ・間違い⇒double **a 正しい1⇒double (*a)[3] 正しい2⇒double a[3][3] ※同様に『b』『prod』も修正します。 もう一つの方法: ・配列の要素が可変の場合は引数を『**a』として for ( k = 0 ; k < ncol ; k++ ){ double aa = a[ k * ncol + j ]; double bb = b[ i * ncol + k ]; prod[ i * ncol + j ] = aa * bb; } と配列位置を計算してアクセスします。 ・以上。
補足
#include <stdio.h> #include <stdlib.h> double * vector; double ** matrix; double * new_vector(int n); /* n×1 ベクトルの作成 */ double ** new_matrix(int nrow, int ncol); /* nrow行ncol列の行列の作成 */ void free_vector(double * v); /* ベクトルの消去 */ void free_matrix(double ** a); /* 行列の消去 */ void vecprint(double * v, int n); /* n×1 ベクトルの表示 */ void matprint(double ** a, int ncol); /* 行列の表示 */ /* ベクトルv1とベクトルv2の和をベクトルsumに代入する */ void vecsum(int n, double * v1, double * v2, double * sum); void matprod(int nrow,int ncol,double a[3][3],double b[3][3],double prod[3][3]); int main() { int i, j, nrow, ncol; double *v1, *v2, *v3; double **a,**b,**prod; nrow = 3; /* 行の数 */ ncol = 3; /* 列の数 */ a = new_matrix(nrow, ncol); /* 行列を作る */ for (i = 0; i < nrow; i++) for (j = 0; j < ncol; j++) a[i][j] = 1.0 * i + j; /* 行列の要素の代入 */ printf("%d × %d 行列:\n", nrow, ncol); matprint(a, ncol); /* 出力 */ b = new_matrix(nrow, ncol); /* 行列を作る */ for (i = 0; i < nrow; i++) for (j = 0; j < ncol; j++) b[i][j] = 1.0 * i + j; /* 行列の要素の代入 */ printf("%d × %d 行列:\n", nrow, ncol); matprint(b, ncol); /* 出力 */ matprod(3,3,a,b,prod); for(i=0;i<nrow;i++){ for(j=0;j<ncol;j++){ printf("%lf",prod[i][j]); //3*3の計算をして、答えを表示する。 }} return; } double * new_vector(int n) { double * v; v = malloc(sizeof(double) * n); if (v == NULL){ fprintf(stderr, "\n記憶領域不足.\n"); exit; } return v; } double ** new_matrix(int nrow, int ncol) { int i; double ** a; a = malloc((nrow + 1) * sizeof(void *)); if (a == NULL){ fprintf(stderr, "\n記憶領域不足.\n"); exit; } for (i = 0; i < nrow; i++) { a[i] = malloc(sizeof(double) * ncol); if (a[i] == NULL) { while (--i >= 0) free(a[i]); free(a); fprintf(stderr, "\n記憶領域不足.\n"); exit(EXIT_FAILURE); } } a[nrow] = NULL; /* 行の数を自動判断するための工夫 */ return a; } void free_vector(double * v) { free(v); } void free_matrix(double ** a) { double ** b; b = a; while (*b != NULL) free(*b++); free(a); } void vecprint(double * v, int n) { int j; for (j = 0; j < n; j++) { printf("%0.f ", v[j]); } printf("\n"); } void matprint(double ** a, int ncol) { int i; for (i = 0; a[i] != NULL; i++) { vecprint(a[i], ncol); } } void vecsum(int n, double * v1, double * v2, double * sum) { int i; for(i=0; i<n; i++) sum[i] = v1[i] + v2[i]; return; } void matprod(int nrow,int ncol,double a[3][3],double b[3][3],double prod[3][3]){ int i,j,k; for(i=0;i<nrow;i++){ for(j=0;j<ncol;j++){ for(k=0;k<ncol;k++){ prod[i][j]=a[k][j]*b[i][k];} } } } このプログラムを動かそうとしています。 セグメントエラーはなくなったのですが・・・。 肝心の計算結果が出てきません。。><・・。 助けてください!!!!
関連するQ&A
- c言語 行列の積に関して
<問> 4行3列の行列aと3行4列の行列bの積を、4行4列の行列cに格納する関数を作成せよ。 void mat_mul(const int a[4][3], const int b[3][4], int c[4][4]) 入門レベルのスキルしかありません。 上手く行列の積のプログラムが組めません。 行列の積の計算結果が何も出てきません。 どの様にしたら良いかご指導の程、宜しくお願いします。 <プログラム> void mat_mul(const int a[4][3], const int b[3][4], int c[4][4]) { int i, j, k; for (i = 0; i < 4; k++) { for (j = 0; j < 4; i++) for (k = 0; k < 3; j++) c[i][j] = c[i][j] + (a[i][k] * b[k][j]); } } void mat_print(const int m[4][4]) { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) printf("%4d", m[i][j]); putchar('\n'); } } int main(void) { int i, j ,k; int tensu1[4][3]; int tensu2[3][4]; int seki[4][4]; for(i = 0; i < 4; i++) { for (j = 0; j < 3; j++) { scanf("%d", &tensu1[i][j]); } putchar('\n'); } for(i = 0; i < 3; i++) { for(j = 0; j < 4; j++){ scanf("%d", &tensu2[i][j]); } putchar('\n'); } putchar('\n'); mat_mul(tensu1, tensu2, seki); puts("行列の積"); mat_print(seki); return 0; }
- ベストアンサー
- C・C++・C#
- C言語についての質問です。
C言語についての質問です。 このプログラムの前半にある A[N][N]={{1,0,0},{0,1,0},{0,0,1}} b[N]={4,5,3} という行列の成分をキーボードから入力するようにする にはどうすればいいでしょうか。 for や scanf や printf を使って、変えてくれないでしょうか。 #include <stdio.h> #include <math.h> /* gauss33.c */ #define N 3 main(){ double A[N][N]={{1,0,0},{0,1,0},{0,0,1}}; double b[N]={4,5,3}; double Aa[N][N]; double x[N], bb[N], e[N]; int n=N; int i, j, k; double akk, aik, s; /* input original coefficients */ /* 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("\nx(%d)=%f error=%f\n",i, x[i], e[i]); } }
- ベストアンサー
- C・C++・C#
- 初心者な質問その5
************************************************************************* void mmul(double a[],double b[],double c[],int imax,int jmax,int kmax){ int i,j,k; for(i=0;i<imax;i++){ for(k=0;k<kmax;k++){ c[(1)]=0.0; for(j=0;j<jmax;j++){ c[i*kmax+k] += a[(2)]*b[(3)] } } } } ************************************************************************* 行列の乗算を計算するプログラムです。 ⅰ,(1)~(3)に入る式 ⅱ,この関数mmulを使って下の行列を計算するプログラム についてお願いします。
- 締切済み
- C・C++・C#
- C言語です
#include<stdio.h> int main(void){ int matA[4][4], matB[4][4], matC[4][4]; int i, j, k; /* 行列A の読み込み */ for(i = 0; i < 4; ++i){ for(j = 0; j < 4; ++j){ scanf("%d",&matA[i][j]); } } /* 行列B の読み込み */ for(i = 0; i < 4; ++i){ for(j = 0; j < 4; ++j){ scanf("%d",&matB[i][j]); } } /*行列の積の計算*/ for(i = 0; i < 4; ++i){ for(j = 0; j < 4; ++j){ matC[i][j]=0; /*初期化が必要*/ for(k = 0; k < 4; ++k){ matC[i][j]+=matA[i][k]*matB[k][j]; } } } /*結果の表示*/ for(i = 0; i < 4; ++i){ for(j = 0; j < 4; ++j){ printf("%d\t",matC[i][j]); } printf("\n"); } return 0; } このプログラムについてですが、 /*行列の積の計算*/ for(i = 0; i < 4; ++i){ for(j = 0; j < 4; ++j){ matC[i][j]=0; /*初期化が必要*/ for(k = 0; k < 4; ++k){ matC[i][j]+=matA[i][k]*matB[k][j]; } } } この部分の初期化がfor(k = 0; k < 4; ++k){の部分の後ろだったら 実行結果が異なります。 なぜ、 for(k = 0; k < 4; ++k){ matC[i][j]=0; /*初期化が必要*/ この順番だといけないんですか?
- ベストアンサー
- C・C++・C#
- C言語を用いた45×45の逆行列の表示について・・・・。。
次のプログラムを動かすと逆行列を求めることができます。 10×10の計算までは、スムーズに計算する事ができたのですが、 私が知りたい45×45の行列の計算になるとなぜかうまくいきません。 そこでみなさんにお聞きしたいのは、計算がうまくいかない理由がプログラムにあるのか、単にPCの限界なのか、それ以外なのか。みなさんからアドバイスをいただけないでしょうか? ※下のプログラム、見づらくてすいません。 #include <stdio.h> #define N 10 /* 元の数 */ #define N2 2*N /* プロトタイプ宣言 */ void Print(int k); /* 大域変数 */ double a[N][N2]= {/* 行列 Aおよび単位行列 */ { ここに45×45の正則行列&45×45の単位行列を入れます・・・。。 }; int main(void) { double d; int i,j,k; for (k=0;k<=N-1;k++) { Print(k); for(i=0;i<=N-1;i++) { if(i!=k) { d=a[i][k]/a[k][k]; for (j=k+1;j<=N2-1;j++) a[i][j]=a[i][j]-a[k][j]*d; a[i][k] = 0.0; } } d=a[k][k]; for (j=k;j<=N2-1;j++) a[k][j]=a[k][j]/d; } Print(N); } void Print(int k) { int i,j; printf("\n ステップ %d \n",k); /* 小見出し */ for(i=0;i<=N-1;i++) { /* 第i行を印刷 */ for(j=0;j<=N-1;j++) printf("%6.4f,",a[i][j]); printf(" : "); for(j=N;j<=N2-1;j++) printf("%6.4f,",a[i][j]); printf("\n"); } }
- 締切済み
- C・C++・C#
- 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言語のソートの問題なんですが
値を入力する→値を入力する度に昇順に表示する これを不の値を入力するまで続けるという プログラムを作ろうと思っているのですが #include<stdio.h> swap(int *a,int *b) { int t; t=*a; *a=*b; *b=t; } main() { int i,j,k,a[100]; for(i=0;;++i) { scanf("%d",&a[i]); if(a[i] < 0) break; for(j=i+1;;++j) if(a[i] > a[j]) swap(&a[i],&a[j]); for(k=0;k <= i;++k) printf("%d ",a[k]); } return 0; } のように書いたのですがjを使った繰り返しの部分でa[j]に 値が無いから動かないと思うのですが どのように直せばいいか分かりません どなたか分かる方御教授お願いします
- ベストアンサー
- C・C++・C#
- C言語による数値計算を教えて下さい
「2次関数y = ax2 + bx + c の係数を最小2乗法で求めるための正規方程式を導出せよ.その上でキーボードからデータの組(xi, yi)を 5点入力してa,b,cを求めるプログラムを作成せよ(x1~x5,y1~y5)」 という問題なのですが、a,b,cを求める方程式を行列式の形で以下のように出せました。 |Σxi^4 , Σxi^3 , Σxi^2| |a| |Σxi^2*yi| |Σxi^3 , Σxi^2 , Σxi |*|b| = |Σxi*yi | |Σxi^2 , Σxi , 5 | |c| |Σyi | ですがこれをガウス消去法で解こうと思っているのですがどうにもプログラムができません。 どなたかC言語で数値計算できる方、助けてください。 以下のはサイエンス社の「C言語による数値計算入門」をもとに ガウス消去法で解くプログラムを自分なりに作ったのですが 当然エラーだらけです。 プログラムを作れる方、どうか教えてください。 #include <stdio.h> #include <math.h> /* ガウス消去法 */ double *simple_gauss( double a[3][3], double b[3] ); main(void) { double a[3][3]; /* マトリックスの宣言*/ double x[3]; /* 解ベクトルの宣言*/ double y[3]; /* 右辺ベクトルの宣言*/ double xx, yy; /* キーボード入力のための一時変数*/ int i, j; /* 繰り返しのための一時変数*/ for(i = 0; i < 2; i++) { /* 変数の初期化*/ x[i] = y[i] = 0; for(j = 0; j < 3; j++) a[i][j] = 0; } for(i=0; i<5; i++) { printf("\n(x, y) = "); scanf("%lf,%lf", &xx, &yy); a[1][1] += xx * xx * xx * xx; a[1][3] += xx * xx; a[2][2] = a[3][1]=a[1][3]; a[1][2] += xx * xx * xx; a[2][1]=a[1][2]; a[2][3] += xx; a[3][2]=a[2][3]; a[3][3] ++; y[2] += xx * yy; y[1] += xx * xx * yy; y[3] += yy; } y=*simple_gauss(a,y); return 0; } double *simple_gauss( double a[3][3], double y[3] ) { int i, j, k; double alpha, tmp; /* 前進消去 */ for( k = 0; k <= 1; k++) { for( i = k+1; i <= ; i++) { alpha = - a[i][k]/a[k][k]; for( j = k+1; j <= 2; j++) { a[i][j] = a[i][j] + alpha * a[k][j]; } y[i] = y[i] + alpha * y[k]; } } /* 後退代入 */ y[2] = y[2]/a[2][2]; for( k = 1; k >= 0; k--) { tmp = y[k]; for( j = k+1; j <= 2; j++) { tmp = tmp - a[k][j] * y[j]; } y[k] = tmp/a[k][k]; } return y; }
- ベストアンサー
- 数学・算数
- 行列の和、積、乗算(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++・C#
お礼
Oh-Orangeさん。 何度も私の初歩的な質問にご回答ありがとうございました。 無事にプログラムを作成することができました!! プログラミングが楽しく思えました★ Oh-Orangeさんみたいな人がこの教えてgooにいることを嬉しく思います>< 本当にありがとうございます!!!