* [[text0001]]の補足説明#1
-(by [[K]], 2019.02.27)
** (0)
-これは[[「川合のプログラミング言語自作のためのテキスト#0001」>text0001]]に対する補足説明のページです。
** (1) テキストファイルを配列変数に読み込むと、どんな結果になるのか?
-ここではC言語の文字列の扱いに自信がない人のために、基礎的な説明をします。
-C言語は文字列型という型を基本型としては持っていません。文字列は「文字コード」という整数の数の集まりだと考えて、配列変数に格納します。
-とまあ結局はそれだけのことなのですが、それでもたぶんピンとこないと思うので、もう少し詳しく説明します。
** (2) 文字コード
-ここでは話を単純にするために、半角文字に限って説明します。
-コンピュータは原則として、ONとOFFの2つの状態しか扱えないのですが、それだと豆電球をつけたり消したりするくらいのことしかできません。それだと当然ながらつまらないわけです。
-そこで、ONを1、OFFを0に見立てて、ON/OFFの並びが二進数の桁を表しているというルールを決め、それで整数を表すということにしました。
-つまりコンピュータは相変わらずONとOFFしか処理していないのですが、それは人間にとっては数値の記憶だったり、加算だったり除算だったりと、別の意味を持たせることができたのです。
-コンピュータは数値を理解しているわけではありません。ただ8個や16個、あるいは32個や64個のON/OFFの集まりをいくつか受け取って、「このパターンが来たらこのパターンを返す」っていうのを淡々とやっているだけです。・・・人間の方が、それを見て、銀行の預金残高が減った増えたと一喜一憂したり、ゲームのハイスコアを更新できたと喜んでみたり、まあそういうことをしているだけです。
-ちょっと話が脱線してしまいましたが、つまり「整数をON/OFFの組み合わせだけでどう表すか」を決めたから、コンピュータは整数を扱えるようになったのです。
-では、文字はどうでしょうか。はい、文字に番号を付けることにしました。そうすれば文字は数値になり、数値になればON/OFFになるので、コンピュータで扱えるようになるのです。つまりコンピュータで文字を扱うために文字に番号を付けたのです。・・・これを文字コードと言います。
-大文字アルファベット
|A|B|C|D|E|F|...|V|W|X|Y|Z|
|65|66|67|68|69|70||86|87|88|89|90|
-小文字アルファベット
|a|b|c|d|e|f|...|v|w|x|y|z|
|97|98|99|100|101|102||118|119|120|121|122|
-数字や記号(1という文字の文字コードは1ではないのが面白いところ)
|0|1|2|3|...|7|8|9|,|.|:|;|
|48|49|50|51||55|56|57|44|46|58|59|
-まあ全部書けば書けるのですが、長くなるし、別に暗記する必要はないので、このくらいにしておきます。
-なぜ暗記しなくていいのかというと、C言語では文字コードを教えてくれる書き方があるのです。それは 'A' とか 'z' みたいに、文字をシングルクォテーションでくくることです。
-'A'は65という数値の代わりで、'z'は122の代わりです。文字ではありません。ただの数値です。整数です。そもそもC言語に文字型なんてないのです。
-文字コードを覚えなくていいなんて、とても便利ですね!
-念を押しますが、文字コードは文字ではなくただの数値です。printf("%d", 1 + 2 * 3);みたいに書けば簡単に計算して結果を画面に書くことができますが、これと同様にprintf("%d", 'A' + 'z');みたいなことができます。何が表示されると思いますか?「Az」とかじゃないですよ、正解は「187」です、65+122=187だからです。
-他の言語では異なる挙動をするかもしれませんが、C言語はこういう言語なのです。
** (3) テキストファイルを読み込んだ場合
-テキストファイルをfopenしてfreadして読みこんだら、どんな結果になるでしょうか。
-論より証拠、百聞は一見にしかずなので、以下のテキストファイルをloadText()を使って読み込ませてみました。
a=1;
b=2;
c=a+b;
print c;
-txt[0]~txt[9]:
|txt[0]|txt[1]|txt[2]|txt[3]|txt[4]|txt[5]|txt[6]|txt[7]|txt[8]|txt[9]|
|97|61|49|59|10|98|61|50|59|10|
|'a'|'='|'1'|';'|改行|'b'|'='|'2'|';'|改行|
-txt[10]~txt[19]:
|txt[10]|txt[11]|txt[12]|txt[13]|txt[14]|txt[15]|txt[16]|txt[17]|txt[18]|txt[19]|
|99|61|97|43|98|59|10|112|114|105|
|'c'|'='|'a'|'+'|'b'|';'|改行|'p'|'r'|'i'|
-txt[20]~
|txt[20]|txt[21]|txt[22]|txt[23]|txt[24]|txt[25]|txt[26]|
|110|116|32|99|59|10|0|
|'n'|'t'|' '|'c'|';'|改行||
-txt[]に具体的にどんな数値が入るかわかったでしょうか。ここで注目してほしいポイントはいくつかあります。
--改行の文字コードは10。改行もただの1文字で、文字コードはその後も連続して並んでいる。
--スペース(空白文字)の文字コードは32。
--末尾は0がある。・・・これはloadText()が「ここでファイルが終わっていますよ」という印のためにつけているものです。テキストファイル内にはこの情報はありません。
** (4) その他のささいなこと
-プログラム内では、'¥n'という表記が出てきますが、これは改行の文字コードを表していて、つまり10です。10なら10って書いたほうがいいような気もしますが、改行の文字コードは10って暗記できていない人がこれを見ると「???」ってなることがあるので、'¥n'って書いてあげるほうが良いとされています。・・・まあ単なる好みの問題ですね。
-同じくプログラム内では'¥t'という表記も出てきます。これはタブの文字コードを表しています。これは9です。だから9って書いたほうがいいような気がしますが、まあ改行の時と同じで、'¥t'って書くほうが普通です。
-関数getNumber()では、与えられた文字が'0'~'9'の場合、数値定数として0~9の数値を返す必要があるのですが、そこで引数の変数の値をそのまま返すのではなく、'0'すなわち48を引き算してから返しています。
-これがなぜ必要なのかですが、先にも書いたように、'0'の文字コードは0ではなく48なのです。'1'の文字コードは1ではなく49なのです。だから48を引き算して、48~57を0~9に変換しているのです。
** こめんと欄
* こめんと欄
#comment