ホチキス先生の「プログラマーと呼ばれたい」

InfoPath & SQL Server !

Posts Tagged ‘C#

C# プログラミング – Visual Studio 2017 で作る Windows Form アプリケーションで起動時にテキストファイルを読み込む。

leave a comment »

教科「情報」の「情報の科学」の授業で、定期的に文字入力のトレーニングをするための簡単なプログラムを作っている。あらかじめ登録されたテキストと同じテキストをテキストボックスに入力し、正しく入力できたか、何文字入力したか、入力にかかった時間は何分何秒か、を記録するトレーニングツールだ。

文字入力トレーニングソフトの画面_mid_640

フォームのイメージはこんなかんじ。テキストボックスは「開始」のボタンが押されるまでは使えないようにしておき、「開始」で時間を計測する。「終了」で時間の計測を終え、入力できた文字列を評価する。

このプログラムを生徒に配布するのだが、入力原稿に相当するテキストを、その都度プログラム内に保存しなければならない。このとき、原稿テキストをテキストファイルにしておき、プログラムを起動するときに読み込むようにした。テキストファイルはプログラムと同じフォルダに置いてもいいが、ファイルが丸見えでは触られてしまう可能性が高いので「settings」フォルダの下に入れることとした。

文字入力トレーニングソフトの画面_002_mid_640_480

プログラムでテキストファイルを読み込むコードは次のとおりだ。

—————————————————————————-

myFileName = @"settings\inputtext.txt"; //テキストファイルの場所を示す
enc = System.Text.Encoding.GetEncoding("shift_jis"); //エンコーディングを指定

//テキストファイルの読み込み
try
{
    myInputTextString = System.IO.File.ReadAllText(myFileName, enc);
}
catch
{
    MessageBox.Show("テキストファイルがありません");
}

—————————————————————————-

これで、生徒にプログラム本体とテキストファイルが入った「settings」フォルダを一緒に配布すればいい。

広告

C# – 文字列を比較するアルゴリズムについて考える(1) – 2つの文字列を前から順に比較し、違いがあった位置を見つけるアルゴリズム

leave a comment »

学校の授業で文字入力のトレーニングをするために、効果的なアプリケーションを作っている。ここで必要な実装として文字列比較がある。

仕様、というか、個人で作るアプリケーションなので厳密な仕様は決めないが、イメージ的にはこうだ。入力トレーニングの元になる文がある。この文は、フォントやポイント、文字飾りなどは無視し、単にテキスト文字列だけのものとする。つまり単なるテキスト文とする。この文と同じ文をキーボードから入力するトレーニングとし、入力にかかった時間と入力できた文字数をカウントしてスコアとする。このとき、入力を間違ったことを評価に加えたい、というものだ。

すぐに思いつくのは、文字列を前から順番に比較し、違いがあったら位置を見つけ出すアルゴリズムだ。2つの文字列が myStr1 と myStr2 に入っており、2つの文字列の長さが同じだとする。

——————————————————————

for (int i = 0; i < myStr1.Length; i++)
{
    if (myStr1[i] != myStr2[i])
    {
        myStrDiff = i;
        break;
    }
}

——————————————————————

前から順に比較し、違いがあった文字でループを抜ける。前から何文字目であったかが myStrDiff に数字として入る。この数字は 0 から始まるので、実際は +1 文字目に違いがあった、となる。これだと、たとえば次のようになるだろう。

myStr1 = "あいうえおかきくけこ";
myStr2 = "あいうえおまきくけこ";

このとき、myStrDiff の値は 5となる。前から 6文字目に違いがあるからだ。しかし、「か」を「ま」と間違えてはいるが、そのあとはちゃんと入力できている。つまり「5文字目までしか間違いなく入力できなかった」のではなく「6文字目だけ間違えたが、それ以外はちゃんと入力できた」はずだ。つまり、このように評価すべきだろう。

入力すべき文字列 ・・・ あいうえおかきくけこ
実際の入力1 ・・・・・ あいうえおかきくけこ (評価10点:満点)
実際の入力2 ・・・・・ あいうえおまきくけこ (評価9点:1文字だけ間違った)
実際の入力3 ・・・・・ あいうえおまみむめも (評価5点:5文字間違った)

つまり、間違った文字以降をどう再判定するか、を考えなければならない。このアルゴリズムについて引き続き考えていきたい。

C# – 文字列を比較する(5)– System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare クラスの System.Globalization.CompareOptions の IgnoreSymbols オプションで $%&!#'()*?<>^~-+ の特殊記号やスペースを無視して評価する。

leave a comment »

System.Globalization.CompareOptions には IgnoreSymbols オプションがある。このオプションを使うと、$ や %、# などの特殊記号やスペースを無視して文字列を評価できる。まず IgnoreSymbols オプションを使わない例だ。次の例では文字列に特殊記号やスペースが入っているので「違う」と評価する。

——————————————————————–

string a = "あいうえお";
string b = "あ$い%う&え  お!#'()*?<>^~-+";
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare(a, b) ==0)
    textBox1.Text = "同じ";
