Q & A¶
Moodle フォーラムに寄せられた質問のうち、重要なものをピックアップして紹介します。
90. 課題提出期限に遅れてしまった時 🔷
Q: 課題の提出時間に間に合わなかった際、何か救済措置はございますでしょうか。期限が設けられている以上そこに合わせるべきであることは重々承知しておりますが、、、。減点を前提に先生にメールで提出する、等でも評価をしていただけますか?
期限内にコードが完成し、あとは提出するだけの状態で不慮のトラブルで提出に失敗した場合、直ちに提出コードの Wandbox の共有リンクを作成し(作成時刻が記録されます)、提出欄は閉じているので「講義に関する質問」に投稿してください。通常の提出通りに扱います。
メールや DM は、第 1 回の講義でお伝えした通り、人に公開できないプライベートな情報や相談を含む場合のみ受け付けます。
締め切りから数分以上経過した場合は、期限内にコードが完成していなかったものとみなし、受け付けません。多くの課題で点数が 100 点満点以上とれるようになっているので、それで補ってください。
82. std::chrono::millisecondsの {} と () の違いについて 🔷
Q: 「duration
は、具体的には std::chrono::milliseconds{ n }
を使って指定します。」とありますが、教科書では std::chrono::milliseconds( n )
となっています。実際にプログラム上では、{ n }
でも ( n )
でもエラーは出ず実行可能でした。つまり、{}
と ()
は同じもの、または同じ役割を果たすものと考えていいのでしょうか?
一部の文法については、{ }
と ()
の両方を使えることがあります。
まず前提として、{ }
と ( )
が完全に同じものと考えるのは間違いです。例えば次のようなコードはコンパイルエラーになります。
一方、一部の文法については、{ }
と ()
の両方を使えることがあります。その一例が、質問にあるような、オブジェクトの初期化のときです。下記の (1) と (2) は同じ意味です。
#include <iostream>
#include <chrono>
int main()
{
std::chrono::milliseconds a{100}; // (1)
std::chrono::milliseconds b(100); // (2)
}
より厳密には { }
のほうは、narrowing conversion という、情報の欠落が起こる可能性がある変換を禁止するという追加の機能や、関数宣言構文との混同の回避、引数の評価順の規定など、いくつかの利点があり、使える場面では {}
を使うことが望ましいです。しかし、少し難しいため、現在の講義の段階では詳しく知る必要はありません。下記の資料が参考になります。
76. プログラムが出力するテキストを英語にしてよいか 🔷
Q: 第 4 回課題のために、【URL 省略】というプログラムを書きましたが、自分の日本語力にあまり自信がないので現在出力(ストーリーの発展、主人公・使い魔・敵のアクション)が全部英語になっています。提出する前に日本語に直した方が良いでしょうか。
出力されるテキストの言語が日本語であるか英語であるかは、本講義で学ぶプログラミングの技能とは関係ないため、どちらでも構いません。ただし、問題文で明確な指示がある場合はそれに従ってください。
71. 課題の点数について 🔷
Q: 毎回の課題の採点結果は表示されますか?またその予定はありますか?
採点結果は通知されませんが、おおよそ自己採点できるよう、最大配点と採点基準、模範解答を公開しています。講義を通して合計 840 点(1400 点の 60%)を獲得すれば単位を取得できます。
64. コード内の半角空白について 🔷
Q: "整数に名前をつけるには、まず int(イント)と書き、スペースをあけて名前を書き、スペースをあけて=を書き、そのあとに値を書きます。"とあるように、スペースを入れることを求められていますが、実際にこのスペースがなくてもプログラムは実行できました 。他の場合でもスペースがあってもなくても結果が変わらないことがありますが、スペースを入れる理由はありますか?
半角空白の使用や変数の命名は、C++ の仕様である程度の自由が許容されています。以下はいずれも OK です。
ただし、C++ プロフェッショナルの間では、読みやすさのために一定のスタイル(マナーと考えて良いです)が共有されています。
半角空白はコードの読みやすさのために入れます。どこに入れるかを網羅的に説明するのは難しいため、講義資料に沿ったスタイルを身につけてください。講義資料のスタイルに沿えば、ほかの開発者からも読みやすいコードを書くことができます。
下記に Google や Microsoft のソフトウェア開発者が書いた、実際のプロダクトで使われている C++ コードの例を示します。半角空白の使用について確認してみてください。
63. 特定の範囲をコメントにする方法 🔷
Q: コード内で //
を入れるとコメントを書き込むことができますが、特定の範囲にだけコメントを書きたい場合にはどうすれば良いですか。
/*
と */
で囲むことで、特定の範囲あるいは複数行にわたるコメントを書くことができます。
55. ダブルクォーテーション " を出力する方法 🔷
Q: 出力する文章に "" をつけることが可能か知りたいです。いろいろ試しましたがダメでした。
確かに、""
で囲んだ文章内に "
を書くと、そこで文章が終了してしまい、うまくいきません。
""
で囲んだ文章内では、"
の代わりに \"
と書くことで、この問題を回避できる仕様になっています。
#include <iostream>
int main()
{
std::cout << "This is a text with \"double quotation\" marks.\n";
std::cout << "\"\"\n";
std::cout << "\"" << 123 << "\"\n";
std::cout << "\"sophia\"\n";
}
このような方法をエスケープと言い、教科書では少し先の p.55~56 で、ほかの例も含め説明されています。
エスケープは C++ 以外の様々なプログラミング言語でも使われています。ChatGPT (GPT-4) に例を挙げてもらいました。
54. AtCoder の取り組みの評定への加算 🔷
Q: AtCoder の取り組みが評定に加算されるとシラバスに書いてありましたが、詳しく聞きたいです。
競技プログラミング(AtCoder)の参加方法などは、講義の進度に応じて情報を提供します。所属を明記した AtCoder ID を申請することで、採点基準日の AtCoder のレートに基づき、最大 15 点分を成績に加算します。
53. iostream のインクルード
Q: コードの最初で <iostream>
をインクルードするのは Java での import と同じようなものでしょうか?
C++ の #include <iostream>
と Java の import
は、両方とも他のライブラリやモジュールから機能を取り込むためのメカニズムを提供していますが、動作の裏側の仕組みは異なります。前者は <>
で指定したライブラリファイルの中身をそのままその場にコピーするのに対し、後者は import
したモジュールのクラスやインターフェイスを参照するための情報をコンパイラに伝えます。
52. 独学の必要性 🔷
Q: プログラミング職などに就きたいと考える場合、この講義のほかに、目安としてどのくらいの独学が求められますか。
プロスポーツ選手になりたい場合、学校の体育以外でどれぐらい練習する必要があるか、という質問と同じです。
幸いソフトウェアエンジニア職は人材不足で、プロスポーツほど狭き門ではなく、入社後に学習することもできます。しかし、学習には時間がかかるため、学生時代に学習しておくことが望ましいです。学生時代に学習することで、自分の興味のある分野を見つけることができます。
実際のところ、情報分野の人たちは、プログラミングを学習ではなく遊びと思って、ほとんど苦労を感じず湯水のごとく時間を投じて取り組んでいる人が多いので、プログラミングを「学習」だと思ってしまう時点で、すでに不利な状態だと思います。
確実にプログラミング職に就きたいのであれば、プログラミングが使われていない分野に就職し、そこでプログラミングを活用することを目指すのが良いでしょう。質問 14 も参照してください。
上記の回答に対する ChatGPT の意見は こちら を参照してください。これを踏まえてさらに聞きたいことがあれば、また質問してください。
49. 講義の後に受けられる検定 🔷
Q: この講義を一通り受けた後に受けられる検定などはありますか?
国の行政機関である情報処理推進機構 (IPA) が実施している情報処理技術者試験などがありますが、これは C++ やプログラミングに特化している内容ではありません。
これ以外の検定は、ほとんどがいわゆる「検定ビジネス」であり、資格を取得することで、就職や転職に有利になるという保証はありません。
検定ではありませんが、今後の講義で「競技プログラミング」という、C++ を存分に活用できる無料のプログラミングコンテストを紹介します。これに参加することで、アルゴリズムやデータ構造に関する知識、コーディングの速さと正確さを客観的に評価したレートを獲得でき、自分の実力や成長を測ることができます。国内企業で、このレートを重視あるいは材料視するところが増えています。
46. 授業のペースと予習 🔷
Q: 初学者なので少し不安です。どれくらいの進度で進みますか、予習は必要ですか?
リスクや危険があるものではないので「不安」という感情を持つ必要はありません。途中で履修を中止したとしても、そこまでに得た知識や経験は無駄になりません。
予習をしていると講義の理解が早くなり、課題にも取り組みやすくなります。
44. プログラミング初心者の復習時間 🔷
Q: プログラミング初心者はどのくらいの復習時間が必要になりますか?
学んだ回の講義資料の内容について十分に理解し、自分でお手本とは異なるプログラムを作成できるようになるまで復習してください。
42. プログラミングに対する苦手意識の解消 🔷
Q: 私は心理学科に所属しており、初めに着手したのが統計の授業でのR言語でした。そこでかなりつまずき、苦手意識が芽生えてしまいました。どのような姿勢で学習すれば苦手意識が解消されますか。
わからなかった点を放置しておくと、次週の講義内容の理解が一層難しくなります。わからない点があれば、ただちに講師や TA に質問してください。
また、思い込みや先入観も、プログラミング学習の障害になります。教科書や講義の内容に耳を傾け、自分の考えを一旦捨てて、新しい考え方を受け入れてみてください。
37. Visual Studio 2022 のエディション 🔷
Q: Visual Studio 2022 をダウンロードしようとしたとき、Community・Professional・Enterprise の 3 つが出ましたが、どれをダウンロードすればいいでしょうか。
学生は Community エディションを無償で利用できます。インストール方法や利用法が少し複雑なので、今後の講義で説明します。
27. コピペについて 🔷
Q: プログラミングを行う際、ほかの人が既に書いたものをコピペして使うことにどのような問題がありますか?
一般論¶
書籍や Web 上に公開されているコードには著作権が存在します。それらのライセンス(利用規約)に従わずにコピペを行って一般に公開するようなソフトウェア・サービスを開発すると、法的な問題が発生する可能性があります。例えば、過去にはソニーから発売された PS2 ゲームが、ライセンスに違反したコードを含んでいたために販売中止になった事例もあり、不適切なコピーが企業に損害を与えることもあります。
Web 上に公開されているコードは、素人が書いたものも多く含まれます。そのようなコードをコピペして使うと、自身が開発するソフトウェア・サービスにバグが混入する可能性があります。
講義におけるコピペ¶
なお、本講義前半(第 1 ~ 10 回)ですでにコピペに頼る必要があるというのであれば、プログラミングの基礎が身についていないということなので、予復習をしっかり行ってください。
課題(小テスト)については、履修者間での明らかなコピペ、あるいはほとんどコピペであると判断された場合、対象者のその回の課題点を負の点数(未提出より悪い点数)にしています(本来は単位の取り消しなどの措置に相当しますが、本講義ではそのような措置は行いません)。
25. シラバス「グラフィックス」について 🔷
Q: シラバスで授業後半にグラフィックスとあったのですが、C++ でグラフィックデザインも自分でできるということですか?「グラフィックス」について具体的に何をやるのか知りたいです。
第 1 回の講義で行った文字だけのプログラムではなく、図形や画像を表示するプログラムを作成して、簡単なゲームを作る予定です。
23. パソコンの OS について 🔷
Q: 講義に持ってくるパソコンは Windows OS のものではないといけないでしょうか。
オンラインコンパイラは OS によらず利用できます。ツールの 4 番目で紹介している Visual Studio 2022 は Windows で、Xcode は macOS で動作します。
20. 必要な数学の予備知識 🔷
Q: 数学などの教科からの予備知識などは必要なのでしょうか?
本講義に関しては、中学数学の知識と、平方根、累乗、絶対値、ラジアン、座標平面などの知識があれば十分です。
18. C++ の勉強法 🔷
Q: プログラミングをするのが初めてですが、C++ はどのように勉強したら良いですか?
教科書と講義資料を十分に予復習し、講義での説明をしっかり聞き、お手本とは違う面白いコードを自分で書いてみて、課題にも力を入れることが最も効率的です。わからないことがあれば、講師や TA に質問してください。
17. 授業外での学習について 🔷
Q: 授業で習った事を定着させ、出来る事を発展させる為に、課題以外で練習するサイトや方法はありますか。
講義の進展に応じて情報を提供します。現時点では、講義で学んだ内容を使ってオリジナルのプログラムを作成することが最も有効です。教科書のチャレンジ問題にも取り組んでください。質問 18 も参照してください。
12. 学ぶべきほかの言語 🔷
Q: 第 3 言語として個人的に習得するとしたら、何言語を習得するのがおすすめですか? また、今回の講義はプログラミング言語習得に役立ちますか?
「おすすめの言語」を学習するのではなく、作りたいものに基づいてプログラミング言語を選択してください。そうでないと、高い確率で挫折します。作りたいものが無い場合は、情報処理学会など情報系の学会に参加したり、IT 系のニュースサイト(Impress watch など)を読んだり、メディアアートを鑑賞したり、情報系の友人と話したり、(怪しいインフルエンサーや YouTuber ではない)良質なインプットを増やして、自分が作りたいものや関心を持つ分野を探してみてください。
身近に使っている人がいるプログラミング言語を学ぶのも、相談しやすいので良いでしょう。
本講義は C++ というプログラミング言語を習得することを目的としています。「分岐」や「繰り返し」といった基本的なプログラムの構造は、ほかの言語でも共通しています。
9. C++ 以外の言語との関係性 🔷
Q: プログラミングに初めて触れるのですが、C++ を学ぶことでほかの言語に触れる際もある程度理解できるものなのでしょうか。
「分岐」や「繰り返し」といった基本的なプログラムの構造は、ほかの言語でも共通しています。また、プログラミングにおける考え方やツールの使い方なども、ほかの言語でも共通している部分が多いです。そのため、C++ を学ぶことで、ほかの言語の習得もスムーズになります。
7. 小テストの回数 🔷
Q: 小テストは全部で何回ありますか?
平常点(出席点)がない代わりに、毎回の講義に小テストがあります。全 14 回の予定です。要領よく取り組めば、講義中の作業時間内あるいは次の休み時間内に提出できる難易度であることがほとんどです。
3. 授業で到達できるレベル 🔷
Q: この授業のみを通じて、どの程度のレベルまで上達することが可能でしょうか。
この講義を終えるころには、C++ プログラミングの基礎を身につけることができます。具体的には、「分岐」や「繰り返し」といった基本的なプログラムの構造、問題を解決するための方法論、そしてプログラミングにおける様々なツールの使い方などが理解できるでしょう。これにより、学びが終わった後も手探り状態での学習ではなく、より効率的に独学を進めるための土台が築けます。
英語の学習に例えるならば、この講義を修了することで中学 1 年生から 2 年生程度の英語の基礎知識を習得するような感じです。これからの学びのための基盤となる部分をしっかりと理解できるレベルを目指しています。
2. C++ の習得にかかる時間 🔷
Q: C++ は習得するのにどのくらい時間がかかりますか?
C++ の習得時間は、目標とするレベルや前提知識によって大きく異なります。例えば、英語の習得と考えるとわかりやすいかと思います。基本的な日常会話を目指すのか、ビジネスレベルでのコミュニケーションを目指すのか、またはネイティブスピーカーのように流暢に話すことを目指すのかによって、習得にかかる時間は大きく異なります。
C++ も同様で、基本的な文法やプログラミングの考え方を学ぶのであれば、この 14 回の講義で十分な理解を得ることができるでしょう。しかし、C++ を習熟するため、またはプロフェッショナルとしての技術を磨くためには、数年の経験や実践的な学びが必要となります。ただし、それは大学卒業後、実際の仕事を通じて学ぶことも可能です。仕事の中で新しい知識や技術を身につけていくことで、より深い理解や習熟を目指すことができます。