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

相性占いプログラム

N/A
N/A
Protected

Academic year: 2021

シェア "相性占いプログラム"

Copied!
10
0
0

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

全文

(1)

プログラムの概要

画面上で、男女夫々れの誕生日の月日と血液型を コンボボックスより選択した後、占うボタンをク リックする。 相性とアドバイス&ポイントは、血液型と星座の 位置に依り、予め或る占術法に基づき作成された データをファイルより読み込んで配列に記憶させ、 誕生日と血液型に依り算出された評価値に該当す るデータを表示する。 猶、必要な入力が行われて居ない場合には、警告 音を鳴らして、該当入力部分に戻る物とする。 今回は、ファイルアクセスの基礎と成るシーケン シャルファイルの読込に付いて学習する。

相性占いプログラム

C# 2005 ① □ 1次元配列変数の宣言(データ型[ ] 変数名 = new データ型[ 要素数 ] ) □ 2次元配列変数の宣言(データ型[ , ] 変数名 = new データ型[ 要素数, 要素数 ]) □ 標準コントロールの利用(Label、ComboBox、Button、Groupbox、Picturebox) □ プロパティの値の取得と設定(Text、StartupPath、Length 等) □ イベントの利用(Load、Click) □ メソッドの利用(EndWith、Focus、Substring、Dispose、Exit) □ 文字列操作メソッドの利用(文字列の分割 Split、文字列の数値化 ToInt32) □ 演算子(代入演算子、算術演算子、比較演算子、論理演算子、結合演算子) □ 制御構造構文(条件分岐 if 文、switch 文、ループ処理 for 文) □ ファイル入出力(シーケンシャルファイルの読込、StreamReader、ReadLine、Close) 今回の課題項目 □ シーケンシャルファイルの読込(FileOpen、Input、FileClose) □ 文字列操作メソッドの利用(文字列の分割 Split、文字列の数値化 ToInt32) 今回の重点項目 □ 背景画やフォントを工夫してビジュアルな面を改良する。 □ 他の占い方法に依る独自のデーターファイルを作成する。 今回の応用項目

(2)

■ オブジェクト・プロパティ一覧 ■ コントロールの種類 プロパティ プロパティの設定値 フォーム Name uranai BackColor White FormBorderStyle FixedSingle Text 相性占いプログラム ラベル1 Name lblTitle Text 血液型・星座に依る相性占い Font HG 創英角ポップ体,標準,24 ラベル2 Name lblExplain AutoSize False Text 星座に依る相性は、ホロスコープ上の太陽の宮 のみで判断しますが、血液型と惑星の位置は、 或る種の密接な関係が有ると言われて居ます。 其処で星座と血液型に依り更に多くの因数か ら詳しい相性を判断して居ます。 Font MS明朝,標準,11 ラベル3 Name lblMan1 Text、Font 男性: 誕生日(MS明朝,太字,12) ラベル4 Name lblWoman1 Text、Font 女性: 誕生日(MS明朝,太字,12) ラベル5 Name lblMan2 Text、Font 生 血液型(MS明朝,太字,12) ラベル6 Name lblWoman2 Text、Font 生 血液型(MS明朝,太字,12) ラベル1 ラベル2 上:ラベル3 下:ラベル4 グループボックス1 ボタン1 ラベル7 上:コンボボックス1 下:コンボボックス2 上:ラベル5 下:ラベル6 ラベル8 ラベル9 ピクチャボックス 上:コンボボックス5 下:コンボボックス6 ボタン2 上:コンボボックス3 下:コンボボックス4 グループボックス2

(3)

