情報基礎A 「Cプログラミング」総合演習

準備

以下に取り組む前に、まず、こちらのページの内容を確認すること。

2013年度 アカデミックスキルII レポート課題

課題1((1)〜(3))は全員。加えて、課題2と課題3のうち一方を選択の上、以下の指示や注意を良く読んで、ソースプログラムとスクリーンショット画像を提出せよ。

提出ファイルは以下のとおり:

また、チャレンジャー用のオプションとして、so-many-names.c(課題4)とそのスクリーンショット(so-many-names.png)を上記に加えて提出しても良い。

レポートについての連絡事項

7/17 亀場サーバー(tfield-linux)とturtle.hファイルは最新のものをダウンロードして使ってください。古いファイルを使うと、正しく表示できない場合があります。

全体に渡っての要件・注意

課題プログラムのひな形

作業を始める前に、同じディレクトリにturtle.hが保存されていることを確認すること。

/* 情報基礎A 課題X  学籍番号:B3XX1234 氏名:東北太郎 */
#include <stdio.h>
#include <math.h>
#include "turtle.h" /* この行を消さないこと! */

/* 関数定義 */

main()
{
  /* 必要な変数の宣言 */
  
  CON("localhost") ;
  CLR() ;
  
  /* 各自のプログラムを記述 */

}

I. 必須課題

以下に示す問題1 (1)~(3)のプログラムを作成し、実行せよ。レポートには、設問ごとに、作成したプログラムと実行結果の亀場のスクリーンショットの画像ファイルを提出すること。

課題1(1):正六角形の描画(20点)

亀で描く基本的な図形の「正N角形」を参考に、図1に示すように、亀場の原点: (0.0, 0.0) を中心とし、中心から頂点までの距離が200.0ピクセルの正六角形を描画するプログラム: hexagon.cを作成せよ。

ただし、正六角形の1辺の長さは、中心から頂点までの距離と等しいが、ここでは、「正N角形」の解説を参考に、1辺の長さを計算により求めよ。また、最初の頂点(描き始めの位置)を真上、すなわち、この場合は (0.0, 200.0) とすること。

図1

tfield-capture-kadai1-1

課題1(2):正N角形の描画関数の定義と利用 (20点)

問題(1)で作成したプログラムを参考に、亀場の x, y を中心とし、中心から各頂点までの距離がr、頂点の個数がNの正N角形を描画する関数: polygon( x, y, r, N ) を定義し、これを利用して、図2に示すように、それぞれ、(-120.0, 120.0), (120.0, 120.0), (-120.0, -120.0), (120.0, -120.0) の各点を中心とし、中心から頂点までの距離が100.0ピクセルの正三角形、正方形、正五角形、正六角形を描画するプログラム: four-polygons.c を作成せよ。

ただし、(1)と同様に、各図形の最初の頂点が真上にくるようにすること。

図2

tfield-capture-kadai1-2

課題1(3):正N角形の繰り返し描画 (20点)

問題(2)で定義した関数: polygon( x, y, r, N ) を応用し、図3に示すように、縦8個×横8個の計64個の正方形を並べた市松模様を繰り返し処理により描画するプログラム: vuitton.c を作成せよ。

なお、中心から頂点までの距離を32.0ピクセルとすると、図のように亀場にちょうど収まるようになる。また、辺で囲まれた領域を塗りつぶしたい場合には、描画前にFILL( ) 関数を実行する(塗りつぶしモードにする) ことで、COL( ) 関数で指定した色で塗りつぶすことができる。ただし、ここでは色を任意の色を指定してよいこととする。

図3

tfield-capture-kadai1-3

II. 選択課題

以下に示す課題2、課題3のいずれか一方を選択し、プログラムを作成、実行せよ。レポートとして、作成したプログラムと実行結果の亀場のスクリーンショットの画像ファイルを提出すること。

選択課題その1

課題2.円描画関数の定義と利用 (40点)

亀で描く基本的な図形の「円」を参考に、x, y を中心とする半径 r の円を描画する関数 circle( x, y, r ) を定義し、以下に示すようにオリンピックのシンボルマークを模した5つの円を描画するプログラム: olympic-symbol.c を作成し、実行せよ。ただし、オリンピックのシンボルマークは5つの円が鎖状につながった形となっているが、ここでは円の重なり部分について特に考慮しなくてよいものとする。

