2021 年度「プログラミング言語 1」定期試験問題（再修正版）

2021 年 8 月 1 日

問題は 4 問ある。それとは別におまけ問題が 2 問ある。
問題 1. 三角形 ABC の辺 BC, CA, AB の中点を、それぞれ、A′ , B ′ , C ′ とする。このとき、三角形 A′ B ′ C ′を三角形 ABC の中点三角形と呼ぶ。もとの三角形の頂点の座標がA = (xA , yA ),B = (xB , yB ),C = (xC , yC )(1)のとき、中点三角形の頂点の座標は(′A =x B + x C yB + yC,22)′,(B =x C + x A yC + yA,22),(′C =x A + x B yA + y B,22)
(2)

である。
三角形の内接円の中心を内心と呼ぶ。三角形 ABC の頂点の座標が (1) のとき、内心 I の座標は(I=axA + bxB + cxC ayA + byB + cyC,a+b+ca+b+c)(3)である。ただし、a, b, c はそれぞれ辺 BC, CA, AB の長さであり、

a=√(xB − xC )2 + (yB − yC )2 , b =√(xC − xA )2 + (yC − yA )2 , c =√(xA − xB )2 + (yA − yB )2と書ける。
三角形の中点三角形の内心を元の三角形のシュピーカー心と呼ぶ。
プログラム 1-1, 1-2 は、与えられた三角形からそのシュピーカー心の計算を C で実装したものである。空欄を埋めよ。

• いずれのプログラムでも、平面上の点を表すのに struct point を、平面上の三角形を表すのに structtriange を使う。それぞれの構造体のメンバの意味はコメントに書かれた通りである。
• プログラム 1-1 とプログラム 1-2 は、関数のインターフェースが異なる。それぞれ、コメントとして書かれた通りである。

• いずれのプログラムでも、関数 medial_triangle は、ある三角形の頂点の座標からその中点三角形の頂点の座標を計算する。(2) を素直に実装したものである。

• いずれのプログラムでも、関数 incenter は、ある三角形の頂点の座標からその内心の座標を計算する。(3) を素直に実装したものである。

• いずれのプログラムでも、関数 spieker_center は、ある三角形の頂点の座標からそのシュピーカー心の座標を計算する。関数 medial_triangle を呼び出した後、関数 incenter を呼び出すことで実装している。

• いずれのプログラムでも、main 関数の動作はコメントの通りである。
問題 2. プログラム 2-1, 2-2 のいずれも、文字列の長さを計算する C の標準関数 strlen と同じ計算をする関数を別名 mystrlen で実装したものである。空欄を埋めよ。
問題 3. プログラム 3-1 は、テキストを入力してそのまま出力することを意図しながら間違えたプログラムである。どこが間違っているか指摘し、その間違いでどのような不具合が生じる可能性があるかを解説し、修正案を提案せよ。

1

2021 年度「プログラミング言語 1」定期試験問題（再修正版）

2021 年 8 月 1 日問題 4. たくさんの数の相乗平均を計算する C の関数が必要になり、今泉慎太郎と西園寺守は、それぞれ、プログラム 4-1, 4-2 のように書いた。数が多い場合は西園寺守版のほうが安全であるが、その理由を説明せよ。
おまけ問題 1 (自信のない人のみ). 三角形 ABC のシュピーカー心*1 を Sp とする。三角形 ABC の頂点の座標が A = (xA , yA ), B = (xB , yB ), C = (xC , yC ) であり、Sp の座標が Sp = (xSp , ySp ) であるとき、xSp とySp を xA , yA , xB , yB , xC , yC で表せ。
おまけ問題 2 (自信のない人のみ). 自分でプログラミング言語を作るとしたらどんな名前をつけたいか。つけたい名前を記し、その名前の由来も説明せよ。

プログラム 1-1: シュピーカー心を計算するプログラム (1)#include <stdio.h>#include <math.h>struct point {doubledouble};x;y;struct triangle {struct point
struct point
struct point};/* x 座標 *//* y 座標 */

A;
B;
C;

/* 頂点 A *//* 頂点 B *//* 頂点 C *//*第一引数：元の三角形
返値：中点三角形
struct triangle
medial_triangle(struct triangle ref){struct triangle med;（あ） = ( （い） + （う） ) / 2;*/（え） = ( （お） + （か） ) / 2;（き） = ( （く） + （け） ) / 2;（こ） = ( （さ） + （し） ) / 2;（す） = ( （せ） + （そ） ) / 2;（た） = ( （ち） + （つ） ) / 2;
return med;}/*
第一引数：元の三角形
返値：内心
struct point
incenter(struct triangle ref){double a = hypot( （て） , （と） );double*/b = hypot( （な） , （に） );double c = hypot( （ぬ） , （ね） );double abc = a + b + c;
struct pointinc;*1 問題 1 参照

