PG0 - 演習問題

順次

問1-1

2つの変数を掛け算した結果を出力する。
入力

var a = 10
var b = 20
出力

実行結果: 200
解答例

var a = 10
var b = 20

var c = a * b
exit c

問1-2

2つの変数の平均を出力する。
入力

var a = 10
var b = 20
出力

実行結果: 15
解答例

var a = 10
var b = 20

var c = (a + b) / 2
exit c

問1-3

3の階乗を出力する。
ヒント: 3の階乗は1*2*3となる。
出力

実行結果: 6
解答例

var result = 1
result = result * 2
result = result * 3
exit result

問1-4

変数xの一の位を四捨五入して出力する。
変数xの値は正の値のみとする。
ヒント: PG0は小数を扱えないため、10で割ってから10倍すると切り捨てとなる。繰り上げは切り捨てる前に5を足しておく。
入力

var x = 16	// 値を変えて動きを確認してみてください
出力

実行結果: 20

解答例

var x = 16

x = x + 5
x = x / 10
x = x * 10
exit x

解答例(PG0.5)

var x = 16

exit int((x + 5) / 10) * 10

問1-5

変数moneyに日本の消費税(8%)を加えた結果を出力する。
ヒント: PG0は小数を扱えないため100倍して計算する。
入力

var money = 3000	// 値を変えて動きを確認してみてください
出力

実行結果: 3240

解答例

var money = 3000

money = money * 108	// 小数が使えないため100倍の値で計算
money = money / 100	// 1/100に戻す
exit money

解答例(PG0.5)

var money = 3000

exit int(money * 1.08)

問1-6

配列の中身を入れ替えて出力する。
ヒント: 入れ替え用にひとつだけ別の変数を用意する。
入力

var data = {10, 20}
出力

実行結果: {20,10}
解答例

var data = {10, 20}

var tmp = data[0]	// 配列の0番目を一時的な変数に入れる
data[0] = data[1]	// 配列の1番目を配列の0番目に入れる
data[1] = tmp		// 一時的な変数を配列の1番目に入れる
exit data

分岐

分岐(if文)を使う問題となっています。

問2-1

2つの変数のうち大きい方の値を出力する。
入力

var a = 20	// 値を変えて動きを確認してみてください
var b = 50	// 値を変えて動きを確認してみてください
出力

実行結果: 50
解答例

var a = 20
var b = 50

var result
if (a > b) {
	// aの方が大きい
	result = a
} else {
	// bの方が大きい
	result = b
}
exit result

問2-2

変数xの中身が0なら0、正の値なら1、負の値なら-1を出力する。
入力

var x = -3	// 値を変えて動きを確認してみてください
出力

実行結果: -1

解答例

var x = -3

var result
if (x == 0) {
	// 0
	result = 0
}
if (x > 0) {
	// 正の値
	result = 1
}
if (x < 0) {
	// 負の値
	result = -1
}
exit result

解答例(PG0.5)

var x = -3

var result
if (x > 0) {
	// 正の値
	result = 1
} else if (x < 0) {
	// 負の値
	result = -1
} else {
	// 0
	result = 0
}
exit result

問2-3

変数xの一の位を四捨五入して出力する。
入力

var x = -16	// 値を変えて動きを確認してみてください
出力

実行結果: -20

解答例

var x = -16

if (x < 0) {
	x = x - 5
} else {
	x = x + 5
}
x = x / 10
x = x * 10
exit x

解答例(PG0.5)

var x = -16

if (x < 0) {
	x -= 5
} else {
	x += 5
}
exit int(x / 10) * 10

問2-4

変数xの中身が0なら0、奇数なら1、偶数なら2を出力する。
入力

var x = 5	// 値を変えて動きを確認してみてください
出力

実行結果: 1

解答例

var x = 5

var result
if (x == 0) {
	// 0
	result = 0
} else {
	// 0は2で割り切れるため0ではない場合に処理をする
	if (x % 2 != 0) {
		// 2で割り切れない場合は奇数
		result = 1
	}
	if (x % 2 == 0) {
		// 2で割り切れる場合は偶数
		result = 2
	}
}
exit result

解答例(PG0.5)

var x = 5

