練習問題/解答例/転置行列/C
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
**転置行列(C言語版)のソースプログラム [#n4991da9]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 300 /*
* size of BUFSIZE is
* size of buffer(tok)
* + size of delimiter
* + size of carriege return character
* + size of NUL
*/
/* COL
* |------------------------
* col[0] col[1] ...
* - +---------+---------+----
* | row[0]|mat[0][0]|mat[0][1]|
* | +---------+---------+----
* ROW | row[1]|mat[1][0]|mat[1][1]|
* | +---------+---------+----
* | row[2]|mat[2][0]|mat[2][1]|
* | +---------+---------+----
* | | ...
*
* row+i point to col.
*
* We have Matrix 'mat',
* then mathematical mat(i,j) is equivalent to *(*(row+...
*/
struct matrix {
double **data;
int rows; /* gyou */
int cols; /* retu */
};
void
init_matrix(struct matrix *mat, int rows, int cols)
{
int i;
mat->rows = rows;
mat->cols = cols;
mat->data = (double **)malloc(rows*sizeof(double *));
for (i=0; i<rows; ++i) {
*(mat->data+i) = malloc(cols*sizeof(double));
}
}
void
free_matrix(struct matrix *mat)
{
int i;
int rows = mat->rows, cols = mat->cols;
for (i=0; i<rows; ++i) {
free(*(mat->data+i));
*(mat->data+i) = NULL;
}
free(mat->data);
mat->data = NULL;
}
void
set_matrix_dialog(struct matrix *m)
{
int i, j;
double n;
char buf[BUFSIZE];
for (j=0; j<m->rows; ++j) {
for (i=0; i<m->cols; ++i) {
printf("input value at (%d, %d) element: ", i, j);
fgets(buf, BUFSIZE-1, stdin);
sscanf_s(buf, "%lf", &n);
*(*(m->data+j) + i) = n;
}
}
}
void
set_matrix(struct matrix *m)
{
int i, j;
double *n = NULL;
char buf[BUFSIZE], *pbuf, *tok, *nx_tok = NULL, *delim ...
n = malloc(m->cols*sizeof(double));
printf("Input [%d] value space separated.\n", m->cols);
for (j=0; j<m->rows; ++j) {
memset(n, 0, m->cols*sizeof(double));
printf("row %d: ", j);
fgets(buf, BUFSIZE-1, stdin);
pbuf = buf;
for (i=0; i<m->cols && (tok=strtok_s(pbuf, delim, &nx_...
*(n+i) = atof(tok);
}
for (i=0; i<m->cols; ++i) {
*(*(m->data+j) + i) = *(n+i);
}
}
free(n);
n = NULL;
}
void
print_matrix(struct matrix *m)
{
int i, j;
for (j=0; j<m->rows; ++j) {
for (i=0; i<m->cols; ++i) {
printf("%8.3f ", *(*(m->data+j) + i));
}
printf("\n");
}
printf("\n");
}
void
transpose_matrix(struct matrix *dest, struct matrix *src)
{
int i, j;
for (j=0; j<dest->rows; ++j) {
for (i=0; i<dest->cols; ++i) {
*(*(dest->data+j) + i) = *(*(src->data+i) + j);
}
}
}
int
main()
{
struct matrix mat[2];
int rows = 3; /* modify if necessary */
int cols = 2; /* modify if necessary */
init_matrix(&mat[0], rows, cols);
init_matrix(&mat[1], cols, rows); /* for transposed mat...
/* Uncomment alternative */
//set_matrix_dialog(&mat[0]);
set_matrix(&mat[0]);
puts("[matrix]");
print_matrix(&mat[0]);
transpose_matrix(&mat[1], &mat[0]);
puts("[transposed matrix]");
print_matrix(&mat[1]);
free_matrix(&mat[0]);
free_matrix(&mat[1]);
getchar();
return 0;
}
**回答部分 [#abf5bed3]
問題の回答部分は
void
transpose_matrix(struct matrix *dest, struct matrix *src)
です。
main()のmat[0]がユーザが用意する行列。
mat[1]がその転置行列になります。
その他の箇所は入力部分だとか表示部分、エラー処理なので気...
**使い方 [#ddeb970a]
Input 2 value space separated.
row 0:
と表示されたら、スペース区切りで列の分だけ値を入力してあ...
行ずつ入力するようにしてあります。
1要素ずつ入力する場合は
set_matrix(&mat[0]);
をコメントして、
//set_matrix_dialog(&mat[0]);
をアンコメントしてあげてください。
終了行:
**転置行列(C言語版)のソースプログラム [#n4991da9]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 300 /*
* size of BUFSIZE is
* size of buffer(tok)
* + size of delimiter
* + size of carriege return character
* + size of NUL
*/
/* COL
* |------------------------
* col[0] col[1] ...
* - +---------+---------+----
* | row[0]|mat[0][0]|mat[0][1]|
* | +---------+---------+----
* ROW | row[1]|mat[1][0]|mat[1][1]|
* | +---------+---------+----
* | row[2]|mat[2][0]|mat[2][1]|
* | +---------+---------+----
* | | ...
*
* row+i point to col.
*
* We have Matrix 'mat',
* then mathematical mat(i,j) is equivalent to *(*(row+...
*/
struct matrix {
double **data;
int rows; /* gyou */
int cols; /* retu */
};
void
init_matrix(struct matrix *mat, int rows, int cols)
{
int i;
mat->rows = rows;
mat->cols = cols;
mat->data = (double **)malloc(rows*sizeof(double *));
for (i=0; i<rows; ++i) {
*(mat->data+i) = malloc(cols*sizeof(double));
}
}
void
free_matrix(struct matrix *mat)
{
int i;
int rows = mat->rows, cols = mat->cols;
for (i=0; i<rows; ++i) {
free(*(mat->data+i));
*(mat->data+i) = NULL;
}
free(mat->data);
mat->data = NULL;
}
void
set_matrix_dialog(struct matrix *m)
{
int i, j;
double n;
char buf[BUFSIZE];
for (j=0; j<m->rows; ++j) {
for (i=0; i<m->cols; ++i) {
printf("input value at (%d, %d) element: ", i, j);
fgets(buf, BUFSIZE-1, stdin);
sscanf_s(buf, "%lf", &n);
*(*(m->data+j) + i) = n;
}
}
}
void
set_matrix(struct matrix *m)
{
int i, j;
double *n = NULL;
char buf[BUFSIZE], *pbuf, *tok, *nx_tok = NULL, *delim ...
n = malloc(m->cols*sizeof(double));
printf("Input [%d] value space separated.\n", m->cols);
for (j=0; j<m->rows; ++j) {
memset(n, 0, m->cols*sizeof(double));
printf("row %d: ", j);
fgets(buf, BUFSIZE-1, stdin);
pbuf = buf;
for (i=0; i<m->cols && (tok=strtok_s(pbuf, delim, &nx_...
*(n+i) = atof(tok);
}
for (i=0; i<m->cols; ++i) {
*(*(m->data+j) + i) = *(n+i);
}
}
free(n);
n = NULL;
}
void
print_matrix(struct matrix *m)
{
int i, j;
for (j=0; j<m->rows; ++j) {
for (i=0; i<m->cols; ++i) {
printf("%8.3f ", *(*(m->data+j) + i));
}
printf("\n");
}
printf("\n");
}
void
transpose_matrix(struct matrix *dest, struct matrix *src)
{
int i, j;
for (j=0; j<dest->rows; ++j) {
for (i=0; i<dest->cols; ++i) {
*(*(dest->data+j) + i) = *(*(src->data+i) + j);
}
}
}
int
main()
{
struct matrix mat[2];
int rows = 3; /* modify if necessary */
int cols = 2; /* modify if necessary */
init_matrix(&mat[0], rows, cols);
init_matrix(&mat[1], cols, rows); /* for transposed mat...
/* Uncomment alternative */
//set_matrix_dialog(&mat[0]);
set_matrix(&mat[0]);
puts("[matrix]");
print_matrix(&mat[0]);
transpose_matrix(&mat[1], &mat[0]);
puts("[transposed matrix]");
print_matrix(&mat[1]);
free_matrix(&mat[0]);
free_matrix(&mat[1]);
getchar();
return 0;
}
**回答部分 [#abf5bed3]
問題の回答部分は
void
transpose_matrix(struct matrix *dest, struct matrix *src)
です。
main()のmat[0]がユーザが用意する行列。
mat[1]がその転置行列になります。
その他の箇所は入力部分だとか表示部分、エラー処理なので気...
**使い方 [#ddeb970a]
Input 2 value space separated.
row 0:
と表示されたら、スペース区切りで列の分だけ値を入力してあ...
行ずつ入力するようにしてあります。
1要素ずつ入力する場合は
set_matrix(&mat[0]);
をコメントして、
//set_matrix_dialog(&mat[0]);
をアンコメントしてあげてください。
ページ名: