2020 年度「プログラミング言語 1」定期試験問題

2020 年 8 月 31 日

問題は 3 問ある。それとは別におまけ問題が 3 問ある。
問題 1. プログラム 1, 2, 3, 4 は、n = 1, . . . , 99 に対して

∑ni=1 i と∑n

∑jj=1i=1 i と

∑n

∑kk=1

∑jj=1

i=1 i を計算して、簡易な表として出力するプログラムである。空欄を埋めよ。
問題 2. 三角形 ABC の辺 BC, CA, AB の中点を、それぞれ、A′ , B ′ , C ′ とする。このとき、三角形

A′ B ′ C ′ を三角形 ABC の中点三角形と呼ぶ。もとの三角形の頂点の座標が A = (xA , yA ), B = (xB , yB ),C = (xC , yC ) のとき、中点三角形の頂点の座標は()()
xB + xC yB + yC
xC + xA yC + yA′′A =,,B =,,2222′(C =xA + xB yA + yB,22)(1)である。
プログラム 5, 6 は、与えられた三角形からその中点三角形の中点三角形の計算を C の関数として実装したものである。空欄を埋めよ。

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

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

• いずれのプログラムでも、関数 medial_medial_triangle は、ある三角形の頂点の座標からその中点三角形の中点三角形の頂点の座標を計算する。どちらも、中点三角形の計算を二回行う方法を、関数medial_triangle を二回呼び出す形で実装している。
• いずれのプログラムでも、main 関数の動作はコメントの通りである。
問題 3. プログラム 7 は、正方形の一辺の長さが与えられたときに周長と面積を計算することを意図しながら間違えたプログラムである。どこが間違っているか指摘し、その間違いでどのような不具合が生じる可能性があるかを解説し、修正案を提案せよ。
なお、修正にあたって関数 square_perimeter_area() の定義は変更できないものとする。
おまけ問題 1 (自信のない人のみ). 三角形 ABC の中点三角形*1 が三角形 A′ B ′ C ′ であり、三角形 A′ B ′ C ′ の中点三角形が三角形 A′′ B ′′ C ′′ であるとする。三角形 ABC の頂点の座標が A = (xA , yA ),′′′′

B = (xB , yB ),′′C = (xC , yC ) であるとき、三角形 A B C の頂点の座標を三角形 ABC の頂点の座標で表せ。
おまけ問題 2 (自信のない人のみ). 自分でプログラミング言語を作るとしたらどんな名前をつけたいか。つけたい名前を記し、その由来も説明せよ。
おまけ問題 3 (自信のない人のみ). プログラミング言語 C の歴史を解説せよ。

*1 問題 1 参照

1

2020 年度「プログラミング言語 1」定期試験問題

プログラム 1∑ni=1 i と

∑nj=1

∑ji=1 i と∑n
k=12020 年 8 月 31 日

∑k

∑j

j=1

i=1 i を計算する（定義式通りで遅い）#include <stdio.h>#define N_MAX

99

longintsum(long n){longi;
longs;
s = 0;for (i = （あ） ; i <= （い） ; i ++) {s += （う） ;}return s;}
longintsum2(long n){longi;
longs;
s = 0;for (i = （え） ; i <= （お） ; i ++) {s += intsum( （か） );}return s;}
longintsum3(long n){longi;
longs;
s = 0;for (i = （き） ; i <= （く） ; i ++) {s += intsum2( （け） );}return s;}
intmain(){longn;for (n = 0; n <= N_MAX; n ++) {printf("%ld %ld %ld %ld\n", n, intsum(n), intsum2(n), intsum3(n));}
return 0;}2

2020 年度「プログラミング言語 1」定期試験問題プログラム 2∑ni=1 i と∑nj=1

∑ji=1 i と

∑nk=1

2020 年 8 月 31 日

∑k∑ji=1 i を計算する（計算結果を配列に保存して再利用）

j=1#include <stdlib.h>#include <stdio.h>#define N_MAX
long
long
long
long
long

99

oneseq[N_MAX];
intseq[N_MAX];
intsum[N_MAX];
intsum2[N_MAX];
intsum3[N_MAX];/*
各 i について、src[0] + · · · + src[i] を dst[i] に代入する。
*
*/
void
accumulate(size_t n, const long src[], long dst[]){size_t i;longs;
s = 0;for (i = （こ） ; i < （さ） ; i ++) {s += src[i];dst[i] = （し） ;}}intmain(){size_ti;for (i = 0; i < N_MAX; i ++) {oneseq[i] = 1;}
accumulate(N_MAX, oneseq, intseq);
accumulate(N_MAX, intseq, intsum);accumulate(N_MAX, intsum, intsum2);
accumulate(N_MAX, intsum2, intsum3);
for (i = 0; i < N_MAX; i ++) {printf("%ld %ld %ld %ld\n", intseq[i], intsum[i], intsum2[i], intsum3[i]);}return 0;}

