【練習問題 1-1】
ヒント・解答方針
label1 の値を 10 増やすためには、次のように記述します。
label1.Text = Convert.ToString(Convert.ToInt32(label1.Text) + 10);

フォームのデザイン例

button1

button2label1

プログラムコード
private void button1_Click(object sender, EventArgs e){label1.Text = Convert.ToString(Convert.ToInt32(label1.Text) + 1);}
private void button2_Click(object sender, EventArgs e){label1.Text = Convert.ToString(Convert.ToInt32(label1.Text) + 10);}1

【練習問題 1-2】
ヒント・解答方針
左のボタンには左のラベルの値を１増やすプログラムを記述します。また、右のボタンには右のラベルの値を１増やすプログラムを記述します。
フォームのデザイン例

button2button1label2label1

プログラムコード
private void button1_Click(object sender, EventArgs e){label1.Text = Convert.ToString(Convert.ToInt32(label1.Text) + 1);}
private void button2_Click(object sender, EventArgs e){label2.Text = Convert.ToString(Convert.ToInt32(label2.Text) + 1);}2

【練習問題 1-3】
ヒント・解答方針
左上のボタンには左のラベルの値を１増やすプログラムを、右上のボタンには右のラベルの値を１増やすプログラムを記述します。また、左下のボタンには左のラベルの値を１減らすプログラムを、右下のボタンには右のラベルの値を 1 減らすプログラムを記述します。
フォームのデザイン例

button2button1label2label1

button4

button3

プログラムコード
private void button1_Click(object sender, EventArgs e){label1.Text = Convert.ToString(Convert.ToInt32(label1.Text) + 1);}
private void button2_Click(object sender, EventArgs e){label2.Text = Convert.ToString(Convert.ToInt32(label2.Text) + 1);}
private void button3_Click(object sender, EventArgs e){label1.Text = Convert.ToString(Convert.ToInt32(label1.Text) - 1);}
private void button4_Click(object sender, EventArgs e){label2.Text = Convert.ToString(Convert.ToInt32(label2.Text) - 1);}3

【練習問題 2-1】
ヒント・解答方針
2 個のテキストボックスの値を、Convert.ToDouble を用いて倍精度浮動小数点型に変換し、それぞれ倍精度浮動小数点型の変数に代入します。三角形の面積は、「底辺×高さ÷2」で求めることができます。C#では、乗算演算子は「*」、除算演算子は「/」です。
フォームのデザイン例

textBox1
textBox2button1
textBox3

プログラムコード
private void button1_Click(object sender, EventArgs e){
double a = Convert.ToDouble(textBox1.Text);
double h = Convert.ToDouble(textBox2.Text);
double s = a * h / 2;
textBox3.Text = Convert.ToString(s);}4【練習問題 2-2】
ヒント・解答方針
3 個のテキストボックスの値を、Convert.ToDouble を用いて倍精度浮動小数点型に変換し、それぞれ倍精度浮動小数点型の変数に代入します。台形の面積は、「（上底＋下底）×高さ÷2」で求めることができます。
フォームのデザイン例

textBox1
textBox2
textBox3button1
textBox4

プログラムコード
private void button1_Click(object sender, EventArgs e){
double a = Convert.ToDouble(textBox1.Text);
double b = Convert.ToDouble(textBox2.Text);
double h = Convert.ToDouble(textBox3.Text);
double s = (a + b) * h / 2;
textBox4.Text = Convert.ToString(s);}5【練習問題 2-3】
ヒント・解答方針
テキストボックスに入力した半径の値を、Convert.ToDouble を用いて倍精度浮動小数点型に変換し、倍精度浮動小数点型の変数に代入します。表面積と体積を求める計算にべき乗が必要です。べき乗は Math.Pow 関数を用いてもよいのですが、2 乗は 2 回、3 乗は 3 回、同じ数を掛け合わせることでも計算できます。
フォームのデザイン例

textBox1button1
textBox2
textBox3

プログラムコード
private void button1_Click(object sender, EventArgs e){
double r = Convert.ToDouble(textBox1.Text);
double s = 4 * Math.PI * r * r;
double v = 4 * Math.PI * r * r * r / 3;
textBox2.Text = Convert.ToString(s);textBox3.Text = Convert.ToString(v);}6

【練習問題 3-1】
ヒント・解答方針
if 文を用います。入力した数を 2 で割ったときの余りが、0 ならば偶数、違えば奇数です。なお、割り算の余りを求める演算子は「%」です。
フォームのデザイン例

textBox1button1
textBox2

プログラムコード
private void button1_Click(object sender, EventArgs e){
int a = Convert.ToInt32(textBox1.Text);
int b = a % 2;
if (b == 0)
textBox2.Text = "偶数";else
textBox2.Text = "奇数";}7

