第7回:中間演習問題 解答例  


(1)下記のC言語に関する文章内の (A) から (J) にはいる言葉または記号を順に答えなさい.(配点30点)

・整数型の変数aと,整数型の変数の (A) を格納する (B) 変数paを宣言する

int a;

int *pa;

(B) 変数paに変数aの (A) を代入するには,

(C) = (D);

とする.さらに(B)変数paを使って(B)の指す値を別の整数型の変数bに代入するためには

int b = (E);

とする.

・文字列変数は文字の (F) として表され,文字の終わりを表す (G) を文字の最後につける.

・関数へ値を渡す方法は (H) (I) があり,(H) では呼び出す側へ戻せる値の数は (J) 個であるのに対し,(I) では関数を呼び出す側と呼び出された関数側で同じ (A) を参照するので,複数の値や配列を共有できる.

解答例:

A: アドレス

B: ポインタ

C: pa

D: &a

E: *pa

F: 配列

G: ‘\0’,NULL,NULL文字,(0,0x00なども可)

H: 値参照

I: アドレス参照

J: 1

(2)文字列aに文字の e が含まれているかどうかを調べ,含まれている場合は「文字列はeを□個含みます」と画面に表示したい.(表示する文字列中の□には具体的な数字が入る.)以下のプログラムを完成せよ.(配点20点)

解答例:

#include <stdio.h>

void main()
{
  char a[ ]= "Hello Meiji";
  int i=0;
  int count=0; /* 'e'を数えるための変数 */

  while(a[i] != '\0' ) {
    if(a[i] == 'e') {
      count++;
    }
  i++;
  }

  if ( count != 0 ) {
    printf("文字列はeを%d個含みます\n", count);
  }
}

(3)キーボードから二つの自然数を入力し,それらの最大公約数を求め,画面表示するプログラムを作成せよ.但し最大公約数を求める部分は関数を用いること.(配点25点)

解答例:

#include <stdio.h>

int saidai_kouyakusu(int p, int q)
{
  int i;
  int result;

  /* p,qの小さいほうをiに代入する */ 
  if(p<q) {
    i=p;
  } else {
    i=q;
  }

  /* p,qともに割り切れる値を見つける */
  while( i>=1 ) {
    if(p%i == 0 && q%i ==0) {
      return i;    /* i=1となる最後には必ず呼ばれる */
    }
    i--;
  }

  /* 2以上の数で割り切れなければ最大公約数は1 */
  /* ここは呼ばれないので無くてもよい(無いと警告が出る?)*/
  return 1;
}

void main()
{
  int a,b;
  int result;

  printf("a=");
  scanf("%d", &a);
  printf("b=");
  scanf("%d", &b);

  result = saidai_kouyakusu(a,b);

  printf("%dと%dの最大公約数は,%dです\n", a, b, result);
}

		

(4)キーボードから自然数nを入力し,1!+2!+3!+...+n!を求め,画面に表示するプログラムを作成せよ.但し関数を用いること.ここでn!はnの階乗である.(配点25点)

解答例:

#include<stdio.h>

int kaijo(int n)
{
  int i;
  int result=1;

  for(i=1; i<=n; i++) {
    result *= i;
  }

  return result;
}

void main()
{
  int i;
  int n;
  int sum=0;

  printf("n=");
  scanf("%d", &n);

  for(i=1; i<=n; i++) {
    sum += kaijo(i);
  }

  printf("1!から%d!までの和は%dです", n, sum);
}