「ブロック機能」のリニューアルについて

ポインタを使って3×3の行列の足し算を行いたいです。mallocは習っていなくて、
関数宣言の形は
void add(int* a,int* b,int* result,int n);
の形で行いたいです。
また演算は一行ごとに行います。
関数の中では index syntax は使ってはいけません。
ー------------------
コードがわかりません。。
関数の中とはメイン関数も含めてなのでしょうか??
メイン関数でindex syntaxを使わずに、mallocも習った状態でできるのでしょうか。
コードの例と解説をお願いしたいです

教えて!goo グレード

A 回答 (3件)

3x3ってサイズがきまってるのに


何故nを渡すのだろう?

固定サイズなら

void(int *a, int *b, int * result)
{
int i;
for(i=0; i < 3*3; i++)
*(restlt + i) = *(a+i)+*(b+i);
}

で十分。

それとも正方行列のみのnxnの可変サイズ版を作れって話?
いや3x3=9=n かな?

要件曖昧。

>関数の中とはメイン関数も含めてなのでしょうか??

こんなこと聞くってことは
これ、宿題か演習?

そんなこと聞かれても解るわけないから
教官だか先生に聞こう。
そもそもaddの外の実装も必要?
    • good
    • 0

同じ方でしょうか。

関数内でindex sintaxを使わない他の条件でも投稿が多く、かなりの数がありました。メイン関数ももちろん関数ですし、そこでの配列の定義で使うものや、mallocも習っていないのに多次元ポインタへのキャストまで多用するものまであり、解答した質問が削除されるまで、何のネタなのかと思いつつ再掲しておきます。

普通は構造体などで定義して、初期化関数を作ると思います。

配列とポインタ
http://wisdom.sakura.ne.jp/programming/c/c22.html

次に、多次元への添え字指定の計算方法です
*(pointa + (指定一次元添字 * 二次元要素数) + 指定二次元添字)です

つまり、多次元配列 ary[10][5] のうち ary[5][3] にアクセスしたい場合は次のようになります
*(pointa + ( 5 * 5 ) + 3);

雑ですが、こんな感じでどうでしょう?

#include <stdio.h>

/* 行列を管理する構造体 */
typedef struct matrix {
int row; /* 行方向の要素数。現在は 3 に固定 */
int col; /* 列方向 (column) の要素数。現在は 3 に固定 */
int data_x[3][3]; /* 行列の各要素 */
int data_y[3][3];
int data_r[3][3];
} Matrix;

/* 行列を初期化する */
void init_matrix(Matrix* entry) {

entry->row = 3;
entry->col = 3;

int *px = (int *)entry->data_x;
int *py = (int *)entry->data_y;

for (int i = 0; i < entry->row; i++) {
for (int j=0; j < entry->col; j++) {
*(px + (i * entry->row) + j) = 5;
}
}

for (int i = 0; i < entry->row; i++) {
for (int j=0; j < entry->col; j++) {
*(py + (i * entry->row) + j) = 1;
}
}

}

void sub_matrix(int* left_row, int* right_row, int* result_row, int nr, int nc) {

for (int i = 0; i < nr ; i++) {
for (int j = 0; j < nc; j++){
*(result_row + (i * nr) + j) = *(left_row + (i * nr) + j) - *(right_row + (i * nr) + j);
}
}

}

int main(void){

Matrix mat;

/* 初期化 */
init_matrix(&mat);

/* 何故か構造体で定義しない^-^; */
int *px = (int *)mat.data_x;
int *py = (int *)mat.data_y;
int *pr = (int *)mat.data_r;

printf("input first Matrix:\n");

for (int i = 0; i < mat.row; i++) {
for (int j = 0; j < mat.col; j++){
printf("%d-%d:", i, j);
scanf("%d", &(*(px + (i * mat.row) + j)));
}
}

printf("input second Matrix:\n");

for (int i = 0; i < mat.row; i++) {
for (int j = 0; j < mat.col; j++) {
printf("%d-%d:", i, j);
scanf("%d", &(*(py + (i * mat.row) + j)));
}
}

sub_matrix(px, py, pr, mat.row, mat.col);

for (int i = 0; i < mat.row; i++) {
for (int j = 0; j < mat.col; j++) {
printf("%d ", *(pr + (i * mat.row) + j));
}
}

printf("\n");

/* サラスの公式 */
printf("\n\n%d\n", (
((*(pr + 0)) * (*(pr + (1 * mat.row) + 1)) * (*(pr + (2 * mat.row) + 2)))
+ ((*(pr + 1)) * (*(pr + (1 * mat.row) + 2)) * (*(pr + (2 * mat.row) + 0)))
+ ((*(pr + 2)) * (*(pr + (1 * mat.row) + 0)) * (*(pr + (2 * mat.row) + 1)))
- ((*(pr + 2)) * (*(pr + (1 * mat.row) + 1)) * (*(pr + (2 * mat.row) + 0)))
- ((*(pr + 1)) * (*(pr + (1 * mat.row) + 0)) * (*(pr + (2 * mat.row) + 2)))
- ((*(pr + 0)) * (*(pr + (1 * mat.row) + 2)) * (*(pr + (2 * mat.row) + 1)))
));

return 0;

}
    • good
    • 0

#include <stdio.h>


#include <stdlib.h>

void add(int* a, int* b, int* result, int n) {
 for (int i = 0; i < n * n; i++) {
  *(result + i) = *(a + i) + *(b + i);
 }
}

int main(void) {
 int x[9] = {0}, y[9] = {0}, result[9] = {0}, n = 3;
 char s[5];

 puts("input first Matrix:");
 for (int i = 0; i < n * n; i++) {
  scanf("%4s%*[^\n]", s);
  getchar();
  *(x + i) = strtol(s, NULL, 10);
 }

 puts("input second Matrix:");
 for (int i = 0; i < n * n; i++) {
  scanf("%4s%*[^\n]", s);
  getchar();
  *(y + i) = strtol(s, NULL, 10);
 }

 add(x, y, result, n);

 for (int i = 0; i < n * n; i++) {
  if (i != 0 && i % 3 == 0) { puts(""); }
   printf("%d ", *(result + i));
 }
 puts("");

 return EXIT_SUCCESS;
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

教えて!goo グレード

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング