Ex11Ans
From Prog0
演習第11回
Contents |
解答例
A問題
A-1 関数の呼び出し
ファイル名: ex11a1.c
#include <stdio.h>
void print_function1(void);
void print_function2(int);
void print_function3(void);
void print_function4(void);
int main()
{
print_function1();
print_function2(2000);
print_function3();
return 0;
}
void print_function1(void)
{
printf("Hey guys!\n");
}
void print_function2(int num)
{
printf("I just hit %d followers!\n", num);
}
void print_function3(void)
{
printf("Thank you so much!\n");
print_function4();
}
void print_function4(void)
{
printf("See you!\n");
}
A-2 関数の基礎
ファイル名: ex11a2.txt
- 関数を使用することによる利点とは?
- プログラムが理解しやすくなる。
- 同じ部品を繰り返して使える。
- 異なるプログラムにも、部品の再利用が可能。
- 修正や改良がしやすい。
- 実引数と仮引数の違いは何か?
- 実引数は関数を呼び出す側で使われる関数に渡す変数であり、仮引数は関数内で用いられる呼び出し側の変数に対応する変数である。
- 戻り値とは何か?
- 関数が処理を終了する際に、呼び出し側に返す値である。
- ローカル変数とは何か?
- ローカル変数とは通常使用している変数で、関数の呼び出しにより生成され、関数の実行終了とともに消滅する。
- 複数の関数内で同じ変数名を使用していても、それぞれ通用範囲が異なる変数になるため、変数名の重複使用による誤動作を防ぐことができ、変数管理が楽になる。
A-3 関数のプロトタイプ宣言と関数定義
ファイル名: ex11a3.c
#include <stdio.h>
#include <math.h>
int yuka(double, double);
double argred(double, double);
int main()
{
double x, y, xdash;
scanf("%lf", &x);
y = 2.0*M_PI;
printf("x = %18.15e: yuka(x, 2pi) = %d\n\n", x, yuka(x, y));
xdash = argred(x, y);
printf("x = %18.15e: sin(x ) = %18.15f\n", x, sin(x));
printf("xdash = %18.15e: sin(xdash) = %18.15f\n", xdash, sin(xdash));
return 0;
}
int yuka(double z, double w)
{
return (int)(z/w);
}
double argred(double x, double period)
{
return x - period*yuka(x, period);
}
B問題
B-1 数字ピラミッドの作成
ファイル名: ex11b1.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-2 温度変換
ファイル名: ex11b2.c
#include <stdio.h>
double c2f(int);
int main() {
int c;
double f;
printf("摂氏(°C)\t華氏(°F)\n");
for (c = 0; c <= 150; c += 5) {
f = c2f(c);
printf("%3d \t%6.2f\n", c, f);
}
return 0;
}
double c2f(int c) {
return 9.0*c/5.0+32.0;
}
B-3 関数の応用
ファイル名: ex11b3.c
#include <stdio.h>
#include <math.h>
double circle1(double);
double cylinder(double, double);
double nijou(double);
int main()
{
double r, h;
printf("円の半径を入力してください:");
scanf("%lf",&r);
printf("円の面積:%f\n", circle1(r));
printf("この円を底面とする円柱の高さを入力してください:");
scanf("%lf",&h);
printf("円柱の体積:%f\n", cylinder(r, h));
return 0;
}
/* nijou()を使って円の面積を計算する */
double circle1(double r)
{
double area;
area = 3.14*nijou(r);
return area;
}
/* 円柱の体積を計算する */
double cylinder(double r, double h)
{
double volume;
volume = circle1(r)*h;
return volume;
}
double nijou(double x)
{
return pow(x, 2.0);
}
Extra問題
E-1 数値積分
ファイル名: ex11e1.c
#include <stdio.h>
#include <math.h>
double func(double);
double simpson(double, double);
double integrate(double, double, int);
int main() {
int i;
double result;
/* 積分区間の分割数を変えて積分 */
for (i = 100; i <= 3000; i += 100) {
result = integrate(0.0, 1.0, i);
/* 答えと"答えx4"を表示します */
printf("%4d分割 答え %10.8f (%10.8f)\n", i, result, 4.0*result);
}
return 0;
}
/* 被積分関数の定義 */
double func(double x) {
return sqrt(1.0-x*x);
}
/* Simpsonの式の計算 */
/* func()を三回呼び出します */
double simpson(double a, double b) {
double h;
h = 0.5*(b-a);
return h*(1.0/3.0*func(a) + 4.0/3.0*func(0.5*(a+b)) + 1.0/3.0*func(b));
}
/* 区間[p, q]をn分割して積分をする */
double integrate(double a, double b, int n) {
int i;
double sum = 0.0, h, x1, x2;
/* 分割した積分区間の幅 */
h = (b-a)/n;
for (i = 0; i < n; i++) {
/* 分割した積分区間[x1, x2]を計算する */
x1 = a + h*i;
x2 = a + h*(i+1);
/* それぞれの区間についてSimpsonの式を適用 */
sum += simpson(x1, x2);
}
return sum;
}