2

2021 年度「プログラミング言語 1」定期試験問題（再修正版）

2021 年 8 月 1 日（の） = (a * （は） + b * （ひ） + c * （ふ） ) / abc;
（へ） = (a * （ほ） + b * （ま） + c * （み） ) / abc;
return inc;}/*
第一引数：元の三角形
返値：シュピーカー心
struct point
spieker_center(struct triangle ref){struct triangle med;
struct point
sp;（む） = medial_triangle( （め） );*/（も） = incenter( （や） );return sp;}
intmain(){struct triangle t_in;
struct point
p_out;
scanf("%lf%lf%lf%lf%lf%lf",&t_in.A.x, &t_in.A.y, &t_in.B.x, &t_in.B.y, &t_in.C.x, &t_in.C.y);/* 元の三角形の頂点の座標を入力 */（ゆ） = spieker_center( （よ） );/* 元の三角形の頂点の座標からシュピーカー心の座標を計算 */printf("%f %f_n", p_out.x, p_out.y);/* シュピーカー心の座標を出力 */return 0;}
プログラム 1-2: シュピーカー心を計算するプログラム (2)#include <stdio.h>#include <math.h>struct point {doubledouble};x;y;struct triangle {struct point
struct point
struct point};/* x 座標 *//* y 座標 */

A;
B;
C;

/* 頂点 A *//* 頂点 B *//* 頂点 C *//*第一引数：元の三角形を指すポインタ *//*第二引数：中点三角形を格納するところを指すポインタ */void
medial_triangle(struct triangle *ref, struct triangle *med){（あ） = ( （い） + （う） ) / 2;（え） = ( （お） + （か） ) / 2;

3

2021 年度「プログラミング言語 1」定期試験問題（再修正版）

2021 年 8 月 1 日（き） = ( （く） + （け） ) / 2;（こ） = ( （さ） + （し） ) / 2;（す） = ( （せ） + （そ） ) / 2;（た） = ( （ち） + （つ） ) / 2;}/*
第一引数：元の三角形を指すポインタ *//*第二引数：内心を格納するところを指すポインタ */voidincenter(struct triangle *ref, struct point *inc){double a = hypot( （て） , （と） );doubleb = hypot( （な） , （に） );c = hypot( （ぬ） , （ね） );abc = a + b + c;（の） = (a * （は） + b * （ひ） + c * （ふ） ) / abc;

doubledouble（へ） = (a * （ほ） + b * （ま） + c * （み） ) / abc;}/*
第一引数：元の三角形を指すポインタ *//*第二引数：シュピーカー心を格納するところを指すポインタ
void
spieker_center(struct triangle *ref, struct point *sp){
struct triangle med;
medial_triangle( （む） , （め） );*/incenter( （も） , （や） );}intmain(){struct triangle t_in;
struct point
p_out;
scanf("%lf%lf%lf%lf%lf%lf",&t_in.A.x, &t_in.A.y, &t_in.B.x, &t_in.B.y, &t_in.C.x, &t_in.C.y);/* 元の三角形の頂点の座標を入力 */spieker_center( （ゆ） , （よ） );/* 元の三角形の頂点の座標からシュピーカー心の座標を計算 */printf("%f %f_n", p_out.x, p_out.y);/* シュピーカー心の座標を出力 */return 0;}

42021 年度「プログラミング言語 1」定期試験問題（再修正版）

2021 年 8 月 1 日

プログラム 2-1: 文字列の長さを計算する関数 (1)#include <stdlib.h>size_tmystrlen(const char *str){
size_t i = （あ） ;while (str[i] != ’\0’) {（い） ;}return （う） ;}プログラム 2-2: 文字列の長さを計算する関数 (2)#include <stdlib.h>size_tmystrlen(const char *str){
const char*p = （あ） ;while (*p != ’\0’) {（い） ;}return （う） ;}プログラム 3-1: 入力テキストをそのまま出力しようとして間違えたプログラム#include <stdio.h>
int
main(){charc;while ((c = getchar()) != EOF) {putchar(c);}return 0;}5

2021 年度「プログラミング言語 1」定期試験問題（再修正版）
プログラム 4-1: 相乗平均を計算する関数（今泉慎太郎版）#include <stdlib.h>#include <math.h>doublegmean(const double *a, size_t size){
size_t i;
double prod = 1;
for (i = 0; i < size; i ++) {prod *= a[i];}return pow(prod, 1.0 / size);}
プログラム 4-2: 相乗平均を計算する関数（西園寺守版）#include <stdlib.h>#include <math.h>doublegmean(const double *a, size_t size){
size_t i;
double sum = 0;
for (i = 0; i < size; i ++) {sum += log(a[i]);}return exp(sum / size);}

62021 年 8 月 1 日