東京工芸大学 工学部  電子機械学科/システム電子情報学科 2年 後期 

応用プログラミング 第15回

期末試験
 2013.1.22
藤木 文彦

http://fujiki.tv/t-kougei/ouyouprog/
fujiki.kougei@gmail.com, ffujiki@em.t-kougei.ac.jp  
 ■ 1   ■ 2   ■ 3   ■ 4  ■5   ■ 6         ■  9   
10
  
11
 ■ 12   ■ 13   ■ 14   ■ 15   ■ 00   ■ 00   ■ 00

インデックスに戻る

 今日は試験です。


 試験は、2時間続きで、演習形式で行います。(休み時間はとりません)
 途中退出は可能としますが、一度退出したら、試験終了まで再入室できません。体調不良などで一時退出したい人は、申し出てください。
 試験の予定は、次のとおり。

 試験時間は、9:40〜12:00 まで。
 9時20分〜 PCの立ち上げと動作の確認
 9時30分〜 試験の方法の説明
 9時40分〜 試験開始
 〜12時00分 試験終了(まだ退出しないこと)
   (時間延長の希望者には、事情によりこの後、12時20分までの延長を認める)
 12時00分 提出課題の確認
 12時10分ころ 提出物の確認ができ次第終了退出可能
 12時20分 時間延長者の試験終了、確認
 12時30分 いったん退出した学生の入室可能


 結果の提出法


「実行ファイルの作成法」について、まだうまくできない人のために、その方法を、ページの末尾に掲げます。

 12:00〜12:10 まで確認時間とします
ので、 12:10までは、終わっても教室に残っていてください。
 早く終わって退出したい人は、11:40までに結果をメールで送付後、提出物を教卓に提出して、確認を受けてから退出してください。
 (途中、トイレなどの用で席を立つ場合には、許可を得てください。)


 以下の4問のうち、2問以上ができれば、合格とします。
 2問完璧なら、100点。不十分でも一応動作すれば、それに応じた得点とします。
 3問以上行えば、その分を累積加算します。


 試験課題

 以下の4課題のうち、2課題以上を行いなさい。

 できたプログラムについて、それぞれ、次の3つを提出することとします。

1)実行画面をプリントして提出する。(提出は、できたところで、教卓に持ってきて良い。最後にまとめて提出でなくてもよい。ただし、立ち歩いている間に、他の人と話をしてはならない。)

2) 動くようなプログラムとなったら、そのプログラムを、以下の名前に変更して、メールに添付して送りなさい。 (メールは、1題ずつ送り、最後に、何番の問題を提出したかを、配布の用紙に記入して提出すること。)

 実行ファイル名の変更
    Project1501.exe −> e0000000-Project1501.ex    e0000000 には、自分の番号を入れる。


2) csファイルをメールに添付する。

 メールのタイトルは、

  Project1501 などとし、各問ごとに提出します。

あて先は

 fujiki.kougei@gmail.com

本文は、

 学籍番号
 氏名

 これに、csファイルと、実行ファイル e0000000-Project1501.ex 等 を添付して送ります。   

 メールを提出したら、配布した、神のメール提出確認票にチェックを入れて、手元に置いておくこと。これは、最後に提出すること。

 提出するもの

1) 各問ごとにメールを送付。
    本文に氏名、学籍番号を記入
    添付ファイルとして、

     ・名前を変えた実行ファイル    e0000000-Project1500.ex
     ・csファイル             Exam1.cs など
                (csファイルの名前は、うまくつけられなければ、無理に変更せずにメールに添付して送ってよい。)

    の2点。

2) 提出用紙に、
    メールで送った問題番号に ○ 印をつけて、提出
    授業アンケートを同時に提出のこと


 課題1.


 プロジェクト名: Project1501
 csファイル名:  Exam1.cs

 住所氏名と生年月日などを入力し、趣味を選ぶと、それを表示するようなプログラムを作ってください。

 完成して実行したイメージは次のようになるようにします。