コントロールの種類 プロパティ プロパティの設定値 コンボボックス1、2 Name cmbMonthM、cmbMonthW Text、Font 空白(MS明朝,標準,9) Items 1月~12月(改行付き、数字半角、桁揃え) コンボボックス3、4 Name cmbDayM、cmbDayW Text、Font 空白(MS明朝,標準,9) Items 1日~31日(改行付き、数字半角、桁揃え) コンボボックス5、6 Name cmbBloodM、cmbBloodW Text、Font 空白(MS明朝,標準,9) Items A型,B型,AB型,O型(改行付き、全角) ボタン1 Name btnStart Text 、Font 占う(MS明朝,太字,11) ボタン2 Name btnFinish Text 、Font 終了(MS明朝,太字,11) グループボックス1 Name grpMesA Text、Font 相性(MS明朝,標準,10) ラベル7 Name lblMes1 Text、Font、AutoSize 空白(MS明朝,太字,12)、False ラベル8 Name lblMes2 Text、Font、AutoSize 空白(MS明朝,標準,10)、False グループボックス2 Name grpMesB Text、Font アドバイス&ポイント(同上) ラベル9 Name lblMes3 Text、Font、AutoSize 空白(MS明朝,標準,10)、False ピクチャボックス Name picAngel BackColor Transparent Picture angel.gif ラベル テキストを表示するコントロール。此のテキストは、ユーザーが直接入力したり変更したりす る事は出来ない。 グループボックス 他のコントロールをグループ化する為のコンテナと成るコントロールで有る。通常は、機能別 にフォームを細分化する為に使用する。パネルと同じ様な目的で使用するが、パネルとは異な り、キャプションを表示する事が出来る。 ボタン ユーザーが選択したコマンド(命令)や操作を実行するコントロール。OK ボタンや実行ボタ ン等、処理の開始や中断・終了の合図に用いられ、最も良く利用されるコントロールで有る。 コンボボックス 選択肢の一覧を表示するコントロール。此の一覧より値を選択する事と、テキストボックスに 直接値を入力する事が出来る。 ピクチャボックス ビットマップ、アイコン、メタファイル、JPEG ファイル、GIF ファイル等の画像を表示す るコントロール。従来のバージョン(VB 6.0)の様に、描画メソッドを用いて描画する事や、 内部に他のコントロールを配置してコンテナと仕て使用する事は出来ない。

(4)

