Hello

始め方

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も表示されるはずです (フォルダアイコンをもう一度クリックすると、同じ内容がグラフィカルに表示されます) 。これは、clanghello.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

makeclangを実行し、さらにコマンドライン引数が追加しているのがわかるはずです。詳しくは、また別の機会に説明しましょう。

次のコマンドを実行して、プログラム自体を最後にもう一度実行します。

./hello

これで完了です!

ユーザ入力を取得する

このプログラムをどのようにコンパイルして実行してもhello, worldしか出力しません。レッスンで行ったように、少しパーソナライズしましょう。

このプログラムを変更して、最初にユーザーに名前の入力を求め、次にhello, so-and-so (so-and-soは実際の名前) を出力するようにします。

前と同じように、以下のコマンドでプログラムをコンパイルしてください。

make hello

また、プログラムを実行し、さまざまな入力で数回はテストしてください。

./hello

ウォークスルー

Hintsヒント

どのようにユーザ入力を取得するか覚えていませんか?

get_stringは次のように使用でき、戻り値string型のnameという変数に格納されます。

string name = get_string("What is your name?\n");

文字列の書式設定方法を覚えていませんか?

ユーザーの名前と挨拶をどのように結合したか覚えていますか。以下のようにprintfは文字列の表示だけでなく書式をフォーマットするためにも使うことができることを思い出してください (printffは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