koarashi_project_no2_directory

ディレクトリ

プログラミングは言語だけではない

先週はCUIの話から始めました.プログラマが直接話しかけるコンピュータの中のこびとのことでした. プログラミングの習得というんは,言語としてプログラミングを学ぶことも大事ですが, 環境としてプログラミングに馴染むことも大事です.

そして優秀なプログラマというのは,環境構築がうまい人でもあります.

コードをなるべく書かずに仕事を進めることができる.

あるいは,

書いたコードの,つかいまわしがうまい

というのを心がけてください.

directoryの命名規約

先週作ったファイルをディレクトリに整理しましょう. まず,先週の作業ディレクトリに移動してください.

ディレクトリの名前を何にするかは重要なことです. first という名前にして,初日の記念にしてもいいです. でも,書いたコードの振る舞いを表現する名前を使う方が, あとで見直す時に思い出しやすく,また中身を検索するのにも便利です. そこで,hello_world を使いましょう.

koarashi_project.002.jpeg

アステリスクと補完

先週の最後の

mv a.out hello_world

をしているとファイル名がダブりますので,まずは,

mkdir tmp

としましょう.tmp とは, temporary の略で,一時的という意味です. 一時的なファイルや保存場所の名前としてよく使います.

ls hello_world*

としてください.*はアステリスクと読み,一文字以上の文字なんでもを意味します.

hello_world*   hello_world.c

と出てますでしょうか.

ヒストリという機能を使うと以前に入力した内容を再利用することができます. 例えば コントロール-pと押すと,先ほどのlsコマンドが再度表示されます. コントロール-a で一番最初の文字の場所に, コントロール-dでカーソルのある場所の文字を一文字削除などです. 多くの場合,コンソールの編集には Emacs エディタと同じキーが使用できます. これを使って編集してみましょう。

  1. コントロール-pで一つ前のコマンドを表示します.
  2. コントロール-aで入力カーソルの場所を一番前に持ってきます.
  3. コントロール-d, コントロール-dとしてlsを消します.
  4. 移動を命令するmvと打ち込んでください.
  5. コントロール-eでカーソルを最後に持ってきます.
  6. space, tmpと打ち込んでください.

結果は,

mv hello_world* tmp

としましょう.hello_worldがついたファイルがtmpに移ったはずです.

mv tmp hello_world

として,tmpディレクトリをhello_world ディレクトリに名称変更しましょう.

ls he

とうって,タブキーを打ってみてください.タブキーは左手小指の上1段目,qの左隣にあります. hello_worldと補完されるはずです. 長いファイル名を打つときは,ある程度まで打ったらタブ補完を使うと, タイプが省略できて,間違いも少ないので,便利です.

相対パスと絶対パス

hello_worldディレクトリーへ移りましょう.

cd hello_タブ

そこで

pwd

として自分の居場所を表示させてください.

 bob% pwd
/Users/koarashi/hello_world

/で表示されるルートディレクトリからこれだけの階層を下がったところに 作業ディレクトリーを置いています.ここで表示されるパスを絶対パスと 読んでいます.

一方で,一つ上の階層のリストをとってみましょう.

ls ..

と打ってください.スペースに注意して,どっとドットは一つ上を意味しています. このようなパスの表記の仕方を相対パスと呼びます.

もう一度コマンドの文法規則を復習しておきます. コマンドは英語の命令文に似せていることを思い出してください.

ls ..
エルエス,スペース,ドットドット

というのは

リストせよ,相対パスで一つ上のディレクトリを

という命令,つまりコマンドです.


file permission

次のコマンドを打ってみてください.

ls -lat

ここでlsの後ろにハイフンで付け足された命令をオプションといいます. コマンドラインインターフェースではこのオプションによっておなじプログラムに対して 違った振る舞いをするように命令することが可能です. -latで出てきた情報をすこし詳しくみましょう.

ls -lat
total 48
drwxr-xr-x  6 bob  staff   204  5  6 15:24 ./
drwxr-xr-x  7 bob  staff   238  5  6 15:24 ../
-rwxr-xr-x  1 bob  staff  8432  5  6 12:47 hello_world*
-rw-r--r--  1 bob  staff    66  5  6 12:46 hello_world.c
-rw-r--r--  1 bob  staff    61  4 27 16:38 first_bug.c
-rw-r--r--  1 bob  staff    66  4 27 16:31 first.c

はじめのdrwxはパーミッションといい,ファイルの読み書きや 実行などの属性を示しています.次のbobは所有者名,次が グループ名,サイズ,変更日時,そしてファイル名です.

