![見出し画像](https://assets.st-note.com/production/uploads/images/162409710/rectangle_large_type_2_c452ea5ae019103bad21b3a0ceff8e0a.png?width=1200)
中学生に説明するためのC++予習(1)
・・という経緯で、中学生になにか質問されるかもしれない。あわてず、かみくだいて説明してあげられるようになっておきたい。教科書に目を通しておかなければ。
そのためのメモです。教科書の各章のテーマをかみ砕いたものに、自分なりの解釈を補ってメモっていく予定です。
1.はじめてのプログラム
プログラミングとは
コンピューターに、何かやらせたいとする。「こんな仕事をしてね」と頼みたい。(例えば「画面に”Hello”と表示してね」とか。)
だけど、コンピューターはもともと「機器語言(機械語)」しか理解できない。 「機器語言(機械語)」は実は0と1の羅列で、人間が理解して、やりたいことをやってもらうのは、とっても大変。
画面への文字表示にしたって「画面上のこの点を光らせて・・」なんていう命令をたくさん組み合わせて表示する。
「画面に”Hello”と表示させてね」といった人間にも分かりやすい命令による言語を「高階語言(高水準言語)」という。
「画面のこの点を光らせて」なんていう、硬體(ハードウェア)を直接高速に処理できる命令の言語を「低階語言(低水準言語)」という。「機器語言(機械語)」はこちらに分類される。
「C++」というのは「画面に”Hello”と表示させてね」といった命令をかけるので、「高階語言(高レベル言語)」の一種である。
だけど同時に、画面のどこを光らせるとか、どこの記憶體(メモリ)を読み出すかといったコンピューターの中身(硬體:ハードウェア)を直接高速でいじる命令も出せるので、「低階語言(低水準言語)」に近い特徴も持っている。
こういうのを「中階語言(中水準言語)」という。
この「中」は「中途半端」の中ではなくて、「高」「低」両方の特徴を「いいとこどり」で兼ね備えているという意味での「中」です。
歴史
教科書には、いろいろ書いてある。C言語というのがあって、その進化系がC++。さらっと読んでおくだけで良いと思います。
いじる
とにかくいじってみる。
![](https://assets.st-note.com/img/1731984478-tsvGV6ELXi7QFbcCUYpmKzOg.png?width=1200)
![](https://assets.st-note.com/img/1731984537-JCxHiONuY4ym9rXp0QaEI3SK.png?width=1200)
ここまでは問題なく動きました。
文字コードいじる:CP932
英語圏の学習者はこれで良いけど、台湾の中学生は当然、繁体字で表示したくなる。それに私は日本語も書きたい。
#include <iostream>
using namespace std;
int main()
{
cout << "Hello world!" << endl;
cout << "Hello world2!" << endl;
cout << "Hello 第一個程式!" << endl;
cout << "Hello はじめてのC++プログラム!" << endl;
return 0;
}
これを実行すると
![](https://assets.st-note.com/img/1732006419-Qb40jR28BSATZscuUn5oiq9r.png?width=1200)
アルファベットの部分は良いけど、台湾の繁体字漢字と日本語の仮名は文字化けした。
「教科書」には、文字化けのことや修正方法は書いていないようです。まるで、普通に漢字書いて、問題なく表示されるかのように書いている。
教科書通りに同じようにやっているのに文字化けしたら、生徒はびっくりしちゃうでしょうに。
ネット情報を探してみます。「高エネルギー技術研究室」様の解説記事
がありました。参考にさせていただいて(解説記事の通り辿って)設定します。
・エディタをUTF-8に
「Setting」「Editor」「General settings」で次の通り
![](https://assets.st-note.com/img/1732014338-FQHsAz7kqVIRyv1JE8jXugoi.png?width=1200)
さらに、記事に沿ってStaticリンク化、エンコード変更をする
「Setting」「Compiler」で
![](https://assets.st-note.com/img/1732015302-GYMeSpCldczInoWqVPTbB1LR.png?width=1200)
「Setting」「Compiler」で「Other compiler options」に移動
![](https://assets.st-note.com/img/1732015667-Dvf7bZhqH492ySzlLGYigd1o.png?width=1200)
設定を保存しました。
Code::Blocksを再起動して、設定内容が保存されていることを再確認
※なお、文字設定変更前に作ったプロジェクトを、文字設定変更後に開いても、設定が反映されないようですので、設定変更したら、都度あらためて新しいプロジェクトを作るようにしましょう。
さて、これでうまく行くかと思ったら
![](https://assets.st-note.com/img/1732016446-AXUSPvQJ48qFoK6ldteN21u3.png?width=1200)
あれ、だめじゃん・・。
そういえば、CP932とは日本語の文字コード。
一方、私の使っているWindows11は普段、日本語の表示で使っていますけど、もともと台湾で買ったPCなので、もしかしたら、こちらの設定に合わせないといけないのかも。
Windows11の「設定」「時刻と言語」「管理用の言語の設定」を見ると
![](https://assets.st-note.com/img/1732024604-dEkt3QUl1c2CADpNfYJ5qHSP.png?width=1200)
Unicode対応で無いプログラムの現在の言語は繁体中国語なんですよね。
「システムロケールの変更」で
![](https://assets.st-note.com/img/1732025080-onaRNu9XVgcKibA26wJ85E7L.png?width=1200)
この設定でチェック入れて「UTF-8」を使用する手もあるようですが、まだ「ベータ」だし、この設定変更したら文字化けして収拾つかなくなった、なんて話をどこかで聞いた覚えもある。このWindows設定を変えるのは危険な気がします。やめておきます。
文字コードいじる:BIG-5
ところで、文字化けは台湾華語(繁体字中国語)で「亂碼」といいます。
(余談ですが「らんま1/2」は「亂馬1/2」です)
CodeBlocksで文字化けしたとき、台湾の人はどう設定しているのか。日本語じゃないので「CP932」のわけはないのでして・・・
中文記事を検索してみたら・・・
"-fexec-charset=BIG-5"
と設定するよう書いてありました。
この設定にして、新規プロジェクトで、先ほどのコードを実行してみます。
![](https://assets.st-note.com/img/1732019013-pytnOuFGkJ8djDQP7NEWBXMA.png?width=1200)
![](https://assets.st-note.com/img/1732019060-7lBe2ZIu9UQhi6rvNq4LV3F0.png?width=1200)
お、おう。「繁体字」は表示できたけど、日本語のかな文字は化けた。両方同時には使えないのか?
とにかく、台湾の中学校で出された課題をやる分には日本語は使わないので大丈夫。演習環境のめどは立ちました。
Copilot先生との対話
文字コードいじる:UTF-8
それでもやっぱり、日本語も表示したいな。(AI相手に敬語の私(笑))
![](https://assets.st-note.com/img/1732031000-aLRp6w2l8yq7IXTeoKSuVDiz.png?width=1200)
![](https://assets.st-note.com/img/1732031055-aeAoFxpycjnO1vB2UzZVl7rY.png?width=1200)
コンパイラのオプションは次のように設定しなおしました。
![](https://assets.st-note.com/img/1732032520-6WKXyLeEgDn89j1F04YoxGvQ.png?width=1200)
コンソールにchcp 65001
でも、Copilotの指示のように、
「コンソールがUTF-8エンコーディングをサポートするように、
chcp 65001を実行する」のってどうやるんでしょう?
![](https://assets.st-note.com/img/1732031107-p2V5rSteBYzmskn0aUuhZglD.png?width=1200)
![](https://assets.st-note.com/img/1732031135-6nYoZMaPbFiGztxVr5j2f7QL.png?width=1200)
それ、リナックス専用の説明じゃないの?
![](https://assets.st-note.com/img/1732031178-tJnO3R24UGsTLAzdNWaVfuHo.png?width=1200)
いや、でもバッチとか設定とかいじるのは、種々の環境での再現性に問題が出てくるような気がする。
プログラム内で実行すればいいのでは?
![](https://assets.st-note.com/img/1732031228-2WGxfFAPHLCI4DhubgzTNoKY.png?width=1200)
![](https://assets.st-note.com/img/1732034066-gIbdqOuxRTPacCZeFojGwhs3.png?width=1200)
このコードで、無事日本語と繁体字が両方表示されました。
![](https://assets.st-note.com/img/1732033113-KJ3OpESCcbF7GytQHwxL0s4D.png?width=1200)
文字化け解決法のまとめ
1)欧文文字だけ使う場合
・何も設定いじる必要ない。
・繁体字漢字、日本語文字は化ける。
2)台湾版ウインドウズで繁体字表示する場合
・エディタのエンコーディングをUTF-8に設定
・コンパイラのオプションに -fexec-charset=BIG-5 を設定
・教科書のコードそのままコピペで動く。
・日本語の文字は化ける。
3)台湾版ウインドウズで繁体字も日本語も表示する場合
・エディタのエンコーディングをUTF-8に設定
・コンパイラのオプションに -finput-charset=UTF-8 と
-fexec-charset=UTF-8 を設定
・繁体字漢字も、日本語も同時に表示できるが、
#include <cstdlib>
をおいて、コードの最初で system("chcp 65001");を実行する必要がある。
・余計なプリプロセッサ、コードがあるので、学校の課題提出用としては、不適。
よって
学校課題用には2)のやりかたで対処。
1.はじめてのプログラム(続き再開)
・プログラムで使えるいろんな機能は、あらかじめ沢山準備されている。
・なにせ機能がたくさんあるから、その中には似たような名前をつけたいのもある。探しやすく、取り違えないように、整理しておく必要がある。
・これからわたしたちが作る「プログラム」では、実行中にキーボードから何か入力したり、それに応じて画面に文字を表示したり、といった「入出力」が必要になる。
・その処理の機能も用意されている。#include <iostream>
cout, cinといった名前で書き出し、読み込みの機能を用意してある。
「画面」とか「キーボード」とか「標準的(standard)な」入出力だからstd::というグループにまとめてある。
・だから呼び出すときは
#include <iostream>
を呼んだうえで、std::cin std::cout などと書かなきゃいけない。
・でも、今回はどうせstd::しか使っていない。cin coutなどが出てくるたびに毎回std::と書くのは面倒。だから最初にusing namespace std:: と書いて「std::書くのは省略していますよ」と伝えておく。
・これでいちいちstd::cin std::cout と書かずに cin coutで済ませられるようになる。
・・・てな説明で外していないでしょうかね?