(細かな配置などは多少変わっても構いません。)

 一番上に、学籍番号と氏名を表示する部分が付け加わっていますので、注意。



 1)住所は、
   東京都、神奈川県、千葉県、その他から、ラジオボタンで選択して選ぶようにします。
 2)男女は、ラジオボタンで選べるようにします。

 課題2.


 プロジェクト名: Project1502
 csファイル名:  Exam2

 次のようなデータの書かれたファイルを用意します。ファイル名は、
"input101.dat"
とします。

3
7
10
33
5
91
76
38
95
101

 このファイルを読み込んで、それを n 倍して表示し、ファイル

"output101.dat"

 に書きだすプログラムを作成しなさい。
 ただし、何倍するかの n は、プログラムの画面から入力できるようにし、その
数値は、口頭で指示します。

(下記の例でのファイルのある場所は、みなさんの場合には、 Z: ドライブになっているはずなので注意。)




 課題3.


 プロジェクト名: Project1503
 csファイル名:  Exam3


 次のように、数値 n を入力すると、n角形を表示するプログラムを作成しなさい。表示位置はおおよそ画面の中央としますが、頂点の位置がどの向きを向いていても構いません。(多少線がつながっていないところやダブっているところがあっても計算法があっていればよいとします。)
 提示画面のあとに、正6角形を描くプログラムの例と、数値を入力する部分のプログラムを掲げますので、参考にしてください。





 参考画面とプログラム

正6角形を描く場合。




 何度も繰り返しますが、忘れやすいことですけれど、
「ボタンを配置し」 「以下の部分を入力」 しただけでは動作しません。
 ボタンを押して、その時に開いた編集画面でカーソルの置かれた位置にプログラムを入力しないとだめです。
 これは、「システムが、ボタンとプログラムの関連付けをする記述を作成するのに、ボタンを押してから編集することが必要だからです。

 
private void button1_Click(object sender, EventArgs e)
{
double pi = 3.1416;
double xrad,xrad2;
int x0, y0, x1, y1;

Graphics g = this.pictureBox1.CreateGraphics();
int width = this.pictureBox1.Width - 1;
int height = this.pictureBox1.Height - 1;
g.DrawRectangle(Pens.Black, 0, 0, width, height);
Pen greenPen = new Pen(Color.Green, 2);

int n=6;
int xc=width/2;
int yc=height/2;
int step=360/n;
for (int i = 0; i < n; i++)
{
xrad = i * step * pi / 180;
xrad2 = (i + 1) * step * pi / 180;
x0 = xc + (int)(Math.Cos(xrad) * 100);
y0 = yc + (int)(Math.Sin(xrad) * 100);
x1 = xc + (int)(Math.Cos(xrad2) * 100);
y1 = yc + (int)(Math.Sin(xrad2) * 100);
g.DrawLine(greenPen, x0, y0, x1, y1);
}
}

■キーボード入力の部分

 
int n = int.Parse(textBox1.Text);

■画面クリアの部分

 デザイン画面のボタンを押して表示されるプログラムの部分に入力することに注意!

  private void button2_Click(object sender, EventArgs e)
{
Graphics g = this.pictureBox1.CreateGraphics();
Color backColor = this.pictureBox1.BackColor;
g.Clear(backColor);
}

 課題4.


 プロジェクト名: Project1504
 csファイル名:  Exam4


 前回作成したシューティングゲームと同じものをもう一度作成してください。
 ただし、弾の発射を
   スペースキー
 ではなく、
    m キー

 に変更してください。


 下記のプログラムは、完成版ですが、実際には、そのままコピペしても動きません。何度も書いていますが、画面レイアウトをして、ボタンなどをおして表示される部分に入れるのですね。
 タイマーの部分は、デザイン画面下の「タイマー」マークをおして表示される部分に入れます。
 12月末の授業の時にやったように、全体のウインドウを表示したところで、「イベントマーク(雷マーク)」を押して、設定することがあることを忘れないでください。(詳細は、第12回のテキストの中に書かれています。)

 タイマー表示、スコア表示などが付け加わっていますが、余裕があったら入れればいいです。不完全にしか動かなくても、少しでも動くのなら、それを結果として出してもらって構いません。

 なお、このゲームは、リスタート機能が無いので、一度終わると、再起動しなければなりませんが、それは、当面そのままで良しとします。

 その他、ゲームにオリジナルの改良点を加えてみてください。
 試験の際には、もともとの動作に、オリジナルの工夫が加わっていれば、その分、点数を加えます。(何も変更を加えなくても、ちゃんと動作すれば、点数は与えられます。)



