2019/10/2(水)、2019/10/5(土)に実施された第一回「エンジニアになろう」講習会の講義スライドを書き起こした資料です。説明の簡略化のため、一部不正確な書き方をしている部分がありますが、ご了承ください。東京大学の学生が A セメスターで学習することを想定しています。
「作りたい」という気持ちが生まれた時、それを実現するために必要な技術は一つであることは稀です。そのため、この講習会では、一つの技術を突き詰めることはせず、様々な技術の扱い方を幅広く学び、より 多くの知識への「引き出し」を持つことに重点を置きます。
素晴らしい製品の裏には、数多くの苦労が存在しています。それがあるからこそ、完成した時の喜びはひとしおです。
今回メインで扱うプログラミング言語です。Microsoft が開発した言語で、古き良き C の文法を踏襲しつつも、モダンで堅牢な書き方ができます。
Visual Studio Code をブラウザ上で利用するためのサービスであるCoderのバックエンドで利用されている OSS、code-server の公式 Docker イメージに、C#の SDK と開発用のプラグイン、雛形となるプロジェクトファイル、実行・共有のための幾つかのスクリプトを加え、VPS 上で人数分のコンテナを起動しました。講習会中のみインスタンスを起動していれば良いだけなので料金はほとんどかかりません。
Console.WriteLine("Hello World!");
こちらは画面に Hello World!と表示するためのプログラムです。授業でもよく取り扱われる Python であれば
print("Hello World!");
と書けるので、煩わしいと感じるかもしれません。しかしながら、基本的な文法はどの言語もそこまで差はありません。動作を変更する時は、カッコの中身を書き換えるだけです。
Console.WriteLine("日本語もおk");
// コメントも書けます
Console.WriteLine(100 * 15);
/* 複数行に
渡ってもいいです。 */
ただし、
という差があるので注意しましょう。
最近のエディタ(プログラムを編集するためのソフトウェア)では、プログラマの支援のための豊富な機能が搭載されています。その中でも最も使用頻度が高いのがこのエディタの補完と呼ばれる機能で、曖昧な知識をコンピューターが自動的に補ってくれます。
C#は比較的「厳しい」言語なので、コンピューターにより容易にプログラムが解析できます。したがってエディタ上で表示される候補は(今回の環境では)「完璧」な候補であり、補完に従って書いている限りエラーになることはありませんし、補完に現れない書き方をしたらエラーとなります。
表示されている補完候補を選択する際は、入力の高速化のためにも必ずキーボードを用いて選択し、正しい候補のところで[Tab]キーを押しましょう。なお、Mac のユーザーは[control]+[P/N]で上下選択ができます。覚えるだけで編集効率が飛躍的に上昇するので、ぜひマスターしましょう。
Python と C# の最も大きな違いの一つとして、「データ型」の概念があることが挙げられます。
int age = 20; // ageは整数(int)型
string name = "鈴木 一郎"; // nameは文字列(string)型
bool isCute = false; // isCuteは真偽値(bool)型
C#において、変数を利用する際は、必ず「宣言」をする必要があります。宣言の際、変数名の前にデータ型を指定するので、その変数に意図しない値が入ることはありません。
上の 4 つだけ覚えておけばなんとかならないことはほぼ無いです。
int age = 19;
if (age >= 20)
{
Console.WriteLine("ようこそオトナの世界へ");
}
else if (age >= 18)
{
Console.WriteLine("ちょっと背伸びしちゃお");
}
else
{
Console.WriteLine("まだまだ");
}
int count = 0;
while (count < 10)
{
Console.WriteLine(count);
// count += 1 もしくは
// count = count + 1 と同義
count++;
}
++をインクリメント演算子(変数の値に1を加える)、--をデクリメント演算子(変数の値に1を減じる)と呼びます。
for (int i = 0; i < 10; i++)
{
Console.WriteLine($"{i + 1}回目");
}
Python の for 文とかなり異なっていますが、基本的に for 文は while 文で置き換えることができ、上の例の場合はほとんど以下のコードと同義です。
int i = 0;
while (i < 10)
{
Console.WriteLine($"{i + 1}回目");
i++;
}
for 文は複雑ではありますが、基本的に例とほぼ同じようなコードで利用されることが大半なので、「型」として覚えてしまいましょう。なお、この例のように$に続いて文字列を書く方法を文字列補間と呼び、で括った部分を式として評価(≒ プログラムとして実行)します。
string input = Console.ReadLine();
Console.WriteLine(input + 3);
Console.ReadLine は、標準入力(≒ キーボード)から一行読み出します。このプログラムを実行し、「4」を入力すると、「43」と出力されます。期待していた結果は 7 かもしれませんが、input は文字列であるため、input + 3 は文字列の結合とみなされるため、「4」+ 3 =「43」となるのです。
問: end が入力されるまで数値を入力させ、その平均を表示するプログラムを作ってください。(配列等は使いません)
int count = 0;
double sum = 0;
while (true)
{
string input = Console.ReadLine();
if (input == "end")
{
break;
}
count++;
sum += double.Parse(input);
}
double average = sum / count;
Console.WriteLine($"平均は{average}です。");
以下のコードの問題点を指摘してください。
for(int i=0;i<10;i++)
{
Console.WriteLine(i);
}
インデントとは字下げのことです。ブロックの内部に適切なインデントを加えることで、プログラムの階層構造が把握しやすくなります。
基本的には英文を書く際と同じです。
面倒でもスペースは適切に入れましょう。
[Command / Ctrl] + [Shift] + [P]に続いて、「Format Document」を選択しましょう。コードが正しければ、変化はほとんどないはずです。自分が書いたコードと見比べて、どのように直すべきなのか考えましょう。
using System;
namespace project
{
class Program
{
static double CalculateBmi(double weight, double height)
{
return weight / Math.Pow(height, 2);
}
static void Main(string[] args)
{
Console.WriteLine(CalculateBmi(60, 1.6));
}
}
}
メソッドは
[戻り値の型] [関数名]([引数の型] [引数名], ...)
の形で定義します。戻り値を持たない場合は、void キーワードを指定します。
問題: 自然数の階乗を求めるメソッドを作成してください。ただし、0! = 1 を考慮する必要はありません。
double Factorial(int number)
{
int result = 1;
for (int i = 1; i <= number; i++)
{
result *= i;
}
return result;
}