【練習問題 3-2】
ヒント・解答方針
if 文による 2 条件分岐（3.3 節）の練習問題です。入力した身長から 100 を引き、これに 0.9 を乗じて理想体重を計算します。実際の体重が理想体重に 1.1 を乗じたものより重ければ、「太りすぎです」と表示します。実際の体重が理想体重に 0.9 を乗じたものより軽ければ、「痩せすぎです」と表示します。また、いずれの条件も成立しないとき、「ちょうどよい体重です」と表示します。
フォームのデザイン例

textBox1
textBox2button1
textBox3

プログラムコード
private void button1_Click(object sender, EventArgs e){
double a = Convert.ToDouble(textBox1.Text);
double b = Convert.ToDouble(textBox2.Text);
double c = (a - 100) * 0.9;
if (b > c * 1.1)
textBox3.Text = "太りすぎです";
else if (b < c * 0.9)
textBox3.Text = "やせすぎです";
else
textBox3.Text = "ちょうどよい体重です";}8【練習問題 3-3】
ヒント・解答方針
𝑎𝑥 2 + 𝑏𝑥 + 𝑐 = 0（𝑎 ≠ 0）の解は𝑥 =−𝑏±√𝑏 2 −4𝑎𝑐2𝑎ですが、判別式𝐷 = 𝑏 2 − 4𝑎𝑐の値に応じて分けて考えなければなりません。𝐷 = 0の場合、解は 1 個です。また、𝐷 > 0の場合は、実数解なので、そのままの計算により求められます。𝐷 < 0の場合は、ルート記号の中の符号が負で、複素解になるた−𝑏

め、注意が必要です。実部は 2𝑎 、虚部は虚数単位記号（𝑖）を用いて±√4𝑎𝑐−𝑏 22𝑎𝑖となります。

フォームのデザイン例
textBox2

textBox3

textBox1button1
textBox4
textBox5

プログラムコード
private void button1_Click(object sender, EventArgs e){
double a = Convert.ToDouble(textBox1.Text);
double b = Convert.ToDouble(textBox2.Text);
double c = Convert.ToDouble(textBox3.Text);
double d = b * b - 4 * a * c;double xa, xb;
if (d == 0){xa = -b / (2 * a);textBox4.Text = Convert.ToString(xa);textBox5.Text = "解は上の一個だけです";}
else if (d > 0){xa = (-b + Math.Sqrt(d)) / (2 * a);xb = (-b - Math.Sqrt(d)) / (2 * a);textBox4.Text = Convert.ToString(xa);textBox5.Text = Convert.ToString(xb);}else{xa = -b / (2 * a);xb = Math.Sqrt(-d) / (2 * Math.Abs(a));
textBox4.Text = xa + " + " + xb + " i";textBox5.Text = xa + " - " + xb + " i";}}9【練習問題 4-1】
ヒント・解答方針
for 文による繰り返しの練習問題です。使用する変数ですが、今回は計算結果が大きな値になるため、64 ビット整数型（long 型）を使うことをお勧めします。例題 4.1 に類似しています。例題 4.1 では、1 から入力した数までを足し合わせていますが、この練習問題では、1 から入力した数までを掛け合わせます。なお、計算結果を記憶しておく変数の初期値が 0 だと何を掛け合わせても結果が 0 になってしまうので、変数の初期値は 1 にする必要があります。
フォームのデザイン例

textBox1button1
textBox2

プログラムコード
private void button1_Click(object sender, EventArgs e){long n = Convert.ToInt64(textBox1.Text);
long s = 1;
for (int i = 1; i <= n; i++){s = s * i;}textBox2.Text = Convert.ToString(s);}10【練習問題 4-2】
ヒント・解答方針
while 文による繰り返しの練習問題です。𝑛の初期値を 0 として、
𝑛 × (𝑛 + 1) × (𝑛 + 2)の値が Limit
より小さい間、𝑛の値を１増加させながら繰り返します。ループを抜けたのち、𝑛、𝑛 + 1、𝑛 + 2、𝑛 ×(𝑛 + 1) × (𝑛 + 2)を表示します。
フォームのデザイン例

textBox1button1
textBox2
textBox3
textBox4
textBox5

プログラムコード
private void button1_Click(object sender, EventArgs e){
int limit = Convert.ToInt32(textBox1.Text);
int n = 0;
while (n * (n + 1) * (n + 2) < limit){n = n + 1;}
textBox2.Text = Convert.ToString(n);textBox3.Text = Convert.ToString(n + 1);
textBox4.Text = Convert.ToString(n + 2);
textBox5.Text = Convert.ToString(n * (n + 1) * (n + 2));}11