■ プログラムリスト ■ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace uranai {

public partial class uranai : Form {

// フォームレベルでグローバルな変数の宣言 private int[ , ] pt = new int[48, 48]; private int[ ] md = new int[13]; private int[ ] cn = new int[13]; private int[ ] st = new int[2];

private string[ ] m1 = new string[8]; private string[ ] m2 = new string[8]; private string[ ] m3 = new string[8]; private string sd;

private ComboBox[ ] cboMonth = new ComboBox[2]; private ComboBox[ ] cboDay = new ComboBox[2]; private ComboBox[ ] cboBlood = new ComboBox[2]; public uranai( ) { InitializeComponent( ); } // フォームが読み込まれた時の処理

private void uranai_Load( object sender, EventArgs e ) { int i, j; string[ ] s; System.IO.StreamReader sr; // 起動パスの取得 sd = Application.StartupPath; if ( !sd.EndsWith(@"¥" ) ) sd += @"¥"; // ファイルよりデータを配列に読込

sr = new System.IO.StreamReader( sd + "uranai1.dat" ); for ( i = 0; i < 48; i++ ) { s = sr.ReadLine( ).Split( ',' ); for ( j = 0; j < 48; j++ ) pt[ i, j ] = System.Convert.ToInt32( s[ j ] ); } sr.Close( ); 注意!! データファイルuranai1~6.dat は、製作中は、当該プロジェクトの bin/Debug フォルダに、亦、コ ンパイル後の実行中は、EXE ファイルと同じフォルダに、格納して置く事。 ネームスペース(名前空間)の使 用を宣言して居る。 此の部分は、エディタが、自動的 に記述して下れる。 此処でprivate 宣言した変数は同 じフォームモジュール内の総ての プロシージャで値の参照と設定を 行う事が出来る。 コントロールも、基本的な型と同 様に変数や配列のデータ型と仕て 指定する事が出来る。 クラスを生成する為のコンストラ クタで有る。 此の部分は、エディタが、自動的 に記述して下れる。 Application の StartupPath プロ パティには、起動したアプリケー ションのパスが格納されて居る。 EndsWith は、文字列の末尾の文 字を調査するメソッドで有る。 ! は否定を意味し、論理式が真の 時は偽に、偽の時は真に成る。 此の時点で、指定したファイルが オープンされる。 使用済みのファイルは、必ず速や かにクローズする。

(5)

sr = new System.IO.StreamReader( sd + "uranai2.dat" ); s = sr.ReadLine( ).Split( ',' );

for ( i = 1; i < 13; i++ ) md[ i ] = System.Convert.ToInt32( s[ i – 1 ] ); sr.Close( );

sr = new System.IO.StreamReader( sd + "uranai3.dat" ); s = sr.ReadLine( ).Split( ',' );

for ( i = 0; i < 13; i++ ) cn[ i ] = System.Convert.ToInt32( s[ i ] ); sr.Close( );

sr = new System.IO.StreamReader( sd + "uranai4_sjis.dat", Encoding.Default ); for ( i = 1; i < 8; i++ ) m1[ i ] = sr.ReadLine( );

sr.Close( );

sr = new System.IO.StreamReader( sd + "uranai5_sjis.dat", Encoding.Default ); for ( i = 1; i < 8; i++ ) m2[ i ] = sr.ReadLine( );

sr.Close( );

sr = new System.IO.StreamReader( sd + "uranai6_sjis.dat", Encoding.Default ); for ( i = 1; i < 8; i++ ) m3[ i ] = sr.ReadLine( );

sr.Close( ); // コントロールを Object 配列に格納(コントロール配列化) cboMonth[ 0 ] = cboMonthM; cboMonth[ 1 ] = cboMonthW; cboDay[ 0 ] = cboDayM; cboDay[ 1 ] = cboDayW; cboBlood[ 0 ] = cboBloodM; cboBlood[ 1 ] = cboBloodW; } // ボタン(占う)がクリックされた時の処理

private void btnStart_Click( object sender, EventArgs e ) { int i, j, m, d, b = 0, s, n; // 男女夫々れの評価値の算出 for ( i = 0; i < 2; i++ ) { // 誕生日(月)の取得 if ( cboMonth[ i ].Text.Length == 0) {

cboMonth[ i ].Focus( ); return; }

m = System.Convert.ToInt32( cboMonth[ i ].Text.Substring( 0, 2 ) ); // 誕生日(日)の取得

if ( cboDay[ i ].Text.Length == 0 ) {

cboDay[ i ].Focus( ); return; }

d = System.Convert.ToInt32( cboDay[ i ].Text.Substring( 0, 2 ) );

日本語等の2バイト文字をを使用 して居てもUnicode で保存された ファイルならエンコードする必要 は無い。 日本語等の2バイト文字を使用し て居る場合(Shift-JIS 等)は、エ ンコードを指定しないと、文字化 けが発生する事が有る。 注意! 配列の要素は、必ず0か ら始まるが、必ずしも総 ての要素を使用する必 要は無い。都合に依り要 素1から値を格納する 事も有る。 変数b は、switch 文の case 節の 中で値を代入して居る為、未参照 と看做される事が有るので、宣言 時に初期化して居る。 Substring は、文字列から部分文 字列を切り出すメソッドで有る。 if 文や for 文等のステートメント ブロックに記述するのが1文丈の 場合は、ブレス { } を省略する事 が出来る。 此の様に2文以上記述して居る場 合は、ブレス { } を省略する事は 出来ない。

(6)

// 血液型の取得

if ( cboBlood[ i ].Text.Length == 0 ) {

cboBlood[ i ].Focus( ); return; }

switch ( cboBlood[ i ].Text ) { case "A型": b = 0; break; case "O型": b = 1; break; case "B型": b = 2; break; case "AB型": b = 3; break; } // 評価値の算出 s = m * 100 + d; for ( j = 1; j < 13; j++ ) { if ( s >= cn[ j – 1 ] && s < cn[ j ] ) { st[ i ] = ( j – 1 ) * 4 + b; break; } } if ( s >= 1222 ) st[ i ] = b; } // 評価値に基づきメッセージの表示 n = pt[ st[ 0 ], st[ 1 ] ]; lblMes1.Text = m1[ n ]; lblMes2.Text = m2[ n ]; lblMes3.Text = m3[ n ]; } // ボタン(終了)がクリックされた時の処理

private void btnFinish_Click( object sender, EventArgs e ) { this.Dispose( ); Application.Exit( ); } } } 1個の式の値を複数の値と比較す る条件が多数有る場合は、switch 文を使用すると、効率的で読み易 いコードを記述する事が出来る。 該当式には、コンボボックスの Items プロパティに記述した通り の文字列を指定し無いと正しく判 断され無い。 条件判定に、比較演算子と論理演 算子を使用して居る。 A >= B : AはB以上 A <B : AはBより小さい A && B : AかつBの場合 此のループ処理ではカウンターj の値を1 から 12 に 1 宛変化させ て、ステートメントブロック内の 処理を繰り返し行う。 アプリケーションを終了する場 合、正しくプログラムをメモリか ら消去(インスタンスを破棄)し て終了する事が望ましい。 データ数の判明して居るファイルの読込 ファイルに記録されて居るデータの個数が、予め判明して居る場合は、for 文で、総てのデータを 読み込む事が出来る。猶、2次元配列に値を格納する場合は、for 文をネスト(入れ子状態)すれ ば良い。 配列の要素を指定するには、リテ ラル丈で無く、変数や配列の値で 指定する事も出来る。

(7)

switch 文に依る条件分岐 (再掲) switch の値と一致する case 節に制御を移すステートメント switch ( 評価式 ) { case 該当値1: 評価式が該当値1に該当する場合の処理 case 該当値2: 評価式が該当値2に該当する場合の処理 … default: 上記孰れの該当値にも該当しない場合の処理 } 評価式の値に従い、複数のステートメントブロックの中の孰れかを実行する。switch 文では 評価式が1回だけ評価され、其の値と各case 節の値が比較され、一致した場合、其の case 節に対応するステートメントブロックが実行される。 case 節は、任意の数だけ指定出来るが、複数の case 節に同じ値を指定する事は出来ない。ステートメ ントブロックの実行は、break ステートメントに依り制御が case 本体の外部に移動する迄、実行される。 ステートメントブロックにコードを記述して居ない場合を除き、C#では、次のステートメントブロック への暗黙的な落下(フォールスルー)はサポートされて居ない為、ステートメントブロックの最後には break 等のジャンプステートメントを記述する必要が有る。 猶、評価式が、孰れの該当値とも一致しない場合、制御はオプションのdefault ラベルの後のステート メントブロックに移動し、default ラベルが無い場合、制御は switch の外部に移動する。 Application オブジェクトの StartupPath プロパティに依る起動パスの取得 起動パスを返すプロパティ Application.StartupPath アプリケーションを開始した実行可能ファイルのファイル名を含まないパスを取得する。 アプリケーションと同じ、又は、下層のフォルダに格納されたデータファイル等のパスを指定する場合 の基準と成るパスを取得する為に必要なプロパティで有る。 String オブジェクトの EndsWith メソッドに依る文字列の末尾文字の確認 文字列の末尾の文字を確認するメソッド Object.EndsWith(文字列) Object で表わされる文字列の末尾が、指定された文字列と一致するか何うかを判断する。 末尾が¥で有るかを確認するには、引数の文字列に "¥¥" 又は @"¥" を指定する。 機 能 書 式 解 説 機 能 書 式 解 説 機 能 書 式 解 説

(8)

StreamReader コンストラクタに依るファイルのオープン(シーケンシャルアクセス) 指定したファイル名用のStreamReader クラスの新しいインスタンスを初期化 変数 = new System.IO.StreamReader(ファイル名); 変数 = new System.IO.StreamReader(ファイル名, エンコーディング); ファイルを開いてファイルへのアクセス(入力)を行う為のオブジェクトを生成する。 入出力処理を行う為には、其の対象と成るファイルを開く必要が有る。StreamReader コンストラクタ は、指定したファイルを読み込む為のオブジェクトを生成し、当該ファイルをオープンする。 引数のファイル名には、ファイルの絶対パスを指定する。ファイル名丈を指定した場合は、既定の文字 エンコーディングと既定のバッファサイズが使用される。 引数のエンコーディングには、使用する文字エンコーディングを指定する。此の場合も、内部バッファ は既定のサイズに初期化される。 上記以外に、バイト順マーク検出オプションやバッファサイズも設定するコンストラクタも有る。 StreamReader の ReadLine メソッドに依るデータの読込(シーケンシャルファイル) 現在のストリームから1 行分の文字を読み取り、其のデータを文字列と仕て返すメソッド 変数 = Object.ReadLine( ) シーケンシャルファイルより1 行分のデータを読み込んで変数に格納する。 1 行は、末尾にラインフィード("¥n")、又は、復帰とラインフィード("¥r¥n")が付いた一連の文字 と仕て定義されて居る。猶、返される文字列には、末尾の復帰やラインフィードは含まれない。亦、入 力ストリームの末尾に到達した場合、戻り値はnull 参照(Visual Basic では Nothing)と成る。

予めデータの行数が判明して居る場合は、for 文で、行数分のループで ReadLine メソッドを使用する と、総てのデータを読み込む事が出来る。

亦、予めデータの行数が判明して居ない場合は、while 文で、ReadLine メソッドか Peek メソッドの戻 り値で、下記の様に終了判定を行うループで、総てのデータを読み込む事が出来る。

System.IO.StreamReader sr = new System.IO.StreamReader( "ファイル名" ); string line;

while ( ( line = sr.ReadLine( ) ) != null ) { … } // 又は while ( sr.Peek( ) >= 0 ) { … } 猶、Peek メソッドは、読み取り可能な次の文字を返すが、StreamReader オブジェクトの現在位置は 変わらず、亦、其れ以上、読み取り可能な文字が無い場合は、戻り値と仕て-1 を返す。 ReadLine メソッドは、1 行分を読み込む為、カンマ区切りのデータは Split する必要が有る。 機 能 書 式 解 説 機 能 書 式 解 説

(9)

StreamReader の Close メソッドに依るファイルのクローズ ファイルを閉じるメソッド

Object.Close( );

StreamReader オブジェクトと、其の基に成るストリームを閉じ、リーダーに関連付けられ た総てのシステムリソースを解放する。

此のClose メソッドの実装は、true 値を渡す Dispose メソッドを呼び出す。亦、ストリームをフラッシ ュしても、Close を明示的に呼び出さない限り、其の基に成るエンコーダはフラッシュされない。 AutoFlush を true に設定すると、データがバッファからストリームにフラッシュされるが、エンコー ダの状態はフラッシュされない。此れに依り、エンコーダの状態(一部の文字)を維持出来る為、次の ブロックの文字を正確にエンコード出来る様に成る。此の動作は、一部の文字をエンコードする為には エンコーダが予め其の文字に隣接する文字を受け取って置く必要が有るUTF8 と UTF7 に対して有効 で有る。

Close メソッドを実行した後、当該 StreamReader オブジェクトに対する操作(ReadLine メソッド等 の実行)は、総て例外(エラー)を発生させる。 String オブジェクトの Split メソッドに依る文字列の分割 文字列を分割するメソッド 配列 = Object.Split( 区切文字 ); 指定された要素で区切られた部分文字列を格納するString 配列を返す。 引数の区切文字には、部分文字列の区切り文字で有るUnicode 文字の配列、区切り文字が含まれて居な い空の配列、又は、null 参照(Visual Basic では Nothing)を指定する。

戻り値の配列要素に区切文字は含まれない。猶、区切文字に指定された孰れの文字も含まれて居ない場

合は、戻り値の配列には、其のインスタンス自体を保持する要素が1 個丈格納される。亦、区切文字が

null 参照(Visual Basic では Nothing)の場合や、文字が含まれて居なかった場合、区切文字に空白文 字が指定された物と仕て実行される。更に、2 個の区切り記号が隣接して居る場合や、区切文字が此の インスタンスの先頭か末尾で見付かった場合、対応する配列の要素にはEmpty が格納される。 下記に、入力(インスタンスが保持する文字列)と区切文字と出力(生成される配列)の例を示す。 入力 区切文字 出力 "42, 12, 19" new Char[ ] {',', ' '} {"42", "", "12", "", "19"} "42..12..19" new Char[ ] {'.'} {"42", "", "12", "", "19"} "Banana" new Char[ ] {'.'} {"Banana"}

"Darb¥nSmarba" new Char[ ] { } {"Darb", "Smarba"} "Darb¥nSmarba" null {"Darb", "Smarba"}

猶、戻り値を格納する配列には、一般にString 型の動的配列を使用する。 機 能 書 式 解 説 機 能 書 式 解 説

(10)

StreamReader オブジェクトを用いたファイル処理 ファイルの入出力 データをファイルから読み込んだり、ファイルに書き込む時は、対象に成るファイルをオープンし てから処理を行い、其の後、ファイルをクローズすると言う手順が必要と成る。 シーケンシャルファイル データがファイルに書き込まれた順に保存されて居るファイルで、原則として先頭から順番に読み 書きする必要が有り、データの一部を変更する事は出来ない。 シーケンシャルファイル読込の処理手順 System.IO.StreamReader sr; string s; string[] d; sr = new Sysytem.IO.StreamReader(“squid.dat”); s = sr.ReadLine( ); d = s.Split( ',' ); … sr.Close( ); 其他のオブジェクトを用いたファイル処理

StreamReader や StreamWriter 等の System.IO 名前空間のオブジェクト以外にも、下記の様な ファイルを操作するオブジェクトが用意されて居る。用途に応じて使い分けると良い。 Microsoft.VisualBasic.FileSystem オブジェクト 従来のVisual Basic のファイル操作を行う事が出来る。 Microsoft.VisualBasic.FileIO.TextFieldParser オブジェクト 構造化されたテキストファイル(CSV ファイル、固定長ファイル)を解析するのに適して居る。 My.Computer.FileSystem オブジェクト Microsoft.VisualBasic.FileSystem より生産性とパフォーマンスを向上して居る。

aa,bb↲

squid.dat squid.dat Open "aa,bb"が s に読み込まれる "aa" が d[0] に格納される "bb" が d[1] に格納される インスタンスを生成しファイルを開く StreamReader 用の変数を宣言する 1 行分のデータを格納する変数を宣言する カンマで区切られた各データを格納する変数を宣言する ファイルを閉じる

参照

関連したドキュメント

生殖毒性分類根拠 NITEのGHS分類に基づく。 特定標的臓器毒性 特定標的臓器毒性単回ばく露 単回ばく露 単回ばく露分類根拠

語基の種類、標準語語幹 a語幹 o語幹 u語幹 si語幹 独立語基(基本形,推量形1) ex ・1 ▼▲ ・1 ▽△

デスクトップまたはスタートボタンの“プログラム”に 標準宅地鑑定評価システム 2023 のショートカ

画像の参照時に ACDSee Pro によってファイルがカタログ化され、ファイル プロパティと メタデータが自動的に ACDSee

指標名 指標説明 現 状 目標値 備 考.

業種 事業場規模 機械設備・有害物質の種 類起因物 災害の種類事故の型 建設業のみ 工事の種類 災害の種類 被害者数 発生要因物 発生要因人

目標 目標/ 目標 目標 / / /指標( 指標( 指標(KPI 指標( KPI KPI KPI)、実施スケジュール )、実施スケジュール )、実施スケジュール )、実施スケジュールの の の の設定

2:入口灯など必要最小限の箇所が点灯 1:2に加え、一部照明設備が点灯 0:ほとんどの照明設備が点灯