プログラミング実習II (2026) 課題
「キックオフ 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追記: 赤字部分を修正しました)
N 未満の負でない整数 n をキーボードから受け取り,orig[ n ],…,orig[N-1], orig[0], ..., orig[n-1] の順に表示せよ.例えば,n = 5 なら 2, 4, 6, 8, 1, 3, 5, 7, 9 が表示される.
void array_shift( int n, int src[], int dst[] ) を作成して用いること,また,この関数内では,for 文を 1 回のみ使用することが望ましい.
N 未満の負でない整数 m (≠ n ) を受け取る.orig[ n ] と orig[ m ] の要素を入れ替えて表示せよ(この配列の表示は,本問内の他の配列とは別個に行うこと).n = 3, m = 6 であれば 1, 3, 5, 4, 9, 2, 7, 6, 8 が表示される.void array_swap( int m, int n, int src[] ) を作成して用いること.なお,この関数が受け取る配列は src[]のみであることに注意し,関数内では新たな配列を定義しないこと.
int a = 5, b = 3;
a = b;
b = a;
さらに,以下のプログラムを追加せよ.
N 未満の負でない整数 l をキーボードから受け取り(l は,小文字のエルで,数字の 1 ではありません),orig[ l ],…,orig[N-1], orig[0], ..., orig[l-1] の順に表示せよ.例えば,l = 5 なら 2, 4, 6, 8, 1, 3, 5, 7, 9 が表示される.
void array_shift( int n, int l, int src[], int dst[] ) を作成して用いること,また,この関数内では,for 文を 1 回のみ使用することが望ましい.
N 未満の負でない整数 m (≠ l ) を受け取る.orig[ l ] と orig[ m ] の要素を入れ替えて表示せよ(この配列の表示は,本問内の他の配列とは別個に行うこと).l = 3, m = 6 であれば 1, 3, 5, 4, 9, 2, 7, 6, 8 が表示される.void array_swap( int l, int m, int src[] ) を作成して用いること.なお,この関数が受け取る配列は src[]のみであることに注意し,関数内では新たな配列を定義しないこと.
int a = 5, b = 3;
a = b;
b = a;
下のプログラムは,6 種類の硬貨(1円, 5円, 10円, 50円, 100円, 500円)についてそれぞれの枚数に対して,金額の合計を表示する.以下に沿うように完成せよ.
num には, 1円, 5円, 10円, 50円, 100円, 500円玉の枚数が格納されている.array_print にて,6種類の硬貨の額面と枚数を表示する.array_sum にて,硬貨の金額の合計を計算して戻り値とする.出力結果の例: 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[] ) /* 合計を求める関数の本体 */
{
/* 合計金額を求めて戻り値とする */
}
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;
}
行列の和を求めるプログラムを作成する.
A および B に対し,C = 3A + 2B を求めるプログラムを[リスト 6.12]を参考にして作成せよ.
なお,行列 A, B, C はプログラム内でそれぞれ2次元配列 a, b, c で表されるものとする.void print_array( double a[M][M] ) を完成する.
行列 C はこの関数を用いて表示せよ.次の結果が得られることを確認せよ:
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;
}
正方行列 A に対して,その転置,トレース,フロベニウスノルムを求める関数を作成して,プログラムを完成せよ.
a の初期化と定義を同時に行え.
3 -2 5 1
-4 1 0 2
1 -6 4 3
7 0 -3 -2
M 次正方行列 A に対して,その転置 B = AT を for 文による2重ループを使用して求める.
A のトレースとは,その対角成分の和である.A のフロベニウスノルムとは,全成分の 2 乗和の平方根である.表示例:
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;
}