始め方
CS50 IDEはWebベースの 「統合開発環境」 であり、ソフトウェアをローカルにインストールすることなく 「クラウドで」 プログラミングできます。実際、CS50 IDEには、独自のファイルやフォルダ (ディレクトリ) を保存できる独自の「ワークスペース」 (ストレージ) が用意されています。
ログイン
ide.cs50.ioにアクセスし、“Sign in with GitHub”をクリックしてCS50 IDEにアクセスします。IDEが読み込まれると、 (デフォルトでは) 3つの画面に分かれています。CS50 IDEの最上部には、すべてのプログラムを記述する 「テキストエディタ」 があります。下部には、「ターミナルウィンドウ」 (デフォルトでは水色) があり、これはワークスペースのファイルやディレクトリの探索、コードのコンパイル、プログラムの実行、さらには新しいソフトウェアのインストールまで可能にするコマンドラインインターフェイス (CLI) です。左側は 「ファイルブラウザ」 で、現在IDEにあるすべてのファイルとフォルダが表示されます。
ターミナルウィンドウ内をクリックします。「プロンプト」 は次のようになります。
~/ $
ターミナルウィンドウの内側をクリックし、次のように入力します。
mkdir ~/pset1/
次にEnterを押して、ホームディレクトリー内にpset1
というディレクトリ (フォルダ) を作成します。mkdir
と~/pset1
や、その他の文字との間のスペースを見落とさないように注意してください。~
は常にホームディレクトリを表し、~/pset1
は~
内のpset1
というディレクトリを表すことに注意してください。
ここでいう実行 (コマンドを走らせる) とは、コマンドをターミナルウィンドウに入力してEnterキーを押すことを意味します。コマンドでは 「大文字と小文字が区別される」 ため、小文字 (大文字) を意味する場合は大文字 (小文字) を入力しないでください。
それでは、以下のコマンドを実行して、
cd ~/pset1/
そのディレクトリに移動 (ディレクトリを開く) します。プロンプトは次のようになります。
~/pset1/ $
このようにならなかった場合は、ステップをさかのぼって、どこで問題が発生したかを確認します。
次に、以下のコマンドを実行して、
mkdir ~/pset1/hello
pset1
ディレクトリ内にhello
という名前の新しいディレクトリを作成します。その後、以下のコマンドを実行し、
cd ~/pset1/hello
そのディレクトリにカレントディレクトリを移動します。
最初のプログラムを書いてもらいましょう。FileメニューからNew Fileをクリックし、~/pset1/hello
ディレクトリ内にhello.c
として (FileメニューのSaveオプションを使用して) 保存します。ファイルに次の行を正確に入力して、最初のプログラムを作成します。
#include <stdio.h>
int main(void)
{
printf ("hello, world\n") ;
}
CS50 IDEでは、入力時に構文の強調表示 (色) が追加されますが、色の選択はこの問題セットとは異なる場合があります。これらの色は、ファイル自体には保存されません。特定の構文を目立たせるために、CS50 IDEによって追加されました。最初からhello.c
としてファイルを保存していなければ、CS50 IDEは (ファイル名の拡張子に従って) Cコードを記述していることを認識しません。その場合、これらの色は表示されません。
ファイルの一覧表示
次に、ターミナルウィンドウのプロンプト (~/pset1/hello/ $
) のすぐ右側で、次のコマンドを実行します。
ls
するとhello.c
が表示されるはずです。これは、hello
フォルダにファイルがリストされているためです。具体的には、ls
(listの略) というコマンドを実行しました (頻繁に使用されるコマンドなので、キーストロークを短くするためにls
と呼ばれます) 。ここまでは大丈夫でしょうか?
プログラムのコンパイル
hello.c
プログラムを実行する前に、コンパイラ (例えば、clang
) でコンパイルし、ソースコードからマシンコード (つまり、0と1) に変換する必要があることを思い出してください。次のコマンドを実行します。
clang hello.c
次に、再び以下のコマンドを実行します。
ls
今度はhello.c
だけでなくa.out
も表示されるはずです (フォルダアイコンをもう一度クリックすると、同じ内容がグラフィカルに表示されます) 。これは、clang
がhello.c
のソースコードをa.out
のマシンコードに変換したためです。a.out
は「アセンブラ出力」 を表していますが、その詳細についてはまたの機会に説明しましょう。
次のコマンドを実行して、プログラムを実行します。
./a.out
ついに「Hello, world」が表示されたはずです。
プログラムの命名
さて、a.out
はプログラムにとって最も使いやすい名前ではありません。再びhello.c
をコンパイルしてみましょう。今度はマシンコードをhello
というファイルに保存します。以下を実行します。
clang -o hello hello.c
文字の間のスペースを見落とさないように注意してください。次に、次のコマンドを再度実行します。
ls
hello.c
(そして以前のa.out
) だけでなく、hello
も表示されるようになります。これは、-o
がコマンドライン引数であり、フラグまたはスイッチとも呼ばれるもので、clang
にhelloというファイルを出力(oはoutputの意味)するように指示するためです。次のコマンドを実行して、新しく名前を付けたプログラムを試します。
./hello
「Hello, world」が再び表示されるでしょう。
物事を簡単にする
覚えておいてほしいのは、make
を利用することで、clang
を実行するプロセスを自動化し、キーストロークを節約できるということです。最後にこのプログラムを以下のようにコンパイルしましょう。
make hello
make
はclang
を実行し、さらにコマンドライン引数が追加しているのがわかるはずです。詳しくは、また別の機会に説明しましょう。
次のコマンドを実行して、プログラム自体を最後にもう一度実行します。
./hello
これで完了です!
ユーザ入力を取得する
このプログラムをどのようにコンパイルして実行してもhello, world
しか出力しません。レッスンで行ったように、少しパーソナライズしましょう。
このプログラムを変更して、最初にユーザーに名前の入力を求め、次にhello, so-and-so
(so-and-so
は実際の名前) を出力するようにします。
前と同じように、以下のコマンドでプログラムをコンパイルしてください。
make hello
また、プログラムを実行し、さまざまな入力で数回はテストしてください。
./hello
ウォークスルー
Hintsヒント
どのようにユーザ入力を取得するか覚えていませんか?
get_string
は次のように使用でき、戻り値string
型のname
という変数に格納されます。
stringname
=
get_string("What is your name?\n");
文字列の書式設定方法を覚えていませんか?
ユーザーの名前と挨拶をどのように結合したか覚えていますか。以下のようにprintf
は文字列の表示だけでなく書式をフォーマットするためにも使うことができることを思い出してください (printf
のf
はformatを表します)。
printf("hello, %s\n",
name);
宣言されていない識別子の使用 (Use of undeclared identifier) とは?
Seeing the below, perhaps atop other errors? 以下のメッセージを見ると、他のエラーにもとづくものでしょうか?
error: use of undeclared identifier 'string'; did you mean 'stdin'?
get_string
を使用するには、次のようにcs50.h
(get_string
の宣言) をファイルの先頭に追加する必要があります。
#include <cs50.h>
コードのテスト方法
check50
を使用するため以下を実行し、コードの正確さを評価してください。ただし、コンパイルとテストは必ず自分で行ってください。
check50 cs50/problems/2021/x/hello
以下を実行し、style50
を使用してコードのスタイルを評価します。
style50 hello.c
提出方法
次のコマンドを実行し、GitHubのユーザー名とパスワードを入力してログインします。セキュリティのため、パスワードには実際の文字ではなくアスタリスク (*) が表示されます。
submit50 cs50/problems/2021/x/hello