演習 6-13

#include <stdio.h>

void mat_add(const int a[2][4][3], int c[1][4][3]){

int i, j, k;

for (i = 0; i < 4; i++){
for (j = 0; j < 3; j++){
for (k = 0; k < 2; k++){
c[0][i][j] += a[k][i][j];
}
}
}
}

void mat_print(const int m[2][4][3], int n){

int i, j;


for (i = 0; i < 4; i++){
for (j = 0; j < 3; j++){
printf("%4d", m[n][i][j]);
}
printf("\n");
}
}

int main(){

int tensu[2][4][3] = { { { 91, 63, 78 }, { 67, 72, 46 }, { 89, 34, 53 }, { 32, 54, 34 } },
{ { 97, 67, 82 }, { 73, 43, 46 }, { 97, 56, 21 }, { 85, 46, 35 } } };
int sum[1][4][3] = { 0 };

mat_add(tensu, sum);

puts("1回目の点数"); mat_print(tensu, 0);
puts("2回目の点数"); mat_print(tensu, 1);
puts("合計点"); mat_print(sum, 0);

return 0;
}

3 件のコメント:

  1. 合計までを含めた3次元配列ではできないのでしょうか。
    以下のようにしてみたのですが、上手くいきませんでした。

    #include

    void mat_add(const int a[3][4][3]){

    int i, j;

    for(i = 0 ; i < 4 ; i++)
    for(j = 0 ; j < 3 ; j++)
    a[2][i][j] = a[0][i][j] + a[1][i][j];
    }

    void mat_print(const int a[3][4][3], int b){

    int i, j;

    for(i = 0 ; i < 4 ; i++){
    for(j = 0 ; j < 3 ; j++)
    printf("%4d", a[b][i][j]);
    printf("\n");
    }
    }

    int main(void){

    int tensu[3][4][3]= {{{91, 63, 78},
    {67, 72, 46},
    {89, 34, 53},
    {32, 54, 34}},
    {{97, 67, 82},
    {73, 43, 46},
    {97, 56, 21},
    {85, 46, 35}}};

    mat_add(tensu);

    puts("1回目の点数"); mat_print(tensu, 0);
    puts("2回目の点数"); mat_print(tensu, 1);
    puts("合計点"); mat_print(tensu, 2);

    return 0;
    }

    返信削除
  2. mat_addのconstを外したところエラーは減りましたが、mat_printのconstも外すことでようやく上手くいきました。なぜmat_printの方でもconstを付けてはいけないのでしょうか?

    返信削除
  3. 少しいじったりしたので行数はずれている部分もありますが、以下のようなエラーメッセージが出ました。

    rensyu.c:12:26: エラー: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token
    void mat_print(const int &a[3][4][3], int b){
    ^
    rensyu.c: 関数 ‘main’ 内:
    rensyu.c:37:3: 警告: 関数 ‘mat_print’ の暗黙的な宣言です [-Wimplicit-function-declaration]
    puts("1回目の点数"); mat_print(tensu, 0);
    ^

    main以外の関数内で引数の配列を変化させないときはconstを付けておいた方が良いと思っていましたが、そのことによるエラーが増えてしまうため、constが本当に必要な時にだけつけるようにした方がよさそうですね。。。

    返信削除