プログラミング基礎I(再)

山元進
1度は講義を受けたことを念頭に置いて講義
 遠慮なく質問せよ

質問で授業を止めたくないならば、TA の人を呼
んで質問すると良い
 前期講義の欠席者は、特に注意せよ。

4限座学+5限演習
 出席をとる(前期同様のシステム)
 中間試験を行う。
 期末試験の範囲は教科書 1-8 章


しばらく、Javaに限らないことを話す
コンピュータ中のデータ = ON/OFF で表現
 ON/OFF → 1/0 とすると2進数
 データはすべて2進数として表される
 2で繰り上がるのが2進数



10で繰り上がるのが10進数
2進数はケタ多い → 16 進数もよく使う
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
 16進数 1 ケタ = 2進数 4 ケタ

コンピュータへの指令も2進数のデータとして
記録されている → 機械語
 機械語は、人間がコンピュータにさせたいこと
を記述するには不向き



数字の羅列は覚えにくい!
人間の言語体系になるべく近いように作られ
た言語 : 高級言語

データは全て2進数で表されているが、その
データを文字と解釈するか、数値と解釈する
か、あるいはもっと複雑なデータと解釈するか
→ データの型
数値として解釈するなら数値型
 文字として解釈するなら文字型
 …


問: 2010 を2進数で表せ
… 210 = 1024, 211 = 2048
 (10進数) 2048-32-4-2
 (2進数)
100000000000
–
100110 (32+4+2)
=
11111011010


問: 2 進表記された数 1110011000 を 16 進
表記に直せ
11 1001 1000 (4ケタずつ切る)
 398


ただ文字を並べても、位取りの意味が不明瞭

Java では、16進数の先頭に 0x 付加



0x398 → 10進数なら (3×16+9)×16+8=920
16 進数 hexadecimal
類似物に 8 進数あり。先頭に 0 付加

0123 と 123 は値が全く違うので注意!!

文字と数との対応表を事前に決めておく

ASCII コード


ユニコード


アルファベット、数字、記号 → 1バイト
2バイトで1単位、1 or 2単位で1文字
文字を表すデータを文字型、char 型

正の整数はそのまま扱う


ただし、ケタ数は決めておく 31 ビット分
負の数は2の補数表示を使う
-1 を 0xffffffff であらわす
 +1 するとケタがあふれて 0x0 になるのでこう選ぶ
 一般の数 x は2の補数表示:



x を2進表示 → 0/1 反転 → 1 を足す
(符号なしの整数もある)

実数は全部を取り扱うのは困難

√2=1.41421356….


仮数部 × 指数部 分かりやすいよう 10 進表示す
ると


123.456 → 1.23456 × 102
倍精度実数 : double 型


桁数に限りがない→必要メモリも限りない
1つのデータで8バイト
単精度実数 : float 型

1つのデータで4バイト
メモリ = データを記憶する場所
 記憶場所管理のため番号の番号 = アドレス



通常、8 ビット (8 ケタの 2 進数) = 1 バイト ごと
1 byte = 2 ケタの 16 進数

0x00 = メモリの 1 バイト分 0
2進数表記なら 00000000 (8ケタ)

変数
プログラム実行中に変更され得るデータ
 通常、メモリの特定の場所と対応している


定数


プログラム実行中に変更されないデータ
通常、変数や定数には、ラベル(名前)が付く
例:
 int k; // k という名前の整数(int) 型変数

高級言語のひとつ
 中間コード利用



仮想マシン(インタプリタ)で実行
Java のプログラム実行まで
Java 言語で書か
れたプログラム
Sample1.java
kasu
コンパイル
javac Sample1.java
中間コード
Sample1.class
仮想マシン上
実行結果
実行
java Sample1

後でどこにサンプルを置いたかわかりやすい
よう、Kiso1-1 などとディレクトリを作り、その中
で作業するとよい。
mkdir Kiso1-1; cd Kiso1-1

Sample1.java を作成して編集する
emacs Sample1.java


文字コードに注意(左下に U と出ているか?)
書き終わったら save して終了
class Sample1
{
public static void main(String args[])
{
System.out.println("ようこそJavaへ!");
System.out.println("Javaを始めましょう!");
}
}