var result
if (x == 0) {
	// 0
	result = 0
} else if (x % 2 != 0) {
	// 2で割り切れない場合は奇数
	result = 1
} else {
	// 2で割り切れる場合は偶数
	result = 2
}
exit result

問2-5

変数pointの中身が61以上なら3、60~31なら2、30以下なら1を出力する。
ヒント: この問の複合条件では「&&」を使う。
入力

var point = 55	// 値を変えて動きを確認してみてください
出力

実行結果: 2

解答例

var point = 55

var result
if (point >= 61) {
	// 61以上
	result = 3
}
if (point <= 60 && point >= 31) {
	// 60以下でかつ31以上
	result = 2
}
if (point <= 30) {
	// 30以下
	result = 1
}
exit result

解答例(PG0.5)

var point = 55

var result
if (point >= 61) {
	// 61以上
	result = 3
} else if (point <= 60 && point >= 31) {
	// 60以下でかつ31以上
	result = 2
} else {
	// 30以下
	result = 1
}
exit result

問2-6

3つの変数(a,b,c)の中身がすべて同じなら3、2つ同じ場合は2、どれも一致しない場合は0を出力する。
入力

var a = 10	// 値を変えて動きを確認してみてください
var b = 20	// 値を変えて動きを確認してみてください
var c = 10	// 値を変えて動きを確認してみてください
出力

実行結果: 2

解答例

var a = 10
var b = 20
var c = 10

var result
if (a == b && b == c) {
	// 3つとも同じ
	result = 3
} else {
	if (a == b || b == c || a == c) {
		// 2つが同じ
		result = 2
	} else {
		// どれも一致しない
		result = 0
	}
}
exit result

解答例(PG0.5)

var a = 10
var b = 20
var c = 10

var result
if (a == b && b == c) {
	// 3つとも同じ
	result = 3
} else if (a == b || b == c || a == c) {
	// 2つが同じ
	result = 2
} else {
	// どれも一致しない
	result = 0
}
exit result

反復

反復(while文)を使う問題となっています。

問3-1

0から10までの合計を出力する。
出力

実行結果: 55

解答例

var total = 0
var i = 0
while (i <= 10) {		// 0から10までループする
	total = total + i	// ループ用カウンタを合計していく
	i = i + 1		// ループ用カウンタを増やす
}
exit total

解答例(PG0.5)

var total = 0
for (var i = 0; i <= 10; i++) {		// 0から10までループする
	total += i	// ループ用カウンタを合計していく
}
exit total

問3-2

0から10までの偶数の合計を出力する。
出力

実行結果: 30

解答例 1

var total = 0
var i = 0
while (i <= 10) {
	total = total + i
	i = i + 2	// 偶数のみを処理するため2ずつループ用カウンタを増やす
}
exit total

解答例 2

var total = 0
var i = 0
while (i <= 10) {
	if (i % 2 == 0) {
		// 2で割り切れる場合は偶数のため、偶数のみを合計する
		total = total + i
	}
	i = i + 1
}
exit total

解答例(PG0.5)

var total = 0
for (var i = 0; i <= 10; i += 2) {
	total += i
}
exit total

問3-3

9の階乗を出力する。
出力

実行結果: 362880

解答例

var result = 1
var i = 2
while (i <= 9) {
	result = result * i
	i = i + 1
}
exit result

解答例(PG0.5)

var result = 1
for (var i = 2; i <= 9; i++) {
	result *= i
}
exit result

問3-4

2つの変数の最大公約数を出力する。
ヒント: 124を100で割った余りは24、100を24で割った余りは4、24を4で割った余りは0。よって、最大公約数は4である。
入力

var a = 124	// 値を変えて動きを確認してみてください
var b = 100	// 値を変えて動きを確認してみてください
出力

実行結果: 4
解答例

var a = 124
var b = 100

// ユークリッドの互除法
while (b != 0) {
	var r = a % b
	a = b
	b = r
}
exit a

問3-5

配列の中身の合計を出力する。
入力

var data = {2,57,30,100,65}
var cnt = 5
出力

実行結果: 254

解答例

var data = {2,57,30,100,65}
var cnt = 5

var total = 0
var i = 0
while (i < cnt) {	// 配列の要素数分ループする
	total = total + data[i]	// 配列の値を合計
	i = i + 1
}
exit total

