6/12(金)〜6/17(水) の学習ログです(主にC言語)
こんにちは、安藤です。
いつもありがとうございます。
ここでは私の学習ログを残しています。
2020.6.12(金)
◎C言語(web記事「苦しんで覚えるC言語」)
●複数の型をまとめる
・構造体の配列
構造体も配列にすることができる。
・構造体配列の引数
構造体配列を引数にして関数に渡すこともできる。配列のような渡し方になる。
構造体配列の最初の要素のアドレスを渡す形になる。
受け取った関数では、配列の引数と同様に扱える。
◎読書「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
歴史的な視点でいうと、「オブジェクト指向」という考え方は1960年代末から1970年代にかけて複数の起源から発生した。
オブジェクト指向プログラミングは構造化プログラミングによって導入された制御の構造化を取り込んだものと考えられる。
・どのオブジェクト指向言語にも共通に備わっている機能
①内部構造を見ずにデータを操作する機能(カプセル化、データ抽象)
②データの種類に応じて適切な操作が自動的に選択される機能(ポリモーフィズム、多態性)
ブラックボックス化はモジュール化の基本原則であり、オブジェクト指向プログラミング言語はこれを個々のデータ単位で施している。
オブジェクト指向プログラミングに限定すれば、カプセル化とポリモーフィズムは生産性を向上させるためのテクニックであると見なしてよい。
構造化プログラミングがデータ・フローを整理し、より生産性や保守性の高いプログラミングの開発を可能にしたのと同じように、オブジェクト指向プログラミングはデータ構造を整理し、生産性や保守性の向上を実現する。
といったように、構造化プログラミングの延長線上としてオブジェクト指向プログラミングをとらえると、オブジェクトが現実世界の存在を反映しているかどうかはどうでもよくなる。
◎読書「自分の中に毒を持て」岡本太郎さん著
「食えなきゃ食えなくても、と覚悟すればいいんだ。それが第一歩だ。その方が面白い」
今日も太郎さんかっこいいです。
2020.6.13(土)
◎C言語(web記事「苦しんで覚えるC言語」)
●ファイルの取り扱い
・テキストファイルの読み書き
ファイルとして保存されたデータは、ディスク上に保存されるので、消えることはなく、コピーや再編集が容易。
・ファイルの開閉
プログラムからファイルを操作する手順は、次の順番で行われる。
ファイルを開く -> ファイルに読み書きする -> ファイルを閉じる
ファイル操作にはファイルの開閉が必須。
そこで、C言語にはファイルを開閉する関数が用意されている。
開く関数がfopen関数、閉じる関数がfclosem関数。
この関数を使うには、stdio.hのインクルードが必要になる。
FILE型のポインタ変数=fopen(ファイル名,モード);
fclose(FILE型のポインタ変数);
モードとは、ファイルを開く目的を表す文字列のこと。
モードには、次の6種類の文字列の内どれか1つを指定する。
r 読み込み。ファイルがない時は失敗。
r+ 読み書き。ファイルがない時は失敗。
w 書き込み。ファイルがあっても空のファイルを作る。
w+ 読み書き。ファイルがあっても空のファイルを作る。
a 追加書き込み。ファイルがない時は作る。
a+ 読み書き。ファイルがない時は作る。
FILE型とは聞き慣れない型だが、その正体は構造体。
fopen関数を実行するとファイル情報を持つFILE型へのポインタが返される。
このポインタは、以後開いたファイルの識別子として使うだけなので、ポインタ特有の操作を行ったり構造体の要素を使うことはない。
FILE型へのポインタ変数を、ファイルポインタと呼ぶ。
次のプログラムは、test,txtという名前のファイルを書き込みするために開く例。
#include<stdio.h>
int main(void) {
FILE*file
file = open(“test.txt”,“w”);
fclose(file);
return 0;
}
このプログラムを実行すると、test.txtという名前のファイルが作成される。
今回の場合は開くだけなので、中身は空。
fcloseの役割
一見、無意味なfopen関数だけど、役割がある。
同時に複数のソフトが動く環境では、もし同じファイルを同時に2つのソフトで書き換えてしまうと、
どちらを反映すれば良いのか分からなくなってしまうので、
fopen関数で書き込みができるように開いたファイルには、他のソフトで書き換えられないように鍵をかけている。
fclose関数は鍵を外して他のソフトから使えるようにする。
その他、ファイルを開いている時は、メモリ内に保存し、fclose関数が実行された時にはじめてディスクに書き込むことで高速化していることもある。
◎読書「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
オブジェクトの鋳型=クラス
多くのオブジェクト指向言語には、「クラス」と「継承」という2つの機能がある。
これらの機能は抽象データ型によってオブジェクトという形にカプセル化されたデータの性質を効率よくモジュール化するための機能。
クラスとは、オブジェクトの雛形になる存在。
クラスのあるオブジェクト指向言語では、オブジェクトは雛形であるクラスから作り出され、各オブジェクトの性質はクラスによって決定される。クラスによって同種のオブジェクトをひとまとめに管理できる。
オブジェクト指向言語におけるクラスは、手続き型言語の構造体あるいは、レコードの延長線上にあると考えればよい。
クラスはメンバーやフィールドと呼ばれるデータの入れ物だけでなく、それら「データの塊」に対する手続きも内包している点が異なる。
単なるデータをまとめたものである構造体では、メンバーの値を取り出すことと、更新することしかできない。
それに対してクラスでは、メンバー関数(メソッド)と呼ばれる、クラスのオブジェクトを対象とする手続きを呼び出せる。
サブルーチンが一連の手続きをまとめ、処理の中身のブラックボックス化に役立つツールであるように、クラスはデータをブラックボックス化するツール。
データの中身には対応する手続き(メソッド)を経由してアクセスするから将来データの保持の仕方などが変更されても外部に影響は及ばない。これはちょうどサブルーチンによって処理をブラックボックス化すると内部のアルゴリズムが変更されても外部に影響が及ばないのと同じ。
このような内部の詳細を考えずに済むブラックボックス化は、抽象化とも呼ばれ、プログラムの複雑さを低減されるのに有効な手法。
2020.6.14(日)
◎C言語(web記事「苦しんで覚えるC言語」)
●ファイルの取り扱い
・ファイルへの書き込みファイルへテキストを書き込む関数はたくさん用意されている。
fprintf関数の使い方は次の通り
fprintf(ファイルポインタ,書き込み文字列,変数…);使い方はファイルポインタを指定すること以外、printf関数と全く同じだが、
指定した文字列は画面ではなくファイルに書き込まれる。・読み込みと追加の場合
読み込みモードで開いた場合、書き込み用の関数を使っても何も起きない。
追加モードで開いた場合、元のファイルの最後にデータが追加される。・ファイルの読み込み
ファイルのテキストを読み込む関数にも多くの種類が用意されている。
馴染みのscanf関数に似たfscanf関数というものがある。
先頭でファイルポインタを指定すること以外はscanf関数と同じ。
scanf関数はキーボードから読み込むため、実行すると入力待ちになったが、
fscanf関数では、ファイルのテキストを先頭から読み込む。※カンマ(,)で区切って数値や文字列を並べたファイルをCVS形式と呼び、エクセルなどの表計算ソフトで扱える汎用的なファイル形式として知られている。
2020.6.15(月)
◎C言語(web記事「苦しんで覚えるC言語」)
●ファイルの取り扱い
バイナリファイルの読み書き・テキストとバイナリ
ファイルには様々なものがあるが、基本的な区分として、テキストかバイナリとという違いがある。全てのファイルは本質的にはバイナリファイル。
バイナリを直訳すると、2進数という意味。
その名の通り、2進数で記録されたファイル。
要するに、数値のみで記録されたファイルのことを意味する。
それに対して、テキストファイルは文字列だけが記録されたファイル。
コンピュータの中では、文字列といえども数値で表されているので、テキストファイルも本質的にはバイナリファイル。
しかし、テキストファイルは文字列で記録されているので、テキストエディタなどで修正を行うことが容易。バイナリファイルも特定のエディタで閲覧・修正することができるが、
全てのデータが数値の固まりになっているため、中身を見ても、その意味が全く分からない。しかし、数値を直接書き込むので、サイズは小さく高速。一般に取り扱いを容易にする必要がある場合はテキストファイル、高速性が必要とされる場合にはバイナリファイルを利用することが多いよう。
2020.6.17(水)
◎C言語(web記事「苦しんで覚えるC言語」)
●ファイルの取り扱い
・ファイルの読み込み
ファイルの数値を直接読み込むには、fread関数を使用する。
fread(読み込む変数のポインタ,1項目のサイズ,項目数,ファイルポインタ);
・ドラッグへの対応
ドラッグされたファイル名の取得
C言語には、アプリケーションの起動時にファイル名を渡す機能がある。
それが、コマンドライン引数。
コマンドライン引数とは、アプリケーション起動時に渡される文字列のこと。
主に処理するファイル名や動作オプションを指定する。
main関数の引数はvoid型として宣言してきたが、ここには決められた型の引数を指定することができる。
コマンドライン引数を受け取るためには、次のような引数を指定する。
int main(int argh,char*argv[ ]);
argcはコマンドラインの数、argvは文字列へのポインタ変数。
実際には、次のようにするだけ。
printf(“%s”,argh[0]);
このようにすれば、0番目(1番最初)のコマンドラインを表示できる。
argv[0]の要素数を変えれば、それに対応するコマンドラインにアクセスできる。
コマンドラインの0番目は、アプリケーション自身のファイル名になる。
※fflush(stdio)は邪道
この命令は、出力バッファを強制出力する関数であるfflushで、入力バッファであるstdioをクリアしている。
この使い方は、一部のコンパイラでしか使えない邪道。
この方法は練習段階でのみ、本格的な開発では使わないこと。
・オプションの解析
一般的には、コマンドラインにはファイル名の他に、アプリケーションの動作を指定するオプションを指定することがある。
例えば、Windowsでファイル名を指定して実行でdefragと指定して起動すると、デフラグが起動して何もせずに終了するが、defrag c: と指定すると、Cドライブのデフラグを開始する。
また、defrag c: -a と指定すると、Cドライブの分析結果だけを表示する。
このような使い方は、パソコン上級者にはおなじみのやり方。
この例では、c: と -a という2つの文字列がコマンドラインに渡され、それをアプリケーション内で解析して
動作を決定している。
以上です。
引き続き、学習を頑張ります。