【練習問題 4-3】
ヒント・解答方針
2 重ループの練習問題です。外側のループで「変数 1」の値を𝑛から𝑚まで 1 増加させながら繰り返
し、内側のループで「変数 2」の値を 1 から 9 まで 1 増加させながら繰り返します。そして、「変数1」と「変数 2」を掛けた値を足し合わせていきます。
フォームのデザイン例

textBox1
textBox2button1
textBox3

プログラムコード
private void button1_Click(object sender, EventArgs e){
int n = Convert.ToInt32(textBox1.Text);
int m = Convert.ToInt32(textBox2.Text);
int s = 0;
for (int i = n; i <= m; i++)for (int j = 1; j <= 9; j++)s = s + i * j;textBox3.Text = Convert.ToString(s);}12【練習問題 5-1】
ヒント・解答方針
整数型の配列を宣言し、Multiline 指定のテキストボックスからデータを配列に読み込みます。この部分のプログラムは、例題 5.4 を参考にしてください。次に、配列に記憶されているデータの最小値を探し出します。この部分のプログラムは、例題 5.2 を参考にしてください。
フォームのデザイン例

textBox2
textBox1button1

プログラムコード
private void button1_Click(object sender, EventArgs e){
int n = textBox1.Lines.Length;
int[] a = new int[n];for (int i = 0; i <= n - 1; i++)a[i] = Convert.ToInt32(textBox1.Lines[i]);int min = a[0];for (int i = 1; i <= n - 1; i++)if (min > a[i])min = a[i];textBox2.Text = Convert.ToString(min);}13

【練習問題 5-2】
ヒント・解答方針
例題 5.4 のプログラムは、小さい順（昇順）に並び替えるプログラムです。大きい順（降順）に並び替えるプログラムは、小さい順（昇順）に並び替えるプログラムにおける if 文の条件を変更するだけです。
フォームのデザイン例

textBox1

textBox2button1

button214プログラムコード
private void button1_Click(object sender, EventArgs e){
int work;
int n = textBox1.Lines.Length;
int[] a = new int[n];for (int i = 0; i <= n - 1; i++){a[i] = Convert.ToInt32(textBox1.Lines[i]);}for (int i = 0; i <= n - 2; i++){for (int j = i + 1; j <= n - 1; j++){if (a[i] > a[j]){work = a[i];a[i] = a[j];a[j] = work;}}}
textBox2.Text = "";for (int i = 0; i <= n - 1; i++){textBox2.Text += a[i] + "¥r¥n";}}private void button2_Click(object sender, EventArgs e){
int work;
int n = textBox1.Lines.Length;
int[] a = new int[n];for (int i = 0; i <= n - 1; i++){a[i] = Convert.ToInt32(textBox1.Lines[i]);}for (int i = 0; i <= n - 2; i++){for (int j = i + 1; j <= n - 1; j++){if (a[i] < a[j]){work = a[i];a[i] = a[j];a[j] = work;}}}
textBox2.Text = "";for (int i = 0; i <= n - 1; i++){textBox2.Text += a[i] + "¥r¥n";}}

15

【練習問題 5-3】
ヒント・解答方針
例題 5.7 のプログラムにおいて、2 次元配列 data[i,j]に点数が入ります。i 番目の人の国語の点数が data[i,0]、数学の点数が data[i,1]、合計点数が data[i,2]に保存されています。国語の点数の合計は、i を 0 から 5 まで 1 増加させながら data[i,0]を加算していけば求められます。同様に、数学の点数の合計は、i を 0 から 5 まで 1 増加させながら data[i,1]を加算していけば求められ、各科目の合計点の合計は、i を 0 から 5 まで 1 増加させながら data[i,2]を加算していけば求められます。平均点は、これらの点数を人数 6 で割って求められます。
フォームのデザイン例

textBox1

textBox3

textBox2

textBox4

textBox5

textBox6
textBox7button1

16