解答例(PG0.5)

var data = {2,57,30,100,65}

var total = 0
for (var i = 0; i < length(data); i++) {	// 配列の要素数分ループする
	total += data[i]	// 配列の値を合計
}
exit total

問3-6

配列の中身を逆転して出力する。
ヒント: 前から増えるループカウンタと、後から減っていくループカウンタを用意して、その2つが入れ替わる時がループの終了条件。
入力

var data = {2,57,30,100,65}
var cnt = 5
出力

実行結果: {65,100,30,57,2}
解答例

var data = {2,57,30,100,65}
var cnt = 5

var i = 0
var j = cnt - 1
while (j - i > 0) {
	// 値の入れ替え
	var tmp = data[i]
	data[i] = data[j]
	data[j] = tmp
	i = i + 1
	j = j - 1
}
exit data

問3-7

九九表(Multiplication table)の結果を2次元配列に格納して出力する。
ヒント: 二重にループするが、まずは内側のループから考える。
2次元配列は分解して考える。
以下はaとbとcで書き方は違うが同じ値となる。

a = {{1,2},{3,4}}

b[0] = {1,2}
b[1] = {3,4}

c[0][0] = 1
c[0][1] = 2
c[1][0] = 3
c[1][1] = 4
出力

実行結果: {{1,2,3,4,5,6,7,8,9},{2,4,6,8,10,12,14,16,18},{3,6,9,12,15,18,21,24,27},
{4,8,12,16,20,24,28,32,36},{5,10,15,20,25,30,35,40,45},{6,12,18,24,30,36,42,48,54},
{7,14,21,28,35,42,49,56,63},{8,16,24,32,40,48,56,64,72},{9,18,27,36,45,54,63,72,81}}

解答例

var result[]
var i = 0
while (i < 9) {
	var j = 0
	while (j < 9) {
		result[i][j] = (i + 1) * (j + 1)	// iとjは0から始まっているため1を足す
		j = j + 1
	}
	i = i + 1
}
exit result

解答例(PG0.5)

var result[]
for (var i = 0; i < 9; i++) {
	for (var j = 0; j < 9; j++) {
		result[i][j] = (i + 1) * (j + 1)	// iとjは0から始まっているため1を足す
	}
}
exit result

応用

基本構造(順次、分岐、反復)を組み合わせた問題となっています。

問4-1

配列の中で一番小さい値を出力する。
入力

var data = {3,4,56,25,47,72,2,23,25,9}
var cnt = 10
出力

実行結果: 2

解答例

var data = {3,4,56,25,47,72,2,23,25,9}
var cnt = 10

var min = data[0]
var i = 1
while (i < cnt) {
	if (min > data[i]) {
		// より小さい値をminに入れる
		min = data[i]
	}
	i = i + 1
}
exit min

解答例(PG0.5)

var data = {3,4,56,25,47,72,2,23,25,9}

var min = data[0]
for (var i = 1; i < length(data); i++) {
	if (min > data[i]) {
		// より小さい値をminに入れる
		min = data[i]
	}
}
exit min

問4-2

配列の中から奇数のみの配列を作って出力する。
ヒント: 新しい配列に結果を入れる。
入力

var data = {34,55,89,32,56,103,6,345}
var cnt = 8
出力

実行結果: {55,89,103,345}

解答例

var data = {34,55,89,32,56,103,6,345}
var cnt = 8

var result[]
var i = 0, j = 0
while (i < cnt) {
	if (data[i] % 2 != 0) {
		// 2で割り切れない場合は奇数
		result[j] = data[i]	// 新しい配列に追加
		j = j + 1
	}
	i = i + 1
}
exit result

解答例(PG0.5)

var data = {34,55,89,32,56,103,6,345}

var result[]
var j = 0
for (var i = 0; i < length(data); i++) {
	if (data[i] % 2 != 0) {
		// 2で割り切れない場合は奇数
		result[j++] = data[i]	// 新しい配列に追加
	}
}
exit result

問4-3

変数valueの値が素数なら1を出力し、素数以外なら0を出力する。
入力

var value = 23	// 値を変えて動きを確認してみてください
出力

実行結果: 1
解答例

var value = 23

