• 検索結果がありません。

HK13

N/A
N/A
Protected

Academic year: 2021

シェア "HK13"

Copied!
8
0
0

読み込み中.... (全文を見る)

全文

(1)

コンピュータプログラミング A

補助教材(13)

授業第 14 回 2016.10 学ぶ上の心構え 中間試験は一つの区切りでした. 初期の頃は与えられたものを打ち込んで所定のものが出れば 満足としていましたが, これはゲームのルールを学ぶことに相当しました. 皆さんは基本ルール は完全にマスターしたことでしょう. 段々その中身が問題になって来ます. 最近は穴埋め形式の 演習が増えていますが, 形だけでなく内容をしっかり理解していないと解けないことが分った と思います. 試験は正にそうでしたね. 一定の範囲内ならプログラムは驚くほど自由に作ること ができ, 意図通りちゃんと動いてくれます. 自分の意図通りのプログラムを自由自在に作るのが 最終目標なのです. 課題を解くに当たって変数名や振る舞い(メソッド)名など自分で工夫して いますか. プログラム作りを少しまじめに勉強すると. 結構面白いことが分ってきます. 工夫を こらし, 楽しいプログラムや役に立つプログラムを自発的に作っていきましょう. 自分で創意工 夫することは世の中的にもとても大切です. そのような力は若いうちに鍛えておけばどんどん 伸びます. 今この若さで伸ばしてください. プログラムは自分の創造性を豊かにするにも格好の 道具なのです. ふと思いついたことをプログラムにしようとするといろいろな限界にぶつかる と思います. それを学習の原動力にするといいのです. ぜひそうしてください. 中間試験講評 問題 1(クラス図からプログラムの機械的導出) DrawFrame

main( args : String [ ] ) : void getLastDigit ( n : int ) : int

getString ( s : String, n : int ) : String

解答例 DrawFrame.java 1 //16JKxxx ○○○○ 2 public class DrawFrame{ 3 public static void main(String[] args){ 4

(2)

5 } 6 public static int getLastDigit(int n){ 7 return 0; 8 } 9 public static String getString(String s, int n){ 10 return ""; 11 } 12 } コメント 機械的導出は基本中の基本です. 今後毎回のように出てくるのできちんとできない と差し支えがあります. この授業では特に指示がなくともプログラムを作るには機械的導出を 経て行うようにしましょう. 今回の試験でこれができなかった人は今日の演習課題 3 を必ず行 うようにしてください. 機械的導出時の返却値について(復習) 返却値が void の場合 return なし 返却値が int の場合 return 0; 返却値が String の場合 return ””; 適当なものを入れてもコンパイルが通る(エラーが出ない)こともありますが, 試験のときはル ール通りでないと減点されます. またクラス図にないものを入れるのも厳禁です. 問題 2 変数 n に代入した数の下一桁を求め,その数の大きさの絵文字を表示するプログラム. API 仕様および実行例を参考にプログラムを完成. API 仕様 main n = 15 の場合にプログラムを実行すると,以下の表示を行います. lastDigit:5 * *** ***** ******* ********* getLastDigit 引数 n で受け取った数の,下一桁を返却します. (例)getLastDigit(15)の場合は,5 を返却します. (ヒント)

(3)

n を 10 で割った余りが下一桁になります.余りは % で求まります. int a = 123 % 10; a には 3 が入ります. getString 一番目の引数 s で受け取った文字列を,二番目の引数 n で受け取った個数,連結し て返却します. (例)getString("*", 5)の場合 "*****" を返却します. 解答例 Draw.java 1 //16JKxxx ○○○○ 2 public class Draw{ 3 public static void main(String[] args){ 4 int n = 123; 5 int lastDigit = getLastDigit(n); 6 System.out.println("lastDigit:" + lastDigit); 7 for(int i = 0; i < lastDigit; i++){ 8 String s1 = getString(" ", lastDigit - 1 - i); 9 String s2 = getString("*", i * 2 + 1); 10 System.out.println(s1 + s2); 11 } 12 } 13 public static int getLastDigit(int n){ 14 return n % 10; 15 } 16 public static String getString(String s, int n){ 17 String str = ""; 18 for(int i = 0; i < n; i++){ 19 str = str + s; 20 } 21 return str; 22 }