プログラムコード
private void button1_Click(object sender, EventArgs e){
string[] simei = new string[6];int[,] data = new int[6, 3];double[] heikin = new double[3];string worksimei;
int work;for (int i = 0; i <= 5; i++){simei[i] = textBox1.Lines[i];data[i, 0] = Convert.ToInt32(textBox2.Lines[i]);data[i, 1] = Convert.ToInt32(textBox3.Lines[i]);}for (int i = 0; i <= 5; i++){data[i, 2] = data[i, 0] + data[i, 1];}for (int i = 0; i <= 2; i++){for (int j = 0; j <= 5; j++){heikin[i] = heikin[i] + data[j, i];}heikin[i] = heikin[i] / 6;}
textBox5.Text = Convert.ToString(heikin[0]);textBox6.Text = Convert.ToString(heikin[1]);textBox7.Text = Convert.ToString(heikin[2]);for (int i = 0; i <= 4; i++){for (int j = i + 1; j <= 5; j++){if (data[i, 2] < data[j, 2]){
worksimei = simei[i];simei[i] = simei[j];simei[j] = worksimei;
for (int k = 0; k <= 2; k++){work = data[i, k];data[i, k] = data[j, k];data[j, k] = work;}}}}
textBox1.Text = "";textBox2.Text = "";textBox3.Text = "";textBox4.Text = "";for (int i = 0; i <= 5; i++){textBox1.Text += simei[i] + "¥r¥n";
textBox2.Text += data[i, 0] + "¥r¥n";
textBox3.Text += data[i, 1] + "¥r¥n";
textBox4.Text += data[i, 2] + "¥r¥n";}}

17

【練習問題 6-1】
ヒント・解答方針
練習問題 4-1 のプログラムと同じ機能のプログラムですが、階乗を計算するメソッドを作り、これを利用してプログラムを作ります。階乗計算の結果が大きな値になるため、メソッドの戻り値を 64 ビット整数型（long 型）にすることをお勧めします。
フォームのデザイン例

textBox1button1
textBox2

プログラムコードlong kaijo(int n){long s = 1;
for (int i = 1; i <=n ; i++){s = s * i;}return s;}
private void button1_Click(object sender, EventArgs e){
int n = Convert.ToInt32(textBox1.Text);
long a = kaijo(n);textBox2.Text = Convert.ToString(a);}18

【練習問題 6-2】
ヒント・解答方針
例題 4.1 のプログラムと同じ機能のプログラムですが、成績判定を行うメソッドを作り、これを利用してプログラムを作ります。成績判定のメソッドは、整数型の点数のデータをもらい、文字列型の判定結果を返します。
フォームのデザイン例

textBox1button1
textBox2

プログラムコード
string hantei(int a){string h = "";if (a >= 80)
h = "A";else if (a >= 70)
h = "B";else if (a >= 60)
h = "C";else
h = "D";
return h;}private void button1_Click(object sender, EventArgs e){
int a = Convert.ToInt32(textBox1.Text);
textBox2.Text = hantei(a);}19【練習問題 6-3】
ヒント・解答方針
複利計算を行うメソッドは、整数型の元金のデータ、倍精度浮動小数点型の利率のデータ、整数型の何年後かのデータをもらい、整数型の元利合計を返します。𝑛年後の元利合計は、for 文を用いて、元金に（1＋利率）を𝑛回かけることで求めることができます。このとき、利率を%で入力させているので、100 で割ることを忘れないでください。また、浮動小数点型の値を整数型に変換して代入する場
合、キャスト演算子(int) を用います（72 ページを参照）。
フォームのデザイン例
textBox1
textBox2
textBox3button1
textBox4

プログラムコード
int fukuri(int a, double k, int n){for (int i = 1; i <= n; i++){a = (int)(a * (1 + k / 100));}
return a;}
private void button1_Click(object sender, EventArgs e){
int a = Convert.ToInt32(textBox1.Text);
double k = Convert.ToDouble(textBox2.Text);
int n = Convert.ToInt32(textBox3.Text);
textBox4.Text = Convert.ToString(fukuri(a, k, n));}20

【練習問題 7-1】
ヒント・解答方針
1 行に 1 個の整数データが書かれているので、ReadLine()を用います。ReadLine()によりファイ
ルからデータを 1 行ずつ読みながら、これを整数型に変換して足し合わせていきます。この操作を for
文により 6 回繰り返せば合計が求められ、合計を 6 で割れば平均が求められます。最後にストリーム
リーダーオブジェクトを閉じることを忘れないでください。
フォームのデザイン例

button1
textBox1

プログラムコード
usingSystem.IO;//usingが書かれているところにこの一行を追加してください

private void button1_Click(object sender, EventArgs e){
int s = 0;
StreamReader sa = new StreamReader("data.txt");
for (int i = 0; i <= 5; i++){string a = sa.ReadLine();s = s + Convert.ToInt32(a);}textBox1.Text = Convert.ToString(s / 6);
sa.Close();}21

【練習問題 7-2】
ヒント・解答方針
6 個の要素をもつ整数型配列を宣言します。ReadLine()によりファイルからデータを 1 行ずつ読みながら、整数型に変換して配列に代入します。配列に記憶したデータの中で最大値を見つけるプロ
グラムは、例題 5.2 を参考にしてください。なお、例題 5.2 の場合、データ数が 5 個ですが、今回はデータ数が 6 個なので気を付けてください。
フォームのデザイン例