// 割り切れない間ループする
var i = 2
while (i <= value / 2 && value % i != 0) {
	i = i + 1
}
var result = 0
if (i > value / 2) {
	// ループが割り切れて終わっていない場合は素数
	result = 1
}
exit result

問4-4

年間のカレンダーを2次元配列に格納して出力する。
入力

var year = 2018	// 値を変えて動きを確認してみてください
出力

実行結果: {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31},
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28},
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31},
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30},
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31},
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30},
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31},
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31},
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30},
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31},
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30},
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31}}

解答例

var year = 2018
var Calendar[]
var day[] = {31,28,31,30,31,30,31,31,30,31,30,31} // 各月の日数

// うるう年の判定
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
	day[1] = 29
}

// カレンダーの作成
var i = 0
while (i < 12) {
	var j = 0
	while (j < day[i]) {
		Calendar[i][j] = j + 1
		j = j + 1
	}
	i = i + 1
}
exit Calendar

解答例(PG0.5)

var year = 2018
var Calendar[]
var day[] = {31,28,31,30,31,30,31,31,30,31,30,31} // 各月の日数

// うるう年の判定
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
	day[1] = 29
}

// カレンダーの作成
for (var i = 0; i < 12; i++) {
	for (var j = 0; j < day[i]; j++) {
		Calendar[i][j] = j + 1
	}
}
exit Calendar

問4-5

配列の中身を大きい順に並べ替えて出力する。
入力

var data = {3,4,56,25,47,72,2,23,25,9}
var cnt = 10
出力

実行結果: {72,56,47,25,25,23,9,4,3,2}

解答例 1

var data = {3,4,56,25,47,72,2,23,25,9}
var cnt = 10

// バブルソート
var i = 0
while (i < cnt - 1) {
	var j = cnt - 1
	while (j > i) {
		if (data[j - 1] < data[j]) {
			// 値の入れ替え
			var tmp = data[j]
			data[j] = data[j - 1]
			data[j - 1] = tmp
		}
		j = j - 1
	}
	i = i + 1
}
exit data

解答例 2

var data = {3,4,56,25,47,72,2,23,25,9}
var cnt = 10

// 選択ソート
var i = 0
while (i < cnt) {
	var max = i
	var j = i + 1
	while (j < cnt) {
		if (data[j] > data[max]) {
			// 最大値
			max = j
		}
		j = j + 1
	}
	if (max != i) {
		// 値の入れ替え
		var tmp = data[i]
		data[i] = data[max]
		data[max] = tmp
	}
	i = i + 1
}
exit data

問4-6

配列dataの中身をそれぞれの桁に設定した整数に変換して出力する。
配列dataの各要素は一桁の値とする。
入力

var data = {2,8,3,0,0,5,0}
var cnt = 7
出力

実行結果: 2830050

解答例

var data = {2,8,3,0,0,5,0}
var cnt = 7

var result = 0
var i = 0
while (i < cnt) {
	result = result * 10 + data[i]
	i = i + 1
}
exit result

解答例(PG0.5)

var data = {2,8,3,0,0,5,0}

var result = 0
for (var i = 0; i < length(data); i++) {
	result = result * 10 + data[i]
}
exit result

問4-7

変数dataの値を一桁ずつ配列に設定して出力する。
変数dataの値は正の値のみとする。
入力

var data = 2830050	// 値を変えて動きを確認してみてください
出力

実行結果: {2,8,3,0,0,5,0}

解答例

var data = 2830050

// 桁数の算出
var x = data
var digit = 0
while (x > 0) {
	x = x / 10
	digit = digit + 1
}
// 最下位の桁から配列に設定していく
var result[]
var i = digit - 1
while (i >= 0) {
	result[i] = data - (data / 10 * 10)
	data = data / 10
	i = i - 1
}
exit result

解答例(PG0.5)

var data = 2830050

// 桁数の算出
for (var x = data, digit = 0; x > 0; x = int(x / 10), digit++) {
}
// 最下位の桁から配列に設定していく
var result[]
for (var i = digit - 1; i >= 0; i--) {
	result[i] = data - (int(data / 10) * 10)
	data = int(data / 10)
}
exit result


戻る
Copyright © 1996-2023 by Ohno Tomoaki. All rights reserved.