Ellipse

Ellipseは、楕円を描画する。

Ellipse function (wingdi.h) | Microsoft Docs

矩形の、左端、上端、右端、下端、を指定することで、その矩形に内接する楕円を描画する。
Ellipse.cppのWM_PAINTで、

Ellipseに矩形情報を渡すだけ。

楕円
楕円

このように楕円というかこの場合はほぼ円が描画される。

Sample/winapi/Ellipse/Ellipse/src/Ellipse at master · bg1bgst333/Sample · GitHub

sealed

sealedは、継承禁止を表すキーワード。

sealed 修飾子 - C# リファレンス | Microsoft Docs
継承 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

Class1.csで、

このようなクラスを定義し、
Class2.csで、

Class1を継承、そしてsealedを付けて継承禁止にする。
Class3.csで、

// 名前空間の登録
using System;       // 共通データ型と基本クラス(System名前空間)

// Class3の定義
class Class3 : Class2    // Class2を継承.
{
    // 継承対象の出力メソッド.
    public override void Print()
    {
        // "Class3.Print"と出力.
        Console.WriteLine("Class3.Print");    // Console.WriteLineで"Class3.Print"と出力.
    }
}

Class2を継承して、
MainClass.csで、

// 名前空間の登録
using System;       // 共通データ型と基本クラス(System名前空間)

// メインクラス
class MainClass // MainClassクラスの定義
{

    // メインメソッド
    static void Main()  // Mainメソッドの定義
    {
        // Class1で出力.
        Class1 class1 = new Class1();   // Class1インスタンスclass1を生成.
        class1.Print(); // class1.Printで出力.
        // Class2で出力.
        Class1 obj2 = new Class2();   // Class2インスタンスを生成しClass1オブジェクトobj2に格納.
        obj2.Print(); // obj2.Printで出力.
        // Class3で出力.
        Class1 obj3 = new Class3();   // Class3インスタンスを生成しClass1オブジェクトobj3に格納.
        obj3.Print(); // obj3.Printで出力.
    }

}

としても、

ビルドエラー
ビルドエラー

継承禁止なので、ビルドエラーになる。
Class3を、

Class2からの継承とせず、

MainClassで、Class3の部分をコメントアウトすると、

ビルド成功
ビルド成功

ビルド成功となり、

Class1.Print
Class2.Print
続行するには何かキーを押してください . . .

実行できる。

Sample/cs/sealed/sealed/src/sealed at master · bg1bgst333/Sample · GitHub

Graphics

Graphicsクラスは、画像処理に関するさまざまな情報や処理を持つ抽象基底クラス。

Graphics (Java Platform SE 6)

これまでも、drawLineなどのメソッドを使っていたが、Graphicsオブジェクトgの内部のインスタンスはどうなっているか確認してみる。

今回もアプレット
g.toStringで文字列を受け取れるので、それをdrawStringで描画。

切れてる
切れてる

切れてるので、ウィンドウを大きくすると、

持っている情報
持っている情報

実際のインスタンスは、SunGraphics2D、あとは、フォントだったり、カラーだったりの情報が入ってる。

Sample/java/Graphics/Graphics/src/Graphics at master · bg1bgst333/Sample · GitHub

feof

feofは、指定されたファイルポインタ(ストリーム)がEOFかどうかを判定する。

Man page of FERROR
C言語関数辞典 - feof

fgetcの場合はEOFを返すので戻り値で判定できるが、fgetsやfreadなど他の関数の場合は読み込めなかった理由を戻り値だけで判定できない。
読み込めない理由は、EOFの場合もあるが、エラーの場合もあるからである。

今回は、freadの読み込みで、feofによるEOF判定を行う。

test.txtをバイナリ読み込みで開いて、3バイトずつ読み込んでいく。
3バイトより小さい時は、EOFかもしれないし、エラーかもしれない。
ひとまずEOFかどうかをfeofでチェックして、ループを抜ける。
あと、エラーが発生しているかどうかを、perrorを出力することで見れるようになっている。

