情報科学概論II(実習) 5回目
課題の提出〆切りは来週の13:00まで.課題提出はNUCTにログインして行うこと.
講義資料
今日やること
講義資料を参考にして、以下の各課題のプログラムをそれぞれ作成し,実行せよ.
NUCTを使用した課題の提出については,各設問の指示に従うこと.
(実際にコンパイル・実行してエラーのないことを確かめておくこと.)
課題5-1
ポインター変数の関数への引き渡しを用いて,2変数a,bをそれぞれa->2*b+aとb->2*a-b
(「*」は掛算,「->」は矢印)に変換し書き出すプログラムを作成する.
以下のconvert関数を作成し目的のプログラムを完成させよ.
convert関数をNUCTに記入するか,プログラムファイルを提出せよ.
(参考: 講義資料の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;
}
課題5-2
以下のプログラムのmain関数の中で呼び出されている関数swap_array(a,i,j)は,配列aのi番目の要素とj番目の要素を入れ替える関数である(例の場合は、i=1, j=3であるが,変更しても良い).swap_array関数を作成・追加し,プログラムを完成させよ.配列は0番目から始まるとせよ.swap_array関数をNUCTに記入するか,プログラムファイルを提出せよ.
(参照: 講義資料の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;
}
課題5-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関数をNUCTに記述するか、プログラムファイルを提出せよ.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define BUF_SIZE 256 /* 定数として定義する */
float rms_array(float *array, int n)
{
自分で考えて作成
......
}
void minmax(float *array, 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;
}