3

2020 年度「プログラミング言語 1」定期試験問題

プログラム 3∑ni=1 i と∑n∑ji=1 i と

j=1

∑n2020 年 8 月 31 日

∑kk=1

∑j

j=1

i=1 i を計算する（計算結果をそのまま再利用）#include <stdio.h>#define N_MAX99

int
main(){
longlongn;s, s2, s3;

s = 0;
s2 = 0;s3 = 0;for (n = 1; n <= N_MAX; n ++) {s += （す） ;s2 += （せ） ;s3 += （そ） ;printf("%ld %ld %ld %ld\n", n, s, s2, s3);}
return 0;
}

∑n

∑n

∑j

∑n ∑k ∑j∑n
i=1 i と
k=1
j=1
i=1 i を 計 算 す る（i=1 i = n(n + 1)/2 と∑n ∑j∑n ∑k ∑jj=1
i=1 i = n(n + 1)(n + 2)/6 と
k=1
j=1
i=1 i = n(n + 1)(n + 2)(n + 3)/24 を使って一気プログラム 4i=1 i とj=1に計算）#include <stdio.h>#define N_MAX99

int
main(){
longlongn;s, s2, s3;for (n = 0; n <= N_MAX; n ++) {s = n * (n + 1) / 2;s2 = s * （た） / （ち） ;s3 = s2 * （つ） / （て） ;printf("%ld %ld %ld %ld\n", n, s, s2, s3);}
return 0;}4

2020 年度「プログラミング言語 1」定期試験問題

2020 年 8 月 31 日

プログラム 5 中点三角形の頂点の座標

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 triangle
medial_medial_triangle(struct triangle ref){*/（て）}
int
main(){
struct triangle t_in, t_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);/* 元の三角形の頂点の座標を入力 */（と） = medial_medial_triangle( （な） );/* 元の三角形の頂点の座標からその中点三角形の中点三角形の頂点の座標を計算 */printf("%f %f %f %f %f %f_n",t_out.A.x, t_out.A.y, t_out.B.x, t_out.B.y, t_out.C.x, t_out.C.y);/* 中点三角形の中点三角形の頂点の座標を出力 */return 0;}

5

2020 年度「プログラミング言語 1」定期試験問題

2020 年 8 月 31 日

プログラム 6 中点三角形の頂点の座標

struct point {doubledouble};x;y;struct triangle {struct point
struct point
struct point};/* x 座標 *//* y 座標 */

A;
B;
C;

/* 頂点 A *//* 頂点 B *//* 頂点 C *//*第一引数：元の三角形を指すポインタ *//*第二引数：中点三角形を格納するところを指すポインタ */void
medial_triangle(const struct triangle *ref, struct triangle *med){（に） = ( （ぬ） + （ね） ) / 2;（の） = ( （は） + （ひ） ) / 2;（ふ） = ( （へ） + （ほ） ) / 2;（ま） = ( （み） + （む） ) / 2;（め） = ( （も） + （や） ) / 2;（ゆ） = ( （よ） + （ら） ) / 2;}/*
第一引数：元の三角形を指すポインタ *//*第二引数：中点三角形の中点三角形を格納するところを指すポインタ */void
medial_medial_triangle(const struct triangle *ref, struct triangle *medmed){（り）}
intmain(){struct triangle t_in, t_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);/* 元の三角形の頂点の座標を入力 */medial_medial_triangle( （る） , （れ） );/* 元の三角形の頂点の座標からその中点三角形の中点三角形の頂点の座標を計算 */printf("%f %f %f %f %f %f_n",t_out.A.x, t_out.A.y, t_out.B.x, t_out.B.y, t_out.C.x, t_out.C.y);/* 中点三角形の中点三角形の頂点の座標を出力 */return 0;}

6

2020 年度「プログラミング言語 1」定期試験問題

2020 年 8 月 31 日

プログラム 7 正方形の一辺の長さから周長と面積を計算するつもりで間違ったプログラム#include <stdio.h>voidsquare_perimeter_area(double, double *, double *);void
square_perimeter_area(double a, double *p, double *q){*p = 4 * a;*q = a * a;}intmain(){
double x;
double *y, *z;scanf("%lf", &x);
square_perimeter_area(x, y, z);printf("%12.5f %12.5f\n", *y, *z);return 0;}7