button1
textBox1

プログラムコード
usingSystem.IO;//usingが書かれているところにこの一行を追加してください

private void button1_Click(object sender, EventArgs e){
int[] a = new int[6];StreamReader sa = new StreamReader("data.txt");
for (int i = 0; i <= 5; i++)a[i] = Convert.ToInt32(sa.ReadLine());
int max = a[0];for (int i = 0; i <= 5; i++)if (a[i] > max)
max = a[i];textBox1.Text = Convert.ToString(max);sa.Close();}22

【練習問題 7-3】
ヒント・解答方針
6 個の要素を持つ文字列型の配列と整数型の配列を宣言します。ReadLine()によりファイルからデータを 1 行ずつ読みながら、Split(',')により分割します。分割したデータの、最初の要素を文字列型の配列に記憶し、次の要素を整数型に変換して整数型の配列に記憶していきます。すべてのデータを配列に読み終えたら、最高得点のデータを探します。その際に、氏名も記憶しておきます。
フォームのデザイン例

button1
textBox1
textBox2

プログラムコード
usingSystem.IO;//usingが書かれているところにこの一行を追加してください

private void button1_Click(object sender, EventArgs e){
string[] namae = new string[6];int[] ten = new int[6];StreamReader sa = new StreamReader("data.txt");
for (int i = 0; i <= 5; i++){string a = sa.ReadLine();string[] b = a.Split(',');
namae[i] = b[0];ten[i] = Convert.ToInt32(b[1]);}string maxname = namae[0];int max = ten[0];for (int i = 1; i <= 5; i++)if (ten[i] > max){
maxname = namae[i];max = ten[i];}textBox1.Text = maxname;textBox2.Text = Convert.ToString(max);sa.Close();}23

【練習問題 8-1】
ヒント・解答方針
メソッドの外で時間計測用の変数を宣言します。タイマーの Interval を 100 にして、100 ミリ秒毎にこの変数の値を 1 増加させます。［Start］が押されると、この変数の値を 0 にした後、タイマーの
Enabled を true にして時間の計測をはじめます。［Stop］が押されると、タイマーの Enabled を
false にして時間の計測を停止し、得点を計算し表示します。
フォームのデザイン例

button1
button2
textBox1

timer1
Enabel を False
Interval を 100

プログラムコード
int i;
private void timer1_Tick(object sender, EventArgs e){
i = i + 1;}
private void button1_Click(object sender, EventArgs e){
i = 0;
timer1.Enabled = true;
textBox1.Text = "";}private void button2_Click(object sender, EventArgs e){
timer1.Enabled = false;
textBox1.Text = Convert.ToString(100 - Math.Abs(i - 100));}24

【練習問題 8-2】
ヒント・解答方針
例題 8.5 を参考にプログラムを作成してください。if 文において、上の行、中の行、下の行、左上から右下への斜め、右上から左下への斜めの 5 パターンのいずれかがそろっていれば、コインが 100増えるようにします。このような複数の条件からなる複雑な条件の作成には、条件演算子（表 3.2）を使用します。
フォームのデザイン例

textBox1

textBox3

textBox2
textBox4

textBox6

textBox5
textBox7

textBox9

textBox8button4

button1

button2button3label1

timer1
Enable を True
Interval を 700

プログラムコード
System.Random r = new System.Random();int f1, f2, f3;
private void button2_Click(object sender, EventArgs e){
if (f1 == 1){
f1 = 0;hantei();}}private void button3_Click(object sender, EventArgs e){
if (f2 == 1){
f2 = 0;hantei();}}25

private void button4_Click(object sender, EventArgs e){
if (f3 == 1){
f3 = 0;hantei();}}private void timer1_Tick(object sender, EventArgs e){
if (f1 == 1){
textBox1.Text = Convert.ToString(r.Next(1, 10));
textBox4.Text = Convert.ToString(r.Next(1, 10));
textBox7.Text = Convert.ToString(r.Next(1, 10));}
if (f2 == 1){
textBox2.Text = Convert.ToString(r.Next(1, 10));
textBox5.Text = Convert.ToString(r.Next(1, 10));
textBox8.Text = Convert.ToString(r.Next(1, 10));}
if (f3 == 1){
textBox3.Text = Convert.ToString(r.Next(1, 10));
textBox6.Text = Convert.ToString(r.Next(1, 10));
textBox9.Text = Convert.ToString(r.Next(1, 10));}}void hantei(){if (f1 == 0 && f2 == 0 && f3 == 0){
if (textBox1.Text == textBox2.Text && textBox1.Text == textBox3.Text|| textBox4.Text == textBox5.Text && textBox4.Text == textBox6.Text|| textBox7.Text == textBox8.Text && textBox7.Text == textBox9.Text|| textBox1.Text == textBox5.Text && textBox1.Text == textBox9.Text|| textBox3.Text == textBox5.Text && textBox3.Text == textBox7.Text){label1.Text = Convert.ToString(Convert.ToInt32(label1.Text) + 100);}}}
private void button1_Click(object sender, EventArgs e){label1.Text = Convert.ToString(Convert.ToInt32(label1.Text) - 1);
f1 = 1;
f2 = 1;
f3 = 1;}26

