プログラミング実習II (2026) 課題

[T7] 第6章 配列(2)

(本実習の課題ページ上で問題として記載されたサンプルプログラムは,特に指示がない限りコピー・ペーストして使用してよい.ただし,必要に応じて,インデントなど調整を行うこと)
(T7_1)

「キックオフ C言語」の第8.4.3項,p. 131, ソースコード8.5 を入力して実行し,正しく動作することを確認せよ ソースコード内では紙幅の削減が意識された書き方となっているが,自身が読みやすいように改行などを入れてよい.

関数が仮引数として受け取った int 型の変数の値を変更しても,呼び出し側である main 関数の実引数の値は影響を受けません.

一方,関数 array_copy が配列 dst[] を仮引数として受け取り,その値を変更すると,main 関数側の実引数 copy[] でもそれが参照できています.

このように,変数の場合と異なり,引数として渡された配列に値が代入された場合,呼び出し側の関数でもそれが反映されることに注意して下さい.

これは,変数が値渡しされるのに対して,配列は参照渡しされる(キックオフC言語には 3.8.2 項)ことによるものですが,関連した事項は C言語によるプログラミング 8章およびキックオフC言語 9章「ポインタ」にて学びます..

さらに,以下のプログラムを追加せよ.(2026年5月26日11:10追記: 赤字部分を修正しました

(T7_2)

下のプログラムは,6 種類の硬貨(1円, 5円, 10円, 50円, 100円, 500円)についてそれぞれの枚数に対して,金額の合計を表示する.以下に沿うように完成せよ.

出力結果の例:
1円が 3枚
5円が 2枚
10円が 0枚
50円が 5枚
100円が 3枚
500円が 1枚
合計は 1063円です.
#include <stdio.h>

#define N 6

/* プロトタイプ宣言,配列の引数の書き方に注意 */
void array_print( int a[], int b[] );
int array_sum( int a[], int b[] );

int main ( void )
{
    int value[ N ] = { 1, 5, 10, 50, 100, 500 };
    int num[ N ] = { 3, 2, 0, 5, 3, 1 };
    int sum;

    printf(" 硬貨の額面,枚数\n");
    array_print( value, num );

    sum = array_sum( value, num );
    printf(" 硬貨の合計金額は %d 円です\n", sum);

    return 0;
}

void array_print( int a[], int b[] )  /* 表示を行う関数の本体 */
{
    /* 金額と枚数を順に出力する */
}

int array_sum( int a[], int b[] )     /* 合計を求める関数の本体 */
{
    /* 合計金額を求めて戻り値とする */
}
(T7_3)

C言語によるプログラミング 6.5節,キックオフC言語 8.6節を読んだ上で,以下のプログラムの出力を予想してレポートに記せ.次に,プログラムを入力,コンパイル・実行して結果を確認せよ.予想が間違った場合はその理由をレポートにて報告すること.

#include <stdio.h>

#define M 3

int main ( void )
{
    int a[ M ][ M ];
    int sum;

    a[0][0] =  2; a[0][1] =  0; a[0][2] = -1;
    a[1][0] = -1; a[1][1] =  2; a[1][2] =  3;
    a[2][0] =  5; a[2][1] =  4; a[2][2] =  3;

    sum = 0;
    for( int i = 0; i < M; i++ ){
        sum += a[ 1 ][ i ];
    }
    printf("%d \n", sum );

    sum = 0;
    for( int i = 0; i < M; i++ ){
        sum += a[ i ][ 2 ];
    }
    printf("%d \n", sum );

    sum = 0;
    for( int i = 0; i < M; i++ ){
        for( int j = 0; j < M; j++ ){
            sum += a[ i ][ j ];
        }
    }
    printf("%d \n", sum );

    sum = 0;
    for( int i = 0; i < M; i++ ){
        for( int j = 0; j < M; j++ ){
            if( (i+j)%2 == 0 )
                sum += a[ i ][ j ];	
        }
    }
    printf("%d \n", sum );

    return 0;
}
(T7_4)

行列の和を求めるプログラムを作成する.

次の結果が得られることを確認せよ:

      3.5   9.0  -1.0
      5.0  -1.5   5.0
     10.0  12.0   5.0
#include <stdio.h>

#define M 3

void print_array( double a[M][M] ){
    // 配列 a を表示.printf の書式は "% 2.1f" など(% の後ろにスペース).
}

int main ( void )
{
    double a[ M ][ M ], b[ M ][ M ], c[ M ][ M ];

    a[0][0] =  2.5; a[0][1] =  0.0; a[0][2] = -1.0;
    a[1][0] = -1.0; a[1][1] =  1.5; a[1][2] =  0.0;
    a[2][0] =  5.0; a[2][1] =  4.0; a[2][2] =  3.0;

    b[0][0] = -2.0; b[0][1] =  4.5; b[0][2] =  1.0;
    b[1][0] =  4.0; b[1][1] = -3.0; b[1][2] =  2.5;
    b[2][0] = -2.5; b[2][1] =  0.0; b[2][2] = -2.0;

    // ここで行列の和を求める

    print_array( c );

    return 0;
}
(T7_5)

正方行列 A に対して,その転置,トレース,フロベニウスノルムを求める関数を作成して,プログラムを完成せよ.

表示例:

    3  -4   1   7
   -2   1  -6   0
    5   0   4  -3
    1   2   3  -2

   trace = 6, Frobenius norm = 13.564660
#include <stdio.h>
#include <math.h>

#define M 4

void transpose( int a[M][M] ){
    int b[M][M];
    // A の転置を求めて表示する.printf の書式は %2d
    // この関数で配列 a の要素を変更しないこと.
    // 変更すると,main 関数で参照する配列 a も値が変わってしまう.
}

int comp_trace( int a[M][M] ){
    /* トレースの計算 */
}

double comp_fnorm( int a[M][M] ){
    /* フロベニウスノルムの計算 */
}

int main ( void )
{
    /* 配列 a の初期化 */
    transpose( a );
    printf("trace = %d, Frobenius norm = %f \n", , );
    return 0;
}