$ ls
feof  feof.c  test.txt
$ cat test.txt
ABCDE
FGHIJ
KLMNO$ vi feof.c
$ gcc feof.c -o feof
$ ./feof
buf = [ABC], read_len = 3
fread: Success
buf = [DE
], read_len = 3
fread: Success
buf = [FGH], read_len = 3
fread: Success
buf = [IJ
], read_len = 3
fread: Success
buf = [KLM], read_len = 3
fread: Success
buf = [NO], read_len = 2
fread: Success
feof(fp): true
$

改行とかも入っているので、読み込んだ3バイト文字列の前後に'['と']'を挟んでおいた。
このように、ファイル終端まで来ると、read_lenは3より小さくなる。
このとき、perrorはSuccessを出力しているが、feofが真なので、EOFであることがわかる。

Sample/c/feof/feof/src/feof at master · bg1bgst333/Sample · GitHub

fgetc

fgetcは、指定されたストリームから、文字を取得する。
getcと違い、こちらは関数で実装することになっている。

Man page of FGETC
C言語関数辞典 - fgetc

ファイルの終わりまで1文字ずつ読み込んでみる。

1文字ずつ読み込み、これ以上読み込めないファイルの終わりまで来ると、fgetcはEOFを返す。
(ファイル終端、EOFはEnd Of Fileの略。)
その時、ループを抜けるようにする。
それまでは、putcharで文字を出力し続ける。

$ ls
fgetc  fgetc.c  test.txt
$ cat test.txt
ABCDE$
$ gcc fgetc.c -o fgetc
$ ./fgetc
ABCDE$
$

このように、EOFになるまで文字を出力できた。

Sample/c/fgetc/fgetc/src/fgetc at master · bg1bgst333/Sample · GitHub

readonly

readonlyは、読み取り専用を表すキーワード。

readonly キーワード - C# リファレンス | Microsoft Docs
定数 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

constと違い、コンストラクタでは値のセットができる。

空のプロジェクトで、Class1.csは、

コンストラクタで配列のsizeをセットできるようにする。

MainClass.csは、

素数5と要素数10という形で指定。

size = 5
intArray[0] = 0
intArray[1] = 1
intArray[2] = 2
intArray[3] = 3
intArray[4] = 4
size = 10
intArray[0] = 0
intArray[1] = 1
intArray[2] = 2
intArray[3] = 3
intArray[4] = 4
intArray[5] = 5
intArray[6] = 6
intArray[7] = 7
intArray[8] = 8
intArray[9] = 9
続行するには何かキーを押してください . . .

こうなる。

もし、

    // 配列の出力
    public void print()
    {
        // これは不可.
        size = 20;  // readonlyなので, あとから変更不可.

        // サイズ出力
        Console.WriteLine("size = " + size);    // sizeを出力.
        
        // 配列に値を入れる.
        for (int i = 0; i < size; i++)    // size分繰り返す.
        {
            intArray[i] = i;    // i番目にiを入れる.
        }

        // 配列の表示
        for (int i = 0; i < size; i++)    // size分繰り返す.
        {
            Console.WriteLine("intArray[" + i + "] = " + intArray[i]); // i番目を出力.
        }
    }

と書くと、

読み取り専用なのでビルドエラー
読み取り専用なのでビルドエラー

こうなるので、初期化はコンストラクタでする。

Sample/cs/readonly/readonly/src/readonly at master · bg1bgst333/Sample · GitHub

Applet

Javaアプレットは、Webブラウザ上で実行できるJavaプログラムである。
Appletクラスを継承して作る。

Applet (Java Platform SE 6)

Eclipseの場合だと、普通にJavaプロジェクトを作成し、MainAppletクラスを追加。

Appletクラスを継承し、paintをオーバーライドして、線を描画する。

実行すると、

アプレット
アプレット

Eclipseの場合は、勝手にアプレット・ビューアを起動してくれるので、これだけでいい。
確かに線が描画されてる。
JDKのみの場合は、htmlファイルにAPPLETタグを書いて、コマンドラインアプレット・ビューアを起動する必要があるが、その方法はまたの機会とする。

簡単なアプリやGraphicsクラスなどの練習にはいいが、セキュリティの観点から、Java9で非推奨、Java11で廃止となった。

Javaアプレット - Wikipedia
もうJavaアプレットは使えない、移行が急務に | 日経 xTECH(クロステック)

Sample/java/Applet/Applet/src/Applet at master · bg1bgst333/Sample · GitHub