【練習問題 8-3】
ヒント・解答方針
描画ソフト（Windows に付属のペイントなど）により、穴の絵と、穴からモグラが顔を出している絵の二つを描きます。ピクチャーボックスを 12 個配置し、pictureBox1 から pictureBox6 には穴の絵を、pictureBox7 から pictureBox12 にモグラの絵を Image に設定します。穴の絵の上にモグラの絵を重ねます。pictureBox7 から pictureBox12 のピクチャーボックスをランダムに表示させ、これらをクリックすると得点が増えるようにします。プログラム記述は、例題 8.6 を参考にしてください。
フォームのデザイン例
label1pictureBox1

pictureBox2

pictureBox3

pictureBox7

pictureBox8

pictureBox9

pictureBox4

pictureBox5

pictureBox6

pictureBox10

pictureBox11

pictureBox12

pictureBox1 から pictureBox6 の上に
pictureBox7 から pictureBox12 を重ねる

timer1
Enable を True
Interval を 700

27

プログラムコード
Control[] a;Random r = new Random();
int ten = 0;
public Form1(){
InitializeComponent();
a = new Control[] { pictureBox7, pictureBox8, pictureBox9,
pictureBox10, pictureBox11, pictureBox12 };}//他のモグラの絵のピクチャーボックスをクリックしたときにもこのプログラムコードが//呼び出されるように119ページの要領で設定してください。
private void pictureBox7_Click(object sender, EventArgs e){label1.Text = Convert.ToString(Convert.ToInt32(label1.Text) + 1);}
private void timer1_Tick(object sender, EventArgs e){for (int i = 0; i <= 5; i++)a[i].Visible = false;
int rr = r.Next(0, 6);
a[rr].Visible = true;}28

【練習問題 9-1】
ヒント・解答方針
例題 9.4 を参考にして、タイマーにより 4 個のピクチャーボックスが動くようにします。コントロール配列を用いると、プログラムの記述量を減らすことができます。また、ピクチャーボックスをクリックした際のプログラムコードは同一であるため、1 個のプログラムコードのみ記述して、ほかのピク
チャーボックスがクリックされた際に呼び出すように設定すると、プログラムの記述量を減らすことができます。残り時間については、タイマーをもう一つ追加し、新たに追加したタイマーにより 1 秒
ごとに値を 1 減少させます。残り時間がなくなったら、ピクチャーボックスの Enabled を false にして非表示にします。
フォームのデザイン例

label1label2
pictureBox1
pictureBox3

pictureBox2
pictureBox4

timer1
Enable を True
Interval を 100

timer2
Enable を True
Interval を 1000

29

プログラムコード
Control[] a;Random r = new Random();
int ten = 0, t = 60;
public Form1(){
InitializeComponent();
a = new Control[] { pictureBox1, pictureBox2, pictureBox3, pictureBox4 };}private void timer1_Tick(object sender, EventArgs e){for (int i = 0; i <= 3; i++)if (a[i].Top < this.Height){
a[i].Top = a[i].Top + 10;
a[i].Left = a[i].Left + r.Next(-10, 10);}else{
a[i].Top = -a[i].Height;
a[i].Left = r.Next(0, this.Width - pictureBox1.Width);}}
private void timer2_Tick(object sender, EventArgs e){
if (t > 0){t = t - 1;label2.Text = Convert.ToString(t);}else
for (int i = 0; i <= 3; i++)a[i].Visible = false;}
private void pictureBox1_Click(object sender, EventArgs e){
ten = ten + 1;
label1.Text = Convert.ToString(ten);}30

【練習問題 9-2】
ヒント・解答方針
練習問題 9-1 と同様に、タイマーにより 4 個のピクチャーボックスが動くようにします。また、制限時間の機能も付けます。天使の絵の移動と矢の発射のプログラムについては、例題 9.5 を参考にしてください。
フォームのデザイン例
label1pictureBox3
label2
pictureBox4

pictureBox5

pictureBox1

pictureBox6
pictureBox2

