Comments
Description
Transcript
コンピュータと数学 - 同志社大学 情報公開用サーバ
コンピュータと数学 同志社大学工学部 水島二郎 平成 年 月 日 目次 第 章 コンピュータの仕組みと動作および操作 コンピュータの構成 ハードウェアとソフトウェア ハードウェアの構造 コンピュータの動作原理とソフトウェア コンピュータの歴史 オペレーティングシステムの歴史 高級言語 の特徴 の歴史 の発展 第 章 コマンド入力によるコンピュータの操作 におけるディレクトリ・ファイルとコマンド と ディレクトリとファイル 基本的な コマンド リダイレクションとパイプ プログラミングとコンパイル 第 章 変数と演算 の基本的なプログラムの書き方 コメント文 変数と型 文字型変数とエスケープシーケンス 型変換 定数 算術式と算術演算子 標準入出力 標準出力 標準入力 英数字の内部表現 整数の内部表現 実数の内部表現 第 章 数学関数・書式指定出力 数学関数 書式指定出力 第 章 手続き型プログラミングと 図・逐次構造 アルゴリズムの作成ー概略設計から詳細設計へ(段階的詳細化) つの基本的アルゴリズム 逐次構造 ,連接 選択構造 ! " 反復構造 #$! ! ",!% ! " 呼出箱とメソッド 関数 概略 &' 図と詳細 &' 図 逐次構造プログラミング 第 章 選択構造 条件式と関係演算子 文 () !* 文 第 章 反復構造 文による繰り返し 文による繰り返し 無限ループ 第 章 メソッド 関数 関数の宣言と定義の方法 関数について 再帰呼び出し ローカル変数 局所変数 第 章 オブジェクト指向プログラミング クラスとオブジェクト データの隠蔽 コンストラクタ 拡張クラスとインヘリタンス 継承 第 章 配列・文字列 配列 多次元配列 文字列 ストリングクラスのメソッド 文字列の大小関係 配列とメソッド 第 章 ファイル処理 ファイルの種類とファイル操作 テキストファイルの入出力 整数や実数のファイルの入出力 第 章 ポストスクリプトによる描画法 ポストスクリプトによる図の描き方 図形の描き方+ 次元グラフィックス 第 章 コンピュータの仕組みと動作および操作 この章では,コンピュータとはどのようなものかということを説明した後,コンピュータを構 成するハードウェアとソフトウェアの概略とその歴史を簡単に述べる.コンピュータを操作する 方法には つの方法がある. つは主にディスプレイ画面上のアイコンをマウスによりクリックや ドラッグをすることによりコンピュータを操作する方法 , % $* (% !%- の略称 で,もう つはコマンド ".. / とよぶ命令をユーザーがキーボードから入力することにより コンピュータに動作を指示する方法である , * % !% (% !%- の略称. コンピュータの構成 ハードウェアとソフトウェア コンピュータは大きく分けると,ハードウェアとソフトウェアから成り立っている.ハードウェ アとは「形のあるもの」であり,コンピュータの中心部である &!% &%"(( 0 !,中 央演算装置 や情報を一時的に保存するメモリー,ディスプレイ 液晶画面, #1 2 !*"/# 3 145 などの周辺装置などである.ソフトウェアとは「目に見えないもの」であり,オペレーティ ングシステム , $% ! 0 3(!. や応用ソフトウェアなどである.このほかにも,ハードウェ アとソフトウェアの中間に位置するファームウェア 6 %.) % とよばれるものもあり,これはソ フトウェアを ## / 3 ."%3 に記憶したものであり,主にコンピュータの起動のため のソフトウェアが記憶されている. 入力装置 中央演算装置 記憶装置 図 ハードウェアの構造 出力装置 第章 コンピュータの仕組みと動作および操作 ハードウェアの構造 ハードウェアの構造を模式的に表すと,図 のようになる.コンピュータの心臓部は中央演算 装置 & であり,& と記憶装置 #',# /". '(( ."%3,ここに一時的に情報を 蓄える の間はバスとよばれる情報伝達路で結ばれている.コンピュータの周辺装置は入力装置と 出力装置に大別されるが,ハードディスク 7 %/ (8 などのように入力装置でありしかも出力 装置でもあるものも多い.これに対して,マウスやキーボードは入力装置であり,ディスプレイ 液晶画面, #1 やプリンタは出力装置である 図 参照. 入力装置 ファイル マウス キーボード インターネット ハードディスク & 出力装置 ファイル メモリ データとプログラム ディスプレイ プリンタ インターネット ハードディスク ,9& : ,9& メモリー : ,; 図 メモリー ,; コンピュータの構造とデータの流れ コンピュータの動作原理とソフトウェア 図 は図 を少し詳しく表したものである.コンピュータのソフトウェアはオペレーティ ングシステム と応用ソフト '$$ ! " に分けられるが,コンピュータに電源を入れると ファームウェア # に書かれている手順に従って入力装置であるハードディスクよりオペレー ティングシステム たとえば,< /")( =& や > ? など が & を通してメモリにコピーされ る.オペレーティングシステムはコンピュータ全体の管理を行うプログラムであり,マウスやキー ボードからの入力を解釈し,適当な処理をした後,必要があれば出力を行う.応用ソフトウェアは コンピュータの利用者 ユーザー,(% がマウスやキーボードから命令を与えると起動する.こ のときも,応用ソフトはハードディスクからメモリに一時的にコピーされて,& はメモリにコ ピーされた応用ソフトに含まれている命令を一つづつ読み込んで,解釈し必要な処理をした後,結 果を出力装置に送る. このように,コンピュータは & を中心として動作し,メモリに蓄えた命令群を順番に一つづ つ処理をしていく.現在実用的に使われているコンピュータはほぼすべてがこのような動作を行 い,フォン・ノイマン式計算機とよばれる これ以外に非ノイマン式計算機も開発されているが広 くは実用化されていない. コンピュータの構成 年 ハーバード大学 年 ペンシルベニア大学 年 ケンブリッジ大学 年 年 ,リレー式計算機 '#@ 7 7 ' 8 第 世代 第 世代 第 世代 年 年 第 世代 年 年 A' ; < ,真空管,ノイマン方式,プログラム内蔵 8( 年 真空管,磁気ドラム,演算速度 年 トランジスタ,磁気コア,ドラム オペレーティングシステム,演算速度 $(,メモリ 8)"%/( 表 ,真空管,配線プログラム 真空管の数 本,大きさ . . .,重量 トン AB' & A8%! @ $( , 利用,データ通信可能 演算速度 $(,メモリ : ビット : 利用,コンピュータネットワーク このころからマイクロコンピュータが開発される ;> 汎用コンピュータ 大型コンピュータ の歴史 コンピュータの歴史 世界で最初に開発されたコンピュータは, 年ハーバード大学における '#@ というリ レー式計算機であるとされている.その後,真空管やトランジスタを使用したコンピュータを経 て, を用いたコンピュータ : 年 ができて,ほぼ現在の形のコンピュータとなった. 初期のコンピュータから : ができるまでをまとめると表 のようになる. コンピュータは : に代表される汎用機,ミニコンピュータ,ワークステーション,スー パーコンピュータ,マイクロコンピュータ パーソナルコンピュータ などに分類することができる. マイクロコンピュータが最初にできたのは, 年でインテル社の という ビット の & を使っていた.そのころのマイクロコンピュータにはオペレーティングシステムはなく, :' とよぶ言語が搭載されており,この言語がオペレーティングシステムの役割も果たしていた.そ の後, 年に : が : & を発売し,それと前後して BA が 年に & を発売す るようになったのち,今の形のマイクロコンピュータとなってきた.アップル社がマッキントッ シュを発売したのは 年である. オペレーティングシステムの歴史 最初にオペレーティングシステムが登場したのは : の としてであり,C という 名前がつけられた.初めは つのコンピュータでは つの仕事 "4 しかできなかったが,やがて いくつかの仕事が並行してできるようになり, 同時に何人もの 人間とも対話的に動作するよう になった 1. 初期のマイクロコンピュータにはオペレーティングシステムが搭載されておらず,:' とい うインタプリタ型の言語が の役割も果たしていた.その後, 年に 0 ! #( %* 社が ½ コンピュータは と の つの状態を区別することによって情報を処理する. と いずれかを表す情報の量が ビットである. ビットを バイトともよぶ. 第章 コンピュータの仕組みと動作および操作 : 年 C && ;1 1 ; マルチタスク ; 多重仮想記憶 ; 'C; 年 :' 年頃 &C &C 年 C 年 < /")( < /")( < /")(B1 < /")( < /")( < /")( < /")(=& < /")(, ! ( 年 ? 年 ;%( " 年 ;%( " 年 システム 年 システム ; 年 システム ; リリース 年 > ? 誕生 図 オペレーティングシステムの歴史 という を販売するようになって以降,マイクロコンピュータでも を使用するよう になってきた.現在よく使用されている は < /")( =& などであり,この は : & の ためのオペレーティングシステムであった の流れを汲むものであり,多くの機能をワー クステーションやミニコンピュータの であった ? から模倣して設計されてきた. &C 高級言語 コンピュータの & が解釈できる言語を機械語という.機械語は & の種類ごとに異なる. 人間が & に合わせて機械語で命令を書き,プログラミングを行うのは非常に長い期間の訓練を 要するので,もう少し人間の言語に近い言語が開発されてきた.コンピュータの機能 & の速 度とメモリの量 が低い頃は機械語と 対 に対応するアセンブラという言語が使われたが,その 後,より人間の言語に近い高級言語が用いられるようになってきた. アメリカ合衆国では高級言語として 6"%!% 6#. 1#'B( ! 0 (3(!. や :>.." :( (( % !/ > 0 0 などが初期に開発され,ヨーロッパでは '>>'>% !*. > 0 0 という言語が開発されて用いられてきた.現在では,工学的な計算や制御には主に 言語 が用いられ,コンピュータの や応用ソフトには DDがよく用いられる.また,ネットワーク コンピュータの構成 :> 米国防省 :' :' の復権 年 @.3 E @%!F 6#1#'B 年 '>> 6#1#'B 6#1#'B 6#1#'B &>C &''> 年 ヨーロッパ '/ : DD 年 @ 1*".$(" 年 ( # !* 年 !%"(!%$ 年 %"(3(!.( 図 高級言語の歴史 関連のソフトやホームページには が使われている.高級言語の開発・発展の変遷を図 に まとめておく. 高級言語である 6"%!% や あるいは & ( などは手続き型言語といわれ,これらの言語を用 いてプログラミングを行うときにはアルゴリズム 計算法,処理手順 が重要となる.一方,それ らの言語の発展形である DD や などはオブジェクト指向型プログラミング言語である.オ ブジェクト指向型プログラミングにおいてはオブジェクトの原型となるクラスの設計が重要であ り,プログラムはオブジェクトにメッセージを送ることによって進行するので,< /")( プログ ラミングのように複雑な処理を行うのに適している. 高級言語には :' に代表されるインタープリタ型の言語と 6"%!% や に代表されるコン パイラ型の言語がある.インタープリタ型の言語は & が命令を つづつ機械語に翻訳しなが ら命令を実行する.それに対して,コンパイラ型の言語では人間が書いたプログラムを一括して 機械語に翻訳 コンパイル,".$ していったん機械語のプログラムをディスクに保存した後, & が機械語を つづつ解釈し,実行する. 第章 コンピュータの仕組みと動作および操作 の特徴 プログラミング言語 はサンマイクロシステムズ %"(3(!.( の ゴスリング "( 0 が中心となって開発したオブジェクト指向型言語である.プログラミング言語 DDに 類似している. で書かれたプログラム コード はコンパイルするとマシンに依存しないバイ トコードとよばれる中間コードに変換される.バイトコードは仮想マシンの命令セットでありど のコンピュータでもこの仮想マシンのインタプリタをもっていれば実行することができる.他の コンピュータ言語は,そのソースプログラムが特定の中央演算装置をもつ,特定のオペレーショ ンシステム用の機械語に変換されるのと異なり, はこのように中央演算装置やオペレーショ ンシステムに依存しない言語に変換するので汎用性が高いのである.したがって,携帯電話や家 庭用の電化製品でもこのバイトコードのインタプリタさえもっていれば で書かれたプログラ ムを動かすことができる. ワールドワイドウェブ <<< の閲覧ソフトであるブラウザが のバイトコードを実行す るためのインタプリタを備えていれば, はアプレットとよばれるプログラムの形で <<< のブラウザ内で実行することができる.この機能により, は <<< のホームページを作成 するのに広く用いられるようになった. 年 .( "( 年 年月 8 年月 B!( $ 0 がオブジェクト指向言語 ベースのウェブブラウザ 8 <4#% 開発 開発 が に改称.<4#% が 7"! に改称 社、 %"(3(!.( 社 とライセンス契約 、 をサポート B!( $B 0 !"% 年 月 %"("-! 年月 @ を公開 年月 @ を公開 年 月 @ 年月 A を公開 年月 A を公開 表 社、 %"(3(!.( 社 とライセンス契約 を公開 プログラミング言語 の歴史 の歴史 の出発点はサンマイクロシステムズにおける家電用組み込みソフトウェアを開発するプロ ジェクトだった G% H プロジェクトであるといわれている. 年に発足したこの開発プロ ジェクト・チームは, 年ごろまでインタラクティブな携帯テレビなどの開発を行ったが,こ のとき .( "( 0 を中心としてデバイス用に開発された言語が G 8 H であり,後の で ある.当時はケーブルテレビを顧客として想定していたが,製品化には至らなかった. 年に <4 ブラウザ G"( H が登場し,インターネットが普及し始めてからは,このチームの関心は そちらへ傾斜していくことになった.サンマイクロシステムズは "( のクローンである 8 ベースのブラウザ G<4#%H後に G7"! H を開発()した. 年,<"% /A?$" が開催され,ここで G<4#%H は G7"! H ブラウザと改名さ れて公開された.このとき 8 も と改められた .G7"! H ではそれまで静止した 情報しか表示できなかったウェブ・ブラウザ上で,インタラクティブで動くコンテンツを表示す る仕組みを実現した.これは画期的であり,そのインパクトのために当初 は「ブラウザでア ニメを実現する言語」として理解された.その後, の開発者向けソース・コードがフリーで インターネットに公開されて普及していくこととなる 年 の発展 開発者向け環境 "$$.! @ ! @ は 年 , 年 とバージョン アップが重ねられ, 年には @ が "-!) % "$.! @ ! @ とし て公開された. 年 にバージョン を経て, 年 月には @ が公開された 表 . サンマイクロシステムズでは抽象 プラットフォームを & !-"%., ! / %/ A/ ! " A とよび,その実装を @, ! / %/ A/ ! " とよんでいる. 「抽象プラットフォームを 実装するのに @ が必要」と解釈すれば良い. プラットフォームには G! / %/ A/ ! "H A の他に,GA!%$% ( A/ ! " HAA, G %" A/ ! " HA がある.AA はサー バサイドの 開発環境 A の機能に加えて, A!%$% ( : ( A:, % !(, %% & 0( &,=> などの機能が追加されている. A は A のサブセットのよ うなものである.携帯電話,&',セットトップボックス などマシンリソースが貧弱なデバイス 上で実装できる組み込み系 環境が実装されている.ただし,必ずしも A と完全に互換で あるわけではない. 第 章 演習問題 問題 <4 ブラウザ インターネットエクスプローラなど を起動し,アドレスバーに同志社大学 のドメイン名 をキーボードから入力することにより,同志社大学の ホームページを表示せよ. 問題 < /")( 問題 問題 ファイルに書かれている内容を,指示するメイルアドレスにメイルとして送れ. 問題 問題 で保存したファイルを自分の : メモリーにコピーせよ. 問題 問題 で作成したドライブ 内のファイルとフォルダを消去せよ. のファイラ エクスプローラ を起動し,ディスクドライブ のルート に という名前のフォルダ ディレクトリ を作成せよ. エディタ 秀丸エディタもしくはノートパッド を起動して,自分の学籍番号,名前,このコ ンピュータプログラミングの講義で学びたいことがらを入力し,というファイ ル名でフォルダ の中に保存せよ. 第 章 コマンド入力によるコンピュータの操作 この章では,コマンド ".. / とよぶ文字列をユーザーがキーボードから命令を入力するこ とによりコンピュータに動作を指示する方法である , * % !% (% !%- の略称 につ いて説明する. におけるディレクトリ・ファイルとコマンド と コンピュータはデータ処理機であり,入力されたデータを人間の指示に従って処理して出力を する.このとき,人間の指示はコンピュータと対話的 インタラクティブ に与えられる場合と一 括して バッチとして 与えられる場合がある. 人がコンピュータに対話的に指示を与える方法には つの方法がある. つは,ディスプレイ上 に表示されたアイコン あるプログラムを象徴するマーク をマウスでアイコンをクリックするこ とによってコンピュータに指示する方法であり,このような方法を % $* (% !%- という.一方,キーボードからコマンドとよばれる文字列を入力することによってコンピュータに 指示を与える方法を * % !%4 (/ (% !%- という. によってコンピュータに 指示を与える方法は人間感覚に訴えるので,初心者にも分かりやすく,画面上から目的の情報を見 つけ出したり,マウスの操作によって情報を取り出したりすることも簡単にできる.これにより, 現在では によりコンピュータを使う方法が一般的である.しかし,プログラミングにおいて は多くの場合にコマンドを入力する が好んで用いられる.これは,何度も繰り返し同じ作業 をするためには よりも の方が効率的で人間の疲れが少ないためであると考えられる. 対話的にコンピュータに指示を与えるのではなく,一括して与えるためにはコンピュータへの 指示をハードディスクを代表とする記憶装置に記憶しておく必要がある.このとき,コンピュー タへの指示は多くの場合コンピュータに備え付けられている &!% &%"(( 0 !,中 央演算装置 が直接解釈できる機械語で書かれている.しかし,人間が機械語でコンピュータへの 指示をすべて書いて記憶装置に記憶するのにはかなりの訓練を必要とし,あまり効率的ではない. そのため,人間に理解しやすい高級言語とよばれる言語 6"%!% , , DD, , & ( など が あり,これらの高級言語でプログラミングをして,そのプログラムをコンパイラとよぶ変換プロ グラムにより機械語に翻訳し,翻訳した結果を記憶装置に記憶するのが一般的である. この章では によりコンピュータに指示をするためのコマンドと高級言語を用いたプログラ ムを機械語に翻訳する方法について簡単に説明する. 第章 コマンド入力によるコンピュータの操作 ディレクトリとファイル ファイルとはデータや文章,プログラムなどの集まりのことである.この集まりに名前を付け ることができる.名前は半角 英数字 で 文字以内であり,ピリオドを含みピリオドの後ろに はファイルの種類 実行ファイル,データファイル,画像ファイルなど を表す文字 拡張子 をつ けることができる. でコンピュータを使う場合には,ファイルの名前には 文字以内の英数 字を用い,拡張子には 文字以内の英数字を用いるのが便利である. では つのファイルに つのアイコンが割り当てられる.これらを整理しておくと ファイル :データや文章,プログラムの集まり. ファイル名 :半角で 文字以下.ピリオド以下は拡張子という 原則 文字以下. となる.ファイル名の例として 例 , ,,, , , , , などが考えられる. 言語のプログラムには , や DDで書かれたプログラムにはそれ ぞれ または の拡張子を用いる. という拡張子がついたファイルは I で書かれたプ ログラムをバイトコードに翻訳したファイルである. という拡張子がついたファイルは や 6"%!% などの高級言語で書かれたファイルを機械語に翻訳したファイルであるが,このファイル に書かれた機械語プログラムを実行することはできず,リンク ライブラリとの結合と編集 を行っ てできる という拡張子のついたファイルに変換すれば実行ファイルとなる. ディレクトリはファイルを集めたひとかたまりのものである.あるディレクトリの中にはディ レクトリも含むことができる.含まれるディレクトリをサブディレクトリという.ディレクトリ は でいうフォルダのことである.まとめると, ディレクトリ :ディスクドライブにはルートディレクトリがある. の下にディレクトリ,その下にサブ・ディレクトリを作ることができる. となる.ディレクトリにも半角 文字以内の名前をつけることができる.例として 例 , などが考えられる. コマンドを用いてコンピュータを操作するときには,いろいろなディレクトリの間を と いうコマンドを用いて「往ったり来たり」することになる.このとき,現在自分が居るディレクト リをカレントディレクトリとよぶ.特に指定しない限り デフォルトで,操作できるのはこのカ レントディレクトリに含まれているファイルである.カレントディレクトリ以外のディレクトリ にあるファイルを指定するのにはパス $ !* という経路を指定する.パスとは外部記憶装置内で ファイルやディレクトリの所在を示す文字列であり,ファイルやディレクトリのコンピュータ内で の住所にあたる. や < /")( では「」でディレクトリ名を区切る.記憶装置は,ドラ イブ名 など を頂点とする木構造になっており,これに沿って頂点から目的のファイルやディ レクトリまでのすべての道筋を記述するのが「絶対パス」である.これに対し,起点となる現在 位置から,目的のファイルやディレクトリまでの道筋を記述するのが「相対パス」である.相対 におけるディレクトリ・ファイルとコマンド パスでは,起点となるディレクトリを「」で,上位ディレクトリを「」であらわす.絶対パス の例として, 例 などのように指定できる. 基本的な コマンド コマンドは使っているコンピュータの オペレーティングシステム によって異なる. < /")( =& などのマイクロソフト社の では コマンドとよばれる次のようなコマン ドがある. ! "# $ % & ' ' & 作業ドライブを ドライブに変更する ファイルとディレクトリ名のリストを表示する $ ドライブに入ってるディスケットをフォーマットする ディレクトリ を新しく作る ディレクトリ を削除する ディレクトリ に移動する ファイル をファイル ' にコピーする ファイル の名前を ' に変更する ファイル を消去する ファイル の内容を表示する ファイル の内容を印刷する 主な () コマンドの説明を表示する リダイレクションとパイプ には ? とよばれる から取り込んだリダイレクションとパイプとよばれる機能が ある.リダイレクションはプログラムやコマンドの出力 ただし,標準出力とよばれる出力のみ をファイルに書き出す機能であり,パイプはプログラムやコマンドを実行した結果を他のプログ ラムやコマンドに引き渡す機能である.まとめると, リダイレクション 標準出力をファイルに受け渡す * * !# * * !# ".$!% の実行結果 画面出力 を %( !(/ ! に書き出す 第章 コマンド入力によるコンピュータの操作 * ** !# * ** !# の実行結果 画面出力 を %( !(/ ! に追加書き込みする パイプ コマンドを連続して実行する ".$!% * + / % コマンドを実行した後,その出力を入力にデータとして ("%! コマンドを実行する となる. コマンドとリダイレクション・パイプについては のマニュアルを参考 にすること. プログラミングとコンパイル コンピュータに一括して指示を与える方法のひとつに,高級言語によるプログラミングがある. ここでは, によるプログラミングの手順を簡単に紹介する 図 . 言語でプログラミ ングを行う人 プログラマ がエディタを使って作るファイルを はプロ グラマが自由につけることのできる名前. はあらかじめ決められた拡張子 とする.このファ イルをコンパイル 機械語に翻訳 するとバイトコードファイル ができる コン パイラが作る.このプログラムを実行するためには もし が にあるなら * と入力する. 問題を解析し,解く手順を考える &' 図 プログラムの設計 エディタを用いて を作成 プログラムの作成 * コンパイル * 実行 図 プログラミングの流れ 第 章 演習問題 問題 エディタを起動して,自分の将来の夢について 字程度にまとめ,その内容を自分の : メモリの中にファイル名&で保存せよ. 問題 問題 問題 コマンド % を用いて,, ドライブのルートディレクトリ , の下にディレク トリ フォルダ を作り,その下にディレクトリ を作成せよ.問題 で 保存した : メモリ内のファイル & をディレクトリ , の中にコピーせよ. コマンド を用いて,ファイル , & の 名前を , に変更せよ. エディタを起動して,次のテキストを入力し,その内容をファイル名-で保存 せよ. -. !) /0#. )& !- 1#2 3 3 問題 コンパイルコマンド を用いて, ソースファイル-をコンパイ ルせよ.コンパイルが成功したら,実行 - を行え. 第 章 変数と演算 この章では簡単なプログラムの例を通してプログラミングの方法について学ぶ. はオブジェ クト指向型のプログラミング言語であり,オブジェクト指向型のプログラミングを行う必要がある が,手続き型のプログラミング方法も修得しておく必要がある.この章では手続き型のプログラ ミングを説明する.したがって,クラス (( などオブジェクト指向プログラミングに関する常 套句については詳しい説明を省いてプログラミングにおける単なるルールであると理解すること. プログラミングをして,そのプログラムの実行結果を見るためにコンソール画面に出力する必要 がある. ではデータの入出力が少々面倒であるが,この章では簡単な入出力のみを説明する. の基本的なプログラムの書き方 のプログラムの書き方は,自由形式なので,書き始める場所も,一つの行に置くことがで きる文の数も制限があまり厳しくはない.しかし,あまり混沌としたプログラムを書くとデバッ グ 間違い探し のときや,後から修正を加えたいときなどに困ることになるのでできるだけ読み 易く書くように心がける必要がある.プログラム例 に示す簡単な のプログラムを使って 基本的な書き方の決まりを説明する. 【プログラム例 】 行目 -. ' 行目 4 行目 !) /0#. 5 行目 )& !- 1#2 6 行目 3 7 行目 3 行目の - は,7 " という名前のクラスを定義している. ではクラスがプログラ ムの基本単位となるが,詳しい説明は後にする.ここでは,クラス名 7 " がこのプログラムを納 める 格納する ファイルの名前と同じでないといけないということだけを注意しておく.したがっ て,このプログラムは 7 "I という名前でファイルに書かなければならない. 行目は空白行 であるが, では何も書いてない行は無視されるので,プログラムの可読性を良くするために, まとまりごとに適度に空白行を入れておく. 行目以降は何文字かのスペース 半角であること の後ろに の命令文が書かれている.これをインデントといい,プログラムを見やすくするた 第章 変数と演算 めの工夫である. 行目には「 !) /0#.」と書かれている. ここでは,メイン・メソッドと呼ばれるメソッド 関数 を定義している.今のところは, の プログラムにはこのメイン・メソッドが必ず一つ存在する必要があるとしておく.メイン・メソッ ド以外にもメソッド 関数 を追加することができるが,プログラムの実行はメイン・メソッドから 実行される.文末に括弧「.」40 の意味 があるが,この括弧から 行目の括弧「3」/ の意 「8 !) /0#.」 味 までがメイン・メソッドであることを表す. における「 」, 「 」, 「 」などについても後に説明するので,ここでは,メイン・ メソッドはこのように記述するという約束であるとしておこう. 行目は,メイン・メソッドで実 行される文である.ここでは,標準出力に文字や数値を書き出す )& メソッド を使っている.メソッドの使い方も後で説明するとして,ここで憶えておくべきことは,文の最 後にセミコロン 2 を付けなければならないということである. のコンパイラは文の終わり を改行ではなくてセミコロン 2 で判断するので,これを付け忘れるとコンパイル時にエラーが 出る.また,行の頭に空白があるがこれも無視される. 行目は, 行目のメイン・メソッドの終 わりを示す括弧である.メイン・メソッドの初めから文を実行していき,この終わりの括弧まで くれば,プログラムは終了する. 行目は, 行目のクラス 7 " の終わりを示す括弧である.以 上が,プログラム例 の説明である. まとめると, のプログラムは クラス名 . 8 !) /0#. 文 2 文 '2 3 3 のように書くということである.それでは,実際にこのプログラムを実行してみよう.エディタで プログラムを書いたら,拡張子 を付けてクラスメイト同じ名前のファイルとして保存する. 例えば,- のようにファイル名を付ける.カレントディレクトリを のソースファ イルのある場所に移動して,次のようにコマンドを実行する. * - * - - 1 !← 実行結果# このように )& メソッド 関数 内の 重引用符 でくくられた中の文章が表 ½ で手続き型のプログラムを書くときにはメソッドを関数と読み替えると分かりやすい. はオブジェクト 志向型言語なので,プログラムはクラスの集まりで構成されており,クラスにはデータとメソッドを定義することがで きる.このテキストでは今後,メソッドを関数と呼び替えることもある. コメント文 示されるはずである.)& メソッドの他に )& メソッドもある. これら2つのメソッドの違いは )& メソッドでは文字列や数値を出力した後で 文字カーソルの復帰と改行を行うのに対して )& メソッドでは復帰と改行を行わ ない点である. のプログラムはクラスやメソッド 関数 の集まりである.メソッドにはあらかじめ用意さ れているクラスやメソッドとユーザーが自分で作るクラスやメソッドがある.あらかじめ用意さ れているメソッドには入出力メソッド,文字列メソッド,数学メソッドなどがある. コメント文 にはプログラム中に注釈 コメント を記述することができ,その方法には2通りの方法が ある.一つは,""以降行末までの文字をコメントとみなす方法で,もう一つは"9 から9" までを コメントとみなす方法である.以下にコメント文の例を示す. クラス名 . 8 !) /0#. "" この文はコメント文です )& !コメント文#2 "" 行の途中からもコメントを書けます "9 複数行コメントを書きたい場合は このようにするのが便利です 9" 3 3 蛇足ではあるが,コメントはプログラムの実行結果に何ら影響を与えない. 変数と型 では変数や定数を定義することができる.変数は個別の名前 変数名 を付けて使い分ける. 変数名は,英字 $ から :, から ; と数字 から および下線 < とドル記号 = で構成され, 最初の文字だけは英字か下線またはドル記号でなければならない.また, は "/ を採用 しているので,変数名に漢字を用いることもできる.変数名の長さに制限はない.変数名において も,英字の小文字と大文字は厳密に区別されるので注意しなければならない .変数名はキーワー ¾ では,大文字と小文字は区別されない. 第章 変数と演算 ドや予約識別子と重複してはいけない.これらの規則を考慮すれば,変数名を自由に付けること ができる. 変数には取り扱うことができるデータの種類を区別するための型がある. の変数の基本 的なデータ型には,論理型 ,文字型 ,1バイト整数型 &,2バイト整数型 ,整数型 ,8バイト整数型 ,実数型 ,倍精度実数型 の8種 類がある. 言語などには符号なし変数 ( 0/ という概念があるが, では文字型以外は すべて符号付きの値をもつ. 基本データ型 & データ長 意味 ビット 論理型 !% と - ( の論理値 バイト 文字型 ビット "/ 文字 バイト 符号付き整数型 バイト 符号付き整数型 バイト 符号付き整数型 バイト 符号付き整数型 ∼ ∼ ∼ バイト 実数型 有効数字 桁, バイト 倍精度実数型 有効数字 桁, 絶対値の範囲は ∼ 表 ∼ ∼ 基本データ型 コンピュータの内部では情報を と で表しており,この情報量を ビットとよぶ.コンピュー タ内部では英数字などの 文字は ビットで表される では ビット). ビットを バイ トという.整数型データ ! は バイトで表し,実数型も バイトである.倍精度型実数は バ イトで表現される 表 参照. 実際にそれぞれの型の変数を定義して値を代入する方法をプログラム例 に示す.この例のよ うに,定義と同時に初期値を代入することも,同じ型の変数を一度に複数定義することもできる. 型に文字を代入するときは,文字を必ず1重引用符「>」で囲む必要がある . 【プログラム例 】 ? . !) /0#. ¿ 2 2 "" 整数型変数 を定義 "" 文字型変数 を定義 後に配列の章にて, 型の拡張として文字列の処理を学ぶが,文字列の表記には 重引用符 を用いる. 変数と型 @ 2 <A<&2 "" 実数型変数 を定義し初期値 を代入 "" 倍精度実数型変数 < と <& を定義 @ '2 @>$>2 @ !# 2 < @ '4567BC2 <& @ 462 "" "" "" "" "" に ' を代入 に文字 $ を代入 に を代入 < に '4567BC を代入 <& に 46 !4 × ! の6 乗## を代入 )& !年齢はDDです#2 "" を出力 3 3 このプログラムで,単精度実数変数 ? に値を代入するときには ?J- あるいは ?JK" ! の ように書いている. では特に指定しなければ実数は倍精度であると決めているので,単精度 の実数変数 ? に倍精度の値 や を代入するにあたっては - のように単精度であることを 指定するか K" ! のように倍精度の値 を単精度に変換 キャスティングという する必要 がある. 記号 > 意味 改行 >6 復帰 # 改ページ 66 タブ文字 1': 1重引用符 L 2重引用符 H バックスペース 記号 文字の "/ 表現 は 進表現の1桁 表 : エスケープシーケンス 文字型変数とエスケープシーケンス では で定義される文字型変数がもつ値も "/2バイト で表されるので,文字 型変数には英文字や数字の他に漢字も代入することができる.コンピュータには直接にキーボー ドから入力することができない特殊な文字,たとえばタブや改行を表す文字,あるいは が文 第章 変数と演算 法上用いる文字, 「 L」や 「」などは表 に示すようなエスケープシーケンスを使って代入する ことができる.この表からわかるように,エスケープシーケンスは「」文字からで始まっている. 「> 」記号は「>」のように表す. たとえば, 「」 記号は「」, 【プログラム例 】 , . !) /0#. A'A4A5A6A72 @>$>2 '@> 亜>2 4@>>2 5@>>>2 6@>66>2 7@>5 >2 )& ! はD Dです#2 "" を出力 )& !' はD'Dです#2 "" ' を出力 )& !4 はD4Dです#2 "" 4 を出力 )& !5 はD5Dです#2 "" 5 を出力 )& !6 はD6Dです#2 "" 6 を出力 )& !7 はD7Dです#2 "" 7 を出力 3 3 文字変数に直接 "/ を用いて値を代入することも可能である.このときは, 「」のよ うに表す。ここで,???? は "/ の 進数表現である.英数字は表 に示す ' コード の前に「」をつけ加えたものが "/ になっているので,たとえば「」を "/ で代入す 「'」は「5 」となる. るときには「66」のように表す.同様に, 型変換 整数型変数の値を実数型に型変換をしたり,逆に実数型変数の値を整数型に変換したりすると きにはキャストという方法を用いる.たとえば, を整数型 !,? を倍精度実数型変数であると する.このとき, を ? に代入するときには ?J/"4 とし,逆に ? を に代入するときには J ! ? とする.このときには,実数 ? の値は小数点以下切り捨てられて整数となる.このよう な型変換の方法は明示的型変換とよばれる. 明示的型変換をしなくても,自動的に型変換がされる場合もある.たとえば,単精度実数型変数 K" ! の値を倍精度実数型変数に代入するときには明示的に型変換をする必要がない.すなわち, ? を倍精度実数型変数, を単精度実数型変数とする.このとき, を ? に代入するときには ?J と表す.この変換は単精度実数型変数の値から倍精度実数型変数の値に精度が大きくなる方向 への変換であり,拡張型変換なので自動的に型変換が行われる.しかし,逆に ? を に代入する 変数と型 ' 4 5 6 7 B C EFG )()LM ,LM ,(L ,EJ $Q N,G N) L$N GU ?L UU O )( )Y G, ' 4 5 E$Q )SE ,LN $E ,X )FN ,) U) V) O) F) 表 ' )8 1 P = R T > ! # 9 D A " 4 ' 4 5 6 7 B C 2 [ @ * ^ ' 5 H $ N , U V Y Z Q G X E ( 6 8 J O ) L F ? W M S : / 0 \ < 7 I % B K & ; . + 3 ] ,G 文字コード表 ときには J ? とすると文法エラーとなる.この変換は精度が小さくなる縮小型変換なので,自動 的に変換することはできない.ただし,明示的に JK" ! ? とすることは可能である.型変換の 例をプログラム例 に示しておこう.このプログラム例を見ると型変換の方法がわかるだろう. 【プログラム例 】 . !) /0#. A2 A&2 A2 @'2 @4 52 @ '452 &@!# 2 "" A は整数型変数 "" A& は倍精度実数型変数 "" A は単精度実数型変換 第章 @! # 2 @2 @&2 変数と演算 "" この文は誤り )& !&@D "" & の値を出力 )& !@D#2 "" の値を出力 )& !@D#2 "" の値を出力 3 3 定数 前節で学んだ変数は,一度定義された後にプログラム中でその値を変更することができる.し かし,プログラム中で決して値を変わらない数を変数として扱うと,予想しないところで変数の 値が書き換えられ,なかなか発見できないバグの原因になることがよくある.変更しない値を定 数として定義することで,プログラム中に値を変更する操作が記述されているとコンパイラがエ ラーで知らせてくれる.定数を定義するためには,定義文の前に 修飾子を付ける プログ ラム例 参照. 【プログラム例 】 . !) /0#. @4 5 62 "" 円周率πを定数として定義する GA2 "" これらは変数 @ 2 G@ 92 "" に を掛けた値を G に代入 )& !直径DDの円の円周の長さはDGDです。#2 3 3 算術式と算術演算子 算術式と算術演算子 変数間および定数と変数の間の2項算術演算子は,足し算 D,引き算 ,かけ算 9,わり算 " , 余り R の 種類であり,それらの間の優先順位は通常の数学における優先順位と同じであ る.これらの演算子は整数 (*"%! 型, ! 型, "0 型,実数 K" ! 型,倍精度実数 /"4 型 の データ型に関わらず同じ記号を使うことができる.ただし,剰余については,整数型にしか用い ることができない.これらのデータ型変数を混合して使用するときは,データ長の短い型のデー タは長い方のデータ型に変換される.ただし,代入文においてデータ長の長い変数を短い変数に 代入するとエラーとなり,データ長の短い変数を長い変数に代入すると長いデータ長に変換され るが,この機能を余り使わずに, 項で説明した型変換 キャスト を使って明確に型変換をす るよう心がけること.算術演算子とその優先順位を表 にまとめておく. 演算子の優先順位 演算子 9,",R (乗算,除算,余り) D, (加算,減算) 高い 低い 表 算術演算子とそれらの間の優先順位 整数 を整数 で割るときには注意が必要である.たとえば '"4 は整数間のわり算であり,結果 は整数化されて となる.数学で期待するようにこの商を としたいときには '"4 とする.あ るいは整数型変数間のわり算の場合には型変換 キャスト を用いて,!# " !# のように表す. 数学における計算と同様,演算の順序にも注意が必要である.たとえば,式 J J を代入したときの値を計算したいときには,次のようにプログラムを書く. 【プログラム例 】 ,K . !) /0#. A&2 "" A& は倍精度実数型変数 @42 &@!'9D4#"! #D992 )& !@DD &@D "" と & の値を出力 3 D D に 第章 変数と演算 3 このプログラムでは @4 と実数であることを明示している.@4 と書くことも可能であるが,常 にそれが実数であるか整数であるかを意識してプログラミングをするように心がけるべきである. 標準入出力 標準入出力を行うためのメソッドを説明しよう.ここで,標準入力はキーボードからの入力 を意味し,標準出力はディスプレイ コンソール画面 への出力を意味する.標準出力メソッド )& はこれまでにも使ってきたがまとめて説明をしておこう. 標準出力 標準出力メソッド 関数)& はすべての変数を文字列に変換して出力するメ ソッドである.したがって,いくつかの変数の値を出力するときには,文字列の連結演算子「D」 により連結して出力する.基本的な書式は, )& !文字列を2重引用符で囲む#2 ""このときは文字列を出力後 改行しない )& !文字列をDつなぐこともできる#2""このときは文字列を出 力後改行する である.変数や定数の値を出力したい場合は,このメソッドが変数の値を文字列に変換するので, 挿入したい箇所に, 「D」で連結して順番に変数を並べればよい. )& !整数は の値はD Dであり,実数 の値はDDである。#2 次のプログラムを実行してみよう. 【プログラム例 】 ) . !) /0#. 2 @>$>2 "" は文字型変数 標準入出力 )& !文字型を文字で表示するD#2"" を出力 )& !文字型をコードで表示するD! ##2 "" >$> の $)YY コードを出力 3 3 標準入力 キーボードから数値や文字を読み込むとき, ではすべての変数の値を文字列として読み込 む. における標準入力の概念は多少複雑なので,ここでは次のプログラム例を通して入力の 方法を学び,今後標準入力を行うときはこれらの例を変更して使用するにとどめよう. 【プログラム例 】 92 ) . !) /0#. 2 2 @Y!#2 @U!#2 )& ! @D#2 )& ! @D#2 3 Y!#. @2 Y)O @ Y)O!)& #2 NO @ NO! #2 & . )& !Y #2 @YY!G !##2 3 !, #. )& !#2)& ! #2 第章 変数と演算 3 2 3 U!#. @2 Y)O @ Y)O!)& #2 NO @ NO! #2 & . )& !Y #2 @UU!G !##2 3 !, #. )& !#2)& ! #2 3 2 3 3 このプログラムをコンパイルして実行し,キーボードから つの整数を入力して改行キーを押し た後, つの実数を入力して改行キーを押すと,実行結果が出力される.ここでは,実行時にキー ボードから何を入力していいのかわかりにくいのを避けるため,キーボードから入力すべきデー タを明示するための出力を付け加えてある. ここまでの復習を兼ねていくつかの例題を考えてみよう. 【例題 】 整数 をキーボードから読み込み, から までの和 を式 J D により計 算するプログラムを作れ. 【解答例】 演算子の優先順位に注意してプログラムを作る. 92 Y . !) /0#. A2 "" A は整数 標準入出力 )& !整数を1つ入力して下さい#2 @Y!#2 @!9!D ##"'2 )& ! から DD までの和はD#2 "" の値を出力 3 Y!#. @2 Y)O @ Y)O!)& #2 NO @ NO! #2 & . @YY!G !##2 3 !, #. )& !#2)& ! #2 3 2 3 3 【例題 】 球の半径 実数 をキーボードから読み込み,球の体積 ラムを作れ. 【解答例】 92 ? . !) /0#. @4 5 6'7642 A2 "" A は倍精度実数型 )& !半径を入力して下さい#2 J を計算するプログ 第章 変数と演算 @!#2 @59 999"42 )& !半径 DD の球の体積はD#2 "" の値を出力 3 !#. @2 Y)O @ Y)O!)& #2 NO @ NO! #2 & . @!G !##2 3 !, #. )& !#2)& ! #2 3 2 3 3 付録 英数文字・整数・実数の内部表現 コンピュータの内部 #'C&C@ など で英数文字や整数・実数などのデータを記憶した り,記録したりするためには,電気素子の電圧や磁気の状態の違いを利用している.ほとんどの コンピュータでは, つの異なる状態を使ってデータを表しており,それらを模式的に 電圧が 低い,"M など と 電圧が高い," など で表現する.このように使用できる数字が つのとき は,データを 進数で考えると便利である. 進数では, と表すと, J を意味する.たとえば, 進数で D と表せば, J D D D D となって, 進数の を表している.すなわち, 進数の 番下の桁は を表し, 番目の桁は を表している.また,それぞれの桁をビット 4 ! と を表しており,右から 番目の桁は 呼ぶ. 英数字の内部表現 コンピュータでは,しばしば 進数の桁を 個づつひとまとめに数えることが多く, 個の ビット 4 !( を バイト 43! という.たとえば, は 進数で となるが, 進数で バイトの数を表すと大きな数になるので, ビットずつ区切って, として, ビットずつ つに分けて表す.このとき, J D となって, 進表現を使うことになる.これを J : J のように,英文字 ' から 6 までを から までの数字の代わりに使用する.すなわち, J ' , J : , J , J , J A , J 6 とする.また, 進数 : を ?: のように, 進数字の前に ? をつけて 進数であることを表現することもある. 英数字の内部表現 では "/ を採用しているので,英数字を バイトで表現する.しかし,英数字の場合 には前の バイトは となるので,ここでは後ろの バイトだけを考える.それぞれの英数字は 表 のアスキー表で 進数と英数字の対応を表されている.たとえば,英字 L'L はこの表の第 列第1行にあるので,? となる.すなわち,列は 進数の第 桁目を表し,行数は第 桁目 を表す.同様に,L L は ? であり,小文字はそれに対応する大文字よりも 進数で だけ大き な数に対応している.第 列目と第 列目は英数字では表すことのできない特殊文字であり,周 辺機器の制御やデータの特殊な意味に使用する.たとえば,?66 A> はコンピュータができ た初期の頃には, 文字前に戻って,消すことを意味するために用いられた. は改行の意味で 使用してきたが,アスキーコードでは ?/ である.また, はヌル と呼ばれて,文字列 の終わりを表すのに用いる. 文字のビット配列を表示するプログラムを示しておこう.このプログラム中ではビット演算や まだ説明をしていない の文法を用いているために,プログラムを詳しく説明しない.このプ ログラムを実行してビットの配列を確かめるのに役立てていただきたい. 1文字 * % !% のビット配列を表示するプログラム N ( . !) /0# . @>$>A '@>>>$>2 2 @C2 )& ! #2 N ! A #2 )& ! '#2 N ! 'A #2 3 第章 変数と演算 N ! A # . /0 @ / 702 @A @ 2 [[@ 2 ! 1@ # . !! T #1@ # / DD0@> >2 / DD0@>>2 **@ 2 3 )& !N #2 )& ! #2 )& !#2 3 3 整数の内部表現 ここでは, バイト ビット の整数 ! 型 の内部表現について見てみよう. ! 型整数を表す ビットの内の最上位ビット 右から数えて 桁目 は正負の符号を表すのに用いられており, このビットが のときは正の整数を示し, のときは負を表す. 正の整数を考えると,最上位ビットは であり,残りの ビットがその絶対値を表す.絶対値は 通常の 進数表現と同じで,たとえば,正の数 は J ? と表される.したがって, ! 型の整数の最大値は J ?6666666 J である. 負の整数は最上位ビットが である.残り ビットについて, をすべて に, をすべて に 変更 ビット反転 したのち, を加えたものが負の整数の絶対値を表す.たとえば, J ?6A 実数の内部表現 はビット反転すると, J ? J となるので,これに を加え,負号 値は を付けて, である.したがって, J ? ! 型整数の最小 であり,ビット反転したのちに を加えて,負号を付けると, であることが分かる. 整数 バイト のビット表現を表示するプログラム例は次のようになるN 整数 バイト のビット表現を表示するプログラム 92 U2 ) N Y. !) /0 #. 2 2 @ 62 ) @2 )& ! @ D#2 ) @YN &) !#2 @ !#2 ) ;@ ! #2 )& !N D;D #2 3 3 実数の内部表現 では実数には /"4 を用いるが,あまり多くのビット数を取り扱うと分かりわかりにので, K" ! 型 バイトJ ビット の実数の内部表現について説明する. K" ! 型実数でも, ビット の内の最上位ビット 右から数えて 桁目 は正負の符号を表すのに用いられる.このビットが のときは正の実数を示し, のときは負を表す.残り, ビットが絶対値を表す. 実数を と表すとき,その絶対値は であるが,ここで を仮数, を指数と呼ぶ.絶対値を表す ビットの内,上位 ビット 左から数えて、 ∼ ビットまで は指数を表し,残りの ビットが 第章 変数と演算 仮数を表す.すなわち, ビットの左から 桁目を とし, 桁目から 桁目までを A,残り 桁目から 桁目までを とすれば,それらがそれぞれ,符号 ,指数 A,仮数 を表す ことになる. A と を求めるために,実数を 進数で表現する.たとえば, J の場合, 進数表現は J J である.仮数部は であるが,コンピュータの内部では最初の を省略するので J となる.指数部は であるが,指数部には のバイアスをかける.すなわち,A は 表す 進数で表現する.これは A J D を と表される. と A および を左から並べて表すと,実数 のビット表現 J が得られる. 次のプログラムは単精度実数 バイト のビット配列を表示するプログラムである. 単精度実数 バイト のビット配列を表示するプログラム 92 92 U2 ) N U. !) /0 #. 2 2 2 @ ''62 ) @2 )& ! @ D#2 @ULYN !#2 ) @YN &) ! #2 @ !#2 ) ;@ ! #2 )& !N D;D #2 3 3 第 章 演習問題 問題 キーボードから ∼ の整数を読み込み,その整数を文字型として出力するプログラムを 作れ. 問題 つの実数 , をキーボードより読み込み,それらの和 D ,差 ,積 ,商 を求めて出力するプログラムを作れ. として を入力するとどのような結果が得ら れるか調べよ. 問題 問題 問題 つの整数 , をキーボードより読み込み,それらの積 と商 および余りを求めて 出力するプログラムを作れ.このとき, として を入力するとどのような結果が得られる か調べよ. 整数 をキーボードより読み込み,その2乗 を出力するプログラムを作り, としてい ろいろな値を入力してその結果を確かめよ.自分が期待する値と異なる結果が得られたり, エラーが生じることがある.その整数 の値と2乗の値 を書け. 実数 をキーボードより読み込み, J D D D の値を求めるプログラムを作れ. 第 章 数学関数・書式指定出力 数学では関数という考え方を用いる.関数では独立変数の値を決めると関数値 従属変数 が決ま る.プログラミングの過程においても,ある つまたは 組の変数の値を与えると つの値が決 まる関数があればプログラミングがずいぶんと容易になり,簡潔になる. はオブジェクト指 向プログラミング言語なので 言語などで関数に相当するものをメソッドと呼ぶが, でもい くつかの数学メソッドが !* クラスというクラスの中で用意されている.この章では数学関 数の使い方について説明する. は 71> などの 環境で使用されるため書式指定入出力 はあまり行われないが,簡単に書式指定出力についても説明を行う. 数学関数 では,いくつかの関数が !* クラスのメソッドとしてあらかじめ用意されており,それら を簡単に利用することができる.三角関数などの数学関数を用いるためには, X の後ろに数 学関数名をつけて呼び出す.プログラム例 は,X !# メソッドを使用する例である. 【プログラム例 】 X . !) /0#. @X 8Y2 A&2 "" πの値 "" A& は倍精度実数型 @ "'2 &@X !#2 "" !# の値を代入 )& ! ! DD # は D "" !# の値を出力 3 3 第章 数学関数・書式指定出力 クラスで定義されている数学関数の代表的なものを表 にまとめておこう.この表で, A & は倍精度実数型 /"4 , は倍精度実数型 /"4 ・実数型 K" !・8バイト整数型 "0・4バイト整数型 ! のうちのいずれかの型を表す.これらの関数に与える入力値 たと えば X !# の のような関数に与える変数のことを引数と呼ぶ.多くの数学関数の引数 の型は 型であり,計算結果の関数値 戻り値 も 型の値になる. !* 書式 X !# X !# X !# X !# X !# X !# X '!&A# X !# X !# X !A&# X K!# X !# X !# X !# X !# 説明 の正弦 ( , の単位はラジアン の余弦 "( , の単位はラジアン の正接 ! 0!, の単位はラジアン ( , の範囲は 2 5 "( , の範囲は 2 5 ! ,関数値の単位はラジアン,関数値の範囲は ! ,関数値の単位はラジアン,関数値の範囲は ,関数値の範囲は 2 5 ,関数値の範囲は 2 5 指数関数 の自然対数 の 乗 "0 の絶対値 の平方根 2 5 2 5 以上の最小の整数 以下の最大の整数 以上 未満の実数 一様乱数 表 数学関数 数学関数の中には三角関数も含まれている. X !# 関数や X !# 関数を使って, 極座標 を直交座標 に変換するプログラムを作る例題を考える. 【例題 】 極座標 を直交座標 に変換するプログラムを作れ. 【解答例】 J "( ( であることを用いる. X ' . !) /0#. A&AAA2 @X 8Y2 "" A&AAA は倍精度実数型 "" @π 数学関数 @ 2 @562 @" C 9 2 @9X !#2 &@9X !#2 "" "" "" "" "" 原点からの距離を代入 角度を代入 角度をラジアンに変換 座標を計算 & 座標を計算 )& ! 極座標 !DDADD# は#2 )& !直交座標では !DDAD&D# である.#2 3 3 3 数学関数 !# は逆正接であり, J ! を満たす の値 を返す関数で ある.この関数を用いて の値を求めるプログラムを作る次の例題を考える. 【例題 】 【解答例】 ! の値を J J %! から計算するプログラムを作れ. であることを用いる. X 4 . !) /0#. 2 @X ! #952 "" πを !# とおく "" 原点からの距離を代入 )& !πの値はD Dである.#2 3 3 3 第章 数学関数・書式指定出力 書式指定出力 コンピュータ内部では,英数文字はアスキーコードで表現されており,整数や実数は多くの場合 AAA の規格によって「」と「」のビット列 型なら バイトJ ビット で表現されて いる.)& メソッド 関数 などを用いてこれらの変数がもつ値を通常の数学で 表すような 進法などで出力を行うときはコンピュータがこれらのデータを文字列に変換して出 力する.これまで用いてきた )& !#2 では,実数 が のとき 桁まで 表示し, のとき 桁まで表示する.書式指定出力を用いるとデータの出力形式を詳細に 指定することができる.書式指定にはクラス . 6"%. ! を用いる. 書式指定出力を具体的に知るために次の例題を考える. 【例題 】 J および J ログラムを作れ. のときの ?$ の値をそれぞれ小数点以下 桁で出力するプ 【解答例】 クラス . 6"%. ! を用いて書式変換を行う.このクラスは という パッケージの中で定義されているので次のプログラムのように 9という命令 が必要である. 92 . !) /0#. &A @ 2 ) A&2 "" は変数の定義と同時に初期値を代入 U <@ U!#2 &@X !#2 "" !# を計算して & に代入 @<!#2 "" 書式変換 &@<! "" 書式変換 )& !!DD#@D "" 書式変換して画面に出力 @42 &@X !#2 "" に4 を代入して同じことを繰り返す. @<!#2 "" 書式変換 書式指定出力 &@<! "" 書式変換 )& !!DD#@D "" 書式変換して画面に出力 3 3 【実行結果】 ! # !4# @'B C4 @5C 整数の書式付き出力の例として1から までの和を計算する次の例題を考える. 【例題 】 から までの和を計算して 桁で出力するプログラムを作れ. 【解答例】 から までの和は公式 D で求める.和は2桁なのでその前に を3つ付け て出力することにする. 92 . !) /0#. A@ 2 ) 2 @!!D #9#"'2 U <@ U!#2 @<!#2 "" 書式変換 )& ! からDDまでの整数の和はD#2 "" 書式変換して画 面に出力 3 3 第章 数学関数・書式指定出力 【実行結果】 から までの整数の和は 66 この例では,計算結果の は2桁の値であったが, によって 桁の出力を指定している ので, 桁に満たない場合は が左側に埋められる.書式を変換しなければ,数値の桁数に合わ せて出力される. 第 章 演習問題 実数 をキーボードより読み込み, J 求めるプログラムを作れ. 問題 問題 問題 J 問題 実数 をキーボードより読み込み,小数点以下第 桁目で切捨てて出力するプログラムを 作れ. 問題 実数 を読み込み,その小数部のみを出力するプログラムを作れ.ただし,結果は小数点 以下 桁目までを出力し, 桁目以降に が出力されないように注意すること. 問題 英大文字 '9 の1文字をキーボードから読み込み,小文字に変換して出力するプログラム を作れ 表 を参考にして,大文字の文字コードにD すると小文字になることを利用す る..キーボードから1文字を読み込むには次のメソッドを使用する. 実数 をキーボードより読み込み,その自然対数 "0 と常用対数 びそれらの比 "0 "0 を出力するプログラムを作れ. "0 およ の つの の値と ( の値の表を作れ.ただし,いずれも数値は小 数点以下 桁まで表示すること. !#. @> >2 Y)O @ Y)O!)& #2 NO @ NO! #2 &. )& !Y #2 @!G !## $!#2 3 !, #. )& !#2)& ! #2 3 2 3 第 章 手続き型プログラミングと 図・逐次 構造 や などは手続き型言語と呼ばれるのに対して. や DD などのコンピュータ言 語がオブジェクト指向型言語と呼ばれる.しかし,オブジェクト指向言語においてもクラスを実 装するときには手続き型アルゴリズムが重要である.アルゴリズムには つの基本構造がある. それらは逐次構造,選択構造および反復構造である.プログラミングの構造はなるべく逐次構造 となるように設計すべきである.そのためには構造化プログラミングという方法を用いる.構造 化プログラミングを行うためにはメソッド 関数 を用いる.この章ではアルゴリズムの作成, &' 図と逐次構造について学ぶ. 6"%!% アルゴリズムの作成ー概略設計から詳細設計へ(段階的詳細化) コンピュータが普及し始めた 年代まで,プログラム設計にはフローチャートを用いてきた. その後,フローチャートではアルゴリズムの正確さを確かめるときに,すべての場合分けの チェックにおいて場合漏れの生じる可能性のあることが指摘され,現在では &' 図が用いられて いる.&' 図 &%"4 . ' 3( ( 0% ., 問題分析図)とは,アルゴリズムをその基本 構造 である処理 連接・反復・選択)に分解し,図形的に表現することにより,問題分析やコーディン グおよびプログラムの可読性に効果を発揮する開発技法である. &' 図の表記には図 に示す ような基本的な箱 処理箱,入力箱,出力箱,選択箱,反復箱)を用いる. 処理箱には計算式などの処理内容を記述し,入力箱には入力する変数,出力箱には出力する変数 や文字列を記入する.選択箱には分岐する条件 論理式 を記入し,論理式が真 1% と偽 6 ( の場合の処理箱につなぐ.反復箱には反復変数の初期値と最終値および増分または論理式 を記述する. つの基本的アルゴリズム アルゴリズムにはできる限り逐次構造を用いるように努力する必要があるが,これだけではすべ てのアルゴリズムを記述することが不可能なので選択構造と反復構造も用いる. 第章 処理箱 手続き型プログラミングと &' 図・逐次構造 入力箱 選択箱 図 &' 出力箱 反復箱 図の基本的な箱 逐次構造 ,連接 逐次構造はトップダウン構造とも呼び,処理 ',:,, のように順次処理を行う最も単純な アルゴリズムである.逐次構造は図 のように表される. 選択構造 選択構造は条件によって処理する内容を分けるのに用いられる.処理を つの場合に分けること が多いが,3つやそれ以上に分けることもある.選択箱には分岐する条件 を記述し,条件によ りそれぞれ行う処理を記述する処理箱を繋げる.最も簡単な選択構造では は論理式であり,論 理式が真 1% の場合と偽 6 ( の場合に行う処理を記述する. 反復構造 ,! コンピュータでの情報処理には同じ処理をパラメータを変えながら繰り返す処理が多い.このと き反復構造を用いる.反復箱には条件 を記述し,その条件が満たされている場合に繰り返し行 う処理を処理箱として繋げる.最も簡単な繰り返し構造は,変数 にその初期値を与えてある処 理を 度行うごとに に増分を加え 引き, があらかじめ指定された最終値になるまで繰り返 すアルゴリズムである. 呼出箱とメソッド 関数 ' : 図 逐次構造の &' 図 真 ' $ 偽 : 図 選択構造の &' 図 呼出箱とメソッド 関数 いくつかの処理や選択構造・反復構造などをまとめてメソッド 関数 とすることにより,メイン のアルゴリズムを逐次構造として書き表すことができる.関数は次節で説明する概略設計と詳細 設計の方法の実現手段でもある.関数の &' 図は図 のように表す. 概略 図と詳細 図 大規模プログラムを書くときには,アルゴリズムが煩雑となることが多いので最初から詳しい &' 図を作成することはせず,概略 &' 図を書き,概略 &' 図のそれぞれの部分を詳細 &' 図で表して全体のアルゴリズムを構成する.概略 &' 図を書くときは,全体のアルゴリズムの うちであるまとまった処理を参照箱を用いて記述し,参照箱のそれぞれについては定義箱の右側 に詳細 &' 図として記述する 図 .すなわち,メインルーチンで 参照箱に出会ったら,そ 第章 手続き型プログラミングと &' 図・逐次構造 $ ' 図 反復構造の &' 図 6 6! " 6 ' 図 関数を表す &' 図 の定義箱にある処理を実行することになる. 逐次構造プログラミング 問題を解析し,その問題を解決するためにコンピュータプログラミングを始めるときにはなるべ くアルゴリズムが逐次構造となるように努める必要がある.この節ではいくつかの例を通して逐 次構造プログラミングの方法を学ぶことにしよう.いうまでもないが,コンピュータプログラミ ングによりある問題を解決しようとする場合にはプログラミングの知識や技術だけでなくその問 題についての深い洞察力が最も重要である.次の例題を考える. 【例題 】 角形の 辺の長さ とその狭角 Æ をキーボードから読み込み,その面積 を計 算するプログラムを作れ. 【解答例】 2辺 と狭角 Æ が与えられたとき,その 角形の面積 は J ( で与えられ る.ただし, の数学関数 X !# の引数 は Æ 度 でなくラディアン単位で与える必要 があることに注意する. 逐次構造プログラミング ' # # 参照箱 定義箱 : 図 概略 &' 図と詳細 &' 図 92 )K . !) /0#. AAAA2 "" 変数 AAAAAA は倍精度実数型 @X 8Y2 "" @π )& !一辺の長さ を入力してください:#2 @!#2 )& !他の辺の長さ を入力してください:#2 @!#2 )& !間の角 を入力してください:#2 @!#2 @9 " C2 "" 角度のラジアンへの変換 )& ! の長さ@D#2 )& ! の長さ@D#2 )& ! 角度 @DDラジアン#2 @99X !#"'2 "" 面積の計算 )& !面積@D#2 "" 計算結果の出力 3 !#. @2 Y)O @ Y)O!)& #2 NO @ NO! #2 & . @!G !##2 3 第章 手続き型プログラミングと &' 図・逐次構造 たとえば, 辺が の正三角形の面積は であることがわかっているので, J J , Æ J と入力すると,計算結果が面積@ B4'6CB67CCBB' とほぼ正しい値が得られる. 一見すると選択構造 文 を用いないと書けないと思われる問題もよく問題を吟味すれば逐次 構造のみで記述できる場合がある.そのようなときは逐次構造のみを用いてプログラミングする ことが望ましい. 【例題 】 キーボードより整数 を読み込みその整数の桁数を出力するプログラムを作れ. 【解答例】 整数 の常用対数 "0 を小数点以下切り捨てて を加えた数がその整数の桁数で あることを用いる.ただし, には数学関数 "0 が定義されていないので,式 "0 J "0 "0 を用いる. 92 E . !) /0#. A2 "" 変数 A は整数 )& !自然数 を入力してください:#2 @Y!#2 @! #!X !#"X ! ##D 2 "" 対数を用いた桁数の計算 )& ! の桁数@D#2 3 Y!#. @2 Y)O @ Y)O!)& #2 NO @ NO! #2 & . @YY!G !##2 3 !, #. )& !#2)& ! #2 3 2 3 逐次構造プログラミング 3 この例のように,選択構造を避けてプログラミングをするとアルゴリズムが単純になり,たとえ 大きなプログラムを書くときにもデバッグ 虫取り,プログラムの誤りを見つけて訂正すること が容易になる. 次の例題も少し考えると選択構造を避けて簡単にプログラミングができる問題である. 【例題 】 小数点以下 桁まで含む正の数をキーボードより読み込み,小数点以下 桁を四捨 五入し小数点以下 桁数の数を出力するプログラムを作れ. 【解答例】 型変換 ! # を用いれば,実数の小数部を切り捨てて整数に変換することができる. 四捨五入をするためには,実数に を加えて切り捨てを行えば四捨五入と同様の操作になる. キーボードより読み込んだ実数 を 倍して,四捨五入 加えたものを小数点以下切り捨て した後 で割ることにより小数点以下 桁を四捨五入した数を得る. 92 O . !) /0#. A2 "" 変数 A は倍精度実数 )& !実数を入力してください:#2 @!#2 @!9 #D62 @!! # #" 2 "" 倍して 6 を加える "" それを整数に変換すれば四捨五入できる "" 最後に で割って桁を元に戻す )& !小数点以下2桁目を四捨五入します。#2 )& !結果はDDです#2 3 !#. @2 Y)O @ Y)O!)& #2 NO @ NO! #2 & . @!G !##2 第章 手続き型プログラミングと &' 図・逐次構造 3 !, #. )& !#2)& ! #2 3 2 3 3 第 章 演習問題 問題 平面上の 点の座標 と が与えられたとき,それらの 点を結ぶ線分の長 さ を計算するプログラムを作れ. 問題 問題 問題 問題 平面上の 点の座標 , , が与えられたとき,それらの 点を頂点 とする三角形の重心と面積を計算するプログラムを作れ. 実数 を読み込み, なら , なら を出力するプログラムを作れ.ただし, J の場合は考えない.また,次章で説明する選択構造 を用いないこと. ラジウム # の半減期は 年である, 205 のラジウムが 205 になるまでの年 数を計算して出力するプログラムを作れ.ただし,1年以下の期間は切り捨てとする. 長さ 2.5 の軽い糸に結ばれた質点が単振動をするときの周期 を計算するプログラムを作 れ.ただし,重力加速度を J 2.C( 5 とする. 第 章 選択構造 選択構造はある定められた条件により異なる処理を行うために用いる.条件の判断には条件式を 用いる.条件式が真 1% のときと偽 6 ( のときにそれぞれの処理を行う.昔,アルゴリズ ムをフローチャートで表していたときは,選択構造は処理の流れを分岐させるために用いられて いた.この章で条件式の作り方と選択構造プログラミングの基本について学ぶ. 条件式と関係演算子 で条件判断を行う文として, 文と 文が用意されている. 文は「もし∼ならば ∼をする」という判断を行う.一方, 文は,いくつかの候補の中から当てはまる場合の処 理を実行する. では, 文の「もし∼ならば」での判断を行う内容を条件式を用いて記述 する. 文の最も単純な構文は, !条件式 .じょうけんしきH条件式3# 文2 である.このとき,条件式の内容が真 式が成立している であれば,その後の文を実行する.し かし,条件式が偽 式が成立しない であれば,その後の文は実行せず次の行へ処理を移す.また, 条件を満たした場合に複数の文を実行させたい場合は, !条件式#. 文 2 文 2 文 2 3 のように,括弧 . 3 を用いて,複数の文を記述する. 条件式は,一般に関係演算子 @@, 1@, [@, *@, [, * を用いて関係演算子の前後の数値あるいは文 字の大小関係あるいは順序関係が吟味される,関係演算子の使用例と意味を表 にまとめる. またこれらの関係式を用いたプログラム例を示す.このプログラムでは入力された整数が の倍 数かどうかを判断する. 【プログラム例 】 第章 関係演算子 @@ 1@ [@ *@ [ * 意味 等しい J 使用例 等しくない J 以下 以上 小なり 大なり 表 @@ 1@ [@ *@ [ * その意味 と 4 は等しい と 4 は等しくない は 4 以下 は 4 以上 は 4 より小さい は 4 より大きい 関係演算子一覧 92 ) . !) /0#. 2 "" 変数 )& !自然数 は整数 を入力してください:#2 @Y!#2 ! R @@ # )& ! Dは の倍数です#2 ! R 1@ # )& ! Dは の倍数ではありません#2 3 Y!#. @2 Y)O @ Y)O!)& #2 NO @ NO! #2 & . @YY!G !##2 3 !, #. )& !#2)& ! #2 3 2 3 3 選択構造 条件式と関係演算子 関係演算子 @@,1@,[@,*@,[,* の優先順位は,算術演算子 D,,9,",R よりも低い.し たがって,たとえば @' のとき R @@ は真となる. もっと複雑な条件判断を行いたい場合がある.ここでは,入力された整数が と の公倍数がど うかを調べる例を考えてみる.まず の倍数かどうかを判断して, の倍数であればそれが の 倍数でもあるかどうかを判断する.このように 文の中に 文を入れ子にすることもできる. 【プログラム例 】 92 ) . !) /0#. 2 "" 変数 )& !自然数 は整数 を入力してください:#2 @Y!#2 ! R' @@ #. ! R4 @@ #. )& ! Dは ' と 4 の公倍数です#2 3 3 3 Y!#. @2 Y)O @ Y)O!)& #2 NO @ NO! #2 & . @YY!G !##2 3 !, #. )& !#2)& ! #2 3 2 3 3 このような複合的な条件判断を行うときに, 文を入れ子にするよりも,論理演算子を用いれば 第章 選択構造 「∼または "%∼」の 種類があ 簡単に記述できる場合がある.論理演算子は「∼かつ /∼」, る.また否定を表す否定演算子を用いれば「∼でない "!」を表すこともできる.これらの演算 子を表 にまとめる.これを用いれば,プログラム例 はより簡単に次のように書ける. 演算子 条件式 論理演算子 TT ++ 1 'B # 論理演算子 否定演算子 表 意味 使用例 かつ 4 または 4 ではない !* TT &@@# ![ ++ &1@# !1!@@ TT &@@ ## 論理演算子と否定演算子 【プログラム例 】 92 )' . !) /0#. 2 "" 変数 )& !自然数 は整数 を入力してください:#2 @Y!#2 ! R' @@ TT R4 @@ #. )& ! Dは ' と 4 の公倍数です#2 3 3 Y!#. @2 Y)O @ Y)O!)& #2 NO @ NO! #2 & . @YY!G !##2 3 !, #. )& !#2)& ! #2 3 2 文 3 3 論理演算子 TT,++ の優先順位は,関係演算子 @@,1@,[@,*@,[,* よりも低い.また,否 定演算子 1 の優先順位は,算術演算子 D,,9,",R よりも高い.これまでに紹介してきた 演算子の優先順位を表 にまとめておく. 優先順位 演算子 ! # 1,!データ型名# 9,",R D, @@,1@,[@,*@,[,* TT ++ @ 表 説明 括弧 否定,型変換 乗算,除算,余り 加算,減算 比較 論理的 'B 論理的 # 代入 演算子の優先順位 ここまでの説明をまとめると, 文は最も単純な選択構造であり,条件式 が真であるときに文 $ を実行する.その形式は ! # $ 2 となる.このときの &' 図は図 で表される.また,次のように括弧. 3によるブロック構 造を用いて,複数の文を実行させることができる. ! #. $ 2 $'2 $42 3 文 文は あるいは 文などと共に用いて,ある指定した条件式 の真偽により異なる 処理を行う目的で使用する.その最も単純な形は 第章 選択構造 真 ' $ 図 選択構造 論理 文 の &' 図 ! # . $ 3 . N 3 のように表すことができる.ここで,処理 $ および処理 N は複数個の処理 複文 であってもよい. このときの &' 図は図 のように表される. 真 ' $ 偽 : 図 選択構造 最も簡単な 文 の &' 図 次の例題は選択構造 文 を用いる例題である. 【例題 】 キーボードから実数 を入力し, が負でないならばその平方根を出力し,負のと きには平方根を計算できないことを出力するプログラムを作れ. 文 【解答例】 92 )4 . !) /0#. 2 "" 変数 は倍精度実数 )& !実数 を入力してください:#2 @!#2 ! *@ #. )& !Dの平方根はDX K!#Dです#2 3 . )& !Dは負なので平方根は求まりません#2 3 3 !#. @2 Y)O @ Y)O!)& #2 NO @ NO! #2 & . @!G !##2 3 !, #. )& !#2)& ! #2 3 2 3 3 ブロック 文では つの論理式を使って図 の &' 図に示されるように つの場合に分けて 処理をすることも可能である.このとき, では, 「 」構文を用いる. 第章 選択構造 真 ' 真 $ : 偽 $ 偽 図 選択構造 つの場合分け の &' 図 【例題 】 キーボードより実数 を読み込み, が正なら , なら;,負なら と出力するプログラムを作れ. 【解答例】 読み込んだ実数 が正 でないときは, J の場合と の場合があ るので「 」構文を入れ子にする. 92 )5 . !) /0#. 2 "" 変数 は実数 )& !実数 を入力してください:#2 @!#2 ! * #. )& !入力値は正です#2 3 !@@# . )& !入力値は です#2 3 . )& !入力値は負です#2 3 3 !#. 文 @2 Y)O @ Y)O!)& #2 NO @ NO! #2 & . @!G !##2 3 !, #. )& !#2)& ! #2 3 2 3 3 コンピュータプログラミングではプログラミングの能力よりも,解決しようとする問題について の理解力の方が重要であることが多い.次の例題も基礎的な数学の力がないとできない例である. 【例題 】 方程式 のとする. J を解くプログラムを作れ.ただし , はキーボードから入力するも 【解答例】 この問題の解答は, J のとき J , J J のとき は任意の実数, J で J のとき解なしとなる. 92 )6 . !) /0#. A2 "" 変数 A は実数 )& !係数 を入力してください:#2 @!#2 )& !係数 を入力してください:#2 @!#2 !@@ TT @@ #. )& !解は任意の実数です#2 3 !@@# . )& !解なし#2 第章 選択構造 3 . )& !@ D!"##2 3 3 !#. @2 Y)O @ Y)O!)& #2 NO @ NO! #2 & . @!G !##2 3 !, #. )& !#2)& ! #2 3 2 3 3 文と 文を繰り返し用いることによって つあるいはそれ以上の場合分けをすることも 可能である. 【例題 】 キーボードより ∼ の整数を読み込み、その整数の英単語を出力するプログラムを 作成せよ.例えば のときはと出力すること. 【解答例】 92 )7 . !) /0#. 2 "" 変数 は整数 )& ! ∼6 の整数を入力してください:#2 @Y!#2 ! @@ #. )& !#2 3 ! @@'#. () !* 文 )& !#2 3 ! @@4#. )& ! #2 3 ! @@5#. )& !#2 3 ! @@6#. )& ! #2 3. )& !入力されたのは 6 以外の数字です#2 3 3 Y!#. @2 Y)O @ Y)O!)& #2 NO @ NO! #2 & . @YY!G !##2 3 !, #. )& !#2)& ! #2 3 2 3 3 文 例題 のように つの条件式の値によって多くの場合分けを行う場合は,先に述べた解答例の ように 文を多用するよりは, 文を用いるほうが適している. 文は,次の プログラムリストのように書き,条件式の値が,値 であれば 値 を実行し,条件式の値 に対応する ブロックを実行する. 文は文末がコロン になっていることに注意する. 各ブロックは つあるいは複数の文を記述することができ,最後に % 文で 文を終了 する.また,どの場合 にもあてはまらない場合のために, ブロックを用意してお くことができる . !条件式# ½ ブロックは省略可能であるが,通常は省略すべきではない. 第章 選択構造 . 値 文 2 %2 値 ' 文 '2 %2 値 4 文 42 %2 値 5 文 52 %2 文 62 %2 3 文を用いて例題 を解くプログラムを作ってみよう. 【解答例】 92 ) . !) /0#. 2 "" 変数 は整数 )& ! ∼6 の整数を入力してください:#2 @Y!#2 ! #. ' 4 5 6 )& )& )& )& )& )& !#2%2 !#2%2 ! #2%2 !#2%2 ! #2%2 !入力されたのは 6 以外の () !* 文 数字です#2%2 3 3 Y!#. @2 Y)O @ Y)O!)& #2 NO @ NO! #2 & . @YY!G !##2 3 !, #. )& !#2)& ! #2 3 2 3 3 文を用いれば条件式を つ書くだけでよいので,プログラムが見易くなるという利点があ る. 文は 文で代用することができるが,よりプログラムの修正やチェックが簡単な方 を選ぶべきである. 第 章 演習問題 キーボードより整数 を読み込み,その整数 が偶数なら,奇数ならと出力す るプログラムを作れ. 問題 問題 問題 問題 キーボードより整数 を読み込み,その整数が何桁の数であるかを出力するプログラムを 文を用いて作成せよ.ただし,整数 は ≦ ≦ であるとする. 問題 実数 をキーボードより読み込み,その平方根を求めて出力し,さらにその平方根を求め て出力することを 回繰り返すプログラムを作れ. つの実数 , , をキーボードから読み込み,方程式 D D J の解 を求めるプロ グラムを作れ. キーボードより整数 を読み込み,その整数を で割って余りが なら , な ら @ , なら @ 'と出力するプログラムを作れ. 第 章 反復構造 反復構造はあるパラメータ 変数あるいはデータ を変えながら同じ処理を繰り返し行うためのア ルゴリズムである.繰り返し処理はコンピュータが最も得意とする処理であり,プログラミング においてもこの構造を頻用する. には, 文, 文, 文という反復処理を 行う文が用意されている.この章では, 文と 文について説明する. $ ' 図 反復構造の &' 図 文による繰り返し 一般にプログラミングにおいて,反復構造は &' 図では図 のように表される. でもっ とも便利な反復構造は 文である. 文は,非常に柔軟な繰り返し処理を行うことができる が,最も単純な方法は つの繰り返し変数を用いて判定条件が満たされるあいだ繰り返し処理を 実行するものであり,次のように記述する. ! @ 2 [@ 2 DD#. 文 $2 3 ここで用いられている が繰り返し変数 カウンタ変数 で, 文の括弧 ! # の中は2つのセミ コロン 2 によって つの式に分けられる.最初に式はカウンタ変数の初期化を行うもので,最 初に 度だけ実行される.第 の式は繰り返しの条件式で,この式の値が真であるあいだは 文の中の処理を繰り返し実行する.そして,第 の式は,カウンタ変数を更新するためのもので, 文の繰り返しが 回進む毎に式 の処理を実行する.この例で,式 DD は @ D の省略形 である.そのためこの 文は を初期値 から ずつ増やしながら [@ を満足するあいだ 第章 反復構造 文 $ を繰り返し実行する.カウンタ変数は実数を用いることもできるが,実数には計算誤差が発 生するため予測しがたいバグの原因になりやすい.そのため,カウンタ変数には整数を用いるこ とが推奨される. 反復構造を用いた簡単な例で,しかも最も重要な例を考えよう.いくつかの数 整数あるいは実 数 の和を求める問題である.この問題では,和を求めるための変数 次の例題では を用意し, その変数を初期化し とおき,その変数に必要なだけの数を加えていく. 【例題 】 から までの整数の和を求めるプログラムを作れ. 【解答例】 和を表す変数 を定義し,初期に としておく.この に整数 から までを加え ることにより, から までの和を求める. O . !) /0#. A@2 ! @ 2 [@ 2 DD#. @D 2 "" "" "" "" "" 変数 A は整数 の初期値はゼロとしておく を から まで ずつ 増やしながら繰り返しを行う に を追加する 3 )& !1から までの和@D#2 3 3 計算の結果 @66 と得られる.これは から までの和 の公式 J D による値と 一致している. 変数 の関数 の値をいくつかの変数値について繰り返し計算して,その最大値を見積もる例 を考える. 【例題 】 関数 J ?$ の値を J から おきに J まで計算して,その関数 の最大値を与える のおよその値とそのときの の値を求めよ. 【解答例】 J から きざみに J まで繰り返し の値を計算し,出力する. 92 O' . 文による繰り返し !) /0#. @2 A2 ) 2 を定義 "" カウンター変数 "" 実数 A を定義 "" は出力形式を決めるための変数 U <@ U!#2 ! @2 [@'2 DD#. "" を から ' まで ずつ "" 増やしながら繰り返しを行う @!# 9 2 "" を計算する @9X !#2 "" !# を計算する @<!#2 "" 書式変換 )& !!DD#@D#2"" 結果の出力 3 3 3 計算の結果より, の最大値は J のときおよそ J であることがわかる.しか し,せっかくコンピュータを使っているのだからもう少し自動的に最大値を探す方法を考えて, 次のようなプログラムを作る.この例題も重要で基本的なアルゴリズムを含んでいる. 【解答例】 92 O4 . !) /0#. @2 "" カウンター変数 を定義 @A@A@A@2 "" A に加え, "" 最大値を保存するために A も定義する ) 2 "" は出力形式を決めるための変数 U <@ U!#2 ! @2 [@'2 DD#. "" を から ' まで ずつ増やしながら "" 繰り返し処理を行う 第章 @!# 9 2 @9X !#2 ! @@ ++ *#. @2 @2 3 反復構造 "" を計算する "" !# を計算する "" 最初の繰り返しの場合,もしくは, "" !# が今までの最大値よりも大きければ "" それを新しく最大値として に置き換える 3 @<!#2 "" 書式変換 )& !最大値は,!DD#@D#2 "" 最大値の出力 3 3 この例では正確な最大点 J が求められたが,このような方法では最大点と最大値の近似的な 値しか求められないことに注意する必要がある.ただし,計算のきざみ幅を小さくすればいくら でも正確な値に近づくことが可能である. 文で繰り返しが終了するのは,条件式の値が偽になった場合である.しかし,それ以外にも 途中で 文を終了したい場合がある.その場合には 文のところでも用いられた % 文を使用する. % 文が実行されると,現在のループを強制終了して 文の外にでる.また, -"% 文の処理が複数の文からなるとき,途中で処理を中断して,次の繰り返しの実行に処理を移し たい場合がある.この場合は 文を用いれば,処理を中断して, 文のカウンタを進め ることができる . 文や % 文を用いる練習として,次のような簡単な例題を考える. 【例題 】 【解答例】 円の所持金を持って 円のペンが何本買えるか 文を用いて計算せよ. 円から 円ずつ減らしていき残金がなくなると途中で繰り返しを終了する. O5 . !) /0#. A@A&@62 @ 62 ! @ 2 [@ 2 DD#. !&*@# ½ "" お金がまだペンを買える額あれば の 文は何も処理しない文であり,全く意味が異なるので混同しないように注意する. 文による繰り返し . &@&2 "" 個購入して所持金を減らす @D 2 "" 購入した個数 を増やす 3 . %2 3 "" お金がなければ "" 文から外にでる 3 )& !買ったペンの本数はDD本#2 )& !残金はD&D円#2 3 3 【例題 】 【解答例】 の倍数または の倍数の場合は何もせずカウンタを増やす. から の整数のなかで, , , , のいずれの倍数でもない数を書き出せ. 92 O6 . !) /0#. 2 ! @ 2 [@ 2 DD#. ! R'@@# 2 ! R4@@# 2 ! R6@@# 2 ! RB@@# 2 )& ! #2 3 3 3 第章 反復構造 文による繰り返し 文による繰り返しは,条件式が真のあいだは繰り返し処理を実行し続け,条件式が偽にな れば繰り返し処理を終了する. 文の一般的な構文は次のようになる. !条件式#. 文 $2 3 このとき,条件式が真の間は処理 文 $ を実行し続ける. 文による繰り返しは繰り返し回数 を指定したい場合に用い, 文による繰り返しは繰り返し回数が不定の場合に用いる. 文を使ったプログラム例として,整数の足し算の計算練習プログラムを考える.乱数をも とに生成された足し算の問題を解答させる.解かなければならない問題数は 問であるが,もし 間違った解答をすると,残りの問題数が 増えることにする.乱数の生成には,X !# 関数を用いる.ただし,この関数は の実数値 をもつ疑似乱数を発生することに注 意する. 【プログラム例 】 92 O7 . !) /0#. &@62 AAA2 !&1@#. @! #!X !#9 D #2 "" 関数で整数乱数を発生する @! #!X !#9 D #2 "" をかけて整数化 !' 桁の乱数# @D2 )& !D D DD @ #2 @Y!#2 !@@#. &2 )& ! 正解!!あとD&D問##2 3. &DD2 )& ! 不正解!あとD&D問##2 文による繰り返し 3 3 3 Y!#. @2 Y)O @ Y)O!)& #2 NO @ NO! #2 & . @YY!G !##2 3 !, #. )& !#2)& ! #2 3 2 3 3 文による繰り返しは先判定による繰り返しともいえる.これに対して,後判定による繰り 返しという方法もある.このときには, を用い,条件にかかわらず必ず一度は繰り返し ループ内の文が実行される.プログラム例として からキーボードより読み込んだ整数までの2 乗和を求める問題を考える. 【プログラム例 】 92 92 OB . !) /0# . A@2 2 )& !Y #2 @ Y!#2 @2 @ 2 . D@ 9 2 第章 反復構造 DD2 3 ! [D #2 )& ! K DD D#2 3 Y!#. @2 Y)O @ Y)O!)& #2 NO @ NO! #2 & . @YY!G !##2 3 !, #. )& !#2)& ! #2 3 2 3 3 無限ループ 文や 文を用いて無限ループを作成することができる. 文による無限ループは括弧 ! # 内に書く条件式を省略し, !22#. 処理 3 と書けば, 文の中の処理を無条件に繰り返すことになる.また, 文による無限ループ は条件式を常に真とすればよいので, ! #. 処理 3 と書けば, 文の中の処理を永久に繰り返すことになる. 無限ループを用いるときは,処理の中に,有限回の繰り返しで,必ずループから出るような % 文を用いた 記述を書かなければならない. 第 章 演習問題 問題 から までの整数の逆数の和を求めるプログラムを作れ. 問題 問題 問題 整数 をキーボードから読み込み, O を求めるプログラムを作れ.このとき,どの程 度大きな の値まで O を正しく計算できるか確かめよ. 問題 キーボードより整数 を読み込み,近似式 J 文を用いて文字>$> から>:> までを出力するプログラムを作れ. 個のデータ 実数 をキーボードから読み込み,それらの平均と 乗平均を求めるプログ ラムを作れ. ラムを作れ. 問題 問題 O を用いて の近似値を求めるプログ 個の正負の混じったデータをキーボードから読み込み,非負のデータの数とその平均,負 のデータの数とその平均をそれぞれ求めるプログラムを作れ.ただし,データの数が 個の ときは平均の代わりに9999と出力するように作ること. つの整数 と を読み込み,その最大公約数 ,% !(! ".." ( % と最小 公倍数 >, ")(! ".." . ! $ を求めるプログラムを作れ を最大公約数とす れば, と の 数の差も で割り切れることを利用する). 第 章 メソッド 関数 第 章では, !* クラスのメソッドである数学関数を学んだ.また,)& な どもメソッドである.メソッドは関数であり,一連の操作 手順 をひとまとめにしたもので,引 数値を受け取り戻り値を返す. 言語にあらかじめ用意されているメソッド以外にも,自分で メソッドを定義して用いることができる.メソッドは手続き型プログラムの構造化を実現する手 段であり,大規模なプログラムを書くためにはクラスの設計において不可欠な要素である.これ まで用いてきた . もメソッドの一つである.この章ではメソッドの定義とその呼び出す方法 の基本について学ぶ. 関数の宣言と定義の方法 数学でよく用いられる J のような関数では,2つの値 と を元に, という処理を施 すことで つの値 を得る. のメソッド 関数 も基本的な考え方はこれと同じであり,いく つかの与えられた値 引数 を元に一定の規則に従って計算や処理を行い結果 戻り値,関数値 を 返すものである.第 章でも説明したように,関数 メソッド の &' 図は図 のように表さ れる. 6 6! " 6 ' 図 関数 メソッド を表す &' 図 メソッドの定義は基本的には次のように行う. アクセス修飾子 関数の型 メソッド名 !引数 の型 引数 A 引数 ' の型 引数 'A 引数 4 の 型 引数 4A #. 第章 メソッド 関数 !処理を記述する# 関数値2 3 ここで,関数の型を指定するだけでなく,各引数についてもその型を明示する必要があることに 注意しなければならない.関数内で求めた関数値を 文により返す.ここではまだアクセ ス修飾子についての詳しい説明は行わず,後で説明することにする. これまでにも,第3章以降では Y!# や !# などのメソッドを作って使ってきたが, これらは引数をもたないメソッドである.ここでは, つの整数の最大値を求める 関数を考え てみる.取り扱う数は整数に限定すると,関数の値 最大値 も整数なので次のように定義する. "" 4 つの整数の引数を受け取り,それらを AA とする "" 関数 の関数値は整数である ! A A #. 2 @2 ! * # @2 ! * # @2 2 3 次にこのように定義した関数を実際に使う例を考える.たとえばこの 関数を使うためには, 以下のようにプログラムを記述する. 【プログラム例 】 X . !) /0#. A@ A&@'A;@42 @!A&A;#2 "" メソッドを呼びだす例 )& ! D#2 3 ! A A #. 関数の宣言と定義の方法 2 @2 ! * # @2 ! * # @2 2 3 3 このプログラム例では, 関数でも, 関数内でも同じ名前の整数変数 が用いられている が,関数内で定義された変数名はその関数内でのみ有効であるので,同じ変数名を異なる目的で 使用しても構わない.例えば,X 関数などの定義の中でどんな変数が使われているのかを 気にしなくてもよいのと同様である. いくつかの例題を通してメソッドのプログラムを書く方法について学ぼう.まず,2次式 J D D を定義し,いくつかの の値についてその関数値を計算するプログラムを 作ってみる. 【例題 】 実数 を引数とする関数 J D D を定義して, J に J まで計算するプログラムを作れ. 【解答例】 関数 を定義する. X ' . !) /0#. 2 2 ! @ 2 [@ 2 DD#. @! # " 2 )& !!DD#@ D<'!##2 3 3 "" <' 関数の定義 <'! #. !9D'9D4#2 3 3 例題 とほぼ同じ次の例題を考える. から きざみ 第章 メソッド 関数 【例題 】 実数 を引数として,値 ?$ を返す関数 0? を定義して, J から きざ みに J まで計算し, と の表を作成するプログラムを作れ 【解答例】 関数 を定義する. X 4 . !) /0#. 2 "" カウンタ変数の整数 を定義 A&2 "" 実数 A& を定義 ! @2 [@'2 DD#. "" を から ' まで繰り返す @!# " 2 "" を計算 &@!#2 "" 関数 を用いて & を計算 )& !!DD#@ D 3 3 "" 関数 を定義する ! #. X !9#23 3 第7章の演習問題 でも取りあげた問題と同じであるが,ここでは2つの整数の最大公約数と最 小公倍数を求めるメソッドを作ろう. 【例題 】 つの整数を引数として,それら つの整数の最大公約数を求める関数 ! A# を 定義して,この関数を用いてキーボードより入力した2つの整数の最大公約数と最小公倍数を求 めるプログラムを作れ. 【解答例】 つの整数を , 等しいことを用いる. とすると, と の積は最大公約数 と最小公倍数 > の積に 92 X 5 . !) /0#. AAA2 )& !整数を一つ入力してください#2 @Y!#2 "" 整数 の読み込み 関数の宣言と定義の方法 )& !整数をもう一つ入力してください#2 @Y!#2 "" 整数 の読み込み @! A#2 "" 最大公約数の計算 @! 9#"2 "" 最小公倍数の計算 )& !VX@ DD GX@D#2 "" 表示 3 ! A &#. A2 "" 最大公約数 VX を求める 関数 !@ 2[@ 2DD#. ![&#. @&2 &@2 @ 2 "" が小さい場合は "" と & を入れ替える 3 !R& @@ # &2 "" が & で割り切れるなら & が最大公約数 @&2 @&2 &@ 2 3 &2 3 "" 割り切れなければ, !&# と & の ' 数で "" 同じことを繰り返す Y!#. @2 Y)O @ Y)O!)& #2 NO @ NO! #2 & . @YY!G !##2 3 !, #. )& !#2)& ! #2 3 第章 メソッド 関数 2 3 3 関数について これまでのプログラムで用いてきた メソッドももちろんメソッドの一つであり,その他のメ ソッドと同じ規則にしたがって記述されている. !) /0# と記述された場合, メソッドの型は 型である. 型というのは特殊な型名で,何も ないことを意味する.したがって, 型関数は戻り値を返さないので, 文は不要であ る.また,引数部に記述されている ) /0 というのは,引数として ) 文字列 型の引数である /0 をもつということを意味している. メソッドの引数を利用すること で,コマンドライン引数を用いることができる.例えば,< /")( の -,G8 コマンドは, * -,G8 YO のように,プログラム名のあとの文字列を引数として読み込んで,処理を実行 その文字列のヘ ルプを表示 する. メソッドの引数 /0 は後述する配列の概念と文字列の扱い方を知る 必要があり,少し複雑であるためここでは詳しい説明は省略する. たとえば,実行時に自分の名前を引数として入力して,それを出力する簡単なプログラムは次の ように書くことができる. X 6 . !) /0#. )& !X& D/0#2 3 3 このプログラムを実行するときに,たとえば * X 6 L と入力すれば, X& L と出力される. 再帰呼び出し 再帰呼び出し では,定義したメソッドの中から自分自身 メソッド を呼び出すことが可能であり,このよ うな呼び出し法を P再帰呼び出しL という.再帰呼び出しを用いるとプログラムが簡潔になる場合 もある.また,効率よくプログラムを作成することが可能となる.再帰呼び出しを使った簡単な プログラム例として代表的な問題を考える. 【例題 】 整数 を使うこと. の階乗 ,- !"% を計算するプログラムを作れ.ただし,再帰呼び出し O 【解答例】 O . !) /0#. @ A2 @ !#2 )& !D1 @ D #2 3 ! #. 2 !@@# @ 2 @9 ! #2 2 3 3 ローカル変数 局所変数 各メソッド内で定義された変数はそのメソッド内だけでのみ有効である.このように定義したメ ソッド内でしか用いられない変数をローカル 局所変数 と呼ぶ.また,次のプログラミング例の ようにかっこ.3で囲まれた部分で定義された変数はその外側では有効ではないので,このプ ログラムをコンパイルするとエラーとなる. "" このプログラムには誤りがあります 第章 メソッド 関数 ? . !) /0#. A '2 @'2 "" 整数型変数 と ' を定義 "" に ' を代入 '@K! #2 )& ! Dの2乗はD 'Dです#2 . 2 @42 3 '@K! #2 )& ! Dの2乗はD 'Dです#2 "" ' を出力 "" ' を出力 3 K ! # . 2 @92 2 3 3 プログラムのどの位置からどの変数の値を呼び出したり,変更をしたりできるのかという点につ いては変数のアクセス修飾子の使い方と関係しており少し複雑なので,次章のクラスの定義のと ころで説明する. 第 章 演習問題 問題 整数 から までの 乗和 J D D D を計算する関数を作り,これ を用いて, 乗和 の値が を越えるときの の値を求め,そのときの 乗和 を表示するプログラムを作れ. 問題 問題 問題 問題 つのベクトル J と J を引数とし,それらの内積を関数値とす る関数を作り,これを用いることにより, つのベクトルの各成分をキーボードより読み込 み,それらが直交しているかどうか調べるプログラムを作れ. つの整数データを読み込み,それらの最大値を求めるプログラムを作れ.ただし つの データの最大値を計算する関数を作って用いること. じゃんけんの頭文字>V>A >L>A >8> のうち つの文字を入力し,勝った方の文字を返す関 数を作り,キーボードからこれらの文字の つを入力し,じゃんけんの勝ちを判定するプロ グラムを作れ.ただし,あいこのとき を返すものとする. 角形の 辺の長さ , , を引数としての長さ と の 辺の間の角 を返す関数を作り, これを用いて,キーボードから , , を読み込み,その長さ と の 辺の狭角 を表示 するプログラムを作れ. 第 章 オブジェクト指向プログラミング はオブジェクト指向プログラミング言語である.しかし,いかにオブジェクト指向プログラ ミング言語であっても個々のメソッドを記述するには手続き型のプログラミング技法を習得する 必要がある.そのためにこれまでの章では手続き型のプログラミングを説明してきたが,この章 ではオブジェクト指向プログラミングを学ぶ.オブジェクト指向プログラミングを完全に理解す るためには多くの新しい概念を知る必要がある.ここではあまり多くのことを説明せず,オブ ジェクトプログラミングの最低限の概念と知識について説明を行う. クラスとオブジェクト オブジェクト指向プログラミングにおいてはクラスの設計が最も重要である.クラスとはデータ とメソッドをまとめたものである.第3章では8種類のデータ型があることを説明した.たとえ ば, ! は4バイトの長さの整数を表すデータ型である.したがって,変数 ? を ! 型として定 義すると ? には1つの整数の値を格納することができる.これに対して,たとえば四角形を表す クラスを 6 0% として定義して,6 0% には底辺の長さ /"4 と高さ /"4 および四角形 の面積を計算するメソッドが含まれているとすると, - という変数を 6 0% として宣言すれば - には2つの実数と1つのメソッドを格納できることになる.このとき,- のことをインスタン スまたはオブジェクトという. の参考書ではクラスとは設計図であり,オブジェクトとはそ の設計図をもとに作られた実体であると説明されている. 四角形を表すクラスを具体的にプログラミングすると次のようなプログラムとなる. 【プログラム例 】 "" 四角形を表すクラスの例 !悪いプログラム例# "" 後に他の図形も表せるように改良する U . @A @A@2 "" は底辺の長さ, は高さ, は面積 $ !# "" 面積を計算 . @ 9 2 第章 オブジェクト指向プログラミング !1@# . )& !面積はD#2 2 3 . )& !底辺の長さと高さを入力して下さい#2 2 3 3 3 このプログラムで,クラス 6 0% は3つの倍精度実数変数 ) /!*, * 0*!, % と1つのメ ソッド "!$!'% をもっている.メソッド "!$!'% は面積を計算して出力するメソッドで ある.このプログラムをコンパイルすると 6 0% (( というファイルができる. クラス 6 0% を使って四角形の面積を計算するプログラム例は次のようにようになる. 【プログラム例 】 "" クラス U を使って面積を計算する例 !悪いプログラム例# "" このプログラムをコンパイル・実行するときは "" U と同じディレクトリーであること U . !) /0# . U @ U !#2 @'2 @42 $!#2 3 3 このプログラムで,6 0% -J) 6 0% という文で 6 0% のクラスのインスタンス - を生 成している.インスタンス - のインスタンス変数 ) /!* と * 0*! やメソッド "!$!'% に アクセスするときはこのプログラム例のように -) /!*, -* 0*!, -"!$!'% などとすれ ばよい。このプログラムをコンパイルして 6 0% (( がおかれているディレクトリで実行すれ ば,結果として「面積は 」と出力される. データの隠蔽 データの隠蔽 プログラム例 では,クラス 6 0% は3つの倍精度実数変数 ) /!*, * 0*!, % と1つのメ ソッド "!$!'% をもっていて,プログラム例 で 6 0% のインスタンス - を作り,イン スタンスにおけるそれらの変数 ) /!*, * 0*!, % に直接に値を代入している.しかし,オブ ジェクト指向プログラミングにおいてはオブジェクトの変数に対するこのような直接代入は推奨 できない.オブジェクトのもつインスタンス変数にはそのクラスのメソッド以外からはアクセス できないようにデータを隠蔽するのがオブジェクト指向プログラミングの常套手段である.これ はそのクラス以外のプログラムから不用意に変数の値を変更してしまわないようにするためであ る.直接変数の値を変更できなくする代わりに,メンバー変数の値を変更したり,読んだりする ためのメソッドをそのクラスの中で定義して,それらのメソッドを通して変数にアクセスするの である.この点を修正したプログラムが次の例である. 【プログラム例 】 "" 四角形を表すクラスの例 "" 後に他の図形も表せるように改良する U . @A @A@2 "" は底辺の長さ, は高さ, は面積 W ! # "" 底辺の長さを代入 . @2 3 - ! # "" 高さを代入 . @ 2 3 $ !# "" 面積を計算 . @ 9 2 !1@# . )& !面積はD#2 2 3 . )& !底辺の長さと高さを入力して下さい#2 第章 オブジェクト指向プログラミング 2 3 3 3 このプログラム例において,クラス 6 0% は3つの倍精度実数変数 ) /!*, * 0*!, % と3 つのメソッド $!< /!*, $!7 0*!, "!$!'% をもっていて,3つの変数にはいずれも アクセス修飾子として $% ! がついている.アクセス修飾子 $% ! がついている変数の値を 代入したり,変更したりできるのはそのクラス内に限られ, 6 0% クラス以外のクラスからはそ れらの値を読み込んだり,その値を変更したりすることができない.その代わりに,他のクラス から 6 0% クラスの変数を操作するためにメソッドとして新たに $!< /!* と $!7 0*! の2つのメソッドをもっていて,これらを通して変数 ) /!* と * 0*! の値を変えることができ る.このプログラムをコンパイルすると 6 0% (( というファイルができる. クラス 6 0% を使って四角形の面積を計算するプログラム例は次のようにようになる. 【プログラム例 】 "" クラス U を使って面積を計算する例 "" このプログラムをコンパイル・実行するときは "" U と同じディレクトリーであること U . !) /0# . U @ U !#2 W !'#2 - !4#2 $!#2 3 3 コンストラクタ インスタンスを生成するのには コマンドを用いる.このようにしてインスタンスを生成する ことができるのはコンストラクタ U !# というのが定義されているからである.これまでの プログラム例ではインスタンスを生成するのに引数を指定せずに,たとえば U @ U !#2 コンストラクタ のようにインスタンス を生成した.このように引数をもたないコンストラクタはプログラム 内であえて定義しなくてもコンパイラが自動的に定義してくれているのである.もし,定義しよ うとするなら,次のように定義する. 【プログラム例 】 "" 四角形を表すクラスの例 "" コンストラクタの定義を行う U ' . @A @A@2 "" は底辺の長さ, は高さ, は面積 U '!# . 3 W ! # "" 底辺の長さを代入 . @2 3 - ! # "" 高さを代入 . @ 2 3 $ !# "" 面積を計算 . @ 9 2 !1@# . )& !面積はD#2 2 3 . )& !底辺の長さと高さを入力して下さい#2 2 3 3 3 このプログラムでコンストラクタの定義では型を定義する必要がないことに注意すること. インスタンスの生成時に引数を指定することも可能であり,) /!* と * 0*! の値を指定してイン 第章 オブジェクト指向プログラミング スタンスを生成するためのコンストラクタを定義するときは次のプログラム例のように行う. 【プログラム例 】 "" 四角形を表すクラスの例 "" コンストラクタの定義を行う U 4 . @A @A@2 "" は底辺の長さ, は高さ, は面積 U 4!# . 3 U 4! A # . . @2 @ 2 3 W ! # "" 底辺の長さを代入 . @2 3 - ! # "" 高さを代入 . @ 2 3 $ !# "" 面積を計算 . @ 9 2 !1@# . )& !面積はD#2 2 3 . )& !底辺の長さと高さを入力して下さい#2 2 3 3 3 コンストラクタ このプログラム例では引数のないコンストラクタ U 4!# と引数を2つもつコンストラクタ U 4! A # が定義されている.このように では引数の数や型の異な るコンストラクタを同じ名前で複数個定義することができ,引数によりどのコンストラクタであ るか区別することができるのである.これをオーバーロードコンストラクタという.このようし て引数つきのコンストラクタを定義しておけば, 【プログラム例 】 "" クラス U 4 を使って面積を計算する例 "" このプログラムをコンパイル・実行するときは "" U 4 と同じディレクトリーであること U 4 . !) /0# . U 4 @ U 4!'A4#2 $!#2 3 3 のように,インスタンス の生成と同時に変数 ) /!* と * 0*! の値を指定することが可能で ある. このようなオーバーロードコンストラクタを利用すれば,四角形の面積だけでなくたとえば三角 形の面積も求められるプログラムを次の例のように作ることができる.ただし,三辺の長さが , , の三角形の面積 は J D D とおけばヘロンの公式により J で求められることを用いる. 【プログラム例 】 "" 四角形と三角形を表すクラスの例 "" 四角形の場合と三角形の場合の2つのコンストラクタの定義を行う U . @2 @2 @A @2 @A '@A 4@2 U ! A # . 第章 オブジェクト指向プログラミング @52 @2 @ 2 3 U ! A 'A 4# . @42 @ 2 '@'2 4@42 3 $ !# . !@@5# . @ 9 2 )& !面積はD#2 2 3 !@@4# . @! D 'D 4#"'2 @X K!9! #9! '#9! 4##2 )& !面積はD#2 2 3 2 3 3 このプログラム例では2つの引数を指定してインスタンスを生成すれば四角形であり,3つの引 数を指定してインスタンスを生成すれば三角形であるとしている.こうして定義した 6 0%( ク ラスを用いて四角形と三角形の面積を求めるプログラムの例は次のようになる. 【プログラム例 】 "" クラス U を使って面積を計算する例 "" このプログラムをコンパイル・実行するときは "" U と同じディレクトリーであること U . !) /0# . U @ U !'A6#2 $!#2 U '@ U !4A5A6#2 拡張クラスとインヘリタンス 継承 '$!#2 3 3 このプログラムで,インスタンス は引数を2つ指定して生成したので四角形を表し,その面 積は である.インスタンス ' は引数を3つ指定して生成したので三角形を表し,その面積 は である. 拡張クラスとインヘリタンス 継承 オブジェクト指向プログラミングは,私たちが日常に接するものやことがらあるいは概念を取り 入れて,プログラミングを効率的にしかも私たちの考える方法に近い方法でプログラミングでき るように工夫されている.その一つが拡張クラスという考え方である.私たちの生活では,もの やものごとは階層構造をもっていて,その最も基本となる根っこ ルート はかなり抽象化された ものであり,それにいろいろな具体的な性質が与えられて現実のものが定義されている.このこ とはすでにクラスという定義からインスタンスという具体的な変数が作られるという点にも反映 されているが,さらに階層構造を考えることができる.日常生活では,たとえば果物という抽象 的なものがあり,果物にはある共通性があって,その共通性によって果物という集合が定義され ている.リンゴは果物の1種であり,果物にさらに何かの性質を与えることによって定義できる. リンゴの中にも国光や富士やデリシャスという品種もある.国光リンゴの中にも私がきょう買っ た国光リンゴというものもある.このような階層的な構造をクラスに実現する方法が拡張クラス である.あるクラスを拡張して拡張クラスを定義するが,拡張クラスは元のクラスの部分集合で ある点に注意する必要がある.拡張クラスの定義は次のように行う. クラス名 スーパークラス名. フィールド メソッド 3 例を用いて拡張クラスの説明をするために,まず元のクラスとして点を表すクラス て,次のように定義する. 【プログラム例 】 8 . @A&@2 &" ! を考え 第章 8 !# . 3 8 ! A &# . @2&@&2 3 M!# . !#2 3 S!# . ! 3 M! # . @2 3 S! &# . &@&2 3 ! A &# . @ D2 & @ &D&2 3 ! # . 2 @4 5 69 " C2 @9X !#&9X !#2 &@9X !#D&9X !#2 オブジェクト指向プログラミング 拡張クラスとインヘリタンス 継承 3 ! # . @9 2 &@&9 2 3 3 クラス &" ! は変数として $? と $3 という倍精度実数の変数をもっている.この変数は点の 座標を表す.このクラスはこの点の座標を与えるメソッド (!=, (!Q や 座標値を得る ための 0!=, 0!Q などの他に平行移動 .",原点まわりの回転 %"! !,原点まわりの拡 大・縮小 ?$ / などのメソッドをもっている. クラス &" ! を拡張して三角形を表すクラス 1% 0 を次のように定義する. 【プログラム例 】 L 8 . 8 A'A42 @A '@A 4@2 L !8 A 8 'A 8 4# . @ 2 '@'2 4@42 3 !# . M!! M!#D'M!#D4M!##"4#2 M!#2 3 &!# . S!! S!#D'S!#D4S!##"4#2 S!#2 3 第章 オブジェクト指向プログラミング $!# . A& A'A&'A4A&4A2 @ M!#'M!#2& @ S!#'S!#2 '@'M!#4M!#2&'@'S!#4S!#2 4@4M!# M!#2&4@4S!# S!#2 @X K! 9 D& 9& #2 '@X K!'9'D&'9&'#2 4@X K!494D&49&4#2 @! D 'D 4#"'2 !X K!9! #9! '#9! 4###2 3 ! A &# . !A'!A!A 3 ! # . ! #2'! #24! #2 3 ! # . ! #2'! #2'! #2 3 3 クラス 1% 0 は変数として3つの &" ! である $$, $$, $$ と3辺の長さを表す倍精度実数 ( /, ( /, ( / をもっている.また,3つの &" ! 変数はそれぞれ 座標である $?, $3 をもっている.1% 0 の位置 座標 $?, $3 は定義されていないが, 1% 0 は &" ! の 拡張であるため,&" ! がもつ変数 $?, $3 を暗黙の内にもっており 継承しており,これをイン ヘリタンスとよぶ. 拡張クラスは別名サブクラスともよばれる.このとき,元のクラスはスーパークラスという.拡 張クラス 1% 0 はスーパークラス &" ! と同じ名前のメソッド .",%"! !,?$ / をもっている.このようにスーパークラスと同じ名前と引数をもつメソッドをサブクラスでも定 義することをオーバーライドという.また,前に名前は同じだが引数の数が異なるコンストラク 拡張クラスとインヘリタンス 継承 タを定義したときのように,同じ名前で異なる引数をもつメソッドを定義することをオーバー ロードという. クラス 1% 0 を用いて簡単なプログラム例を作ることを考えてみよう.ここでは,3点 , , を頂点とする三角形を定義して,その3角形を と 方向にそれ ぞれ ずつ平行移動することを考え,そのときの三角形の面積とその重心を求めるプログラム を作ってみる. 【プログラム例 】 8L . !) /0# . 8 @ 8 !A#2 8 '@ 8 !5A#2 8 4@ 8 !A4#2 L @ L ! A'A4#2 ! A #2 )& !三角形の面積@D $!##2 )& !重 心 座 標@D !#D 重 心 @D &!##2 3 3 & 座 標 このプログラムをコンパイルして実行すると,実行結果は 三角形の面積@7 重心 座標@'4444444444444446 重心 & 座標@' と表示される. J だけ平行移動する前の三角形の重心の位置は であ り,平行移動した後にはこの結果のように となる. この章ではオブジェクト指向プログラミングの概要のみを説明したが,ここでは説明しなかった 概念や定義および命令は他にも数多くある.これらを他の参考書を読んで学習しておくことが望 ましい. 第 章 演習問題 問題 プログラム例 とプログラム例 を参考にして,三角形と四角形と円を表すクラスを 作り,底辺の長さが で高さが の四角形,3辺の長さが と と の三角形,半径が の円の面積を求めるプログラムを作れ. 問題 プログラム例 を参考にして,3点 , , を頂点にもつ三角形を原点を 中心に反時計まわりに Æ 回転したときの3頂点の座標と面積を求めるプログラムを作れ. 問題 プログラム例 を参考にして,3点 , , を頂点にもつ三角形を原点に ついて2倍に拡大した図形の3頂点の座標と面積を求めるプログラムを作れ. 問題 プログラム例 とプログラム例 を参考にして,円を表すクラスを作り,中心を Æ にもつ半径 の円を反時計回りに 回転した図形の中心と面積を求めるプログラム を作れ. 第 章 配列・文字列 配列を用いると つの変数名で多くのデータを記憶したり,演算したりすることができる.同じ ような処理の繰り返しの多いプログラミングにおいては,配列を使うと非常に簡潔で効率的なプ ログラムを書くことができる.また,このテキストでは説明しないが, では配列以外にも連 結リストや木 1% など,プログラミングで大切なデータ構造をサポートしている.それらにつ いては適切な参考書を読んでいただきたい.この章では配列と文字列の定義およびその使い方に ついて学ぶ. 配列 数学におけるベクトルや行列のように, つの変数名で多くのデータを取り扱うときには配列 %% 3 を用いる.配列を用いることで,いくつかの同種の変数をまとめて, 「変数 の何番目の データ」というように扱うことができる. 次元の配列宣言の一般形は, 型名 /0 配列変数名2 または 型名 配列変数名 /02 であり,型名には, 型の他にも, 型, 型, 型など全てのデータ型を用い ることができる.この宣言によりできるのは配列オブジェクトへの参照である.実際に配列オブ ジェクトを作って配列変数に割り当てるには 配列変数名 @ 要素の型名 /配列の大きさ02 とする.たとえば,整数型の配列変数 を宣言し,5つの整数型の値をもつ配列オブジェクトに 割り当てるには, /02 @ /602 のように指定する.この例では 型の値を記憶する配列オブジェクトを配列変数名 により参 照することができる.または,配列変数の宣言と配列オブジェクトへの割り当てを同時に行うと, もっと簡単に 第 章 配列・文字列 /0 @ /602 のように書くこともできる.このとき,配列 の つの各要素を参照するためには, /0, / 0, /'0, /40, /50 のように,配列名 要素番号 の形式で参照する.配列の最初の要素は添え字 「」であり,最後は「配列の要素数 大きさ 」であることに注意しなければならない .図 のような箱をイメージするとわかりやすい.配列オブジェクトが宣言されると,データを格 納するための領域が割り当てられる.このときの箱の大きさは, 型であればそれぞれ バイ トの大きさである. a[0] a[1] a[2] 図 a[3] a[4] 配列 /60 の定義 これまで,配列変数について少しあいまいに説明してきたが,ここでまとめておこう. には 第3章で学んだ8種類の基本データ型の他に,配列型とクラス型とインターフェイス型の3種類 のデータ型がある.8種類の基本データ型は値型と呼ばれ,基本データ型の変数は値を記憶する ことができる.これに対して,配列型などの3種類のデータ型は参照型と呼ばれ,参照型の変数 はデータへの参照を記憶するのである.参照というのはクラスオブジェクトやデータへの関連づ けであり,コンピュータ内でデータが記憶されている場所 アドレス のようなものと理解するこ とができる. 配列を使った簡単な例をプログラム例 に示す.この例では,配列 /60 を定義し,それぞれ の要素に点数を代入して, 文を用いることにより全ての値を表示させている.また,それら の配列に記憶された点数 整数 の和を求める.この例のように,いくつかの数の和を求めるため には,和を計算するための変数 この例では を用意しておき,初期に @ と初期化したのちに この変数 にそれらの数を加えていけば和が求められる.この和を求める方法は手続き型プログ ラミングで大切なアルゴリズムである.もし,配列を用いずに同じプログラムを書こうとすれば, 異なる名前の変数が5つ必要であり,5つの数を出力しようとすれば 文が つ必要にな るのに対して,配列を用いれば 文の中に つだけで済むので,プログラムが簡単になる. 【プログラム例 】 $& . !) /0#. ½ では,配列の下限は無指定の場合で であり,明示することで下限と上限を自由に設定できる. 配列 A@62 /02 2 "" は配列の大きさ "" は整数配列変数 "" は合計 @ /02 "" は5つの要素をもつ /0@ / 0@ /'0@ /40@ /50@ 62 2 '2 2 2 "" "" "" "" "" の の の の の 番目の要素に 6 を代入 番目の要素に を代入 ' 番目の要素に ' を代入 4 番目の要素に を代入 5 番目の要素に を代入 @2 "" 合計を計算するための変数 "" を初期には としておく ! @2 [2 DD#. "9 テストの点数を出力する 9" )& !学生R のテストの点数はD/ 0D @D/02 "" に点数を加える 3 )& !点数の合計は DD 点#2 点#2 "" を出力 3 3 配列はクラスなのでいくつかのメソッドとメンバー変数をもっている.たとえば,配列の要素数 を表すメンバーは 0!* である.オブジェクトへの参照変数 の要素数を得るためには と指定する.また,配列オブジェクトを生成して,値を代入しなかったときはどうなる のかを調べてみよう. 【プログラム例 】 $& . !) /0#. A@62 "" は配列の大きさ /0@ /02 "" は整数配列変数 2 "" は合計 第 章 @2 配列・文字列 "" 合計を計算するための変数 ! @2 [2 DD#. )& !学生R のテストの点数はD/ 0D 点#2 @D/02 "" に点数を加える 3 )& ! の配列の大きさは D #2"" の大きさを出力 )& !点数の合計は DD 点#2 "" を出力 3 3 このプログラムをコンパイルして実行すると,配列 に各要素には が入っている.このように, 整数型の配列オブジェクトを生成したときにはその値は で初期化される.このことは,ある整 数型変数を定義したときに値を代入しなかったらコンパイルエラーとなるのと対照的である.ま た,このプログラム例で配列オブジェクト の要素数が 6 と出力される. 配列を用いてクラスを設計するとかなり実際に使えるプログラムに近づく.ここでは,いくつか の整数データをもらってそれらの個数や平均などを計算するためのクラス '%% 3 を設計してみ よう.このクラスにはデータは1つづつ与えることにして,連続して与えなくてもいつでもデー タを追加することができるとする データを与えるメソッドは /// ! とする.問い合わせメ ソッドにはデータの問い合わせ 0!/ ! ,個数 .4% ,データの削除 / / ! ,合計 !"! ,平均 % 0 ,分散 % などを用意する. 【プログラム例 】 $& . A@ 2 "" は配列の大きさ /0@ /02"" は要素数 A2 "" は入力個数、 は合計 A 2 "" 平均と分散 $&!#. @2 @2 @2 @23 !#. 23 ! #./0@2@D 23 ! %#. !%*# )& !該当するデータなし#2 !%@@# .@ 2/0@23 . ! @%2 [@2 DD# / 0@/ 02 @ 2/0@23 配列 3 ! %#. /% 023 !# .@2 ! @2 [2 DD# . D@/ 023 23 !#. !1@# !#!#"!#2 )& !データなし#2 23 !#. !1@# . @2 @!#2 ! @2 [2 DD# . @ D!!#/ 0 #9!!#/ 0 #2 "!#23 3 )& !データなし#2 23 3 このプログラムで,平均や分散などはデータが1つも入力されないときには計算ができないので, データの個数が のときには「データなし」と出力することにしておく.また,第 8 番目のデー タを削除しようとしたときにデータの個数 よりも大きな番号を指定されたときには「該当する データなし」と出力する.クラス '%% 3 を使うプログラム例を次に示す. 【プログラム例 】 $& . !) /0#. @2 "" は合計 @A@2"" は平均、 は分散 $& @ $&!#2 !46#2 !66#2 !#2 )& !2番目のデータはD !'##2 )& !ここまでのデータの個数はD !##2 )& !ここまでのデータの和はD !##2 )& !ここまでのデータの平均はD !##2 第 章 配列・文字列 3 3 このプログラムをコンパイルした後実行すれば,結果は 2番目のデータは 66 ここまでのデータの個数は 4 ここまでのデータの和は C ここまでのデータの平均は 7 のようになる. 多次元配列 次元配列の例として,各学年と各組の生徒数を配列で扱うことを考えてみる.各クラスの人数 が表 のようであるとする.このようなとき, 次元配列 ;/40/50 を定義する.この 次 元配列を使った例題を考えてみよう. 組 組 組 組 年 年 年 表 ある高校の各組の人数 【例題 】 ある学校の各クラスの生徒の人数が表 のように与えられているとき,各学年 の生徒数の合計と,学校全員の生徒数を求めよ. 【解答例】 型の 次元配列 ;/40/50 に人数を登録し,その和を計算する. 文を使っ て合計人数の計算を行うが,各学年の合計人数も 次元配列 % /40 に計算するとプログラム が簡単になる. $& . !) /0#. AAV@4A@52 /0/0 @ /V0/02 "" 人数配列 文字列 @2 "" 全生徒数のための変数を初期化 /0 @ /V02 "" 各学年の合計人数の配列 "" 配列に初期値を代入 "" 999999 年生 999999 /0/0@472/0/ 0@4C2/0/'0@5 2/0/40@5'2 "" 999999 ' 年生 999999 / 0/0@572/ 0/ 0@5B2/ 0/'0@552/ 0/40@562 "" 999999 4 年生 999999 /'0/0@5C2/'0/ 0@572/'0/'0@62/'0/40@5B2 "" 合計を計算 ! @2 [V2 DD#. / 0@2 "" 各学年の合計人数の変数を初期化 !@2[2DD#. / 0@/ 0D/ 0/02"" 各クラスの人数を足す 3 @D/ 02 "" 全学年の人数に各学年の合計を足す "" 各学年の合計人数を表示 )& !! D #D年の生徒数はD/ 0D人#2 3 "" 全生徒数を表示 )& !全生徒数はDD人#2 3 3 文字列 では文字列を取り扱うために ) クラスと ) N クラスが用意されている. ) クラスと ) N クラスはほぼ同じであるが, ) クラスのオブジェクトであ る文字列は初期に設定されると変更できないのに対して, ) N クラスのオブジェクト である文字列はいつでも変更が可能である.この節では,) クラスのオブジェクトである文 字列についてのみ説明する. 第 章 配列・文字列 文字列は ) クラスまたは ) N クラスのオブジェクトなので,文字列変数は値を 保持する値型変数ではなく参照型変数である.たとえば,次のように2つの文字列変数 ) @文字列12 ) '@文字列22 ) 4@ D'2 とすれば,H文字列1Hという文で文字列オブジェクトを生成して,そのオブジェクトへの参照を 文字列変数 に代入している.' も同様である.3行目の「D」は文字列の連結を示してい る.この文により,H文字列1文字列2Hという文字列オブジェクトが新たに生成されてその参照 を 4 に代入するのである.ここでは,簡単に文字列を生成してその参照を文字列変数に代入 したが,より正式には 演算子を用いて次のように文字列オブジェクトを生成する. ) @ ) !文字列1#2 ) '@ ) !文字列2#2 ) 42 4@ D'2 文字列は ) クラスまたは ) N クラスのオブジェクトなので,それらのクラスで 定義されたオブジェクト変数やメソッドを使用することができる.たとえば,文字列 の長さ を知りたいときは,次のように !# と書いて, メソッドを用いる. 【プログラム例 】 ) . !) /0#. ) A'2 "" A' は文字列変数 @ コンピュータ2 "" は漢字6文字 ' @ Z 8 2 "" ' は英字16文字 )& ! Dの文字数は D !##2 )& !'Dの文字数は D' !##2 3 3 このプログラムをコンパイルおよび実行すると,次のような結果が得られる. 文字列 コンピュータの文字数は 7 Z 8 の文字数は 7 ここで, 「コンピュータ」は漢字6文字なので12バイト, 「 &%"0% .. 0」は英字で16文 字なので16バイトであるが,文字数はそれぞれ6と16のように英字や漢字の区別をせずに単 に1文字を1つと数えて文字数が表示される.これは第3章で説明したように, では1文字 を2バイトの "/ で表しているためである. !% 0 クラスのオブジェクトの生成の仕方には ) @- 12 ) '@ ) !Z 8 #2 のような方法があったが,これ以外にも (!# というクラスメソッドを使う方法がある.こ のメソッドは基本データ型や配列およびオブジェクトの参照を引数として文字列を生成する方法 である.たとえば,整数型変数 と 倍精度型実数 ? を文字列に変換して,文字列変数 と ' に代入するプログラムは次のプログラム例 のように書ける. 【プログラム例 】 ) ' . !) /0#. @'62 "" は整数型変数 @ 5 5' 4672"" は倍精度実数型変数 ) A'2 "" A' は文字列変数 @ ) (!#2 "" 整数 を文字列 に変換 ' @ ) (!#2 "" 実数 を文字列 ' に変換 )& ! Dの値はD#2 )& !'Dの値はD#2 3 3 このプログラムをコンパイルして実行すると '6 の値は '6 5 5' 467 の値は 5 5' 467 第 章 配列・文字列 と出力されるが,P の値は L の前の は文字列 (!% が出力されたものであり,後ろの は整数 がこのプログラムの中で 3(!."!$% ! 関数の中で 文字列に変換されて出力 されたものである. " ストリングクラスのメソッド クラスには,文字列を編集するための数多くのメソッドが用意されている.それらを表 に示す. !% 0 関数 説明 文字列の長さ . H 3!# $ . $H $3! /? 番目の文字 # ) /? から /? の1つ前までの文字列 ! A '# ) /? から最後までの文字列 ! # W 文字列の末尾が (!% ならば !% !) # W 文字列が (!% から始まれば !% !) # ) 文字 を に置き換える ! A '# /0 $& . $&H $&3!# 文字列を * % 型の配列に変換する ) F .FHF3!# すべての文字を大文字に変換 ) G .GHG3!# すべての文字を小文字に変換 ( . (H 文字 (3! * が何番目にあるか # ないとき (!) # 文字列 (!% が何番目の文字から始まるか Y( .Y(HY(3! 文字 * が後ろから何番目にあるか # Y( 文字列 (!% が後ろから何番目にあるか !) # L 文字列 (!% と辞書順に比較 前N負,後N正,同じN !) # KY 文字列 (!% と辞書順に比較 前N負,後N正,同じN !) # 表 !% 0 文字列メソッド クラスのメソッドを使う例を考える.次のプログラム例 は,文字列 文字列 L という文章をすべて大文字に変えて,その中で という文字列 が何番目の文字から始まる文字列であるか調べ,また という文字は何番目にあるか調べるプロ グラムである.何番目の文字であるか調べる前にすべての文字や文字列を大文字に変換している のは,大文字と小文字を区別せずに文字列を比較しているからである.もし,大文字と小文字を 区別するときはすべての文字を大文字に変換しておく必要はない. 【プログラム例 】 ) 4 . !) /0#. ) A'2 2 "" A' は文字列変数 "" は文字型変数 @ ) !L #2 ' @ ) !#2 @>$>2 @ F!#2 '@ 'F!#2 )& ! #2 )& !'DはD (!'#D番目の文字から始まる文 字列である#2 )& ! DはD (! #D番目の文字である#2 3 3 このプログラムをコンパイルして実行すると L-Y) Y) $E Z$?$ 8O(VO$X Z$?$ は 番目の文字から始まる文字列である $ は C 番目の文字である と出力される. 文字列関数を例としてパスワードをチェックする次の例題を考える. 【例題 】 文字以内の英数字をキーボードから読み込み,あらかじめ登録されているパス 第 章 ワードと一致するかどうか判定するプログラムを作成せよ. 【解答例】 92 ) 5 . !) /0#. ) @8 '&;2 "" 文字の正解パスワード ) '2 "" ' は文字列 )& !パスワードを入力してください#2 '@) !#2 "" ' を入力 )& !入力されたパスワードはD'#2 ! L!'#@@#. "" パスワードが正しければ である )& !正しいパスワードです#2 3. )& !パスワードが違います#2 3 3 ) ) !#. ) @2 Y)O @ Y)O!)& #2 NO @ NO! #2 & . @G !#2 3 !, #. )& !#2)& ! #2 3 2 3 3 配列・文字列 文字列の大小関係 文字列の大小関係 つの英数文字の大小関係はアスキーコード表 第 章の ' 表を参照 の順序によって判断す る.アスキーコード表における前の文字は後ろの文字よりも小さいとする.いくつかの英数文字 からなる文字列の大小関係は初めの文字から順に比較して大小関係を決める.異なる長さの文字 列を比較するとき,同じ長さの部分列が同じであれば短い文字列の方が小さいとする.このよう な文字列の大小関係を用いて次の例題を考える. 【例題 】 キーボードから 文字以内の 人分の名前をローマ字で入力して,それらの名前 をアルファベット順に並べ換えるプログラムを作れ. 【解答例】 関数の戻り値で大小関係を調べられる.文字列を入れ替えるときは, & 関数を利用する. 92 ) 7 . ) ) !) /0#. A2 "" A は整数 X$M@52 "" X$M は名前の個数 2 "" 文字列の入れ替えをするためのダミー /0 @ ) /X$M02 "" 文字列変数を X$M 人分用意する "9 名前を順番に読み込む 9" ! @2 [X$M2 DD#. )& !! D #D人目の名前を入力してください ** #2 / 0@) !#2 3 "9 名前の大小関係を比較するメソッドを呼ぶ 9" ! @2 [!X$M #2 DD#. !@! D #2 [X$M2DD#. !/ 0L!/0#*#. "" /0 の方が前だったら入れ替える @/ 02 / 0@/02 /0@2 3 3 第 章 配列・文字列 3 "9 名前を順番に表示する 9" )& !並べ替え結果#2 ! @2 [X$M2 DD#. )& !/ 0#2 3 3 ) ) !#. ) @2 Y)O @ Y)O!)& #2 NO @ NO! #2 & . @G !#2 3 !, #. )& !#2)& ! #2 3 2 3 3 このプログラムを実行して次のように,順に S,L%,S ,(% と入力すると, それらの名前がアルファベット順に並べ換えられることを確かめることができる.すなわち, 配列とメソッド 人目の名前を入力してください ** S ' 人目の名前を入力してください ** L% 4 人目の名前を入力してください ** S 5 人目の名前を入力してください ** (% 並べ替え結果 (% L% S S と出力される. 配列とメソッド メソッドの引数に配列を指定するのにはプログラム例 のように書く.すなわち,メソッド定 義の宣言部において ! /0A ;# のように,引数が配列であることだけを書く.ま た,メソッドを呼び出すときは, !A X$M# とすれば,メソッド側で配列の大きさを知ること ができる. 【プログラム例 】 92 $&' . !) /0#. AAX$M@62 /0 @ /X$M02 ! @2 [X$M2 DD#. )& !! D #D 番目の値を入力 ** #2 / 0@Y!#2 3 @ !AX$M#2 "" メソッドに配列と大きさを渡す 第 章 配列・文字列 )& !合計は D#2 3 "" 合計を計算するメソッド ! /0A ;#. "" 配列とその大きさを受け取る A@2 ! @2 [ ;2 DD#. @D/ 02 "" 合計の計算を行う 3 2 3 Y!#. @2 Y)O @ Y)O!)& #2 NO @ NO! #2 & . @YY!G !##2 3 !, #. )& !#2)& ! #2 3 2 3 3 この例のように,配列全体をメソッドに渡したときは,メソッド内で配列の値を変更すると,そ の変更は呼び出し側での値 実引数 にも反映される.この章の初めに説明したように,配列は基 本データ型が値型でありメソッドでその値を変更しても呼び出し側の値には影響を与えないのに 対して,配列は参照型 アドレス渡し であるためメソッド内でその値を変更するとその影響が呼 び出し側にまで及ぶからである .したがって,メソッドに配列を渡すときはデータの変更が実引 数にも影響することを注意してプログラムを作成する必要がある.ただし,オブジェクト指向プ ログラミングのデータ隠蔽の原則からいえば,配列をメソッドに渡す機会は少ないと思われる. ¾ ではデータは全て参照渡しである. 第 章 演習問題 例題 では,>N> と>> では,>N> の方がアスキーコードが小さいため,順序が先にな る.大文字と小文字を区別せず同じとみなしてアルファベット順に並べ換えができるように 解答例のプログラムを書き換えよ. 問題 問題 問題 問題 問題 個の実数 J をキーボードより読み込み,それらの平均と分散および標 準偏差を出力するプログラムを作れ.ただし, 個の実数の平均と分散を求めるメソッド (関数)を作り,これを用いること. 個の名前 .,アルファベット 文字以内 と数学の点数 . %8,整数 J をキーボードより読み込み,それらを数学の点数の高い順に出力するプロ グラムをプログラムを作れ.ただし,2個の整数と名前を引数とし,それらを整数の大きい 順に入れ換えて返すメソッド(関数)を作り,これを用いること. 個の名前 .,アルファベット 文字以内 と数学の点数 . %8,整数 J をキーボードより読み込み,それらを名前のアルファベット順に出力する プログラムをプログラムを作れ.ただし,2個の整数と名前を引数とし,それらをアルファ ベット順に入れ換えて返すメソッド(関数)を作り,これを用いること. 整数 を引数として,その数のカラムに>9> を出力するメソッドを作り,これを用 いてキーボードより読み込んだ 個の整数 J をグラフに表すプログラ ムを作成せよ.たとえば,整数が つで と の場合には 4__9 7_____9 となる. 問題 文字以内の文字列の中にある特定の文字 たとえば>> が含まれているかどうかを判定 するメソッド(関数)を作り,これを用いてキーボードより読み込んだ文字の中に小文 字>> から大文字>:> までのそれぞれの文字の頻度分布を調べるプログラムを作れ 第 章 ファイル処理 ファイルの種類とファイル操作 数多くのデータを入力するときや何度も同じデータを繰り返し入力するときなどはハードディス クに代表される外部記憶装置にデータを保存しておき,必要に応じてプログラム中からそれらの データを読み込むようにしておくと便利である.逆に,プログラムを実行して大量のデータを計 算したときにはそれらを外部記憶装置に保存しておく必要がある.これらの目的に のファ イル入出力機能を用いる. に限らず他の言語でも,ファイルの読み込みと書き出しには2つの形式がある.その1つは 逐次参照ファイル (! (( R であり,データを最初から順次読み込む形式である.こ のファイルは,たとえば10番目のデータを直接に読み込むことができないので,10番目の データを知りたいときには1番目のデータから10番目まで読み込む必要がある.多くの場合, 科学技術計算においてはこの逐次参照ファイルが用いられる.これに対して,直接参照ファイル / %! (( R ,% /". (( R は何番目のデータでも直接に読み出すことができる.た くさんのデータの中から必要とするデータを見つけだすためのデータベースなどでは直接参照 ファイルにしておく必要がある.これらの2つのファイル形式のうち,この章では逐次参照ファ イルについてのみ説明する. ファイルの分類にもう1つの分類がある.それはテキストファイルとバイナリーファイルである. テキストファイルはデータが文字の形式で書かれており,プログラムを介さずに直接にエディタ などで内容を見たり,データを変更することができる.一方バイナリーファイルは2進数で書か れているため,直接にエディタで見てもその内容が分からないので,プログラムで読み書きをす る.バイナリーファイルの取り扱いは不便ではあるが,ハードディスク上のファイルの大きさが 小さくて記憶領域を節約できたり,数値の精度を落とすことがないなどの利点もある.この章で は,逐次参照ファイル (! (( R で,しかもテキストファイルのみを取り扱うことに する.ただし, はいろいろなファイルを扱う手段を提供しており,また,そのおのおのの ファイルを取り扱うときにも,数多くの手段が用意されている. ではキーボードからのデー タ入力やディスプレイへのデータ出力からファイルへのデータの入出力まですべてのデータのや り取りをストリームという抽象的な概念で処理している.したがって,もっと一般的にデータの 送受信を考える必要があるが,ここではテキストファイルだけを取り扱うことにするので,次節 で説明するように 6 <% !% と 6 # /% という2つのクラスの使い方のみを理解すればよい. また, にはファイルを消去したり,コピーをするなどの多くのファイル操作の機能とディレ クトリを操作する機能も提供している. 第 章 ファイル処理 テキストファイルの入出力 前にも述べたように, I ではファイルの読み書きに数多くの手段を用意しているので,初心者 がファイルを取り扱うときは,どの方法を用いるか決める必要がある.ここでは,6 <% !% と いうパッケージでテキストファイルを書き, 6 # /% というパッケージでテキストファイルを 読むことにする.また,文字をファイルから読み書きするときには,1文字ごとにハードディス クなどにアクセスして読み書きするのではなく,1行単位で読み書きすることにする.そのため には,:M%/<% !% と :M%/# /% クラスを用いる必要がある. 文字列をファイルに書きだすことから始めよう.ディスク上にファイル P!?!/ !L を新たに作 り,そのファイルに文字列を書く準備を行うには次のようにプログラムを書く. U W @ U W ! #2 NW @ NW !#2 ここで, は出力ファイルオブジェクトである.P!?!/ !L というファイルを新たに作成して, そのオブジェクトが となる.このとき,ファイル名 P!?!/ !L というファイルが存在して いるときには,そのファイルに書かれている内容をすべて削除して,ファイルの最初から文字列 を書き始める準備をする.したがって,消されては困る内容のテキストが書かれているファイル をこのように指定することはできない.このようにファイルに書き出す準備をすることをファイ ルを「開く」ともいう.プログラムの2行目では,このファイルへの書き込みをするときには バッファーを介してある単位 ここでは1行単位 ごとにディスクにアクセスすることを指定して いる.このように指定すると,ファイルへの書き込みにはオブジェクト を使うことができ る.このオブジェクトを通して,ファイルにたとえば文字列 を書き出すには !D>¥>#2 とする.ここで,P¥ L は文字列 を書いたのちに,改行を行うことを表す.もし,改行を行 わないで何行かの文字列を書くと,ファイルの中ではそれらの文字列が1行に連結されて保存さ れることになる.したがって,いくつかの文字列を1行に書きたいときには P¥L を省略すれば よい. キーボードから入力した文字列をファイルに保存する例として次の例題を考える. 【例題 】 3行の文字列をキーボードから読み込み,ファイル ルとして保存するプログラムを作成せよ. 【解答例】 92 92 P!?!/ !L にテキストファイ テキストファイルの入出力 U ( . !) /0# . ) 2 A2 &. U W @ U W ! #2 NW @ NW !#2 @42 ! @ 2 [@2 DD# . @O)!#2 !D>¥>#2 3 !#2 !#2 3 !Y(, # .)& !,#2 3 3 ) O)!# . ) @2 )& !Y #2 & . NO @ NO ! Y)O!)& ##2 @ G !#2 3 !Y(, # .)& !,#2 3 2 3 このプログラム例では,キーボードから読み込んだ文字列 を !D>¥># として 1行ずつファイルに書き出している.こうして書き出した文字列はコンピュータのメモリ内の バッファ領域に保存されているので, !# により,実際にハードディスクに書き出す. その後に命令 !# によってファイルを閉じる. & .&H&3. 3 から始 3 で終わる命令は,ファイルがう まり, . H 3!Y(, # . まく開けなかったときに「A%%"%」と出力する処理であり, ではプログラムの実行中にエ ラーが生じてもエラー処理をした後にプログラムが継続して実行されるように,このような例外 処理の仕組みをもっている.他の多くの言語では,このような例外処理のプログラムを自分でプ ログラミングに組み込まない以上は,エラーが生じた時点でプログラムの実行が停止し,コン ピュータがハングアップして動かなくなるのとは対照的である. 第 章 ファイル処理 ファイルに保存した文字列のデータを読み出すときにもファイルを開く必要がある.このときは, 既にファイルが存在していなければならず,その内容が消えても困るのでデータを書き出すとき とは異なり,次のようにしてファイルの読み込み準備を行う. U O @ U O! #2 NO @ NO!#2 ここで, は入力ファイルオブジェクトである.既にディスク上に存在する P!?!/ !L という ファイルを指定して,そのオブジェクトを とする.このとき,ファイル P!?!/ !L が存在 しない可能性もあるが,そのときの処理は例題 と同様に例外処理をする.プログラムの2行 目では,このファイルからの読み込みをするときにはバッファーを介してある単位 ここでは1行 単位 ごとにディスクにアクセスすることを指定しており,ファイルからのバッファーを介した読 み込みにはオブジェクト を使う.ファイルから1行の文字列 を読み込むには @G !#2 とする. ファイルから文字列を読み込んで,ディスプレイに出力する例として,次の例題を考える. 【例題 】 ファイル P!?!/ !L にテキストファイルとして保存されている文字列を3行読み 込んで,ディスプレイに出力するプログラムを作成せよ. 【解答例】 92 92 U Y. !) /0# . ) 2 A2 &. U O @ U O! #2 NO @ NO!#2 @42 ! @ 2 [@2 DD# . @G !#2 )& !#2 3 テキストファイルの入出力 !#2 3 !Y(, # .)& !,#2 3 3 3 このプログラム例では,ファイルに書かれている文字列 を G !# によりバッ ファを介して1行ずつ読み込んでいる.こうして読み込んだ文字列を標準出力に送ってディスプ レイに表示する.3行読んだ後, !# によってファイルを閉じる. 実際に,ファイルに書かれている文字列を読もうとする場合には,そのファイルに何行の文字列が 書かれているか不明であることが多い.そのようなときは, G !# で文字列を読もう としてもう文字列がなくてファイルの終わり ,(U まで来たときに, G !# は という変数値を返すことを使って,ファイルの終わりまで読むようにプログラミングを行う. 【プログラム例 】 "" 例題 ' のプログラムを改良して,ファイルに書かれている文字列を "" 最後まで読む 92 92 U Y'. !) /0# . ) 2 A2 &. U O @ U O! #2 NO @ NO!#2 !!@G !## 1@# . )& !#2 3 !#2 3 !Y(, # .)& !,#2 3 3 3 第 章 ファイル処理 整数や実数のファイルの入出力 前にも説明したように, ではファイル入出力の方法には数多くの方法が用意されており,全 てを簡単に学ぶことが難しいので,この章ではファイルの読み書きをテキストファイルに限定し て説明している.したがって,整数や実数をファイルに出力したり,逆にファイルから入力する には少しの工夫が必要である. まず,整数をファイルに出力する方法について考えよう.整数を文字列に変換する関数を用いて その文字列をファイルに書くのであれば,前節の方法を用いることができる.そのときには,た とえば,整数 を文字列 に変えるのには @) (! #2 とする.同様に,この関数を用いて実数 や倍精度実数 ' を文字列にすることもできる.整 数を文字列としてファイルに書く方法にはもう一つの方法がある.それは 8 W クラスを 用いる方法で,次のように指定する. U W @ U W ! #2 NW @ NW !#2 8 W @ 8 W !#2 このように 8 W クラスを用いて整数 を出力するときには !D>>#2 とすればいいのである.ここでも>> は整数1つを書き出すごとに改行を行うことを示してい る.次の例題を考える. 【例題 】 キーボードから3つの整数を読み込み,それらをファイル ファイルとして保存するプログラムを作成せよ. 【解答例】 92 92 U( . !) /0# . AA2 &. P/ ! / !L にテキスト 整数や実数のファイルの入出力 U W @ U W ! #2 NW @ NW !#2 8 W @ 8 W !#2 @42 ! @ 2 [@2 DD# . @OY!#2 !D>>#2 3 !#2 !#2 3 !Y(, # .)& !,#2 3 3 OY!# . @2 )& !Y #2 & . NO @ NO ! Y)O!)& ##2 ) @ G !#2 ) L% ; @ ) L% ;!#2 @ Y(!L%!## ?!#2 3 !Y(, # .)& !,#2 3 2 3 3 このようにして保存したデータをファイルから読み込むにはどうすればいいのだろうか.次の例 題を考える. 【例題 】 ファイル P/ ! / !L にはテキストファイルとして各行に1つの整数が保存されて いる.これらのデータを読み込んでディスプレイに出力するプログラムを作成せよ. 【解答例】 92 92 第 章 ファイル処理 UY. !) /0# . ) 2 AA2 &. U O @ U O! #2 NO @ NO!#2 !!@G !## 1@# . ) L% ; @ ) L% ;!#2 @ Y(! L%!## ?!#2 )& !#2 3 !#2 3 !Y(, # .)& !,#2 3 3 3 このプログラムではファイルH/ ! / !Hから1行ずつ読み込んで,各行に書かれている文字列を 整数に変換している.文字列から整数へ変換するには,トークン 文字列の単位 の抽出をする必 要がある.この抽出には,デリミタという文字列を分割している文字コード 空白,コンマ A な ど を探して,文字列の切り出しを行う.その後,抽出された文字列を整数などのデータに変換す る.トークンの抽出を行うためのクラスが ) L% ; であり,その次の行のコマンド Y(! L%!## ?!# が次のトークンを抽出して文字列を整数に 変換するコマンドである. 例題 ではファイルには各行に1つの整数しか書かれていなかったが,1行に2つ以上のデー タが書かれているときには,トークン 文字列の単位 の抽出を2回行う.次の例で は,H/ ! / !H というファイルの各行に2つづつ実数が保存されている場合に,ファイルから それらのデータを読み込むことを考える. 【例題 】 ファイル P/ ! / !L にはテキストファイルとして,各行に実数が2つづつ保存さ れている.これらを読み込んで,各行に書かれた2つの実数の和を求めるプログラムを作成せよ. ただし,ファイルには何行分のデータがあるか分からないが,全ての行について和を求めること. 【解答例】 92 92 整数や実数のファイルの入出力 UY'. !) /0# . ) 2 A2 A&A;2 &. U O @ U O!'#2 NO @ NO!#2 !!@G !## 1@# . ) L% ; @ ) L% ;!#2 @ (! L%!##?!#2 & @ (! L%!##?!#2 ;@D&2 )& !D D D & D @ D;#2 3 !#2 3 !Y(, # .)& !,#2 3 3 3 この例題でも分かるように,テキストファイルに書かれている文字列をデータとして読み込むと きにはそのファイルにはどのようなデータがどのような順序で書かれているかあらかじめ分かっ ていないと読み込むことができない.ただ,テキストとして読み込むのは簡単であり,テキスト であれば自分の好みエディタで内容を確かめることができる.このように,ファイルに書かれて いるデータの種類と順序を知らなければそれらのデータを読むことができないのは, の他の ファイルの取り扱い方法であっても,他の言語であってもほぼ同様である.したがって,ファイ ルにデータを書き出すときにはそのデータの保存方法をしっかりと記憶したり,記録したりして おくことが大切である. 第 章 演習問題 問題 キーボードから10名分の人の氏名をローマ字で入力し,ファイル名H. 4"/ !Hとして 保存するプログラムを作れ. 問題 ファイルH. 4"/ !Hに保存されている人名を全て読み込み,アルファベット順に並べ替 えた後,ファイルH. 4"/ !Hに保存するプログラムを作れ. 問題 キーボードから10名分の人の氏名と数学の試験の得点をそれぞれローマ字と整数で入 力し,ファイル名H( (8 / !Hとして保存するプログラムを作れ.ただし,後で得点を整数 として読み込むときに簡単に読み出せるように工夫をしておくこと. 問題 ファイルH( (8 / !Hに保存されている人名と数学の試験の得点を全て読み込んだ後,成 績順に人名を並べ替え,平均を計算し,それらをファイルH( (8 / !Hに保存するプログ ラムを作れ. 問題 各行に1つの整数 学生番号 と2つの実数 身長と体重 が書かれたファイルH/ ! / !H がある.これらのデータをすべて全て読み込み,全学生の平均身長と平均体重を計算するプ ログラムを作れ. 第 章 ポストスクリプトによる描画法 プログラミング言語 を用いてグラフや図を描くためにはサンマイクロシステムズ %"(3(!.( が提供する @ "$.! @ ! に含まれる '& '$$ ! " &%"0% .. 0 !%- 中のグラフィックス・ルーティンを使うのが一般的であるが,それには 少しの勉強が必要であり,ディスプレイに出力する目的では適切であるがプリンタにきれいな出 力をするにはあまり適切ではない.この章では,簡単にグラフや図を描くための道具 ポストス クリプト言語を利用 を準備した.この道具を使うと & というクラスのいくつかのメソッドを呼 び出すだけで簡単にきれいな図を描くことができる.これらを修得してコンピュータで図を描く ことを楽しもう. ポストスクリプトによる図の描き方 ポストスクリプト を用いて図を描くときにはポインタ $" !% とパス $ !* という考え方が大 切である.ポインタを移動することにより,パスという図形を描く.パスで描かれた図形はまだ 何の出力ももたないが,パスで表された図形に墨入れ %,または することによって パスで表された図形が出力される.簡単にパスを描く方法には というメソッドを用いる.詳 しくは同志社大学工学部水島研究室のホームページ "" "] ; " にあるポストスクリプトの説明または水島研究室 が発行しているポストスクリプトのマニュアルを参考にすること. 図形を描く際の座標系については次の節で詳しく説明する.簡単のため,ここでは出力機器 機 器座標系 の左下は であり,右上は であるとしておく.最も簡単に,ポストスクリプ トを用いて図を描くためのプログラムをプログラム例 に示す.このプログラムは4つの点 を順次つないで正方形を描くプログラムである.ポ ストスクリプト描画のためのクラスを使用するためには,プログラム &I を上記のホーム ページからダウンロードしてコンパイルして & (( というファイルを作って,今後図形出力の ためのプログラムを書いて実行するディレクトリと同じディレクトリにおいておく必要がある. 具体的には,下記のプログラム例 のように記入してたとえばファイル名 < として保存し, 8) と同じフォルダに置き,次のコマンドを実行してコンパイルを行う. * 8) ½ ポストスクリプト はアドビ 社の登録商標である. 第 章 ポストスクリプトによる描画法 コンパイルが終わると 8) ができる.この操作は1度行うだけでよい.今度は自分で作っ たプログラムファイル < をコンパイルする. * < エラーがなければバイトコードファイル < ができるので,ファイル 8) があるディレクトリにおいて,これまでと同様に次のように < を実行する. * < プログラムの実行が終わると !.$$( というファイルが作成される.このファイルは描画され た図をポストスクリプトにより表現しているファイルである.図を見るときには * とするとポストスクリプトのためのウインドウが現れて図が表示される. 【プログラム例 】 ) . !) /0# . 8) @ 8)!#2 !#2 !#2 !'A 'A 4#2 !CA 'A '#2 !CA CA '#2 !'A CA '#2 !'A 'A '#2 %!#2 !#2 3 3 この章ではポストスクリプトによる描画するために & というクラスを用いる.プログラム例 の 行目では & クラスのインスタンス オブジェクト $( を生成 コンストラクト して いる.今後、ポストスクリプトにより図を描くとき, & クラスのインスタンス $( がもつメ ポストスクリプトによる図の描き方 ソッドを用いるので, 行目の !# のように図を描くメソッドの前に必ず をつけ る.ただし,以下の説明ではこれを省略するので注意すること. !# はポストスクリプト描画 の準備を行うメソッドである.これによって, というファイルが作られてこのファイル に描画命令が書かれる.図を描き終わったら 行目のように !# により描画終了する.これ により,図を出力するための手続きが完了する ページを出力し,ファイル を閉じる. パスを作成するときは,まず !# によってこれから新しいパスを作るという宣言を行う. 最も簡単にパスを描くのには, というパスを描くための関数を使う. !A &A 4# は線 を書かずにポインタを移動するだけでパスを作る.!A &A '# は線を書きながらポインタを 移動してパスを作る.プログラム例 では 行目から 行目でパスを作っている. 行目は !'A 'A 4# なので,点 にポインタを移動している.はじめにはどこにポイン タがあるかわからないので,とりあえずこの点までポインタを移動しておく.このとき,線は書 かない.つぎに,線を書きながらポインタを点 , , , , まで順次移動する.これでパスが完成する.ここまではまだなにも出力されていないの で, 行目のように墨入れ % を行うとパスに墨が入り,正方形が描画される 図 . 図 つの点 を順次つないで描いた正方形 【例題 】 ポストスクリプトにより,図心を にもつ一辺が の正三角形を描くプ ログラムを書け. 【解答例】 図心が であり一辺の長さが である正三角形の つの頂点の座標は , , と計算できるので,これらの3点を頂点とする三角形を ポストスクリプトにより描くプログラムとその実行結果 図 は次のようになる. "9 8) のあるディレクトリで実行すること 9" 第 章 ポストスクリプトによる描画法 , . !) /0# . 8) @ 8)!#2 !#2 !4A 4C56A 4#2 !BA 4C56A '#2 !6A B4A '#2 !4A 4C56A '#2 %!#2 !#2 3 3 図 図心を にもつ一辺が の正三角形 【例題 】 ポストスクリプトにより,中心を とする半径 を書け. の円を描くプログラム 【解答例】 ここでは,中心を とする動径 が から まで 刻みで回転すると きの軌跡として円を描く. "9 8) のあるディレクトリで実行すること 9" ポストスクリプトによる図の描き方 ,' . !) /0# . A @52 A A &A & 2 A A 2 & 8) @ @ @ @ 62 62 '2 '94 5 62 @ 8)!#2 !#2 !#2 !A A A A A A '#2 ! @2 [@2 DD#. @ !!# " !# # 9 2 @D9X !#2 & @&D9X !#2 ! @@#. ! A & A 4#2 3. ! A & A '#2 3 3 %!#2 !#2 3 3 第 章 図 中心を とする半径 ポストスクリプトによる描画法 の円 図形の描き方 次元グラフィックス この節では 次元図形処理の基本である つの座標系,すなわち世界座標系・正規座標系・機器 座標系について説明し,ポストスクリプトを使った便利な描画法について解説する. これから描こうとする図に座標系 世界座標,図 を導入する.このことは,現実の世界 または図形を矩形領域に切り出すことに対応している.この座標系は任意にとることができる. 長さの単位も任意であるが,領域をできるだけ正方形に近く切り出しを行うと,できあがる図が きれいに描ける.世界座標系に書かれた図をコンピュータの機器座標系 出力座標,図 に 変換してグラフィック出力する.すなわち,切り出した世界座標における矩形領域を機器座標に 線形写像するので元の世界座標における図形の縦横比が機器座標系での出力図形と同じ縦横比を 保つためには切り出す世界座標系における矩形領域の縦横比と機器座標の矩形領域の縦横比を同 じにする.世界座標で描かれた図形を機器座標に線形写像するために,まず世界座標を正規座標 に変換する.正規座標系で図形は左下が であり,右上が である正方形領域に写像され る.世界座標系における矩形領域の左下を とし,右上を とすれば,世界座標の1 点 から正規座標 への変換は J J D で表される.出力機器は通常 ' の紙 . ! J ! . で表される.また,機器座標系における矩形領域の左下を ば,正規座標 から機器座標 ! への変換は J ! とし,右上を ! とすれ ! D ! を想定しているため, , J 図形の描き方+ 次元グラフィックス ,! J であるが,ここでは覚えやすくするために, ! J ,! J としておく. ,! J J 4 (x1 , y2 ) (x2 , y2 ) (x1 , y1 ) (x2 , y1 ) J , J , 世界座標系 正規座標系 機器座標系 図 (0, 1) (1, 1) (0, 0) (1, 0) (X1 , Y2 ) (X2 , Y2 ) (X1 , Y1 ) (X2 , Y1 ) 世界座標と正規座標と機器座標 最も簡単なプログラムとして,プログラム例 で世界座標で つの点 を順次つないで正方形を描くプログラムを示した. そこでは世界座標の取り方と機器座標の取り方については明確に示さなかったが,世界座標と機 器座標を明確に指定するとプログラムは次のようになる. 【プログラム例 】 )' . !) /0# . 8) @ 8)!#2 !#2 !AA A #2 &!AA A #2 !#2 !'A 'A 4#2 !CA 'A '#2 第 章 ポストスクリプトによる描画法 !CA CA '#2 !'A CA '#2 !'A 'A '#2 %!#2 !#2 3 3 このプログラムでは, !AA A # で機器座標の全体すなわち左下 から 右上 までを使って描画することを宣言している.また,使用する世界座標も左下が で あり,右上が であることを宣言している. 機器座標として左下を !M A S #,右上を !M'A S'# と指定するには . H 3!M AS AM'AS'#2 と記述する.また,世界座標として左下を ! A & #,右上を !'A &'# と指定するには & .&H&3! A& A'A&'#2 と記述する. これらの命令を説明する前に,世界座標で つの点 を順次つないで正方形を描くプログラムを改良しておく.はじめに指定したパスの出発点までポ インタを戻すときは, という命令があるので,これを用いる. 【プログラム例 】 )4 . !) /0# . 8) @ 8)!#2 !#2 !AA A #2 &!AA A #2 !#2 !'A 'A 4#2 !CA 'A '#2 !CA CA '#2 !'A CA '#2 図形の描き方+ 次元グラフィックス !#2 %!#2 !#2 3 3 もっと簡単に矩形を描く命令 .H3! A& A'A&'AAA # を使って次のよ うにすればもっと短いプログラムとなる. 【プログラム例 】 )5 . !) /0# . 8) @ 8)!#2 !#2 !AA A #2 &!AA A #2 !'A 'A CA CA A A #2 %!#2 !#2 3 3 命令 ! A& A'A&'AAA # は左下を ! A & #,右上を !'A &'# とする矩形を明度 J はもっとも黒く,J は最も白い で,線の幅を インチ . J .. として実線 J のとき で描く. 機器座標を 等分して左下を とし,右上を とする領域,左下を とし, 右上を とする領域,左下を とし,右上を とする領域,左下を とし,右上を とする領域の つの部分に分けてそれらにそれぞれ世界座標で点 を左下, を右上とする正方形を描くプログラムは次のようになる. 【プログラム例 】 )6 . !) /0# . 第 章 ポストスクリプトによる描画法 2 @ A &@2 8) @ 8)!#2 !#2 !AA A #2 ! @2 [52 ! @@ # ! @@'# ! @@4# DD#. D@ 62 & D@ 62 @ 62 !A &A D6A &D6#2 !'A 'A CA CA A A #2 3 !#2 3 3 このプログラムの実行すると図 のような図形が得られる. 図 機器座標を 等分して,それぞれの領域に描かれた世界座標で点 を左下, を右上とする つの正方形 世界座標で点 を左下, を右上とする正方形を描きその中を灰色 J で塗 りつぶすプログラムは次のようになる. 図形の描き方+ 次元グラフィックス 【プログラム例 】 )7 . !) /0# . 8) @ 8)!#2 !#2 !AA A #2 !'A 'A CA CA 6A A #2 !'A 'A CA CA A A #2 !#2 3 3 このプログラムを実行すると図 のような図形が得られる. 図 世界座標で点 を左下, と正方形の内部を塗りつぶした図形 【例題 】 ポストスクリプトにより,円とその円に内接する正六角形を描くプログラムを書け. 【解答例】 ポストスクリプトにより,円とその円に内接する正六角形を描くプログラムは次のよ うに書ける. 第 章 ポストスクリプトによる描画法 ,4 . !) /0# . A @ A @72 @6A &@6A @42 A&A 2 8) @ 8)!#2 !#2 !#2 !A&A#2 !#2 ! @2 [2 DD#. @'9X 8Y9!!# "!# #2 @DX ! #92 &@&DX ! #92 !A&A'D #2 @2 3 !#2 %!#2 !#2 3 3 このプログラムの実行結果は図 のようになる. 【例題 】 ポストスクリプトにより,関数 ( のグラフを くプログラムを書け. 【解答例】 ポストスクリプトにより,関数 ( のグラフを プログラムは次のようになる. ,5 . !) /0# J 2 J 2 5 5 の範囲でグラフに描 の範囲でグラフに描く 図形の描き方+ 次元グラフィックス 図 円に内接する正六角形 . 8) @ 8)!#2 !#2 !AA A #2 &! 'A 'AD 'AD '#2 ! #2 ! #2 !#2 3 !8) #. A2 A2 ! AA AA'AA #2 !A AA A'AA #2 ! A A A #2 ! 6A 'A 'A #2 ! CA 'A A #2 ! A A A  ! 'A 'A 'A #2 第 章 ポストスクリプトによる描画法 ! 'A CA A #2 ! 'A A A #2 !#2 ! @ 2 [@ 2 DD#. ! @@# 2 @!# " 2 @52 !! R6#1@# @'2 !A A4#2 !DA A'#2 ! AA4#2 ! ADA'#2 3 %!#2 3 !8) #. A @ A@ 2 2 !#2 ! @2 [@2 DD#. @!# "!# 2 !AX !X 8Y9#A'D #2 @2 3 %!#2 3 3 【例題 】 ポストスクリプトを用いて関数 作れ.座標軸 軸と 軸 も入れること. 【解答例】 ,6 J を の範囲で描くプログラムを 図形の描き方+ 次元グラフィックス y 1 0 -1 1 x -1 図 J 2 5 における J ( . !) /0# . 8) @ 8)!#2 !#2 !AA A6#2 &! 'A'AD 'AD '#2 ! #2 ! #2 !#2 3 !8) #. A2 A2 ! AA AA'AA #2 !A AA A'AA #2 ! A A A #2 のグラフ 第 章 ! 6A ! CA ! A ! 'A ! 'A 'A 'A A CA A 'A A A A A #2 #2  #2 #2 !#2 ! @ 2 [@ 2 DD#. ! @@# 2 @!# " 2 @52 !! R6#1@# @'2 ! *#. !A A4#2 !DA A'#2 3 ! AA4#2 ! ADA'#2 3 %!#2 3 !8) #. A @ A@ 2 2 !#2 ! @2 [@2 DD#. @!# "!# 2 !A9A'D #2 @2 3 %!#2 3 3 このプログラムを実行すると図 の図形が得られる. ポストスクリプトによる描画法 図形の描き方+ 次元グラフィックス y 1 0 -1 図 J 2 5 における 1 J のグラフ x 第 章 演習問題 問題 問題 問題 問題 ポストスクリプトを用いて実線で正方形を描き,その中に正方形に接する円を描くプログ ラムを作れ. 同志社のシンボルマークを描き,その横に F & と書き,その下に自分の 名前をローマ字で書くプログラムを作れ. ポストスクリプトを用いて関数 J のグラフを グラムを作れ.座標軸 軸と 軸 も入れること. の範囲で描くプロ ファイル に書かれている 点の 座標の値 を 読み込み,ポストスクリプトを用いてそれらの点をなめらかに結ぶ曲線を描くプログラム を作れ.座標軸 軸と 軸 も入れること. 索引 記号/数字 4% 8 文 , , :M%/# /% J :M%/<% !% JJ 43! J L H 4 - % ! O J 1バイト整数型 2バイト整数型 8バイト整数型 / * % * % 型 "($ !* :> ".$ %1" "! 文 "( & . 6"%. ! / / ! 4( "( /// ! 論理演算子 ' 文字コード表 'B / %! (( R /")* 文 /"4 /"4 型 , ( ! /< !* ! (0"% ( % 0 ?$ :' 6 ( 4"" 6 # /% 索引 6 <% !% # 論理演算子 R K" ! K" ! 型 K""% 6"%!% -"% 文 &' 図 $ "! $") $% ! $% ! &% !<% !% 0!/ ! $% ! 文 文 % /". - ( % /". (( R - %$ ! %!% 文 !0% - ! 型 (! (( R (*"%! , ( @ (%! (! %!< !* "0 "0 関数 . メソッド !* クラス !* クラス コマンド . ) )$ !* .4% 8 関数 (!%$3 関数 !% 0 文字列 型 !% 0:M% クラス (!%.$ !% 01"8 F% !% 0 クラス (4(!% 0 () !* 文 , ! !"! 1% "/ "/ 索引 か % 型 " / 型関数 " / )* 文 , <<< あ アクセス修飾子 , アセンブラ 値型 , 値型変数 後判定による繰り返し アルゴリズム , い インスタンス , インターフェイス型 インタープリタ型 インデント インヘリタンス え エスケープシーケンス , 演算子の優先順位 お オーバーライド オーバーロード オーバーロードコンストラクタ オブジェクト オブジェクト指向型 オブジェクト指向型言語 オブジェクト指向型プログラミング言語 オブジェクト指向プログラミング オブジェクト指向プログラミング言語 オペレーティングシステム , 外部記憶装置 概略 &' 図 拡張クラス 拡張子 型 型変換 カレントディレクトリ 関係演算子 , 関数 関数値 き 偽 , 機械語 機器座標系 疑似乱数 キャスト く クラス , , , クラス型 繰り返し処理 繰り返し変数 カウンタ変数 こ 高級言語 合計 構造化プログラミング 個数 コメント文 コンストラクタ コンソール画面 コンパイラ型 コンパイル , コンピュータ言語 さ 再帰呼び出し 最小公倍数 索引 最大公約数 先判定による繰り返し サブ・ディレクトリ サブクラス 算術演算子 , 参照型 , 参照型変数 参照箱 た 多次元配列 単精度実数型変数 ち 逐次構造 , , 逐次参照ファイル 直接参照ファイル し て 実行ファイル 実数型 , 実数型変数 縮小型変換 出力箱 条件式 , 詳細 &' 図 書式指定出力 処理箱 真 , 定義箱 定数 ディレクトリ データの削除 テキストファイル 手続き型 手続き型言語 手続き型プログラミング 手続き型プログラム デバッグ , デリミタ す 数学関数 , 数学メソッド スーパークラス ストリーム 墨入れ せ 正規座標系 整数型 整数型変数 世界座標系 絶対パス 選択構造 , , , , 選択箱 そ 相対パス ソフトウェア と 問い合わせ トークン に 入出力メソッド 入力箱 は ハードウェア ハードディスク 倍精度実数型 , 倍精度実数型変数 バイト バイトコード バイトコードファイル バイナリーファイル パイプ , 索引 配列 配列オブジェクト 配列型 バグ パス , 反復構造 , , 反復箱 ひ 引数 引数値 ビット 否定演算子 標準出力 標準入出力 標準入力 ふ ファームウェア ファイル ファイル入出力機能 フォン・ノイマン式計算機 フローチャート プログラミング ブロック構造 文 分散 へ 平均 変数 変数名 ほ ポインタ ポストスクリプト ま マイクロコンピュータ む 無限ループ め 明示的型変換 メイン・メソッド メソッド メソッド 関数 , も 文字型 文字型変数 文字列変数 文字列メソッド , 戻り値 , よ 呼出箱 ら 乱数 り リダイレクション る ルートディレクトリ れ 連結演算子 ろ ローカル 局所変数 ローカル変数 局所変数 論理演算子 , 論理型 論理式 わ ワールドワイドウェブ