完成版プログラム
(コピーして使っても構いませんが、適宜、「キーを押してできた部分にコピーして挿入しなおす」ようにしなければ動作しません。

namespace Exam4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
pictureBox1.Width = 300;
pictureBox1.Height = 300;


int yoko = new int();
int tate = new int();
yoko = pictureBox1.Width;
tate = pictureBox1.Height;
jiki.X = yoko / 2;
jiki.Y = tate - tate0;



}

Point jiki = new Point();
Point[] tama = new Point[10];
const int tate0 = 50;
const int yoko0 = 50;
Font font1 = new Font("MS UI Gothic", 30);
Brush brush1 = new SolidBrush(Color.Black);

Point[] teki = new Point[5];
Random rnd1 = new Random();
int kankakunum = 5, kankaku = 0;
int score = 0;
int scorep = 10;


TimeSpan startTime = new TimeSpan(0, 0, 0);
TimeSpan addSecond = new TimeSpan(0, 0, 1);

private void button2_Click(object sender, EventArgs e)
{
Application.Exit();
}

private void button1_Click(object sender, EventArgs e)
{
int yoko = new int();
int tate = new int();
yoko = pictureBox1.Width;
tate = pictureBox1.Height;
jiki.X = yoko / 2;
jiki.Y = tate - tate0;
textBox1.Text = jiki.X.ToString();
textBox2.Text = jiki.Y.ToString();
Timer timer1 = new Timer();
timer1.Interval = 1000;
timer1.Start();
timer1.Tick += new EventHandler(timer1_Tick);

Graphics g = pictureBox1.CreateGraphics();
Pen myPen = new Pen(Color.FromArgb(200, 50, 0), 3);
Pen erasePen = new Pen(pictureBox1.BackColor, 3);
Brush eraseBrush = new SolidBrush(pictureBox1.BackColor);

g.DrawString("凸", font1, brush1, jiki.X, jiki.Y);

}

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
Graphics g = pictureBox1.CreateGraphics();
Pen myPen = new Pen(Color.FromArgb(200, 50, 0), 3);
Pen erasePen = new Pen(pictureBox1.BackColor, 3);
Brush eraseBrush = new SolidBrush(pictureBox1.BackColor);
g.DrawString("凸", font1, eraseBrush, jiki.X, jiki.Y);

Char c = e.KeyChar;
String s = String.Format("Char={0}", e.KeyChar);
textBox3.Text = s;
if (c == 'z')
{
jiki.X -= 20;
if (jiki.X <= 0) jiki.X += 20;
}
else if (c == 'x')
{
jiki.X += 20;
if (jiki.X >= pictureBox1.Width - 50) jiki.X -= 20;
}
else if (c == 'm')
{
for (int i = 0; i < 10; i++)
{
if (tama[i].Y == 0)
{
tama[i].X = jiki.X;
tama[i].Y = jiki.Y - 20;
break;
}
}
}

textBox1.Text = jiki.X.ToString();
textBox2.Text = jiki.Y.ToString();

g.DrawString("凸", font1, brush1, jiki.X, jiki.Y);
for (int i = 0; i < 10; i++)
{
if (tama[i].Y != 0)
{
g.DrawString("↑", font1, brush1, tama[i].X, tama[i].Y);
}
}
}

private void textBox3_TextChanged(object sender, EventArgs e)
{

}