(4)

23 } コメント 前問とクラス名が異なるだけでクラス図は事実上同じなので前問でできたプログラムをコピー してファイル名とクラス名を書き換えればプログラムの骨子ができます. 一見難しい印象があ るかも知れないですがAPI仕様を個別に満たすようにすれば全体として解けるようになっていま す. mainは記載されているのをそのまま打ち込みます. getLastDigitはAPI仕様にあるヒントを参考にすればできます. 問題の指示(API仕様)に素直に 従わず実行例と同じものが出るようにと奮闘し失敗している人もいます. API仕様を満たすプロ グラムが求められているのであって実行例と表示が合うプログラムを作るのは直接の目標では ありません. もちろん表示は合わなくてはいけないのですが. ちなみに今日の授業で学ぶif文 のプログラムでは例題のプログラムの中身はそれぞれ違いますが表示はほとんど毎回同じです. 表示は実行例を満たさなくてはなりませんが, 実行例を満たすプログラムなら何でもよい訳で はないことを胸にきざみましょう. getLastDigitの別解: public static int getLastDigit(int n){ int x; x = n % 10; return x; } わざわざ変数 x を定義して, x に答を入れた上 return 文で返していますが, 解答例の方が簡潔 です. return 文には式を入れてよいのです. getString は同じ問題を演習(6.11 演習 6-3)で行 いました. また補助教材(12)で解説しています. 資料を参照するのは構わないのでそれを丸写 ししても正解を得ることが可能でした. 17 String str = ""; の変数名は便宜的なものなので変数として可能なものなら何でもよいです. 文字列をつなぎ合 わせていくときのデータを保存する場所を定義しご破算に相当する = "" とします. 18〜20行目 はおなじみです. 15 return str; で結果を返却します.

(5)

以下は試験問題の DrawFrame.java と Draw.java を例にして, 手順に従って機械的導出後指示に 従って作業し, 完成したプログラムを提出する場合を想定した説明です. 最初の問題で与えられたクラス図から機械的に導出したものを DrawFrame.java という名前で 保存します. それをコンパイルしてエラーなしならひとまず完成です(エラーが出たら, 出なく なるまで修正します). 次の問題はクラス名は別ですがクラス図は事実上最初の問題と同じです (そのようにわざわざ出題しています). それに回答するにはゼロから作ってもよいのですが, 以下の方が簡単です. DrawFrame.java をコピーし Draw.java という名前で保存します. それを開き, クラス名を Draw とします. そのファイルを API 仕様および実行例を参考にして書き直します. 下では API 仕様および実行例を参考にして書き直すときの変更のありなしを注釈で入れます Draw.java 1 //16JKxxx 電大太郎 2 public class Draw { // DrawFrameを書き換える 3 public static void main(String[] args){ 4 //ここに指示通りのものを入れる 5 } 6 public static int getLastDigit(int n){ 8 return ""; //書き直す 7 } 8 public static String jointWords(String s1, String s2){ 9 //ここにAPI仕様を満たすように書き足す 10 return ""; //書き直す 11 } 12 } 以上のように修正したら, 同じファイル名でそのまま(上書き)保存します. 当然ですが, 最初 の機械的導出されたものの骨子(クラス図に表されているもの)は変わらない状態となります. これをコンパイルします. エラーが出たら修正します. ただし, 機械的導出で得た骨子の部分 は確認済なので変更は必要ないはずで, 新たに修正した部分だけが対象です. エラーが出なく なったら, クラス図, API仕様および実行例を反映したプログラムができたことになります. これを提出することになります. もし, 機械的導出だけ終わってその後を行う時間がなくなっ

(6)

