コンテンツにスキップ

第 1 回 | 2024-09-27

  • 講義の流れについて理解する
  • プログラミング言語 C++ の特徴や用途を学ぶ
  • オンラインコンパイラの使い方を覚える
  • プログラムで画面にテキストを出力する方法を学ぶ
  • コンパイル時の警告とエラーに慣れる

1. 講義について

2. 質問の方法

演習(ここをクリック)

Moodle のフォーラムで、C++ や講義内容に関する疑問・質問を投げてみよう(例: C++ は難しいですか? 〇〇とは何ですか?)。回答は Q & A のページに順次掲載する。

3. C++ のコードを実行する方法

3.1 ツール

  • C++ のコードを書いて、その実行結果を確認するには、いくつかの方法がある。
  • 後者ほどセットアップに時間がかかるが、より快適にプログラミングができる。
  • 慣れてきたらどんどんステップアップしよう。
方法 ツール名 機能 対応する授業回
入門用オンラインコンパイラ Simple C++ Editor 日本語でのヘルプ 第 1 ~ 3 回
中級向けオンラインコンパイラ Wandbox コードの URL シェア機能 第 1 ~ 10 回
高性能オンラインコンパイラ replit(レプリット) インタラクティブ実行 第 1 ~ 10 回
自分の PC にインストールする Visual Studio 2022
または Xcode
インタラクティブ実行
高性能エディタ
第 1 ~ 14 回
演習(ここをクリック)

1 つ目の方法と 2 つ目の方法を実演する。一緒に操作してみよう。

3.2 C++ のコードを実行する裏側で何が起きているのか

C++ のコードがパソコン上で実行されるまでの流れを簡単に説明する。

  1. ソースファイル(テキストファイル、拡張子は .cpp)にコードを書く。
  2. コンパイラがソースファイルに書かれたコードを C++ の仕様に基づいてコンパイルし、オブジェクトファイル(機械語のデータ)を作成する。
  3. リンカが複数のオブジェクトファイルをリンクしてプログラムを生成する。
  4. 生成されたプログラムを実行する。

ほとんどのコンパイラは、2 ~ 4 をワンクリックで行ってくれる。

4. 講義ページの便利な使い方

  • 「📙」マークは、教科書『冒険で学ぶ はじめてのプログラミング』の Unit 番号を表す。新しく学ぶ機能やコードについて、詳しい説明が教科書に書かれている。
  • サンプルコードの右上にある「」をクリックすると、コードをクリップボードにコピーできる。
  • サンプルコード上にある「」をクリックすると、コードのヒントが表示される。

5. 画面にテキストを表示する

5.1 最小限のプログラム

int main()
{

}

これが C++ のプログラムの最小限の形。int main() はプログラムの入り口(エントリーポイント)を表し、波カッコ { } で囲んだ部分に、処理したい内容を書いていく。

この時点でのプログラムは、処理したい内容が何も書かれていないので、実行しても何も表示されない。

5.2 セリフを用意する

  • 文章を "(ダブルクォーテーション)でかこんで用意しよう。
  • 文章を用意した行の最後は ;(セミコロン)で終わりにする。
  • セミコロンはプログラムにとっての句点「。」のようなもの。
📙 Unit 01
int main()
{
	"ボクはプラス。"; // (1)!
}
  1. ダブルクォーテーション " やセミコロン ; は半角英字で入力する

まだ文章を用意しただけで画面への出力命令がないプログラムなので、実行しても何も表示されない。「用意した文章を使っていない / 何の効果もない」という警告が出ることがあるが、今は無視する。

5.3 複数のセリフを用意する

  • 文章はいくつでも用意できる。
  • ; を忘れないようにしよう。
📙 Unit 02
int main()
{
	"ボクはプラス。";
					 // (1)!
	"シープラ村出身。";

	"12歳だ。"; // (2)!
}
  1. このように行間を開けると読みやい
  2. 先頭の大きな空白を入力するには Tab キーを押す

文章は何個でも用意できる。さきほど用意したセリフに、あと 2 つセリフを追加しよう。

5.4 セリフを表示する準備

  • 文章を表示する機能を使えるようにしよう。
  • まずは、C++ の標準ライブラリ(標準機能集)の 1 つである <iostream> (アイオーストリーム)をインクルードする。
  • 先頭の行に #include を書き、そのうしろにインクルードしたいライブラリの名前を書く。
📙 Unit 03
#include <iostream>	// (1)!

int main()
{
	"ボクはプラス。";

	"シープラ村出身。";

	"12歳だ。";
}
  1. #include は先頭の行に書く

<iostream>をインクルードすることで、次の 5.5 で扱う、文章を表示する機能「std::cout(エスティーディー・シーアウト)」を使えるようになる。

5.5 セリフを表示する

  • std::cout に向かって、出力の記号 << (左シフト)で文章を送ると、その文章を表示できる。
📙 Unit 04
#include <iostream>

int main()
{
	std::cout << "ボクはプラス。";	// (1)!

	std::cout << "シープラ村出身。";

	std::cout << "12歳だ。";
}
  1. << の前後に半角空白があると読みやすい