private void timer1_Tick(object sender, EventArgs e)
{
Graphics g = pictureBox1.CreateGraphics();

Brush eraseBrush = new SolidBrush(pictureBox1.BackColor);
startTime = startTime + addSecond;
textBox4.Text = startTime.ToString();

for (int i = 0; i < 10; i++)
{
if (tama[i].Y != 0)
{
g.DrawString("↑", font1, eraseBrush, tama[i].X, tama[i].Y);

tama[i].Y -= 20;
if (tama[i].Y <= 0) tama[i].Y = 0;
}
if (tama[i].Y != 0)
{
g.DrawString("↑", font1, brush1, tama[i].X, tama[i].Y);
for (int j = 0; j < 5; j++)
{
int dx = tama[i].X - teki[j].X;
int dy = tama[i].Y - teki[j].Y;
if (dx > -20 && dx < 20 && dy > -20 && dy < 20)
{
g.DrawString("↑", font1, eraseBrush, tama[i].X, tama[i].Y);
g.DrawString("▼", font1, eraseBrush, teki[j].X, teki[j].Y);
tama[i].Y = 0; teki[j].Y = 0;
score += scorep;
textBox5.Text = score.ToString();
}

}
}
}
for (int j = 0; j < 5; j++)
{
if (teki[j].Y == 0 && kankaku == 0)
{
teki[j].X = rnd1.Next(pictureBox1.Width - 100) + 50;
teki[j].Y = 20;

break;
}
}
kankaku++;
if (kankaku == kankakunum) kankaku = 0;
for (int j = 0; j < 5; j++)
{
if (teki[j].Y != 0)
{
g.DrawString("▼", font1, eraseBrush, teki[j].X, teki[j].Y);
teki[j].Y += 20;
if (teki[j].Y > pictureBox1.Height - 50)
{
g.DrawString("GAME OVER", font1, brush1, 50, 50);
timer1.Stop();
break;
}
}
if (teki[j].Y != 0)
{
g.DrawString("▼", font1, brush1, teki[j].X, teki[j].Y);
}
}


}

private void textBox4_TextChanged(object sender, EventArgs e)
{

}

private void textBox5_TextChanged(object sender, EventArgs e)
{

}
}
}










 プログラムを独立実行ファイル(exeファイル)
  にする方法

 一応の動作が確認できたプログラムは、VisualStudio が無くても、独立して実行できるファイルにすることができます。

 次のようにします。

 メニューの「ビルド」 を選択
「Project000 のビルド」 を選択

 これで、実行ファイル ”Project000.exe" ができているのですが、置かれている場所が、面倒な場所です。
 エクスプローラで、次の場所を表示してください。
 MyVolume(Z:)
Documents
VisualStudio2008
Projects
Project000    <−作業中のプロジェクト名
Project000       <− もう1段階同じ名前のフォルダがあるので、その下へ下がります。
Obj
Release

 ここに、

"Project000.exe"

という名前のファイルがあるはずです。

 これをダブルクリックすると実行されるはずです。

 このファイルを他にコピーすることで、VisualStudio が無くても、独立して動くプログラムとして使用できます。


 提出用ファイルへの変換




 できたファイルを提出用ファイルにするために、ちょっと工夫します。
 大学内のメールでは、添付ファイルに、危険なものが添付されないように、拡張子 exe を持つものは、送れません。

 そこで、拡張子を、他のものに変更して送ってもらいます。
 そのために、まず、ファイルをコピーして、名前を変更します。

 "Project000.exe" ファイルの上にカーソルを合わせ、右クリックで、「コピー」し、そのまま、すぐ近くの場所で、「貼り付け」を選ぶと、同じファイルのコピーが作成されます。
 ファイル名は、
 "Project000-コピー.exe"

のようになっているはずです。(コピーを取らずに名前を変更してもよいがその後の動作に不都合が起こるかもしれない)

 このファイルの名前を次のように変更します。

 "e0000000-Project1500.ex"  

のような名前に変更します。

このファイルはそのままでは実行できませんが、メールに添付して送ることができます。



inserted by FC2 system