出なくなり, その後の作業の途中で終わった(エラーが取れないなど)ときはそのままの状態を 保存して提出します. 骨子の部分を変えてしまったりしていなければ, それなりの点はもらえ ます. またエラーが出ていても途中までそれなりにできていれば点をもらえます. 結果を入れるための変数 for 文で合計を求める場合や文字列をつなぎ合わせていくときは, 結果を入れるための変数を 定義して初期化することが必要です. 合計の例 int sum = 0; 文字列の例 String message = ""; 仮の変数を自分で定義するのを嫌ってか振る舞いに与えられた引数の変数や振る舞い名を仮の 結果を入れるための変数として流用する人がときどきいますがあまりよい習慣とは言えません. その場合奇妙な結果を招くことがあります. 必要なときは遠慮なく変数を定義しましょう. 変数名について 変数名は文法上許されている範囲では何でもよいですが, 案外悩みがちです. 1文字の変数名 はfor文のカウンタとしてよく使われます. 整数型でi, j, k, l, m, nなど. カウンタ以外 にはごく短いプログラムを除き1文字だけの変数は意味が分りにくいので避けるべきです. 合 計ならsum, 平均値ならaverage, メッセージを意味する場合はmessage, 文字列としてstr など意味が分りやすい変数名を付けるように心がけましょう. averageTemperatureなど長 くしてもよいのです. その場合変数名の先頭は小文字にし, 単語の区切りは大文字にする慣例 です. 振る舞い名も同じ規則です. 英語を使うなら綴り字を正しくしましょう. またクラス名 は先頭が大文字のほかは同じ慣例です. 変数名が慣例からあまり外れると見ずらくなります (例 int型にmessage, String型にi, sumなど). 当面オンラインドキュメントなどの例をま ねしましょう. 条件分岐 条件分岐1 if(条件式){ 条件式が真(true)の場合, 実行するソースコード } public static void printWeatherInformation(int temperature){ String message = "真冬日ではありません";

(7)

message = "真冬日です(0未満)"; } System.out.println(message); } 条件分岐2 if(条件式){ 条件式が真(true)の場合, 実行するソースコード }else { 条件式が偽(false)の場合, 実行するソースコード }

public static void printWeatherInformation(int temperature){ String message = ""; if(temperature < 0){ message = "真冬日です(0未満)"; } else { message = "真冬日ではありません"; } System.out.println(message); } if文でもブロックの考えは重要です. 復習になりますが{ } で囲まれた範囲がブロックです. プログラムは原則上から下に1行(1文)づつ動いて行きます. ブロックは外から見たら1文と同 じです. ブロックに入ったら同じ原理で動いて行きます. ブロックの中にまたブロックがあっ ても同じです. なのでいくら複雑そうに見えても基本原理は同じです. 上から下に1文づつ動 く, ブロックは1文と同じと覚えておけばいいのです. if()のかっこ内を条件式といいます. 条件分岐1では条件式が真(true)のとき(成立という 言い方もあります)その後のブロックが実行されます. ブロックの中はたった1行でもよいし何 行もあってもよいのです. もし条件式が偽(false)の場合(成立しないとき), 何もしません. 条件分岐2では条件式が真のとき直後のブロックをそうでないとき(偽のとき), else以後の ブロックを実行します. 代表的な論理演算子

(8)

優先順位 演算子 説明 1 () 式をまとめる 2 ! 論理値の否定 3 < より小さい 3 > より大きい 3 <= 以下 3 >= 以上 4 == 等しい 4 != 等しくない 5 && 論理値のAND 6 || 論理値のOR == や && を間違えて = や & とした場合, 文法的には間違いとならずコンパイルエラーが発 生しない場合があります(もちろんプログラムとしては間違い). 何度やり直してもプログラム が意図通りに動いてくれないときこの可能性があります.

参照

関連したドキュメント

Since locally closed functions with all point inverses closed have closed graphs [2], (c) implies

We aim at developing a general framework to study multi-dimensional con- servation laws in a bounded domain, encompassing all of the fundamental issues of existence,

Assume that F maps positive definite matrices either into positive definite matrices or into negative definite matrices, the general nonlinear matrix equation X A ∗ FXA Q was

Then by applying specialization maps of admissible fundamental groups and Nakajima’s result concerning ordinariness of cyclic ´ etale coverings of generic curves, we may prove that

Then Catino [15] generalized the previous result concerning the classification of complete gradient shrinking Ricci solitons to the case when Ricci tensor is nonnegative and a

We prove a continuous embedding that allows us to obtain a boundary trace imbedding result for anisotropic Musielak-Orlicz spaces, which we then apply to obtain an existence result

[r]

We provide an accurate upper bound of the maximum number of limit cycles that this class of systems can have bifurcating from the periodic orbits of the linear center ˙ x = y, y ˙ =