課題4-1
ポインター変数の関数への引き渡しを用いて、2変数 a, b を変換し書き出すプログラムを作成する。
変換は自分の学籍番号下一桁の数(n)に応じて以下のようにせよ。
a -> 2*(n+1)*b+a と b -> 2*a-b (「*」は掛算,「->」は矢印)
以下の convert関数 を作成し目的のプログラムを完成させよ。
convert関数 を TACT に記入するか,プログラムファイルを提出せよ。
(参考: 講義資料の2ページ目2.1のサンプルプログラム)
#include <stdio.h>
void convert(int *a, int *b)
{
自分で考えて作成
...........
}
int main()
{
int a = 1, b = 2;
convert(&a, &b);
printf("%d %d\n",a,b);
return 0;
}
課題4-2
以下のプログラムのmain関数の中で呼び出されている関数 swap_array(a,i,j) は、配列a の i番目 の要素と j番目 の要素を入れ替える関数である(例の場合は、i=1, j=3であるが、変更しても良い)。swap_array関数 を作成・追加し、プログラムを完成させよ。配列は0番目から始まるとせよ。swap_array関数 を TACT に記入するか、プログラムファイルを提出せよ。
(参照: 講義資料の3ページ目 3.1のサンプルプログラム)
#include <stdio.h>
void swap_array(int *, int, int) /* 例; 引数を加えよ */
{
自分で考えて作成
......
}
int main()
{
int i;
int a[]={0,1,2,3,4,5,6};
swap_array(a,1,3);
for(i = 0; i < sizeof(a)/sizeof(a[0]); i++)
printf("%d\n", a[i]);
return 0;
}
課題4-3
次のプログラムでは main関数 では 配列a を動的に確保している(配列の動的確保については講義資料の3ページの3.2参照)。
この 配列a に対して、自乗平均を求める rms_array関数 と最大値と最小値を求める minmax関数 に計算を行うプログラムを作成する。
関数rms_array(array, n) では,要素の個数が n である float型 の配列arrayの要素の、自乗平均平方根(root mean square; 自乗した平均の平方根)を計算しする。
また、関数minmax(array,n,&min,&max) では、同じく要素の個数が n であるfloat型 の 配列array の要素のなかで最大値と最小値をminとmaxとして返す。
このような、rms_array関数 と minmax関数 を作成・追加し、プログラムを完成させよ。
rms_array関数 と minmax関数 を TACT に記述するか、プログラムファイルを提出せよ。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define BUF_SIZE 256 /* 定数として定義する */
float rms_array(float *a, int n)
{
自分で考えて作成
......
}
void minmax(float *a, int n, float *min, float *max)
{
自分で考えて作成
.......
}
int main()
{
int i,matrix_size;
float *a, min, max;
char buf[BUF_SIZE];
/* ベクトルの大きさを取得 */
printf("Matrix size = ");
fgets(buf, sizeof(buf), stdin);
if (1 != sscanf(buf, "%d", &matrix_size) || matrix_size < 1) {
fprintf(stderr, "Invalid Matrix size!\n");
exit(-1);
}
/* 配列を動的に開く */
if (NULL == (a = (float *)malloc(sizeof(float) * matrix_size))) {
fprintf(stderr, "Cannot allocate memory!\n");
exit(-1);
}
/* 各成分毎に値を入力する */
for(i = 0; i < matrix_size; i++){
printf("please input vector element %d = ",i+1);
fgets(buf,sizeof(buf),stdin);
if (sscanf(buf,"%f\n",&a[i]) != 1) {
fputs("input error\n", stderr);
exit(-1);
}
}
printf("rms = %5.2f\n", rms_array(a,matrix_size)); /*各要素の和を出力*/
minmax(a,matrix_size,&min,&max);
printf("min, max = %5.2f, %5.2f\n", min, max);
free(a); /* 配列のメモリの解放: 非常に重要 */
return 0;
}