timer1
Enable を True
Interval を 100

timer2
Enable を True
Interval を 100

timer3
Enable を True
Interval を 1000

31

プログラムコード
Control[] a;Random r = new Random();
int t = 60;
public Form1(){
InitializeComponent();
pictureBox2.Left = -pictureBox2.Width;a = new Control[] { pictureBox3, pictureBox4, pictureBox5, pictureBox6 };}private void Form1_KeyDown(object sender, KeyEventArgs e){
if (e.KeyCode == Keys.Left) pictureBox1.Left = pictureBox1.Left - 10;
if (e.KeyCode == Keys.Right) pictureBox1.Left = pictureBox1.Left + 10;
if (e.KeyCode == Keys.Up) pictureBox1.Top = pictureBox1.Top - 10;
if (e.KeyCode == Keys.Down) pictureBox1.Top = pictureBox1.Top + 10;
if (e.KeyCode == Keys.Space){pictureBox2.Left = pictureBox1.Left;
pictureBox2.Top = pictureBox1.Top + pictureBox1.Height / 2;}}
private void timer1_Tick(object sender, EventArgs e){
pictureBox2.Left = pictureBox2.Left - 10;}
private void timer2_Tick(object sender, EventArgs e){for (int i = 0; i <= 3; i++){if (a[i].Top < this.Height){
a[i].Top = a[i].Top + 10;
a[i].Left = a[i].Left + r.Next(-10, 10);}else{
a[i].Top = -a[i].Height;
a[i].Left = r.Next(0, (this.Width - a[i].Width));}}}if (pictureBox2.Left < a[i].Left + a[i].Width&& pictureBox2.Left > a[i].Left&& pictureBox2.Top > a[i].Top&& pictureBox2.Top < a[i].Top + a[i].Height - pictureBox2.Height){
label1.Text = Convert.ToString(Convert.ToInt32(label1.Text) + 1);
a[i].Top = -a[i].Height;
pictureBox2.Left = -300;}

private void timer3_Tick(object sender, EventArgs e){
if (t > 0){t = t - 1;label2.Text = Convert.ToString(t);}else{
for (int i = 0; i <= 3; i++)a[i].Visible = false;}}32

【練習問題 9-3】
ヒント・解答方針
2 個のタイマーを使用します。一つのタイマーでワニを動かし、もう一つのタイマーで残り時間を表示させます。コントロール配列を用いると、プログラムの記述量を減らすことができます。
フォームのデザイン例

pictureBox3
pictureBox1

pictureBox4

pictureBox2

pictureBox5

label1

timer1
Enable を True
Interval を 500

label2

timer2
Enable を True
Interval を 1000

プログラムコード
Control[] wani ;Random r = new Random();
int ten = 0, t = 60;
public Form1(){
InitializeComponent();
wani = new Control[] { pictureBox1, pictureBox2, pictureBox3,
pictureBox4, pictureBox5 };}private void timer1_Tick(object sender, EventArgs e){for (int i = 0; i <= 4; i++){if (wani[i].Top <= this.Height - 150)
wani[i].Top = wani[i].Top + r.Next(1, 20);else{
ten = ten - 10;
label1.Text = Convert.ToString(ten );wani[i].Top = 150;

33

}
}
}
private void timer2_Tick(object sender, EventArgs e){
if (t > 0){t = t - 1;label2.Text = Convert.ToString(t);}else{timer1.Enabled = false;
timer2.Enabled = false;for (int i = 0; i <= 4; i++)wani[i].Visible = false;}}
private void pictureBox1_Click(object sender, EventArgs e){
ten = ten + 1;
label1.Text = Convert.ToString(ten);wani[0].Top = 150;}
private void pictureBox2_Click(object sender, EventArgs e){
ten = ten + 1;
label1.Text = Convert.ToString(ten);wani[1].Top = 150;}
private void pictureBox3_Click(object sender, EventArgs e){
ten = ten + 1;
label1.Text = Convert.ToString(ten);wani[2].Top = 150;}
private void pictureBox4_Click(object sender, EventArgs e){
ten = ten + 1;
label1.Text = Convert.ToString(ten);wani[3].Top = 150;}
private void pictureBox5_Click(object sender, EventArgs e){
ten = ten + 1;
label1.Text = Convert.ToString(ten);wani[4].Top = 150;}

34

【練習問題 10-1】
ヒント・解答方針
例題 10.2 の Keisan というクラスの中には、値を設定するメソッドと合計点を計算するメソッドしかありませんでした。この中に、平均を計算するメソッドを追加します。
フォームのデザイン例

textBox6

textBox1
textBox2

textBox7

textBox3
textBox4
textBox5button135