std::cout(エスティーディー・シーアウト)に向かって、出力の記号 << で文章を送ると、その文章が出力画面に表示される。

5.6 セリフを改行する

  • 文章中(" " 内)に改行文字 \n があると、出力時にそこで改行される。
  • 改行文字は文章中の好きな場所にいくつでも書ける。
📙 Unit 05
#include <iostream>

int main()
{
	std::cout << "ボクはプラス。\n";	// (1)!

	std::cout << "シープラ村出身。\n";

	std::cout << "12歳だ。\n";
}
  1. 改行文字 \n は文字の 1 つなので、" " の中に含める

出力画面に表示する文章を改行したい場合は、文章の中に \n(バックスラッシュ・エヌ)の 2 文字からなる「改行文字」を入れる。

バックスラッシュ「\」の入力方法

日本語キーボードでは右上の円マーク「¥」キーを押す。Windows ではフォントの都合上、バックスラッシュが円マークとして表示されることがあるが、同じ意味である。macOS の日本語キーボードでは Option キーを押しながら、¥ キーを押す。US キーボードには \ キーがある。

改行文字を増やしてみよう

改行文字 \n を文章の途中に入れたり、増やしたりするとどうなるか試してみよう。

6. コンパイル時の警告とエラー

6.1 コンパイル時のエラー

コンパイラは、コードに C++ の仕様で解釈できない文があった場合、エラーや関連情報を出力してコンパイルを中断する。誤りかもしれないと思われる箇所については警告 (warning) を出力することがある。エラーや警告メッセージの表現はコンパイラによって多少異なる。

エラーが出るコードの例 1
セミコロン ; が無い
#include <iostream>

int main()
{
	std::cout << "Hello, C++!\n"
}
出力されるエラーの例
main.cpp:5:33: error: expected ';' after expression
	std::cout << "Hello, C++!\n"
								^
								;
1 error generated.
exit status 1
エラーが出るコードの例 2
最後の波カッコ } が無い
#include <iostream>