{} の入れ子構造を字下げで表す。
対応する { と } が、同じケタに来るように。
class Sample1
{ public static void main(String args[])
{
System.out.println(
"ようこそJavaへ!");System.out.println("Javaを始めま
しょう!");
}
}

上のような書き方は、Javaの文法上許されるが、
私は許さない!

提出課題などでこんなの見つけたら減点する
プログラム中にコメント(註釈)を書ける
 1 行の中で, // の右はコメント
 /* と */ とに囲まれた部分はコメント
 コメントに何を書いても実行結果に影響なし
 コメントは、コードを読む人のために書く

class Sample1 // クラスの宣言 クラス名は Sample1
{
// クラス Sample1 本体の開始
// 次行から main()メソッド(実行開始場所)の宣言
public static void main(String args[])
{ // main() メソッド本体の開始
System.out.println("ようこそJavaへ!");
System.out.println("Javaを始めましょう!");
}
// main() メソッド定義の終了
}
// クラス定義の終了
// メソッド、クラスの宣言とも、続く{}の中身が本体である
// メソッドの宣言が、クラスの宣言の中に入れ子になっている
// クラスの概念の詳細は、後の回の講義で行う
ファイル名(拡張子を除く)と同じにすること!
class Sample1 // クラスの宣言
{
// コメント (人間が読むときのための註)
public static void main(String args[])
{ // main メソッドの宣言 (仮想マシンの実行開始場所)
文末のセミコロン必須(次行も同様)
System.out.println("ようこそJavaへ!");
System.out.println("Javaを始めましょう!");
}
カッコの対応関係には意味あり。
開いたら、必ず正しい位置で閉じること
}
(次行も同様)
// メソッド、クラスの宣言とも、続く{}の中身が本体である
//
メソッドの宣言が、クラスの宣言の中に入れ子になっている
"(ダブルクォーテイション)
は、開くときも閉じるときも同じ記号。対応関係に注意。
// "と"で囲まれた部分は文字列データで、全角OK。それ以外では全角不可
クラスの概念の詳細は、後の回の講義で行う
特に、全角スペースが文字列データ以外の部分に混じらないように!!
Java のコードは1つ以上のクラスからなりたつ
 main()メソッドからプログラムの処理がはじまる
 文は原則として先頭から順番に実行される
 文の最後にはセミコロンをつける

コメントは人間がコードを理解しやすくするため
に書く (実行動作には関係しない)
 インデントや改行を使ってコードを読みやすく


コンパイル
javac Sample1.java
 エラーなし → Sample1.class できる (ls で確認)

実行
java Sample1
 Sample1.class が仮想マシンで実行される
 Sample1 の後に .class をつけるな!!

プログラムの書き間違い、手順違い
→エラー出力 読めば何を間違えたか参考になる

literal → 通常は形容詞で、「文字どおりの」


名詞としては、文字どおりの解釈・意味
プログラムで値を表す文字列

Sample1.Java 中では
"ようこそJavaへ!"
 "Javaを始めましょう!"


の2つが文字列リテラル。データの内容は
ようこそJavaへ!
 Javaを始めましょう!


文字リテラルの例


文字列リテラルの例


'A', 'B'
"ようこそJavaへ!"
' と " の使い分けに注意
' は1文字を囲む
 " は文字列を囲む


数値リテラルの例

System.out.println(0x398);
0x398 は数値リテラル(整数リテラル)
 920 と表示される (整数はデフォルトで10進表記)


System.out.println(3.14159265e2);
3.14159265e2 は浮動小数点(数)リテラル
2
 314.159265 と表示される (3.1415926 × 10 )

class Sample3
{
public static void main(String args[])
{
System.out.println('A'); // 文字リテラル
System.out.println("ようこそJavaへ!");
System.out.println(123); // 整数リテラル
}
}

次のようなメソッドを使う
System.out.println()
 System.out.print()
 問 : 両者の違いはなにか?次のページの
Sample2.java をコンパイルして動かしてみよ

class Sample2
{
public static void main(String args[])
{
System.out.print("ようこそJavaへ!");
System.out.print("Javaを始めましょう!");
}
}
// Sample1 と Sample2 の違いは何か?
// 見比べて考え、実行して確かめてみよ。


複数の文字で1文字を表す規則
画面の出力を制御する、特殊な文字など





Java プログラム中で特別な意味のある文字




普通の文字で表せない
そこで、 \文字 などで表す規則になっている
タブ → 印字位置を前もって決めた場所へ移動
復帰→ 印字位置を行の先頭に移動
\ → \\
' → \'
" →\"
System.out.println("\\100"); // 例
文字コードで文字を表すのにも使える
教科書 表2-1を参照せよ
など
class Sample4
{
public static void main(String args[])
{
System.out.println("円記号を出力します。:\\");
System.out.println("アポストロフィを出力します。:\'");
}
}
// エスケープシーケンスを使うと、特殊な文字をあらわすことができる。
class Sample5
{
public static void main(String args[])
{
System.out.println("8進数101の文字は\101です。");
System.out.println("16進数0061の文字は\u0061です。 ");
}
}
// 文字コードを指定して 文字を出力することができる
class Sample6
{
public static void main(String args[])
{
System.out.println("品物\t\t単価\t数量\t金額");
System.out.println("えんぴつ\t10\t2\t20");
System.out.println("消しゴム\t100\t1\t100");
}
}
// エスケープシーケンスを使って、画面の出力を制御できる
// タブストップ(\tによって印字位置が移動する場所)
// はどこに設定されているか考えよ。ヒント:半角文字換算
1.自分の名前を出力するプログラムを作成せよ。
 2.「タブ」記号を表すエスケープシーケンス(¥t)
を使用し、以下例のように氏名、学籍番号、学
部を出力するプログラムを記述せよ。
氏名
山元進
学籍番号 c0110999
学部
コンピュータサイエンス学部

文字列の開始位置 \t でそろえること!!
提出は 課題2 のみ
 課題2 の class 名は Report2 とせよ



必然的に、ファイル名も決まる
時間内にTA の許可を受けること

許可のない提出は未提出と同じ扱い