プログラムコード
namespace 練習問題１０_１{
public partial class Form1 : Form{public Form1(){
InitializeComponent();}
private void button1_Click(object sender, EventArgs e){
int[] a = new int[5];a[0] = Convert.ToInt32(textBox1.Text);
a[1] = Convert.ToInt32(textBox2.Text);
a[2] = Convert.ToInt32(textBox3.Text);
a[3] = Convert.ToInt32(textBox4.Text);
a[4] = Convert.ToInt32(textBox5.Text);
Keisan1 ss = new Keisan1();
ss.Atai(a);textBox6.Text = Convert.ToString(ss.Goukei());
textBox7.Text = Convert.ToString(ss.Heikin());}}
class Keisan1{
int[] a = new int[5];public void Atai(int[] aa){for (int i = 0; i < 5; i++)a[i] = aa[i];}public int Goukei(){
int s = 0;
for (int i = 0; i < 5; i++)s = s + a[i];return s;}
public double Heikin(){
int s = 0;
for (int i = 0; i < 5; i++)s = s + a[i];return (double)s / 5;
}
}
}

36

【練習問題 10-2】
ヒント・解答方針
練習問題 10-1 でメソッドを追加したクラス（Keisan1）を基底クラスとして、派生クラスを作ります。この派生クラスの中に、最大値と最小値を求めるメソッドを記述します。派生クラスを使用する場
合、基底クラスのフィールド定義のところに、アクセス修飾子として protected を付けることを忘れないでください。
フォームのデザイン例

textBox1

textBox6

textBox2

textBox7

textBox3

textBox8

textBox4

textBox9

textBox5button1

プログラムコード
namespace 練習問題１０_２{
public partial class Form1 : Form{public Form1(){
InitializeComponent();}
private void button1_Click(object sender, EventArgs e){
int[] a = new int[5];a[0] = Convert.ToInt32(textBox1.Text);
a[1] = Convert.ToInt32(textBox2.Text);
a[2] = Convert.ToInt32(textBox3.Text);
a[3] = Convert.ToInt32(textBox4.Text);
a[4] = Convert.ToInt32(textBox5.Text);
Keisan2 ss = new Keisan2();
ss.Atai(a);textBox6.Text = Convert.ToString(ss.Goukei());
textBox7.Text = Convert.ToString(ss.Heikin());
textBox8.Text = Convert.ToString(ss.Max());
textBox9.Text = Convert.ToString(ss.Min());}}
class Keisan1{
protected int[] a = new int[5];37public void Atai(int[] aa){for (int i = 0; i < 5; i++)a[i] = aa[i];}public int Goukei(){
int s = 0;
for (int i = 0; i < 5; i++)s = s + a[i];return s;}
public double Heikin(){
int s = 0;
for (int i = 0; i < 5; i++)s = s + a[i];return (double)s / 5;}}class Keisan2: Keisan1{
public int Max(){int M = a[0];for (int i = 1; i < 5; i++)if (a[i] > M)
M = a[i];return M;}
public int Min(){int M = a[0];for (int i = 1; i < 5; i++)if (a[i] < M)
M = a[i];return M;
}
}
}

38

【練習問題 10-3】
ヒント・解答方針
複素数のクラスは、実部と虚部を記憶する 2 個の倍精度浮動小数点型変数をメンバー変数としてもちます。クラス内に、値を設定するメソッド、ベクトルの大きさを計算するメソッド、偏角を計算する
メソッドの 3 個のメソッドを作成します。ベクトルの大きさは、三平方の定理により、実部の 2 乗と虚部の 2 乗を足して平方根をとることで求めることができます。また、偏角は、tan−1（アークタンジェント）という関数を用い、tan−1 (虚部÷実部)で求めることができます。C#には、tan−1 の計算用に
Math.Atan という関数があるので、これを用います。
フォームのデザイン例

textBox1
textBox2button1
textBox3
textBox439プログラムコード
namespace 練習問題１０_３{
public partial class Form1 : Form{public Form1(){
InitializeComponent();}
private void button1_Click(object sender, EventArgs e){
double r, i;
r = Convert.ToDouble(textBox1.Text);
i = Convert.ToDouble(textBox2.Text);
Complex comp = new Complex();comp.Fukusosu(r, i);textBox3.Text = Convert.ToString(comp.Mag());
textBox4.Text = Convert.ToString(comp.Arg());}}
class Complex{
double R, I;
public void Fukusosu(double rr, double ii){
R = rr;I = ii;}public double Mag(){
double m = Math.Sqrt(R * R + I * I);return m;}
public double Arg(){
double a = Math.Atan(I / R) * 180 / Math.PI;
return a;}}}40