場合 - みる会図書館


検索対象: 月刊 C MAGAZINE 2001年3月号
116件見つかりました。

1. 月刊 C MAGAZINE 2001年3月号

スでもある程度のテストの実行は可能だが , プログラムの仕様レベルの確認まで含めた 場合には , C + + Test だけでは十分とはいえ ない。このような場合には , ユーザ自身の 手でテストケースを追加する作業が必要に なる。 C + + Test は , 多様なユーザ定義のテスト ケースの実行を可能にするために , 次の 2 File Eroject lests Qptions 旦引 p Fig. 2 テスト結果の画面 ータとして定義する ・ユーザ定義のテストケースを追加のデ 用意している。 つのユーザ定義のテストケース設定方法を 今ヒト地」をを、をを「・作を 朝 ,. 。ア 0 ・ C + + Test が自動生成した Stub ではなく , ユーザ自身が用意した Stub を使用し てテストを行う これら 2 つの方法は , どのようなテスト を行いたいかで使い分けられる。設定方法 の詳細は以下のようになっている。 テストデータの追加 テストデータの追加は , [Test case edito 日夕プで行う。 Fig. 5 にその様子を示す。テ ストデータの追加はこの画面から簡単に行 うことができる。まず , 画面の [Test case 無同 テスト結果画面 editor] タブ上に表示されている実行済みの テスト結果をクリックする。すると , その テストの入力テンプレートが画面下部のパ ラメータの詳細部分に表示される。 関数への引数を編集する場合には , " Ar gs and return ' に表示されている青色の部 分 (Fig. 5 の場合は {... D , もしくは入力ポッ クスから値の変更をする。 こで設定され - ・ e 畑 1. 叩 p , : e 2. 叩 p 。・ e畑3. cpp 第、 4. 。叫 4.CPP PO 引 Conditions: Pre Conditions: gs and 扣 rn : 0 リリい ReSLJlts ・十和 simp を ・十 VO 馗 simpB ・十 VO bubb 十 VO bubb ・十 c 酣 SO te 00d 引 Test pro を ss Results ー Te 獸 se 曲 0 日帥」 b ね b 愴引 S 叩 83 引 on 引 lastresults ・い一 ARGS arr=NULL S にを = -2147433648. PRE S 田 1 」 Ode = 印」 b e POS を SO れ一 rnod 日 u ・い一 ARGS. arr=NULLt size=O, PRE:sort_mode=B1 」 bblel, POST: 30 員一 mode = 日 u わし el. ・い一 ARGS: 砒に N リ LL. S に e = 2147493647. PRE. 30 員一 mode = 日リ bb 1 . POST: sort_mode=Bub ~ ・・・い一 ARGS: arr=NULLt 6 に e = 町 PRE son_mode=Simplelnsettion1, POST ・ 30 ー mode = 引 mp ・卩ー AROS: art=NULL, s に e = ・ 214748364 PRE : SO れ一 mod Simp 厄 ln 託 on 籖 POST ・ 50 れ一 ・い一 ARGS. ド NU し L. s にをニ 0. PRE: 30 ⅱー mode = Simp 3 を市 0n1. POST: sott_rnode=Simple:- ・材ロ代 : 0 ”ーー… - 0 ゖ 0 ャ - 第マ 03 第 0 PQ に 0 ′”、当 0 、 1 air 、 00 , ・ Exception caught ー・・、・ E occurred. 白」第日 0 ま第し、ない日局心市時日 0 純 so 杙 ( い 3 なを き一を So 杙 Mode so 杙ー第 od をし第い SO rtuode so 杙ー第 ode : ⅲを引 - た出力値と実際にテストした結果が異なる これが , プラックポックステスト 場合には , テスト結果でエラーとして表示 となる。 される。 分もユーザ自身が Stub を生成することで , 成した Stub が使用される。しかし , この部 行わない。この部分は , C + + Test が自動生 際にデータベースに接続したテストなどは C + + Test は単体テストツールなので , 実 ユーザ定義 Stub の使用 例を Fig. 6 , 7 に示す。 テストケースを作成してテストを実行した ことができる。 DCOM アプリケーションの ラックボックステスト , 回帰テストも行う 行うことで , グローバル変数も考慮したプ あとの変数の状態を入力する。この設定を 状態 , ' PostCond ⅲ on ' は関数が実行された ons" は , 関数が実行されるの前の変数の は "Post Condition" から行う。 Pre Conditi 数を変更するには ,"Pre Conditions" また また , 関数で参照しているグローノヾル変 Fig. 3 配列の詳細表示 ノ int* arr [NULLI bject name: arr Objecttype: int* Ob. i t Vi 旧・ バラメータの詳細画面 【 0 」 e00 : [Non-editab 囘 テパッガと連動した様子 第 ファイルの ) 表示物入 (P 加ゾ⑧ビルド⑧ツールウインゆア⑧ 当をすⅡ , 則。旦 p 穢国「パーレ 朝ノ象 第 e 1 工叩 ・「 02-0 叩 ・ 8 3 毛叩 0 出 ce COde Show 、丁朝 39 を d 0 「 ー一曲ね 0 博 3 同ロ ロ X Te いを , S 叩 p 虍 3 引 0 rogram ℃ :VWIbNTVSYf 'E:VProgram F ' E : 「 ogr 訓 F 'C:VWIhMVSYf 'C:VWIM{TVSYf ' C : ー刪 TV ミ 'C:VWIWVSYf 'C:VWIVITVSY{ 一 4 」 0 、」・十但 04 メ細 dbub 0 ー , 0 市 0 心・ 00 こ」囘 ARGS 3 に N リ LL. 5 に 1. 4,CPP 国こ」ロ声 RGS : a に N 以ム s に 1 . 十 GLOBALSYMk; ・十り h 第 ' 02 乢。 十和 bubb ・十 vo 引 mp ・十 vo 引 rn ロ 0 国 PUt 区 : E:\Program ~ 土 1 に 3 、 Parasoft 、 c + + T 色 3 セ、色 x 屮 1 を 3 、に X04 ・ cp 【 0 ) に C い 146 C MAGAZINE 2001 OK 3

2. 月刊 C MAGAZINE 2001年3月号

List 5 ページを表示させる 1 : JEditorPane Jep = new JEDitorPane( 2 : URL url = new URL("http://cmaga.zdnet.co. jp/index. html" 3 : jep ・ setpage(url); / / ネットからページを取って表示する List 6 リンク先ドキュメントを一括ダウンロード 3 : / / のリンク先をダウンロードする ! = null){ processHREFs ( line 5 : while(( line = toc. readLine()) String line; new Buf feredReader ( new InputStreamReader ( mainur I. openStream ( ) ) BufferedReader toc / / readLine() を使いたいため URL mainurl = new URL("http:/ん響″.aaa.org/docindex.html"); 6 : 4 : 2 : 1 : 3 : if (ucon. getcontentType( ) . equals("text/html" ) ) { //HTML なら 2 : URLConnection ucon = pageurl.openConnection( ); 1 : URL pageurl = new URL(hrefvaIue); HTML だけをダウンロードする List 7 4 : 5 : 6 : BufferedReader pagecontent new BuffereReader(new InputStreamReader(ucon. getlnputstream( ) ) getpagecontent(pagecontent); / / ページをダウンロード ( 自作メソッド ) 性の値 ( = リンク先 ) から URL オプジェクト を作り , その URL にあるべージ / ドキュメ ントをロードする・・・・・・の繰り返しになるで しよう (List 6 ) 。 List 6 で呼び出されている 自作メソッド processHREFs() の中では , 目次 (toc, table of contents) を表している docindex. html の中の , <A HREF=' 意点は「リンク先からのリンク先の取り扱 ジを自動ダウンロードする際の , 第三の注 リンクをたどりながら複数の Web ペー が必要です田 st 7 ) 。 前にコンテンツタイプをチェックすること openStream() を呼び出すのではなく , 事 List 6 の例のようにいきなり URL クラスの けをダウンロードしたい , というときには 場合の対策です。それらの中から HTML だ が HTML に統一されていない可能性がある 第二の注意点は , リンク先ドキュメント けなければなりません。 対 URL の前に http://www.aaa.org/" を付 換する必要があります。 Iist6 の例では , 相 ムの中から呼び出す場合には絶対 U 糺に変 れをローカルクライアントの Java プログラ の文字列は相対 U 糺になっているので , そ トにあるドキュメントを参照する HREF 値 しなければならないのは , 同じサーバサイ 字列からリンク先の U 糺を作ります。注意 の部分を見つけ , HREF 属性の値である文 い方針」です。この方針は , 私ゃあなたが 作るプログラムの目的次第 , そして目的ペ ージの性質次第ですから , プログラム立ち 上げ後に指定できるためのインタフェイス を設けておくのがべターかもしれません ( 単純画一的な指定はできないというケー スも多いでしよう ) 。当面のデフォルトの 方針としては , たとえば " HREF 属性の値 が絶対 URL なら無視 / 相対 URL でかっその コンテンツが HTML ならばダウンロードす る " でよいでしよう。絶対 URL ならば , そ れは目的文書の一部ではないことがほば確 実です。リンク先のリンク先のそのまたリ ンク先・・・・・・まで拾うためには , 単純な再帰 メソッドを書けばよいでしよう。そのため には , ページのダウンロードのために java. util. URL. getContent ( ) のような一括ロード を行うメソッドはたぶん使えません。どう しても , 1 行ずつ readLine ( ) する方法にな ります。 ただし第四の注意点として , 無限ループ の防止が重要です。人間がマウスでリンク をクリックしながらページを肉眼で見てい く場合は " 前に見たページに戻った " ことが 当然分かりますが , コンピュータブログラ ムの場合には訪問履歴を Vector などに記録 保存しておいて , 新たな訪問先をそれらと 照合チェックする必要があります。 現在の Web プラウザというソフトは , M icrosoft lnternet Explorer にしても Netsc 叩 e Navigator, あるいはそのほかの製品にして も , 「人間がインターネットを活用する」と いう大きな多様な目的に対してわざと機能 を極少に限定しているような気がします。 使っていて , そんなもどかしさを感じる場 面が少なくありません。上で説明した , 複 数の ( 多数の ) リンクから成る資料の一括ロ ードという当然あってもよさそうな機能 も , 現在の Web プラウザにはありません。 このほか , 昔の BBS ( " パソコン通信 " ) のた めのオートパイロットプログラムでいろい ろできることを 100 とすれば , 今の Web プ c 言語フォーラム 141 だから , マークアップそのものは基本的に て , 昔々からのありふれた作業技法です。 く人 , ときには絵画作品を作る人等にとっ アップの記入は , 文書を作る人や文章を書 してもよいのではないでしようか。マーク の技術の基本枠組みは , まあそのまま踏襲 像 ~ 全体構造を記述する」という今日まで 記述することによってドキュメントの全体 「テキスト本体の随所にマークアップを べてみたいと思います ( 順不同 ) 。 の本稿では私なりの結論をスケッチ的に述 機会と場をあらためて行うことにし , 今回 ですが , 実装試行を含めての論考の展開は 「ドキュメントオプジェクトのあるべき姿」 さて , このところ本稿で探究している 共通ドキュメント技術の将来像 適かもしれませんが。 a プログラミングの入門者の課題として最 用の超低機能の HITP クライアントは , Jav イントラネット オプションもないよなー ろもあります。そう , 逆に機能を制限する 会社のイントラネットでは採用しないとこ 「利用者にいろんなことをさせないため」に ていない既存の商用 Web プラウザですら , しかも , それだけわずかな機能しか提供し ため」に作られているという説もあります。 製品は「しろうとに余計なことをさせない 今の Web プラウザというソフトウェア ぐらいでしよう。 ラウザにできることの多様さはせいぜい 1

3. 月刊 C MAGAZINE 2001年3月号

行できるものが多いようです。 この受け取ったスクリプトファイルから 1 つの命令となる「単語 ( トークン ) 」を取り 出します。言語仕様によってどんなものが 1 つの単語となるかはわかりませんが , 処 理の 1 つの基本となる単語をまずは取り出 すことから始まります。これを「字句解析」 といいます。 単語を取り出すことができたら , その単 / * 関数のポインタと命令の対のコード * / typedef 土 n し ( *cmdfuncptr ) ( char * s / * 対応する関数へのポインタ * / 1 インタブリタの簡単な例 cmdfuncptr cmdfunc; typedef struct ( / * 1 命令取り出す * / {NULL, 即阯 } , zombie {Cmd3, {Cmd2, "meka") , {Cmd1, "taco"} , cmd-t cmdlist[ ] = / * 命令のリスト * / int Cmd3(char *s) / * 命令その 3 * / 土 n し Cmd2(char *s) / * 命令その 2 int Cmd1(char *s) / * 命令その 1 * / } cmd—t; char * 町 void paser—st て ing ( void ) / * 文から命 -p を取り出す * / return S ー / * 叩〒 を切り出して詰める / * s におおもとのテキストから * / char far *getword(void) s = getword( ); / * 1 叩 -p 得る * / 土 n し土ー char far * 語に対応した機能を実行します。単語によ っては , ほかの単語と重なっていることも あるでしようし , 計算を行うような式の形 となっているものもあるでしよう。ある単 語同士の間には優先順位などを決めている こともあります。こうした単語同士の関係 に注意しながら , 処理を実行していくこと を「構文解析」と呼びます。 インタブリタが持つ基本的な構造は , のような字句解析と構文解析 , それによっ て行われる具体的な処理命令 , 場合によっ てはエデイタ部分などスクリプトを入力し たり編集する部分が組み合わされてできて います ( Fig. 1 ) 。 ・それぞれのアルゴリズム 構文解析や字句解析は昔からさまざまな アルゴリズムが考えられていました。本誌 でも 2000 年 5 月号の特集「スクリプト言語を 作ろう」などで何度か紹介しています。構 文解析として代表的なものを簡単にいくつ かあげてみると , ・再帰下降解析 「式」「項」「演算子」などに分け , それぞ れの解析ルーチンを作り , そこへ 1 単 語ずっ与えて解析を行う。「演算子」ま で解析したら「式」へ戻るというように 解析の終端に差しかかったらほかのル ーチンを再帰的に呼び出していく ・ LR 解析 単語が集まった文字列があるとして , それを左から順に読み込む。得た単語 同士の塊をさらに右側から見て単語同 士の優先順位などといった結合具合を 調べる。その時点の状態で行うべき処 理と次の状態への移動先を対にした解 析表を使うのが一般的。また , 左側か などといったものがあります。 ら調べる LL 解析もある この「 X 」を処理することで得られますね。 ることになります。最終的な計算結果は , 「 10 + 1 」を計算してから , 両者の値を「 >< 」す -1 ) >< ( 10 + 1 ) 」のような場合 , まず「 3 -1 」 , がされたデータとなります。たとえば「 ( 3 解析された単語は , それぞれに順序付け そこで , これを「根」と考えると , ほかの計 算部分はその根につながる「枝」と考えられ ます。まとめるとデータ構造のひとつであ る木構造となり , これを「解析木」と呼ばれ ています。実装の際にはデータをスタック 構造にして処理する方法がよくとられてい インタブリタの構造 どのような形であれ , 「スクリプトファ イルからある処理に変換する」ということ を考えると , インタブリタとは一種のフィ ルタのようなプログラムといえます。ソー スコードにするのなら List 1 のような形で す。「単語を読み込み」 , 「単語を計算順に 並べ替え」 , 「単語に応じた処理を呼び出 す」という処理の流れになりそうです。な お , ListI では分岐処理が多くなることを 考えてテープルジャンプを用いています。 WonderWitch の特性を考えると「なるべ く小さく」 , 「なるべく速く」というプログ ラミングスタイルが求められます。またメ モリの制約があるため , 再帰処理などもで きるだけ避けたいところです。 ■フレームワーク「らむね」 こでちょっと過去を振り返ります。筆 者の今までしてきたプログラミングを考え ると , だいぶ偏っているとは思いますが 「その時点の状態を示す変数」と「その変数 に応じた処理」 , 「状態を進める処理」とい う一連の状態遷移を扱うものばかり作って きた気がします。今回扱うようなプログラ ムで再帰処理をしない方法というと , 「 1 つの状態」を処理する関数をいくつか作り , その振る舞いを定義した表を多用すること 0 になるはずです。 ・・・いや , 白状します。 私はこういうプログラミングスタイルが好 きなんです ( 笑 ) 。 これらを効率よくプログラミングできな いかと考えて自分で作ってみたフレームワ ークが「らむね」です ( Fig. 2 ) 。らむねの構 成要素は「フィールド」 , 「ハンドラ (Famili ar : 使い魔 ) 」 , 「スペル」の 3 つがあります。 まずはだいたいのイメージをつかんでもら 1 26 / * 命令に対応した関数を探す * / 00 { / * 命令の比較 * / if (strcmp(s, cmdlist[i] . s)) { / * 関数を呼び出す * / cmdlist[il . cmdfunc(s); ) while (cmdlistti] . s ! = C MAGAZINE 2001 3

4. 月刊 C MAGAZINE 2001年3月号

特集 プログラミング 期末試験 [ 問 4 」 List 1 のように構造体を宣言した場合 , sizeof(struct f00 ) の値 は次の① ~ ④のうちのどれか。 ① 2 ② 4 ③ 8 ④処理系に依存する 編 五ロ ( 2 点 ) List 出題・解説 : フィンローダ 1 struct f00 { char cl; char c2 ー 問題は , 標準的な C 言語 ( いわゆる ANSI C, 訓 SC ) を想定して います。特別な処理系では , 必ずしもこのとおりにならないこ とがあるかもしれません。 問 1 次の文章の【 1 】 ~ 【 4 】に適切な数値をあてはめなさい。 char 型の変数が表現できる値は , 少なくとも【 1 】以上【 2 】以 下である。 int 型の表現できる値は少なくとも【 3 】以上【 4 】以下である。 ( 各 1 点 X4 ) p->X と同じ意味を持つのは , 次の① ~ ④のうちのどれか。 ③ * (). x) ④ p[x] 2 * p. x [ 問 5 ① ( * p). x 〇 ( 2 点 ) 問 6 」 List 2 と List 3 が同じ処理を行うように ① ~ ④の中から List 3 の【 1 】 ~ 【 4 】に適切なものを選びなさい。 ② i く 100 ; ( 3 ) i 十十 ; ④ ( 空欄のままでよい ) 【 3 】 【 2 】 【 4 】 問 2 」 main 関数が正常終了したことを実行環境に知らせたい場合 次の① ~ ④のうち適切でないものはどれか。 ② return ( 0 ) ; ③ return EXIT SUCCESS 1 return 0 ; ④ exit(l ) ; ( 2 点 ) ( 各 1 点 X4 ) ▽ ▽ fo て ( 土 = 土く 10 土十十 ) f00 ( 土 while ( 【 2 】 ) { 【 3 】 foo ( 土 【 4 】 【 3 】 【 2 】 main 関数の書き方として , 次の① ~ ④のうち正しいものはど れか 1 int main (void) { . 2 VOid main 3 void main void) { . 4 void main (int argc, char * argv[] ) { . 問 3 問 7 List 4 のプログラムを実行したら , 画面に abc と表示された。 【 1 】に入れるものとして適切なものを次の① ~ ④の中から選び なさい。 1 str = "abc" 2 * str = "abc" ③ strcpy (str, "abc") ; 〇 4 memcpy(), "abc") ; 。〇〇〇〇 ( 2 点 ) ( 2 点 ) 特集実力チェックプログラミング期末試験 c 言語編 11

5. 月刊 C MAGAZINE 2001年3月号

CD ・ ROM t e 5 を必ず確認ください ・ NET SDK をインストールする際 , イ ンストールする OS の言語に適応した lnternet Explorer 5.5 と MDAC 2.6 がイ ンストールされている必要があります。 本誌付録 CD - ROM に収録されている 日本語版 MDAC 2.6 をあわせてご利用 ります。その際にはサポート窓口 (pa ・アンインストールが失敗する場合があ ることはできません ・ Visual C + + デバッガと連動して使用す ・漢字の表示はできません く試用にあたっての注意事項 > イスク空き容量 ・インストール時 50M バイトのハードデ バイト ) ・ 128M バイト以上のメモリ ( 推奨 256M ・ Pentium 200MHz 以上 ・ Microsoft Visual C + + 6.0 イアログが表示されます ) 行うとファイルが不足している旨のダ 作対象外です。実際にインストールを いますが , 実際には Windows 98 は動 ュメントには Windows 98 も含まれて ( 付録 CD - ROM に収録されているドキ ・ Microsoft Windows 2000 , NT4.0 く動作環境 > ります。 ご利用にあたっては , 下記注意事項があ ディレクトリに収録しました。 クス ( 株 ) のご協力により , «rechmatrix> ユニットテストツールです。テクマトリッ ース生成からテスト実行までを自動化する 「 C + + Test 」は , ワンクリックでテストケ C + + Test1.0 トライアル om/j 叩 an/devel 叩 er/) をご覧ください。 の Web サイト (http://www.asia.microsoft.c す。詳細については , マイクロソフト ( 株 ) lStudio. NETß 1 日本語版も配布されていま また , . NLTSDK を含む総合開発環境Ⅵ sua 語仕様とプログラミング」もご覧ください。 あわせて , 本誌 2g1 年 1 月号の特集「 C # 言 ください rasoft_support@techmatrix. CO. (p) まで ご連絡ください く評価用ライセンスキーの請求 > 実際の利用にあたっては評価用ライセン スキーを入手する必要があります。説明ド キュメントにある評価用ライセンス請求書 に必要事項をご記載のうえ , 電子メール ( p クトリにある readme. html をご覧ください。 詳細については , く YBorlandYjb40up> ディレ そのほか , これらのインストール方法や ェアご使用条件に準じます。」 用に関しては , 製品に同梱されたソフトウ ものです。このパッチのインストールと使 ilder のライセンスユーザ向けに提供される 「このソフトウェアパッチは BorIand JBu 注意事項があります。 アップデータの利用にあたっては , 下記 があります。 工ンコーディングの変換を手動で行う必要 ラスに格納してしまうため , 以前と同様に イティブエンコーディングのまま String ク 現在の版の Tomcat は渡された文字列をネ cat に正しく渡されるようになります。なお , テキスト項目から入力された日本語が Tom り , 例えば旧 E 内で JSP を実行した場合に なわれない不具合を修正します。これによ ザで HTML Form の日本語処理が正しく行 wser の [web 表示 ] タブに表示されるブラウ IDE 内蔵のブラウザ , すなわち AppBro 対処しています。 改善および確認されていた以下の不具合に このアップデートでは , JBuilder4 の機能 しました。 トを <BorlandYjb40up> ディレクトリに収録 ーランド ( 株 ) のご協力により , アップデー Java 言語を採用した最新 RAD 環境です。ボ 「 BorIand JBuiIder4 ( 以下 JBuiIder4) 」は , アップデートファイル Borland JBuiIder4 新開発環境レポートもご覧ください。 また , あわせて本誌 144 ページからの最 子メールで送布されます ださい。折り返し , 評価用ライセンスを電 arasoft-info@techmatrix. CO. (p) でお送りく 1 6 イ 2001 年 3 月号特別付録 CD - ROM には , 次 のプログラムが収録されています。ご使用 にあたっては , 各プログラムに添付されて いるドキュメントファイル , および付録 CD - ROM のルートディレクトリに収録されてい る index. html をご覧ください。 Microsoft .NET Framework SDK 日本語版 「 Microsoft . NET Framework SDK 卩 1 日 本語版 ( 以下 . NETSDK ) 」は , マイクロソフ ト社の次世代戦略 . NET 構想の基幹を担う Framework SDK の卩版です。 C# をはじめ としたコンパイル環境を提供します。マイ クロソフト ( 株 ) のご協力により , <YMicros 0 れ > ディレクトリに収録しました。 . NETSDK では以下のプラットホームと lnternet Explorer 5.5 の組み合わせがサポ ートされています。 ・ Windows 2000 ( 推奨 ) ・ Windows NT 4.0 ・ Windows Millenium Edition (Windows (e) および Windows 98 また , . NETSDK を使用するには , 最低 限でも以下のシステム環境が必要です。 プロセッサ : Pentium 日 300MHz 以上 (Pe ntium Ⅲ 600MHz 推奨 ) メモリ : 96M バイト ( 128M バイト推奨 ) ハードディスクの空き領域 : 360M バイト ビテオ : 800X600 , 256 色 その他 : Microsoft Data Access Compo nents (MDAC) 2.6 そのほか , 下記注意事項をご確認くださ ・本製品は版です ・上記ティレクトリに収録されているド キュメント「 Microsoft NET Framewo rkSDK べータ 1 リリース情報」の内容 C MAGAZINE 2001 3

6. 月刊 C MAGAZINE 2001年3月号

【 B 】 【 c 】 【 D 】なし 2 群 【 A 】 【 B 】 【 c 】 【 D 】 ・解説 a, b, i, j, k, し m, n m, n, 0 , p a, b, c, d, i, m a, i, j, k, し m, n, 0 , p a, i, j, し l, m, n, 0 , p a, i,j, k, m, n, 0 , 0 , P e パッケージに属しています。つまり , ク ラス Latour と Mateus では , 同じディレクト リに入っていても , 属するパッケージが違 うのです。 特殊な場合を除き , 無名パッケージのク ラスは , パッケージを宣言したクラスから は呼び出すことができません ( 逆はできま す ) 。よって Mateus にあるメソッドはほか のクラスからは使えません。 選択に間違いがあっても , 半数以上合っ ・解説 ② [storm] ① [game] [ 問 7 」 ていたら 1 点です。 実行されない・・・・・・ような気がしますが , ret あるので , メソッドから抜けて血 a Ⅱ y 節は List 5 では , 実行される catch 節に return が す。また , 何が起こっても実行されます。 外が発生してもしなくても常に実行されま ②は血 ally 節の問題です。 finally 節は , 例 を作るのはえらくやりにくいですが。 バグの予防に有効でしよう。こういう問題 ンパイルエラーになります。この機能は , とすると , 次の行が到達不能文となってコ throw new RainException ( ) ; 接 , ちなみに main 中の weather() の行で , 直 節が実行されます。 のなかに適合した例外が見つかれば , その [cansel] は表示されません。そして catch 節 ます。それ以降の文は実行されないので たら , 発生したところまでの文は実行され ①は基本的な使い方です。例外が発生し 例外についての問題です。 特集 プログラミング 期末試験 urn があってもやはり実行されます ( もっと も , そういう特殊性がなければ , 単に後ろ に命令が続くのと変わらなくなってしまい ます ) 。 ③も血 a Ⅱ y 節の問題です。例外が発生せ ず , t Ⅳプロック内で return があっても , fina 11Y 節は実行されます。 [ 問 8 」 アクセス可能性についての問題です。メ ソッドのアクセスは , 修飾子によって , public アクセス : クラスが見えるとこ ろならばどこからでも使用可能 p 「 0 す ected アクセス : パッケージ内のほ かのクラスと , サプクラスから使用可能 テフォルトアクセス ( パッケージアク セス ) : パッケージ内のほかのクラス から使用可能 private アクセス : そのクラスの内部か らのみ使用可能 となります。 また , static が付くと「クラスメソッド」と なります。インスタンスメソッドからクラ スメソッドは使えるが , クラスメソッドか らインスタンスメソッドは直接は使えませ ん 間違えやすい点がいくつかあります。 pri vate アクセスの場合 , インスタンスが別で も同じクラスならばアクセスが可能です。 ( A ) で 1. d ( ) が使えるのはその例です。また , あるインスタンスの protected アクセスのメ ソッドを使う場合 , そのインスタンスが 自分のクラスか自分のサプクラスのときに だけ可能となります ( 「 Java 言語仕様第 2 版』 6.6.2.1 ) 。 ( B ) において 1. b ( ) とはできませ んが , n. b ( ) とするとアクセスが可能になり 1 つひっかけがあります。クラス Mateus にはパッケージ宣言がありません。という ことは , 無名パッケージに属することにな ります。一方 , クラスレ tour はちゃんとⅵ n ① X ②〇 ・解説 ③ X ④〇 ライプラリ全般の問題です。 ① ( 動詞 ) というメソッドを持つイン タフェイスは XXXable という名前にするこ とが多いのですが , java. util. Observable や ja va. lang. Throwable はクラスです ② Object クラスの getCIass() メソッドに よって得られます。オプジェクトが属する クラス名やメソッド名を調べたり , クラス 名からインスタンスを作ったりする機能を 持っています。リフクレクション機能にと って大変重要なクラスです。 ③文法的には java. Iang.ThrowabIe を拡張 していればいいのです。ただしユーザ定義 例外を作るときは Excep ⅱ on を拡張するのが 普通です。 ④の s ⅲ c ゆというキーワードは , JDKI. 2 から導入されました。浮動小数点演算に対 し , 環境の違いにかかわらず同じ演算結果 を要求するというものです。 [ 問 9 」 ① X ② x ④ X ⑤〇 ・解説 ③〇 Java, とくにそのクラスライプラリは , 今も成長を続けています。その過程で推奨 されない (deprecated) , あるいは非推奨な 特集実力チェックプログラミング期末試験 Java 編イ 1

7. 月刊 C MAGAZINE 2001年3月号

第桶亡 30 ~ ます。先ほどの再帰分割に限らず , ドロー 都合 7 点で 2 本の曲線が定義されます。 ソフトなどで , 曲線を切ったりするときに もう 1 つ注目したいのは , この手順によ 使用できます。ベジェ曲線を例にとってざ って , コントロールポイントの成す多角形 っと進みますが , 少し注目しておきたい点 自体が , より曲線に近づいていく点です 寄り道とは , 曲面の向いている方向 , 法 がいくつかあります。 このことについても , 今回の最後に少し触 線に関する考察です。テセレーションによ まず , コントロールポイントが新たに作 れることにします。 って生成されたポリゴンから法線を算出す 成されたり , 不要になったりするという点 ベジェ曲線の 2 分割 ることもできますが , せつかく曲面の式が です。ベジェの場合では , 始点と終点はそ あるので , これを利用して数学的に法線を のままの形で使われるでしようが , 新たに 求めてみましよう。 5 点のコントロールポイントが作成され , まず曲線をちょうど半分に切ってみまし いきなり「数学的に」というと難しそうで すが , 接線を用いると簡単に考えることが できます。法線は , の曲線の接線との曲 線の接線が成す外積で求めることができる のです (Fig. 6- (a) ) 。その接線はどうやっ て求めるのかというと , 微分を使います。 どの式の微分なのかというと , 最初のほう で説明した Fig. 6- ( b ) のような曲面式です。 ちょっと形が変わっているので注意して ください。この式の微分と聞くとぞっとし ませんか ? 偏微分だとかなんとか , 頭が 痛くなりそうです。ですが , 今回は方向 の接線と , む方向の接線をべつべつに求め るだけでいいので少し救われています。そ れぞれ相手が固定していると考えてもよい のです。すると Fig. 6- ( c ) といった感じに なります。 p の各要素がべクトル ( 点 ) だとすると , おのおのの結果はべクトルになり , みごと に接線になります。そこで 2 べクトルに直 交するという外積の性質を最大限に生かし て , Fig. ( d ) が曲面の法線になります。ち ょっと計算量が多い気がしますが , 正確な ライティングが必要になるときやモデルの 法線を生成するコンバータやプラグインな ど , 知っておくと意外と役に立つ場面が多 いので , こんなのもあるよという意味でご 紹介しました。 法線 Fig. 7 ベジェ曲線を 2 分割する ( a ) 分割するベジェ曲線の例 ( e ) 前半部分のコントロールポイント 20 ( b ) 分割した曲線の式 L(u)=S( 均 1 1 ( f ) 後ろ部分のコントロールポイント 火 ( の = S ( を + プ ) 1 8 = 〃 jP ニ 0- -0- 1 0 一 0- 1 一 2 -0 0 数 漑 係 0 1 一 40 0 る めアた め 1 一 80 0 0 求″ -0 -0- 0- 1 を漑求 で 0 01 一 2 0 ン 計 0 1 一 4 0 0 イ 1 一 80 0 一 0 用 を ロ ン 行 コ 逆 1 ] 亠 8 3 3 8 1 1 1 4 2 ー 1 一 2 如 = [ 卍リ こ 0- 0 -0 1 一 8 0- 0 一 1 一 43 一 8 01 一 21 一 23 一 8 11 一 21 一 41 一 8 分割 HFMB 話を元に戻して , 曲線の分割を行ってみ Enter The 3D Programming 109

8. 月刊 C MAGAZINE 2001年3月号

後藤謙太郎 第 & 回 ーインタブリタは遅いけどー スピードアップ について解説します。また , 「 1 つのプログラムをいかにして速くするか」という実践 を速くできることがあります。今回はこのような Ruby を使ったプログラムの高速化 これは仕方のないことですが , それでもちょっとしたコツで , 普通に作るよりも処理 インタブリタである Ruby では , どうしてもプログラムの実行速度に限界があります。 的な内容についても取り上げます。 はじめに Ruby はインタブリタとして実現されて います。これはある意味必然的なもので , Ruby のように eval を持っていたり , メソッ ドが実行時に決まったり , 結果の型 ( クラ ス ) もやはり実行時に決まるようなオプジ ェクト指向言語には避けられないことです。 インタブリタであることは決して悪いこと ばかりではありません。ソフトウェア工学 的な部分はさておき , こでは少し昔話を させてもらいます。 筆者が最初に触れたプログラミング言語 は 1980 年代の中ごろ , そのころ国産機とい われていた NEC の PC -9801 に標準で付いて きた N«BASIC です ( その前にインテルの 80 85 のアセンプリを手でアセンプルしたり紙 の上で Lisp を勉強してましたが , アセンプ リは言語というにはアレだし実際に Lisp を 触ったのはもう少しあとなのでこの際おい ておきます ) 。そのころは主に『サイエンス』 誌 (Scientific American 誌の翻訳がべース ) にあったテュードニーさんの連載記事「コ ンヒュータ・レクレーション」で遊びなが らプログラミングをかじっていました。 今では BSD や Linux あるいは Windows 20 00 といった , ちゃんとした OS を誰でも入手 でき , 言語処理系も選び放題なので , もう BASIC を最初に学ぶメリットをまったく感 じられなくなりましたが , それでも当時の パソコン環境は , プログラミングという愉 快な世界の入口としてはなかなかよかった と思います。ゲームで遊びたければ本や雑 誌から BASIC や 16 進ダンプで書かれたプロ グラムリストを打ち込んで実行するといっ たことはぜんぜん珍しいことではありませ んでした。もっともパソコンを所有するこ と自体が珍しいことだったわけですが。お Fig. 1 マニュアルに書かれている scan メソッドの内容 マッチ全体 ) をプロックのバラメータとします。 コでくくられた部分にマッチする部分文字列 ( カッコを含まない場合は の配列を返します。プロックを指定して呼び出されたときには , カッ 返します。正規表現がカッコを含まない場合はマッチした部分文字列 規表現中のカッコでくくられた部分にマッチした文字列を配列として 「 e で与えられる正規表現を文字列に対して繰り返しマッチを行い , 正 Fig. 2 St 「 ing#scan を使ってみた 伝授 ! 極めよ Ruby 道 ni 冂 $ ruby -e ' ” 00 , 02 , 18 ” . scan ( / は d + ) ( , ) ? / ) { 国 p i)' $ ruby -e ' " 圓 , 02 , 18". scan ( d 十 / ) ロ幻 p i}' [ ” 18 ” [ ” 02 ” ” 02 ” ” 00 ” 81

9. 月刊 C MAGAZINE 2001年3月号

になっています。 「問 7 」 1 Array. new ( 1 0, または [0] * 10 ② Array. new ( 1 0, または これは次の文字列を出力します。 a[O] push 1 a = Array. new(10, [ ] ) ます。まず , テスト用のコードを作ります。 ジェクトであることは , 次の実験でわかり ②も①と同様です。これらが同一のオプ ん。 をかぞえ間違いやすいので , お勧めしませ のような書き方ももちろんできますが , 数 [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] そのほかに です。一方後者はやや遅い処理となります。 ます。 ray. new を使ったほうが高速だから 示します。一般的に前者のほうをお勧めし るので , こでは代表的な 2 つの方法だけ いずれについてもいくつかのやり方があ ・解説 a = [ ] ; 10. times{ a. push [ ] } または ③ Array.new(10). map!{ [ ] } 詰めることはできません。③のようなこと なお , ray. new では同一でない要素を こから , 配列の状態がわかると思いま [ 1 ] ] す。 60 C MAGAZINE 2001 3 要素を詰めていくしかやり方はありません。 を実現するには , いったん生成した配列に コードを指定しないという意味の " NONE " a = [ 1 , 2 , 3 ] a = [ 1 , 2 , 3 ] [ 問 8 」 ① ② 0 ・解説 ックは知っておきたいところです。たとえ のですが , 配列の要素を置き換えるテクニ このアルゴリズム自体はどうでもよいも のです。 Perl/Ruby カンファレンスで出題されたも 得ることができます。この問題は昨年の ほかなりません。 82 は 9 進数なので結果を ムは与えられた n を 9 進数で表現することに 余りからなる配列なので , このアルゴリズ になります。 lnteger#divmod は除算の商と ⑨の要素で d [ 0 ] を置き換える」ということ ば , 「 d [ 0 ] が 9 未満になるまで d [ 0 ] . divmod して 3 行目で行っていることを言葉でいえ ず 2 行目までで d は [ 82 ] になっています。そ プログラムを順に見ていきましよう。ま ば , と , a [ 1 .. 1 ] = [ 4 , 5 , 6 ] = [ 4 , 5 , 6 ] は , いずれも a を , 4 , 5 , 6 , 3 ] とします。これを , a = [ 1 , 2 , 3 ] a[l] = [ 4 , 5 , 6 ] としたなら , その結果 a は , となります。 は 9 」 [ 4 , 5 , 6 ] , 3 ] ・解説 ちょっといじわるな問題です。 a の要素 は 1..2 という Range オプジェクト 1 つだけな ので , このような結果となります。 f00 ” = > 10} このプログラムは引数で与えられたテキ count. each{lw, cl puts ” w, c" } end split. each{lwl count[w] + = 1 } while gets count = Hash. new(O) す。 あるかというと , 次のような用途のためで では Hash. new のデフォルトが何のために す。 これがこの一見奇妙な結果の説明となりま ②では default と同じ " a " が報告されます。 告され , h [ 1 ] には登録されていないので , ん。よって①では何も要素がないことが報 すが , h [ 1 ] が変更されるわけではありませ ult が返すオプジェクトに " a " が連結されま れます。 2 行目の concat によって , この defa 録されていないキーに対する値として返さ fault の値として登録されます。 default は登 Hash. new に引数が与えられると Hash#de ・解説 ③” ②” ① { } [ 問 11 」 っこは省略できません。 また , プレースを省略したら引数を囲むか ーと値の間は = > にしなければなりません。 省略することができます。この場合は , キ は , ハッシュリテラルの外側のプレースを ハッシュを 1 つだけ引数として渡す場合 ・解説

10. 月刊 C MAGAZINE 2001年3月号

◎⑨の 素性のよい数たち 第 120 回 最近気になったことなのだが , 確保した 変数の初期化を行っていないソースが目に っく。それでも偶然うまく動作することも あるが , しつかりと初期化を行うよう習慣 づけていただきたい。 今月の問題「六角形の超線上」では , 思わ ぬ方向に直線が存在するから気をつけて。 吉柄責樹 【 12 月号の問題】 こに相異なる 7 数がある。そのうちの 6 数を選んで掛け合わせ , それに残りの 1 数 を足すと素数になり , これはどの 6 数を選んでも成立しているという。このような 7 数 の組み合わせはたくさんあるので , その 7 数の和が最小のものを見つけていただきた い。なお , ここに登場する数はすべて正の整数とする。 正解は , 1 3 1 3 の 2 つで , 1 2 月号の解答 5 7 17 22 23 8 1 1 1 3 17 25 和は 78 であった。このうち 1 つ 「 2 以外の素数は奇数」 「 nx 偶数 = 偶数 , 偶数 + 偶数 = 偶数 , 奇数 x 奇数 = 奇数 , 奇数 + 奇数 = 偶数」 という前提から , 「全要素数のなかに偶数 が 1 つだけ必ず入る」という解の法則性を 抽出。これに基づき , 解の配列は , 偶数を 最終 lndex に , 奇数は最終手前から lndexl に向かって増加するように使用 ( コードの 簡素化と高速化の都合により Index0 は未使 用 ) 。 偶数は 2 , 奇数は 1 , 3 , 5 ・・・・・・と順に要素 分埋まるのが最低の和。そこから " 割り振 り可能な 2 の数 " を解が見つかるまで順に増 やす , というのが main のループ。 TrySetV ar 関数は , その lndex で使用可能な " 割り振 り可能な 2 の数 " の全種を設定しながら次の lndex に移っていくことにより , 「重複のな い全組み合わせを作る」再帰関数。 1 つの組み合わせができたら , IsOkVars 関数で素数条件系のテストをし , 解が見つ かれば Prin は ns 関数にて表示する。そのほ か , 以下の特徴を持つ。 ・ 3 ~ 9 の組み合わせも可能 ・同じ和の全パターンを調べ尽くすまで 継続するか否かを切り替え可能 ・感想 数字そのものを操作するようなロジック から " 割り振り可能な 2 の数 " を操作してい くというアルゴリズムにたどりつきました。 その改造によりコード量が一気に 1 / 3 ほど になり , いかにムダなことをいままでして いたのか , と驚かされました。パズルを解 くことは , コンピュータと人間の可能性の 競演 & 共演のようですね。 C P U : Celeron 533MHz しか答えていなくても正解とした。ちなみ に 8 数では , 1 2 5 7 11 23 47 51 1 3 4 11 1 3 1 7 1 9 79 となり , 和は 147 であった。 10 数までの解 を求めてくれた解答もいくつかあった。数 の個数が増えると unsigned long では桁あ ふれを起こすので注意していただきたい。 この問題を解くにあたり , まず気づかな ければならないのが , 「 6 つの奇数と 1 つの 偶数からなる」ということであり , これは 大部分の方がクリアしていた。素数の判定 は , 割ってみるための素数のテープルを作 っておくほうが高速になるだろう。 今回は , 初期状態の 7 数に 2 を順に加えて いくことで解いている平野敏太さんと , 「構 成する各数に共通の因数が存在してはいけ ない」という条件を用いて解いている花田 康守さんの解答を紹介する。お 2 人とも 7 数以外の問題も解けるようになっている。 平野敏太さんの解答 ( プログラムは付録 CD - 日 OM PUZZLEO 1 . C) ・プログラムの説明 O S : Windows 2000 Professional (SPI) コンパイラ : Visual C + + 6.0 ( SP4 ) 実行時間 : 0.03 秒 花田康守さんの解答 ( プログラムは付録 CD - 日 OM PUZZLE02 ℃ ) ・プログラムの説明 処理は単純に小さい和から始めて , この 和を構成する 7 数をすべて求め , 題意の積 値を求めて , すべて素数である 7 数の組み 合わせを検索します。単純にこれを実装 するだけでは , いまいち速度が遅いので , 以下のような問題の性質を利用して速度 を向上させています。 1 ) 解となりうる組み合わせのなかに偶 数は 1 個必ず存在する 2 個以上ある場合 , 偶 x 奇 x 奇 x ・・ ・十 偶 = 偶数になり素数にならない。 0 個の 場合 , 奇 x 奇 x ・・・・・・ + 奇 = 偶数になり素 数にならない 2 ) 7 数の場合 , 調べるべき和は偶数だけ でよい。 1 ) より , 数の組み合わせは奇 160 C MAGAZINE 2001 3