ブログ「サイバー少年」

ブログ「サイバー少年」へようこそ!
小学六年生ごろからプログラミングを趣味にしている高校生のブログです。
勉強したことについての記事などを書いています。フリーソフトも制作、公開しています。
(当ブログについて詳しくは「ブログ概要紹介」を参照)

サイバー少年が作ったフリーソフトは「サイバー少年の作品展示場」へ

1月

コンピュータ関連で覚えた技術
・C#でyieldキーワードの使い方を覚えた。
・C#の拡張メソッドについて、より詳しく仕様を知った。

その他で覚えた技術
・円周角の定理についての理解の間違いを正した。
・タンジェント関数の内容について学んだ。

制作進行した作品
・小遣い帳ソフト(仮称)、ロジック部分は完成も近い。

コメント
数学関連がいつもより大きな割合を占めています。コンピュータ関連ではC#以外のものを覚えることが目標になっていますが、とりあえず小遣い帳ソフトを完成させてからですね。

tag:

カプセル化が上手く出来ぬ

小遣い帳ソフトのプログラムを書いていて思ったのですが、
私はカプセル化されたオブジェクトの構築が下手ですね…。


カプセル化っていうと、下図のようにするべきじゃないですか。

(矢印はそのクラスへの依存を表し、ただし逆方向への依存は表していません。)


理想的なカプセル化されたオブジェクト
理想的なカプセル化されたオブジェクト


こんなふうに、それぞれの役割をこなすクラス(細かく言うとインスタンス)がたくさんあって、

メイン進行者的なクラス、要するにエントリーポイント的なクラスから、それぞれ呼び出していくのが理想的なカプセル化だと思っています。

それで、部品は取り替えようと思ったら簡単に取り替えられるわけです。
続きを読む

tag:

ARM用Windowsは作らないのか

Windows RTでは既存のアプリケーションが動作しません。

ストアアプリしか動作しないのです。

なぜなら、Windows RTが動作するARMアーキテクチャはx86アーキテクチャとの互換性がないため、
x86アーキテクチャ用にコンパイルされている既存のアプリケーションは動かないのです。




・Windows RTについて


ではアプリケーションをARM用にコンパイルすればWindows RTでも動くではないかと思いますが、違うようです。

しかし、現在のARM用Windowsと言えるWindows RTには、x86用Windowsと同等の機能が搭載されていません。

そのため、全てのアプリケーションが動作しないわけではないでしょうけど、動作するアプリケーションは限られてくるでしょうね。


なんで同等の機能を搭載しないのかは分かりませんが、推測ではWindows RTは軽量性重視で作っているんじゃないかなと思います。

たしかにx86用のWindowsはデカいです。
(Windows RTは軽量なのかというと、調べていませんが)

続きを読む

tag:

SortedListとSortedDictionaryの違い

C#ではSystem.Collections.Generics名前空間にて様々なデータ構造が提供されています。

しかし、私はデータ構造の知識があまり無いもので、「これ何?」というようなデータ構造がとても多いのです。

今回、SortedDictionary<TKey, TValue>とSortedList<TKey, TValue>の違いを調べたので記事に書きます。


SortedDictionaryは辞書ですから、
辞書→連想配列→ハッシュテーブルかな、
と思ってしまいますが、内部実装は平衡二分探索木だそうです。

ちなみに、Sortedじゃない普通のDictionary<TKey, TValue>はハッシュテーブルで実装されています。

まぁ、ハッシュテーブルにソートという概念はありませんからね~。
(厳密にいうとツリーにもソートはありませんが)
続きを読む

tag:

for文で連結リストを探索! ~ for文を再考する ~

for文というものがありますね。

今まで、配列のアクセスくらいにしか使っていませんでしたが、本当は自由度が高いんです。

最近、その自由度の高さでfor文を見なおしました。


for文は一般的に

for(int i = 0; i < 256; ++i)

と書きますが、本質的には

for(最初に実行する文; ループ抜けの条件式; 毎回実行する文)

となっています。


これは

最初に実行する文;

無限ループ {
毎回実行する文;
if(NOT ループを続ける条件式) ループ脱出;

波カッコ内に記述してある処理;
}

に等しいです。

for文はこれのシンタックスシュガーなのかな?

シンタックスシュガーだとしたら、“最初に実行する文”にて宣言した変数のスコープがループの外でも有効ですね。

じゃあ、違うのかな?
まぁ、それはいいとして。

別に数値型のカウンタ変数を用意しないといけないわけじゃありません。

for文のカッコの中は何でもいいんです。



さて、こんなに自由度が高いので、for文は連結リストの走査にも使えるということに最近、気が付きました。

C#風の言語で書くと、こうです。

for(Node node = rootNode; node != null; node = node.Next)
{
WriteLine(node.Value);
}


波カッコの中はWriteLineじゃなくても、値の検索でもいいでしょう。

こうするとシンプルに走査できて良いですね。


1つ問題を言うと、自由度はありますが、一方でVBみたいな分かりやすさはありません。

VB.NETだと、

For i As Integer = 0 To 255 '「Step 2」とかで加算する数も変更可能
Console.WriteLine(Array(i).ToString())
Next i


と書きますが、これは分かりやすいのです。


自由度を取るか、分かりやすさを取るかですね。

今回、C言語系のfor文を褒めておいて、実は私はVB.NETのFor文のほうが好きだったりします。

tag:

[C#] foreach文で連結リストを探索! ~ foreach文を再考…してる? ~

前回と同じような記事タイトルになってしまって、“連結リスト探索シリーズ”が生まれそうですね(笑)

前回はC言語系のfor文で連結リストを走査できる、という話題でしたが、
(記事「for文で連結リストを探索! ~ for文を再考する」を参照)

今回はC#の話に限ります。
しかし、多分Javaにも通用すると思います。


.NET Frameworkには連結リストのLinkedList<T>が標準で用意されています。

前回は連結リストをfor文で走査しましたが、なんとC#ならforeachで操作できるのです。


LinkedList<T>はIEnumerable<T>を実装しているからです。

T型の要素の列挙としても扱えるわけですね。

例えばこんな感じです。


var list = new LinkedList<string>();

list.AddLast("バナナ"):
list.AddLast("黄色");
list.AddLast("キレンジャー");
list.AddLast("カレー");

foreach(string str in list) {
Console.WriteLine(str);
Console.Write(str + " といえば ");
}


出力

バナナ
バナナ といえば 黄色
黄色 といえば キレンジャー
キレンジャー といえば カレー
カレー といえば


for文で走査したときよりさらにシンプルに書けていいですね。


ただ、実行速度等の処理パフォーマンスはfor文で走査するときよりも劣りますので(そのはず)、注意してください。

その主な原因はforeachが外部イテレータを使っているからです(そのはず)

まぁ、配列に変換しているわけではないので、list.ToArray()をforeachにかけるよりは高パフォーマンスですね。


処理パフォーマンスと書きやすさのどちらをとるかはよく考えてください。

tag:

当ブログをご利用(閲覧等)になる場合は必ず「当ブログの利用規定」をお守りください。