else
    textBox1.Text = "違う";

——————————————————————–

しかし次のように System.Globalization.CompareOptions の IgnoreSymbols オプションを使うと、同じと評価する。

——————————————————————–

string a = "あいうえお";
string b = "あ$い%う&え  お!#'()*?<>^~-+";
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare
(コードの続き)(a, b, System.Globalization.CompareOptions.IgnoreSymbols) ==0)
    textBox1.Text = "同じ";
else
    textBox1.Text = "違う";

——————————————————————–

C# – 文字列を比較する(4)– System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare クラスの System.Globalization.CompareOptions の IgnoreKanaType オプションでカタカナとひらがなを同じに評価する。

leave a comment »

System.Globalization.CompareOptions には IgnoreKanaType オプションがある。このオプションを使うと、カタカナとひらがなを同じとして評価できる。まず IgnoreKanaType オプションを使わない例だ。次の例ではカタカナとひらがなを「違う」と評価する。

——————————————————————–

string a = "アイウエオ";
string b = "あいうえお";
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare(a, b) ==0)
    textBox1.Text = "同じ";
else
    textBox1.Text = "違う";

——————————————————————–

次に IgnoreKanaType オプションを使った例を示す。この例ではカタカナとひらがなを「同じ」と評価する。

——————————————————————–

string a = "アイウエオ";
string b = "あいうえお";
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare
(コードの続き)(a, b, System.Globalization.CompareOptions.IgnoreKanaType) ==0)
    textBox1.Text = "同じ";
else
    textBox1.Text = "違う";

——————————————————————–

C# – 文字列を比較する(3)– System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare クラスの System.Globalization.CompareOptions の IgnoreWidth オプションでカタカナの全角と半角を同じに評価する。

leave a comment »

文字列を比較するとき、System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare クラスを使うと日本語固有の評価を変えることができる。たとえば System.Globalization.CompareOptions の IgnoreWidth オプションを使うと、カタカナの全角と半角を同じに評価することができる。

まず、IgnoreWidth オプションを使わない評価をする。System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare クラスが返す値は int 型で、文字列が同じときは「0」、異なるときは「-1」を返す。次の例では「違う」という評価がされる。

——————————————————————–

string a = "アイウエオ";
string b = "アイウエオ";
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare(a, b)==0)
    textBox1.Text = "同じ";
else
    textBox1.Text = "違う";

——————————————————————–

次に System.Globalization.CompareOptions の IgnoreWidth オプションを使ったコードを示す。こちらでは「同じ」という評価を得る。

——————————————————————–

string a = "アイウエオ";
string b = "アイウエオ";
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare
(コードの続き)(a, b,System.Globalization.CompareOptions.IgnoreWidth)==0)
    textBox1.Text = "同じ";
else
    textBox1.Text = "違う";

——————————————————————–

このように System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare クラスは多言語の特性に対応しており、日本語特有の評価を行うことができる。

C# – 文字列を比較する(2)– Equals メソッドで StringComparison.Ordinal と StringComparison.OrdinalIgnoreCase オプションを使い分けて大文字と小文字の評価を変える

leave a comment »

文字列を比較するとき、Equals メソッドで StringComparison.Ordinal と StringComparison.OrdinalIgnoreCase オプションを使い分けて大文字と小文字の評価を変えることができる。

StringComparison.Ordinal オプションを使うと、大文字と小文字を区別する。

—————————————————

textBox1.Text = Form2Obj.textBox1.Text;
string a = "ABC";
string b = "abc";
if (string.Equals(a, b, StringComparison.Ordinal))
    textBox1.Text = "同じ";
else
    textBox1.Text = "違う";

—————————————————

上の例では「違う」と評価される。しかし次のように StringComparison.OrdinalIgnoreCase オプションを使うと、大文字と小文字を同じと扱って評価する。次の例では、「ABC」と「abc」を「同じ」と評価する。
—————————————————

textBox1.Text = Form2Obj.textBox1.Text;
string a = "ABC";
string b = "abc";
if (string.Equals(a, b, StringComparison.OrdinalIgnoreCase))
    textBox1.Text = "同じ";
else
    textBox1.Text = "違う";

—————————————————

C# – 文字列を比較する(1)– Equals メソッドと ReferenceEquals メソッドを使う

leave a comment »

Equalsメソッド2つの文字列が同じかどうかを調べるには、String オブジェクトの Equals メソッドを使う。

———————————————————-

string a = "あいうえお";
string b = "あいうえお";
if (string.Equals(a, b))
    textBox1.Text = "同じ";
else
    textBox1.Text = "違う";

———————————————————-

String オブジェクトの ReferenceEquals メソッドを使ってもいい。

———————————————————-

string a = "あいうえお";
string b = "あいうえお";
if (string.ReferenceEquals(a, b))
    textBox1.Text = "同じ";
else
    textBox1.Text = "違う";

———————————————————-

2つの文字列が同じならば「同じ」違うなら「違う」とテキストボックスに表示される。

Written by Yoshio Matsumoto

2017年4月6日 at 4:52 PM