Ex11Ans

From Prog0

Jump to: navigation, search

演習第11回

Contents

解答例

A問題

A-1 関数の基礎

ファイル名: ex11a1.txt

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

A-2 関数の使い方(口頭試問)

ファイル名: ex11a2.c

#include <stdio.h>

double weighted_average(int, int);
int evaluate_grade(double);

int main()
{
  int math, english;
  double avg;
  int grade;

  printf("数学と英語の点数(整数)を入力してください: ");
  scanf("%d %d", &math, &english);

  avg = weighted_average(math, english);
  grade = evaluate_grade(avg);

  printf("加重平均: %.1f\n", avg);
  printf("評価: %d\n", grade);

  return 0;
}

double weighted_average(int x, int y)
{
  return (0.6 * x + 0.4 * y);
}

int evaluate_grade(double score)
{
  if (score >= 85)
    return 1;
  else if (score >= 70)
    return 2;
  else
    return 3;
}

A-3 scanfの戻り値

数値を2つ入力してください:6 7
value = 2, a = 6, b = 7
数値を2つ入力してください:3 2.8
value = 2, a = 3, b = 2
数値を2つ入力してください:4.4 6.3
value = 1, a = 4, b = 32759*
数値を2つ入力してください:5.2 2
value = 1, a = 5, b = 32759*
数値を2つ入力してください:1 a
value = 1, a = 1, b = 32759*
数値を2つ入力してください:a 9
value = 0, a = 191704832*, b = 32759*
数値を2つ入力してください:<Ctrl+d>
value = -1, a = 96902912*, b = 32759*

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

B問題

B-1 円錐の体積の計算

ファイル名: ex11b1.c

#include <stdio.h>
#define PI 3.14

double nijou(double);
double circle(double);
double cylinder(double, double);
double cone(double, double);

int main()
{
  double r, h, cv;
  printf("円錐の底面の円の半径と高さをcmで入力してください\n");
  printf("半径 高さ:");
  scanf("%lf%lf",&r, &h);
 
  cv=cone(r,h); 

  printf("円錐の体積は %f cm3\n",cv);
  return 0;
}

double nijou(double r)
{
  double r2;
  r2 = r*r;
  return r2;
}

double circle(double r)
{
  double area;
  area=PI*nijou(r);
  return area;
}

double cylinder(double r, double h)
{
  double volume;	
  volume = circle(r)*h;
  return volume;
}
 
double cone(double r, double h)
{
  double volume2;
  volume2 = cylinder(r,h)/3;
  return volume2; 
}

B-2 数字ピラミッドの作成

ファイル名: ex11b2.c

#include <stdio.h>
void print_pyramid(int);

int main() {
    int n;

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

    if (n < 1 || n > 9) {
        printf("範囲外の数値です。\n");
    } else {
        print_pyramid(n);
    }

    return 0;
}

void print_pyramid(int n) {
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < n - i; j++) {
            printf(" ");
        }

        for (int j = 0; j < i; j++) {
            printf("%d", i);
            if (j < i - 1) {
                printf(" ");
            }
        }

        printf("\n");
    }
}

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