始め方
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