-lat

のlはlong, aはall, tはtimeの略で,long形式で,隠しファイルを含めて全てのファイルを 時間順で出すように命令しています.

隠しファイルというのはドットから始まるファイルやディレクトリで, 普段のlsコマンドでは表示されません.どっとドットが一つ上,ドットは 今いるディレクトリ,カレントディレクトリを示しています.

C言語

今日の狙い:変数とループ

今日は変数とループについてやります. 変数とループを使っていくつもの繰り返し操作を コードにやらせることが可能になります.ここでは, 先週やった"hello world."を8回出力することが目的です.

動くものから始める

先週書いたコードから進めていきます.

プログラミングで大切な心構えの一つとして,

「しっかりとした土台を使う」

というのがあります. 動くコードから改良を加えていくことをつねに心がけてください. コードをなるべく書かずに仕事を進める最初のコツでもあります.

先週の課題をもういちどコンパイルして動かしてみましょう.

#include <stdio.h>

int main(void){
  printf("Hello world.\n");
}

さきほど説明したオプションを使うとすこし便利になります.

gcc hello_world.c -o hello_world

としてください.これは,

hello_world.cをhello_worldという名前にgccしなさい

ということを意図しています.-oはobjectつまり目的の意味です. これを指定しない時には,a.outが実行ファイルとして生成されます.

作業ディレクトリの作成

さてディレクトリの構築です.for_loopというディレクトリを作ります. 今は,hello_worldにいるはずなので,

mkdir ../for_loop

としてhello_worldの一つ上の階層にfor_loopというディレクトリを作ります. どっとドットの使い方に注意して下さい. さらに

cp hello_world.c ../for_loop/for_loop.c

としてfor_loop.cという名前のファイルをfor_loopディレクトリの中に作ります.

bob% tree .
.
├── for_loop
│  ├── for_loop.c
└── hello_world
    ├── hello_world
    └── hello_world.c

となります.

cd ../forタブ

でfor_loopディレクトリに移って今後の作業を進めます.

整数型の導入

for_loop.cに変数を導入します.

#include <stdio.h>

int main(void){
  printf("Hello world.\n");
  int i=1;
  printf("%d\n",i);
}
int i=1;

とすると,

整数型の変数iを作って,初期値として1を入れる

という命令になります. intはintegerつまり整数の略です.

整数を出力する時には,printfにフォーマットを指定する必要があり, それが,

%d

です.このprintfは,

%dで指定したフォーマットで,変数iの中身を出力しなさい

ということになります.

変数の操作

iを出力する行をコピーペーストして2行足してください. その真ん中の出力変数をiからi+1に変えてください.

#include <stdio.h>

int main(void){
  printf("Hello world.\n");
  int i=1;
  printf("%d\n",i);
  printf("%d\n",i+1);
  printf("%d\n",i);
}

gccして出力をみましょう.

bob% ./a.out
Hello world.
1
2
1

となっています.i+1としても変数i自身が変更されているのではないことを理解してください. iを変更するには,明示的に

i = i+1

と変更する必要があります.

#include <stdio.h>

int main(void){
  printf("Hello world.\n");
  int i=1;
  printf("%d\n",i);
  i = i+1;
  printf("%d\n",i);
}

さらに一つ増やすという操作はよく使うため,簡略記法が用意されています.

i += 1

あるいは

i++

です.これに書き換えてどうなるかみてください.

ループの導入

さてloopです.もっとも基本となるfor-loopです. いままでの

int i=1;
i++;

のあたりを以下のように書き換えてください.

 for (int i=1;i<10;i++){
   printf("%d\n",i);
 }

できました?

#include <stdio.h>

int main(void){
  printf("Hello world.\n");
 for (int i=1;i<10;i++){
    printf("%d\n",i);
  }
}

これをgccして動かしてみましょう. 1から9までの数字が出力されていますか?

for (int i=1;i<10;i++){

では

初期値が1の整数iをi<10である限り,iに一つずつ加えなさい

ということを意図しています.

課題

以下の改良をおこなってください.

  1. 0から9までを出力するように変更しなさい.(for_0_9_loop.c)
  2. 1から10までを出力するように変更しなさい.(for_1_10_loop.c)
  3. "hello koarashi kun."と8回出力するように変更しなさい.(koarashi_times_8.c)
  4. "hello koarashi kun."と100回出力するように変更しなさい.改行は取っておいてください.
Last modified:2024/03/29 08:25:52
Keyword(s):
References:[koarashi_project]