情報科学概論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;
}