図4

tfield-capture-kadai2

なお、各円の半径は50.0ピクセル、線の幅は7.0ピクセルとし、青、黒、赤、黄、緑の各円の中心座標、ならびにRGB値は表に示す値を利用するとよい。

表1

中心座標
x
中心座標
y
R G B
-110 30 0.00 0.40 0.75
0 30 0.00 0.00 0.00
110 30 0.93 0.10 0.24
-55 -30 1.00 0.83 0.00
55 -30 0.00 0.50 0.00

選択課題その2

課題3.毛筆文字による氏名描画関数の定義と利用 (40点)

亀場でプログラミング:文字情報とフォントの「2. フォント(グリフ)をデザインする」を参考に、毛筆モードを利用し、亀場上の(x, y)を基準点(1文字目の左下隅の位置)とし、1文字の幅と高さがwピクセルの大きさで自分の氏名の2文字を描画する関数: my_name(x, y, w) を定義し、これを利用して図5に示すように亀場上に縦2列×横2行で1文字の幅を100.0ピクセル (2文字分の幅は200.0ピクセル) としてバランスよく文字が収まるよう (図の青色で示す長方形が幅200.0ピクセル、高さ100.0ピクセル、ただし青枠を描画する必要はない) 、自分の氏名の2文字を繰り返し処理により4回描画するプログラム: my-name.cを作成し、実行せよ。

なお、自分の氏名の2文字は、苗字と名前のどちらかから、もしくは苗字と名前のそれぞれから1文字ずつ利用してもよく、また、漢字とカタカナのどちらでもよいが、漢字の「一」や長音記号「ー」を含めてはいけない。また、線の太さは、描画する文字が綺麗に見えるよう、幅が100.0ピクセルの場合に概ね10.0~15.0の範囲になるよう指定すること (全ての線で共通としても、また、線によって変化させてもよい)。ただし、文字の大きさにあわせて線の太さも調整されるよう、my_name()関数を定義する事。また、「トメ」、「ハネ」、「ハライ」などの装飾を行うこと。

図5

tfield-capture-kadai-myname

III. 発展課題

余力がある学生は、発展課題として、以下に示す問題4のプログラムを作成し、実行せよ。レポートとして、作成したプログラムと実行結果の亀場のスクリーンショットの画像ファイルを提出すること。なお、発展課題に取り組んだ場合、アカデミックスキルIIのレポートの点数の合計が100点を超えない範囲で、40点を上限に加点する。

チャレンジ用オプション課題

課題4.毛筆文字による氏名の配置 (最大40点)

問題3で定義した関数: my_name(x, y, w) を利用し、図6に示すように、亀場の一番下に、氏名の2文字を幅64.0ピクセル、高さ32 .0ピクセルの大きさで左端から右端まで繰り返し描画し(この場合、描画される氏名の個数は計8個となる)、そのすぐ上に、幅と高さが下の段のちょうど2倍の大きさ、すなわち、幅128.0ピクセル、高さ64.0ピクセルの大きさで氏名の2文字を同様に左端から右端まで繰り返し描画し(2段目の氏名の個数は計4個)、さらにそのすぐ上に、幅256.0ピクセル、高さ128.0ピクセルの大きさで氏名を繰り返し描画し、最後に、そのすぐ上に幅512.0ピクセル、高さ256.0ピクセルの大きさで氏名を描画するプログラム: so-many-names.cを作成せよ。

ただし、名前の文字を繰り返し描画する方法は様々考えられるが、プログラム中にmy_name()関数を計15回記述する形で全ての氏名について位置と大きさを直接指定して描画した場合には最大10点、横方向の描画位置と大きさのみ、計算により求め、縦方向の位置は直接指定する形で繰り返し処理を行っている場合には最大20点、事前に描画位置と大きさを手作業で計算した結果を配列に格納しておき、これを参照する形で繰り返し処理により描画する場合には最大30点、縦方向、横方向の両者とも計算により求める形で繰り返し処理を行っている場合には最大40点、その他の方法により描画を行っている場合には、その内容に応じて加点する。

図6

tfield-capture-kadai3-2