情報科学概論II(実習) 4回目

課題提出はTACTにログインして行うこと。
課題の提出〆切はTACTを確認すること。

講義資料

今日やること


講義資料を参考にして、以下の各課題のプログラムをそれぞれ作成し、実行せよ。 TACTを使用した課題の提出については、各設問の指示に従うこと。
(実際にコンパイル・実行してエラーのないことを確かめておくこと。)

課題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;
}