Ex11Ans

From Prog0

Jump to: navigation, search

演習第11回

Contents

解答例

A問題

A-1 関数の基礎

ファイル名: ex11a1.txt

  • 関数を使用することによる利点とは?
    • プログラムが理解しやすくなる。
    • 同じ部品を繰り返して使える。
    • 異なるプログラムにも、部品の再利用が可能。
    • 修正や改良がしやすい。
  • 実引数と仮引数の違いは何か?
    • 実引数は関数を呼び出す側で使われる関数に渡す変数であり、仮引数は関数内で用いられる呼び出し側の変数に対応する変数である。
  • 戻り値とは何か?
    • 関数が処理を終了する際に、呼び出し側に返す値である。
  • ローカル変数とは何か?
    • ローカル変数とは通常使用している変数で、関数の呼び出しにより生成され、関数の実行終了とともに消滅する。
    • 複数の関数内で同じ変数名を使用していても、それぞれ通用範囲が異なる変数になるため、変数名の重複使用による誤動作を防ぐことができ、変数管理が楽になる。

A-2 関数の使い方

#include <stdio.h>

int square(int);
double recipro(int); 

int main()
{
  int m, n;
  double res;

  printf("整数値を入力してください:");
  scanf("%d", &n);

  m = square(n);
  res = recipro(m);

  printf("n = %d, m = %d, res = %f\n", n, m, res);

  return 0;
}

int square(int x)
{
  return x*x;
}

double recipro(int x)
{
  return 1/(double)x;
}

A-3 scanfの戻り値

数値を2つ入力してください:3 5
value = 2, a = 3, b = 5
数値を2つ入力してください:2 4.6
value = 2, a = 2, b = 4
数値を2つ入力してください:3.2 6.7
value = 1, a = 3, b = 32767*
数値を2つ入力してください:5.2 8
value = 1, a = 5, b = 32767*
数値を2つ入力してください:3 a
value = 1, a = 3, b = 32767*
数値を2つ入力してください:a 5
value = 0, a = 1692004406*, b = 32767*
数値を2つ入力してください:<Ctrl+d>
value = -1, a = 1838960694*, b = 32767*

(*の付いた数字は必ずしも一致しない)

B問題

B-1 関数の引数

ファイル名: ex11b1.c

#include <stdio.h>

void teaspoon(int);

int main()
{
  int cups;

  while (1)
  {
    printf("紅茶の杯数を入力してください:");
    scanf("%d", &cups);
    if (cups == 0)
      break;
    teaspoon(cups + 1);
    printf("お湯を注ぐ・・・\n");
    printf("お茶をどうぞ!\n");
  }
  printf("またどうぞ\n");

  return 0;
}

void teaspoon(int n)
{
  int i;
  for (i = 1; i <= n; i++)
  {
    printf("%dさじ", i);
    if (i < n)
      printf("、");
  }
  printf("\n");
}

B-2 関数の戻り値

ファイル名: ex11b2.c

#include <stdio.h>

double round_to(double, int);

int main()
{
  double val, rounded;
  int n;

  printf("正の実数値を入力してください:");
  scanf("%lf", &val);
  printf("小数点以下の桁数を入力してください:");
  scanf("%d", &n);
  rounded = round_to(val, n);
  printf("%f\n", rounded);

  return 0;
}

double round_to(double x, int n)
{
  double mul = 1, result;
  int i;

  for (i = 0; i < n; i++)
    mul *= 10;
  result = (int)(x * mul + 0.5) / mul;
  return result;
}

B-3 時間差

ファイル名: ex11b3.c

#include <stdio.h>

int sectime(int, int, int);

int main()
{
  int h1, m1, s1;
  int h2, m2, s2;
  int dt1, dt2, diff;
  int diff_h, diff_m, diff_s;
  
  printf("時刻1の時・分・秒を整数値で入力してください:");
  scanf("%d%d%d", &h1, &m1, &s1);
  printf("時刻2の時・分・秒を整数値で入力してください:");
  scanf("%d%d%d", &h2, &m2, &s2);

  dt1 = sectime(h1, m1, s1);
  dt2 = sectime(h2, m2, s2);
  diff = dt2 - dt1;
  diff_h = diff / 3600;
  diff_m = (diff % 3600) / 60;
  diff_s = diff % 60;
  printf("時刻1は0時0分0秒から数えて %d 秒\n", dt1);
  printf("時刻2は0時0分0秒から数えて %d 秒\n", dt2);
  printf("時刻1と時刻2の時間差は %d 時間 %d 分 %d 秒です\n", diff_h, diff_m, diff_s);

  return 0;
}

int sectime(int h, int m, int s)
{
  return 3600 * h + 60 * m + s;
}

Extra問題

E-1 円周率 π を求める

ファイル名: ex11e1.c

#include <stdio.h>

double arctan(int);

int main()
{
  double pi; // 最終的な円周率
  int seqmax; // 級数の上限

  printf("級数の計算上限となる数を奇数で入力して下さい: ");
  scanf("%d", &seqmax);

  pi = 4.0 * arctan(seqmax);
  printf("%dまで計算した場合の pi の値: %f\n", seqmax, pi);

  return 0;
}

double arctan(int smax)
{
  double seqsum = 0.0; // 級数かけ算の合計
  int i;

  for(i = 1; i <= smax; i += 2)
  {
    if (i%4 == 1) seqsum += 1.0 / (double)i;
    if (i%4 == 3) seqsum -= 1.0 / (double)i;
  }

  return seqsum;
}
Personal tools