int main()
{
	std::cout << "Hello, C++!\n";
  
出力されるエラーの例
main.cpp:5:32: error: expected '}'
  std::cout << "Hello, C++!\n";
                               ^
main.cpp:4:1: note: to match this '{'
{
^
1 error generated.
exit status 1

条件によっては非常に長いエラーメッセージが出力されることがあるが、一番最初のメッセージで原因が示されていることが多いので、冷静に対処しよう。

エラーが出るプログラムの例 3
「<<」ではなく「>>」にしている
#include <iostream>

int main()
{
	std::cout >> "Hello, C++!\n";
}
出力されるエラーの例
main.cpp:5:15: error: invalid operands to binary expression
	('std::ostream' (aka 'basic_ostream<char>') and
	'const char [13]')
	std::cout >> "Hello, C++!\n";
	~~~~~~~~~ ^  ~~~~~~~~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/streambuf:175:9: note: 
	candidate template ignored: could not match 'basic_istream'
	against 'basic_ostream'
		operator>>(basic_istream<_CharT2, _Traits2>&,
		^
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/istream:756:5: note: 
	candidate template ignored: could not match 'basic_istream'
	against 'basic_ostream'
	operator>>(basic_istream<char, _Traits>& __in, unsigne...
	^
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/istream:761:5: note: 
	candidate template ignored: could not match 'basic_istream'
	against 'basic_ostream'
	operator>>(basic_istream<char, _Traits>& __in, signed ...
	^
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/istream:803:5: note: 
 clang++-7 -pthread -std=c++17 -o main main.cpp
main.cpp:5:15: error: invalid operands to binary expression
	('std::ostream' (aka 'basic_ostream<char>') and
	'const char [13]')
	std::cout >> "Hello, C++!\n";
	~~~~~~~~~ ^  ~~~~~~~~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/streambuf:175:9: note: 
	candidate template ignored: could not match 'basic_istream'
	against 'basic_ostream'
		operator>>(basic_istream<_CharT2, _Traits2>&,
		^
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/istream:756:5: note: 
	candidate template ignored: could not match 'basic_istream'
	against 'basic_ostream'
	operator>>(basic_istream<char, _Traits>& __in, unsigne...
	^
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/istream:761:5: note: 
	candidate template ignored: could not match 'basic_istream'
	against 'basic_ostream'
	operator>>(basic_istream<char, _Traits>& __in, signed ...
	^
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/istream:803:5: note: 
	candidate template ignored: could not match 'basic_istream'
	against 'basic_ostream'
	operator>>(basic_istream<char, _Traits>& __in, unsigne...
	^
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/istream:808:5: note: 
	candidate template ignored: could not match 'basic_istream'
	against 'basic_ostream'
	operator>>(basic_istream<char, _Traits>& __in, signed ...
	^
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/istream.tcc:931:5: note: 
	candidate template ignored: could not match 'basic_istream'
	against 'basic_ostream'
	operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c)
	^
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/istream.tcc:963:5: note: 
	candidate template ignored: could not match 'basic_istream'
	against 'basic_ostream'
	operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s)
	^
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/istream:980:5: note: 
	candidate template ignored: requirement
	'__and_<__not_<is_lvalue_reference<basic_ostream<char> &> >,
	__is_convertible_to_basic_istream<basic_ostream<char> &>,
	__is_extractable<__rvalue_istream_type<basic_ostream<char>
	&>, char const (&)[13]> >::value' was not satisfied [with
	_Istream = std::basic_ostream<char> &, _Tp = char const
	(&)[13]]
	operator>>(_Istream&& __is, _Tp&& __x)
	^
1 error generated.
exit status 1

6.2 コンパイル時の警告

コンパイルに支障は無いが誤りと思われるコードがあった場合、コンパイラは警告メッセージを出力する。警告の基準は一律でないためコンパイラによって判断が異なる場合もある。Wandbox は GCC(ジーシーシー)というコンパイラを使っているが、replit は Clang(クラン)という C++ コンパイラを使っている。

警告が出るプログラムの例 1
改行文字が正しくない
#include <iostream>

int main()
{
	std::cout << "Hello, C++!\N";
}
出力される警告の例
main.cpp:5:28: warning: unknown escape sequence '\N'
      [-Wunknown-escape-sequence]
  std::cout << "Hello, C++!\N";
                           ^~
1 warning generated.
警告が出るプログラムの例 2
int と main の間が半角空白ではなく全角空白になっている
#include <iostream>

int main()
{
	std::cout << "Hello, C++!\n";
}
出力される警告(Wandbox ではエラー)の例
main.cpp:3:4: warning: treating Unicode character as whitespace
	[-Wunicode-whitespace]
int main()
   ^~
1 warning generated.

6.3 エラーをすぐに見つける方法

自分のコードを新しく加筆修正するたび、こまめにコンパイルを試すと良い。1 行加えたときにエラーになったら、その行に原因があるとすぐにわかる。1 つのエラーを直さずにそのまま新しいコードを書き続けると、連鎖的にエラーが出現して解決が困難になる。

✅ 振り返りチェックリスト

  • 講義の流れについて理解した
  • プログラミング言語 C++ の特徴や用途を学んだ
  • オンラインコンパイラの使い方を覚えた
  • プログラムで画面にテキストを出力する方法を学んだ
  • コンパイル時の警告とエラーに慣れた

📝 課題

プログラミング学習の強敵は「思い込み」や「先入観」「おそれ」です。

  • 講義資料や教科書に書かれていないルールを仮定してしまい、そこから抜け出すことができないと、自力での問題解決が困難になります。
  • ノーコストで簡単に試せるにも関わらず、エラーを恐れてチャレンジをしないことで、応用力が身につかない問題もあります。

以下の 6 人の学生は C++ プログラミングを習い始めたばかりで、それぞれが何らかの問題に直面し、先に進むことができていません。

  • 書いた本人はどのような思い込みを抱えているのでしょうか。あなたならどのように助言をしてあげますか。
  • 今後も学生が似たような問題に直面して立ち止まらないように、ただ間違いを指摘するだけでなく、次に進むためのヒントも与えてあげましょう。

①~⑤ に対して、解答欄にあなたのアドバイスを書いてください。

(練習)A さん「なんかたくさんエラーが出る」

#include <iostream>

int main()
{
	std::cout << "上智大学 4 年生です。\n";
}
解答例
C++ のプログラムで、半角記号と全角記号の違いが重要であることを理解しましょう。

iostream の左右の < > が全角になっています。半角にしてください。
また、std::cout のあとの << も全角になっています。半角にしてください。

日本語のセリフなどを書く時を除いて、C++ のプログラムは全て半角英数字で書きます。
プログラムを書く時は、基本は半角英数字モードにしておいて、日本語の入力が必要な時だけ全角に切り替えるようにすると良いです。

このプログラムでは 2 つの行に問題があり、エラーメッセージが長くなってしまいました。
まずは #include の行を書いた時点でいったんコンパイルしていれば、そこでエラーが出るだけだったので、原因究明がしやすかったと思います。
慣れないうちは、1 行書いたらすぐにコンパイルしてみると良いです。

① B さん「習ったとおりに書いたのにエラーになる」

#include <iostream>

int main()
{
	std::cout << "Sophia University"\n;
}

② C さん「改行されないし、変な記号が表示される」

#include <iostream>

int main()
{
	std::cout << "こんにちは。/nはじめまして。/n";
}

③ D さん「必要なものは全部書いたと思う」

int main()
{
#include <iostream>

	std::cout < < "Hello, C++!\n";
}

④ E さん「どこが間違ってるかわかりません」

#include <iostream>

int main();
{
	std::cout << "I love C++.\n";
}

⑤ F さん「この下に日本語を表示したいです。どうすればいいですか?」

#include <iostream>

int main()
{
	std::cout << "Sophia University\n";
}

提出方法

Moodle の「第 1 回課題」欄に ①~⑤ に対するアドバイスをまとめて書いて提出してください。