University of Electro-Communications Human Interface section
基礎プログラミングおよび演習
第
1回
University of Electro-Communications Human Interface section
自己紹介
&研究室紹介
長谷川晶一
高校1年のときに初めてプログラミング MS-DOSのバッチファイル ⇒ C言語、C++言語 大学サークルでバーチャルリアリティ作品を作る 会社(SONY)でデジタルテレビのソフトを作る (100人で開発) 大学に戻り、バーチャルリアリティ研究者になる バーチャルリアリティコンテスト 1996の様子 最近の状況は http://ivrc.net/ 研究室URL http://haselab.hi.mce.uec.ac.jp/University of Electro-Communications Human Interface section
プログラミングの重要性
自律ロボットの研究はプログラム作成時間が半分以上
ラジコンならばソフトウェアがなくても動く
自分で判断して動くロボットでは、ソフトが主役
コンピュータ(=計算機)とは
計算=ややこしい処理をする機械
プログラムに従って動作する
階差機関(Charles Babbage 1791~1871) の復元 数表の計算と印刷 解析機関(Charles Babbage 1791~1871) を作ったもの プログラム可能なコンピュータ コンピュータの歴史プログラムとは
コンピュータの動作を決める手順書
ロボット
PCとロボットとプログラム
PCの構成
制御マイコンの構成
CPU メモリ ビデオメモリ GPU ディスプレイ キーボード マウス USB CPU メモリ A/Dコンバータ カウンタ D/Aコンバータ パラレルI/O ポテンショメータ エンコーダ PWMモータドライバ アナログモータドライバ スイッチ/ソレノイドCPUとメモリ
CPUの動作 1. 命令カウンタを1増やす 2. メモリの命令カウンタのアド レスから命令を読み出す 3. 命令に従って計算する メモリから読みして、計算して、 メモリに書き戻す。命令によっ ては、命令カウンタを書き換え ることもある(ジャンプ)。メモリ
0 1 2 3 4 5 6 1 0 0 1 1 0 1 0 3FFFFFFE 3FFFFFFF 1 1 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 0 0 1 0 0 0 1 1 1 0 1 1 0 1 1 0 0 1 1 プログラムCPU
命令カウンタ アドレス 命令 命令レジスタ 計算ユニットプログラムの表現
1011 0000 0110 0001 0101 0100 1111 0110 1101 0111 0001 0010 メモリ プログラム(マシン語) 命令レジスタに読みだす 値を並べたもの add r0 61 sub r1 r2 @r3 sub r1 r2 @r4 jmp r2 プログラム(アセンブリ言語) 人に分かりやすいように 命令を意味のある単語に 置き換えたもの アセンブラプログラムの表現
高級言語(
C言語,BASIC,Perl,Ruby…)
コンピュータが実行できる言語で、かつ、
人が読み書きしやすい,わかりやすい言語
int main(){ printf(“Hello, world!”); return 0; } 0101 0100 1111 0110 1101 0111 0001 0010 1101 1110 1001 1000 0101 0100 1111 0110 1101 1110 1001 1000 mov r0 61 sub r1 r2 @r3 sub r1 r2 @r4 jmp r2 コンパイラ アセンブラ C言語(ソースコードファイル) 実行形式 アセンブ リ言語 マシン語なぜ
C言語
人にわかりやすいプログラムのための言語は
たくさんある
(暇な人はHello_world.htmを参照)が
…
C言語はなんにでも使える
実行形式を小さくできる。 → 家電製品などの組込マイコンなどでも使える。 実行速度が高速な実行形式を作ることができる。 → OS(オペレーティングシステム)の中核部に使える。 わりと、人にもわかりやすい。 → 大規模なプログラムの開発にも使える。
みんなが使っている
入門用としてはちょっとむずかしめの言語です。
その他の言語
C++
C言語を拡張、オブジェクト指向
Java
Sunが作ったC++に似た言語
どこでも動くのが特徴
FORTRAN
スパコン用 最適化が効きやすい
Ruby, PHP
Webサーバで動くサービスに多い
シェルスクリプト(
Unix),バッチファイル(Windows)
使えると
OSがちょっと便利になる
C#
Microsoftが作ったC++に似た言語
SunのJavaに対抗して作った
University of Electro-Communications Human Interface section
プログラミングの手順
ビルド:ソースコードから実行形式を作ること
int main(){ printf(“Hello, world!”); return 0; } C言語(ソースコードファイル) コンパイラ +アセンブラ (gcc) ビルド 実行形式ファイル 0101 0100 1111 0110 1101 0111 0001 0010 1101 1110 1001 1000 OS (Mac OS Xの FinderやTerminal) 1011 0000 0110 0001 0101 0100 1111 0110 1101 0111 0001 0010 メモリ プロセス 実行形式ファイルを メモリにロードして 実行 プログラム開発の手順 1.ソースコードを書く 2.ビルドする 3.実行してみる 問題があったら 問題があったらプログラム開発の実際
Xcode
ビルドと実行とデバッグをするための開発環境
テキストエディタ コンパイラ (gcc) デバッガ(gdb)
デバッグ・デバッガとは?
デバッグ:プログラムが正しく動作するように修正すること デバッガ:修正を助けるプログラム – プログラムを1行ずつ実行して動作の様子を見ることなどができる。開発環境の起動
画面下のメニュー
(Dock)のファインダーをクリック
開発環境の起動
Xcodeを起動する
Dockに登録
DockメニューのXcodeを右クリックして
Xcodeの設定
初めて
Xcodeを起動したときにだけ出てきます
新規プロジェクトの作成
プログラムを作る「プロジェクト」の作成
新規プロジェクト(コマンドライン)
授業では、「
Command Line Tool-Standard Tool」
新規プロジェクトに名前をつける
英字で始まり、英数字で名前をつけます。
名前は何でもかまいませんが、ここでは課題1ということで、ex1に
します。
プロジェクトの構成
プロジェクトの構成が示されます
main.c の中身
main.cの中身
です。
“Hello
world!”と表示
するだけのプ
ログラムを作
る
C言語のソー
スコードになっ
ています。
プログラムのビルドと実行
「ビルド」で
Xcodeがgccを使ってビルドしてくれる。
「ビルドして実行」でそのまま実行できる
プログラムの出力
ターミナルからプログラムを実行
「
Finder」で、「ユーティリティ」フォルダの
「ターミナル」を起動
ターミナルで、
cd ex1/build/Debug
と入力
ls
と入力
./ex1
と入力
この
ex1がXcodeで作ったプログラム
実行すると
Hello, World!
と表示が出る。
C言語の基本
#include <stdio.h>
int main(int argc, const char* argv[]){
// insert code here
printf (“Hello, World!¥n”);
return 0; } 標準入出力機能 (standard I/O)を使うことを宣言 メインのプログラムの始まり メインのプログラムの終わり コメント 「Hello, World!」と表示 メインから戻る 灰色 :なくてもいいところ 青 :ないとだめだけれど、後で説明する部分 黒 :今回説明する部分
C言語の基本
#include <stdio.h>
int main(int argc, const char* argv[]){
// insert code here
printf (“Hello, World!¥n”);
return 0;
}
C言語では、この部分に書いた プログラムが
上から順に実行されます。 // insert code here
printf (“Hello, World!¥n”);
return 0; //から行末までを、コメントといいま す。 コンパイラはコメントを読みません。 他の人がプログラムを読むときに助 けなるようなことや、自分のためのメ モを書くために使います。 このコメントは、Xcodeが書いたコメ ントで、「ここにコードを挿入してくだ さい」ということです。
C言語の書き方
// insert code here
printf (”Hello, World! ¥n”);
return 0; printf という関数 (function: 機能)を 呼び出しています。 printf( ”出力したい文字列” ) ; 関数の名前 関数の引数 文の終わりをあらわす セミコロン 関数 printf は文字列を出力します。 ¥n は表示すると、改行になる文字です。 MacとPCでフォントが違うので、¥の代わりに、 =バックスラッシュ になります。
とりあえずいろいろ表示してみよう
printf(” と ”);の間にいろいろな文字列を入れて
いろいろな文字列を表示するプログラムを作って
みてください。
#include <stdio.h>
int main(int argc, const char* argv[]){
// insert code here
printf (”Hello, World!¥n”); printf (”2 Hello, World!”); printf (”3 Hello, World!”); printf (”3 Hello, World!”);
printf (” ¥n ¥n ¥n4 Hello, World!”);
return 0;
}
上から順に 実行されます
ビルドがうまくいかない?
いろいろ書いていると、ビルドがうまくいかないこ
とが起こりえます。たとえば、次の例では、
なぞの
machigai という文字列があります。
コンパイラ(
gcc)がその旨を伝えるためにエラー
メッセージを出します。(
xCodeが表示します)
#include <stdio.h>int main(int argc, const char* argv[]){
// insert code here machigai
printf (”Hello, World!¥n”);
return 0;
ビルド時のエラー
「プロジェクト」のエラーと警告を見るか、
main.c の 赤丸×印にマウスをあわせるとメッセー
エラーメッセージを読もう
先ほどの例では、
error: `machigai‘ undeclared (first use in this function)
エラー:
machigai は宣言されていません(この関数の中
では、ここで初めて使われました)
と出ています。
C言語には、まだお話していない文法が
たくさんあるので、意味が取りにくいと思います。ですが、
コンパイラ(
gcc)が machigai をどう解釈してよいかわ
からず、なにか言っている。
この行の
machigai のあたりに何か問題があるようだ
ということは判ると思います。メッセージはいろいろあり
ますが、必ずよく読んで、意味を考えてください。
エラーメッセージの例
error:parse error before ‘}’ token
エラー:語
‘}’ の前で構文解析エラーが起きました
}の前に、何かが足りないために、コンパイラ(gcc)がC言
語の解析(解釈)ができなくなったと言っています。
この場合前の文の最後に足りない文字がありますね。
#include <stdio.h> int main(){printf (”Hello, World!¥n”); printf (”Hello, World!¥n”)
エラーメッセージの例
error: missing terminating “ character
エラー:終わりの文字 ” が必要です。
error:parse error before ‘}’ token
エラー:語 ‘}’ の前で構文解析エラーが起きました 文字列の終わりの”がないと言っています。 コンパイラは、 ); も表示する文字列(Hello World! ¥n)の続きだと思ったようで す。このため構文解析エラーも起きています。 このように、ひとつの原因で複数エラーが出ることもあります。 エラーメッセージは最初の方から見て行きましょう。 ひとつ直すと全部直ることもあります。こまめにビルドしましょう。 #include <stdio.h> int main(){
printf (”Hello, World!¥n”); printf (”Hello, World!¥n);
エラーメッセージの意味
そのほかのエラーメッセージについては、
C科大久保先生のページ
http://www.tnlab.ice.uec.ac.jp/~sokubo/class/language/ref
/error.html
を見てください
MacOSのgccは日本語のエラーメッセージを出し
てくれません。
Windowsの場合、Visual C++ / Borland C++ /
cygwinのgccで日本語のメッセージが出ます。
関数をもうひとつ
上から順に実行されることを確かめるために、も
う
1つだけ関数を覚えましょう。
#include <stdio.h>
int main(){
printf (”Plase hit ENTER key¥n”); getchar(); printf (”Thankyou¥n”); } 1文字入力 [ENTER]キーが押される まで、キーボードからの文 字入力を待ちます。 [ENTER]が押されたら、 最初に入力されたキーを 読み出します。
順番に実行される様子を見る
いろいろ変えてみて様子を見てください。
#include <stdio.h>
int main(){
printf (”Plase hit ENTER key 3 times.¥n”); getchar();
getchar(); getchar();
printf (”Thankyou¥n”);
printf (”Plase hit ENTER key 2 times.¥n”); getchar();
getchar();
printf (”Thankyou¥n”);
プログラムのデバッグ
ビルドがうまくいっても、プログラムが思ったよう
に動作しないこともあります。
デバッグ・デバッガとは?
デバッグ:プログラムが正しく動作するように修正する
こと
デバッガ:修正を助けるプログラム
プログラムを1行ずつ実行 動作の様子をゆっくり見ることなどができる。デバッグの実際
デバッグ
ブレークポイントを設定
ブレークポイントを設定してデバッグを始めると、
プログラムがブレークポイントのところで止まる。
int main(…. の行にブレークポイントを 設定して、デバッグを開始 してみてください。デバッグ
– ステップ実行
ブレークポイントで止まった後は、
ステップオーバーで
1行ずつ実行して様子を見る
ことができます。
参考
mainが終わっても しばらくプログラムは続きま す。C言語のソースがない ので、アセンブリ言語やマ シン語が表示されます。驚 かないで。 ステップインを選ぶと関数 の中にどんどん入っていき ます。printfの中身が全部 わかるためには結構勉強 が必要です。課題と提出
課題提出
Webサイト
http://haselab.hi.mce.uec.ac.jp/class/basic/
ここをクリックして指示に従ってWebのアカウントを作る ・パスワードを設定させられます ・一度ログアウトしてからログインしなおすよう指示されますログイン
ここに設定したユーザ名と パスワードをを入力