第1回 プログラムの基本 - CreW 慶應義塾大学

第1回 プログラムの基本
他人が読めるプログラムを書く
学習目標

Javaプログラムを書き、動かせる


他人が読めるプログラムが書ける




コンパイルし、実行できる
インデントをつけることができる
適切な名前をつけることができる
適切なコメントをつけることができる
基本的なJava文法を説明できる



変数と代入について説明できる
出力する方法について説明できる
条件分岐のしくみを説明できる
1.1 Javaプログラム
を動かしてみましょう


1.1.1 基本的な流れ
1.1.2 実際に書いてみましょう






①JDKのインストール
②エディタを開く
③ソースコードを書く
④保存する
⑤コンパイルする
⑥実行する
1.1.1 基本的な流れ
コンパイル
ソースコード
人間が書く
プログラム(Java)
実行
バイトコード
コンピュータが
実行できる命令
1.1.2 実際に書いてみましょう

①JDKのインストール


テキストを参照
②エディタを開く

テキストを参照
③ソースコードを書く
例題1-1
(Example1_1.java)
public class Example1_1 {
public static void main(String[] args) {
System.out.println("自動販売機のサービスが開始されました");
}
}
Example1_1.java
同じ名前にすること
ファイル名の拡張子は.java
classって何?

クラスとは?(第4回から詳しくやります)



Javaにおけるプログラムの単位
Javaではすべてのプログラムはクラスに書か
れます。
ファイル名とクラス名は同じにします。
クラス
プログラム
クラス
クラス
クラス
プログラム
mainって何?

main()メソッドは、Javaのプログラムのス
タート地点です。各プログラムに必ず一つ
必要です。
main
クラス
クラス
クラス
プログラム
④保存する

場所に注意してください(整理しないと後で
わからなくなります)


objprogフォルダ(ディレクトリ)を作成します。
その中に毎回のフォルダを作成します。(今回
はobjprog01)
objprog
objprog01
Example1_1.java
objprog02
…
⑤コンパイルする
1.
2.
3.
objprog01ディレクトリ objprog01
に移動します。
コンパイルコマンド
「javac Example1_1.java」
を実行します。
Example1_1.class
ファイルができれば成功。
Example1_1.java
Example1_1.class
⑥実行する
1.
2.
実行コマンド
「java Example1_1」
を実行します。
「自動販売機のサービスが開始されまし
た」メッセージが表示されれば実行完
了!
1.2 自動販売機プログラミング

1.2.1 買うことのできる商品を提示する


①商品と種類
②商品種類を番号で扱う
1.2.1 買うことの
できる商品を提示する

商品のリストを提示するプログラム

商品を売るためには、取り扱う商品を提示す
る必要がある
①商品と種類

利用者が商品を選ぶときは、商品そのも
ので選ぶわけではなく、種類で選びます
コーラB
コーラA
コーラC
コーラ
コーラCを選ぶわけではない。コーラならどれでも良い
「商品」と「商品種類」

本講座では、実際の商品のことを「商品」、
種類のことを「商品種類」と呼びます
商品
商品種類
「商品種類」の表示を行う

買える商品を提示するプログラム
=商品種類のリストを提示するプログラム

しばらくはCUIで考えます。
「コーラ」は販売中です。
「ソーダ」は販売中です。
「緑茶」は販売中です。
GUI
CUI
②商品種類を番号で扱う

簡単にするために、しばらく商品種類は番
号だけで扱うことにします
1001
1003
1002
1004
1001番は販売中です。
1002番は販売中です。
1004番は販売中です。
1.3 他人が
読めるプログラムを書く

1.3.1 人が読めるプログラムとは?




①インデントが付けられている
②変数に適切な名前が付けられている
③コメントがかかれている
1.3.2 コメントの書法



①コメントとプログラムの目的
②目的の階層構造
③コメントの種類
1.3.1 他人が読める
プログラムとは?

他人が読めないプログラム
例題1-2
(Example1_2.java)
public class Example1_2 {
public static void main(String[] args) {
System.out.println("自動販売機のサービスが開始されました
int x;
x = 1001;
System.out.println(x+ "は販売中です。");
}
}
①インデントを付ける
例題1-2改①
(Example1_2.java)
public class Example1_2 {
public static void main(String[] args) {
System.out.println("自動販売機のサービスが開始されました");
int x;
x = 1001;
System.out.println(x+ “は販売中です。”);
}
}
インデント(1) ブロック

プログラム中で{}で囲まれた部分をブロッ
クといいます
public static void main{
…
for(int i=0;i<10;i++){
…
} ブロックの中のブロック
}
ブロック
インデント(2)

ブロックの中に書かれているコードを字下
げします(Tab1つ,またはspace2つ分)
ブロックに入るごと
に一つ字下げ
します。
public static void main{
…
for(int i=0;i<10;i++){
…
}
}
②適切な名前を付ける
int x;
x = 1001;
System.out.println(x+ “は販売中です。”);
xとは、取り扱う商品種類の番号のことですから
int itemType;
itemType = 1001;
System.out.println(itemType+ “は販売中です。”);
名前付け規則

Javaで使われる基本的な名前付け規則

クラス名



最初の文字は大文字にする。
(複数の単語を繋げた変数名の場合は、各単語の
最初の文字を大文字にする。)
ex) String,StringBuffer,House,MyHouse
変数名、メソッド名


最初の文字は小文字にする。
ex) name,myName,move(),getString()
適切な名前付けを
したプログラム
例題1-2改②
(Example1_2.java)
public class Example1_2 {
public static void main(String[] args) {
System.out.println("自動販売機のサービスが開始されました");
int itemType;
itemType = 1001;
System.out.println(itemType+ “は販売中です。”);
}
}
③コメントが書かれている

コンテクストが分からない他人が読めるように
する
//取り扱う商品種類を提示するプログラム
public class Example1_2 {
public static void main(String[] args) {
System.out.println(“自動販売機のサービスが開始されました”);
int itemType;
itemType = 1001;
System.out.println(itemType+ "は販売中です。");
}
}
Javaにおける
コメントの記述方法
/*
範囲指定コメント
*/
public class Example1_2 {
public static void main(String[] args) {
//行コメント
System.out.println(“自動販売機のサービスが開始されました”);
int itemType;//行コメント
itemType = 1001;
System.out.println(itemType+ "は販売中です。");
}
}
1.3.2 コメントの書法

コメントは内容が重要!

他人に分かるコメントとは?
①コメントとプログラムの目的

コメントをつけてみよう
public class Example1_2 {
public static void main(String[] args) {
//…
System.out.println(“自動販売機のサービスが開始されました”);
//…
int itemType;
//…
itemType = 1001;
//…
System.out.println(itemType+ "は販売中です。");
}
}
まずいコメント
何故まずいのか考えてみよう!
public class Example1_2 {
public static void main(String[] args) {
//「自動販売機が開始しました」を表示する
System.out.println(“自動販売機のサービスが開始されました”);
//int型のitemType変数を定義する
int itemType;
//itemType変数に1001を代入する
itemType = 1001;
//itemTypeを表示する
System.out.println(itemType+ "は販売中です。");
}
}
プログラムの解説はいらない
//itemType変数に1001を代入する
itemType = 1001;


itemType変数に1001を代入していること
は、プログラムを見れば明らか
これでは、何故この人は1001を代入してい
るのか、他人にわからない
すべてのプログラムには意味があるはず
コメントには目的を書け!
//取扱う商品種類にコーラを追加する
itemType = 1001;

適切なコメントを書くことによって、
itemType変数に1001を代入することは、取扱う
商品種類にコーラを追加するという意味があるこ
とが分かるようになる。
ソースコードだけでは、「コーラ=1001」だという
意味を理解できない。
プログラムの「目的」を書くようにする。
コメントには目的を書け!

改めて、コメントを考えてみよう
public class Example1_2 {
public static void main(String[] args) {
//…
System.out.println(“自動販売機のサービスが開始されました”);
//…
int itemType;
//取扱う商品種類にコーラを追加する
itemType = 1001;
//…
System.out.println(itemType+ "は販売中です。");
}
}
目的が書かれたコメント
public class Example1_2 {
public static void main(String[] args) {
//自動販売機の開始を知らせる
System.out.println(“自動販売機のサービスが開始されました”);
//取扱う商品種類を保存するための変数
int itemType;
//取扱う商品種類にコーラを追加する
itemType = 1001;
//取扱う商品種類を表示する
System.out.println(itemType+ "は販売中です。");
}
}
②目的の階層構造

だいぶ他人にも分かるようになったが、
全体として何をやっているのか分からない
public class Example1_2 {
public static void main(String[] args) {
//自動販売機の開始を知らせる
System.out.println(“自動販売機のサービスが開始されました”);
//取扱う商品種類を保存するための変数
int itemType;
//取扱う商品種類にコーラを追加する
itemType = 1001;
//取扱う商品種類を表示する
System.out.println(itemType+ "は販売中です。");
}
}
目的の目的を考える
//商品種類を保存するための変数
int itemType;

では、何故保存しておく必要があるのか?

その目的は?
取扱う商品種類を提示するため

その目的は?
商品を買ってもらうため
(自動販売機のプログラムだから)
目的の階層構造(1)

自動販売機のプログラム(商品を買う)
をするためには

取扱う商品種類を提示する




自動販売機の開始したことを知らせる
取扱う商品種類を保存する変数を定義する
取扱う商品種類にコーラを追加する
をするためには
取扱う商品種類を表示する
目的の階層構造(2)



取扱う商品種類を保存する変数を定義する
取扱う商品種類にコーラを追加する
取り扱う商品種類を
追加するために
変数を定義している
取扱う商品種類を追加する
 取り扱う商品種類を保存する変数を定義する
をするためには
 取り扱う商品種類にコーラを追加する
目的の階層構造を反映する
/**
* 自動販売機のプログラム
*/
public class Example1_2 {
大目的
/**
* 取扱う商品種類を提示する
*/
public static void main(String[] args) {
中目的
//自動販売機の開始を知らせる
System.out.println(“自動販売機のサービスが開始されました”);
//取り扱う商品種類を追加する
int itemType;//取扱う商品種類を保存するための変数
itemType = 1001;//取扱う商品種類にコーラを追加する
//取扱う商品種類を表示する
System.out.println(itemType+ “は販売中です。”);
}
}
小目的
③コメントの種類

目的の階層構造が反映されたコメントを書
くための指針



(1)見出し・コメント
(2)ブロック・コメント
(3)行・コメント
(1)見出し・コメント

プログラムの一番初めに書くコメント


大目的を書く


Javaでは、class宣言の前に書く
そもそもこのプロ
グラムは何のため
に書いたのか
日付や、作成者
なども入れるとよい
/**
* 自動販売機のプログラム
*
* 平成xx年xx月xx日 作成者:○○
*/
public class Example1_2 {
…
}
××
(2)ブロック・コメント


ブロックの最初に書くコメント
ブロック全体に対する目的を書く

中目的を書く
/**
* 取扱う商品種類を提示する
*/
public static void main(String[] args) {
//自動販売機の開始を知らせる
System.out.println(“自動販売機のサービスが開始されました”);
}
ブロック
(意味のカタマリ)を表現する
/**
* 自動販売機のプログラム
*/
public class Example1_2 {
/**
* 取扱う商品種類を提示する
*/
public static void main(String[] args) {
//自動販売機の開始を知らせる
System.out.println(“自動販売機のサービスが開始されました”);
//取り扱う商品種類を追加する
int itemType;//取扱う商品種類を保存するための変数
itemType = 1001;//取扱う商品種類にコーラを追加する
//取扱う商品種類を表示する
System.out.println(itemType+ “は販売中です。”);
}
}
改行を利用して
ブロック(意味のカタマリ)
を表現する
(3)行・コメント

行の最後に書くコメント

その行に対して、小目的を書く
int itemType; //取扱う商品種類を保存するための変数
プログラムの後に書く
//取扱う商品種類を追加する
itemType01 = 1001;//コーラ
itemType02 = 1022;//ソーダ
ブロック・コメントとの
連携
練習問題

ソースコードを美しく、他人が読めるように
class Practice1_1 {
せよ public
public static void main(String args[]){
int a = 49;
int b = 73;
int c = 100;
int d = 45;
int e = 25;
double x = a + b + c + d + e;
double y = x / 5.0;
y = y * 10;
if((y % 10) >= 5){
y = y + 10;
}
int z = (int)(y / 10);
System.out.println(z);
}
}
解答例
/*
* 中間テストの成績を計算するプログラム
*/
public class Practice1_1 {
/**
* 5教科の平均を求めるプログラム
*/
public static void main(String args[]){
//各教科を保存する変数に、点数を代入する
int kokugo = 49;
//国語
int suugaku = 73;
//数学
int rika = 100;
//理科
int syakai = 45;
//社会
int eigo = 25;
//英語
//5教科の平均を求め、heikin変数に保存する
double goukei = kokugo + suugaku + rika + syakai + eigo;
double heikin = goukei / 5.0;
//平均を四捨五入し、answer変数に保存する
heikin = heikin * 10;
if((heikin % 10) >= 5){
heikin = heikin + 10;
}
int answer = (int)(heikin / 10);
//四捨五入された平均を提示する
System.out.println(answer);
}
}
1.4 たくさんの商品種類を扱う

1.4.1 変数を用意する



1.4.2 条件分岐を使う


Javaの文法-変数と代入-
Javaの文法-標準出力-
Javaの文法-条件分岐-
1.4.3 さまざまな条件式

Javaの文法-条件式-
1.4.1 変数を用意する

簡単に10個の変数として扱う方法
例題1-3
(Example1_3.java)
//取扱う商品種類を保存するための変数を定義する
int itemType01;
int itemType02;
int itemType03;
int itemType04;
int itemType05;
…
初期化する

商品種類が入っていないことを「-1」として
表現することにします

コメントに意味を書いておかないと、他人に分
からなくなりますよ
//取扱う商品種類を保存するための変数を初期化する
//入っていないことを-1として表す
itemType01 = -1;
itemType02 = -1;
itemType03 = -1;
itemType04 = -1;
…
Javaの文法①ー変数と代入ー
変数の宣言
//取扱う商品種類を保存するための変数を宣言する
int itemType;
itemType
変数への代入
//取扱う商品種類にコーラを追加する
itemType = 1001;
1001
itemType
Javaの文法①-変数と代入ー

Javaでは、宣言と代入を同時にできます。
//取扱う商品種類を保存するための変数を宣言し、コーラを追加する
int itemType = 1001;
1001
itemType
Javaの文法②ー標準出力ー

文字列を出力するには
System.out.println([文字列])
文字列リテラルは
「“」「”」で囲む
//自動販売機の開始を知らせる
System.out.println(“自動販売機のサービスが開始されました”);

変数もそのまま出力できます
System.out.println([変数])
//取扱う商品種類を表示する
System.out.println(itemType+ “は販売中です。”);
文字列とつなげる時
は、「+」でつなげる
追加と表示のプログラム
//取扱う商品種類を追加する
itemType01 = 1001;//コーラ
itemType02 = 1022;//ソーダ
itemType03 = 1033;//お茶
例題1-3
(Example1_3.java)
//取扱う商品種類を表示する
System.out.println(itemType01+"は販売中です");
System.out.println(itemType02+"は販売中です");
System.out.println(itemType03+"は販売中です");
System.out.println(itemType04+"は販売中です");
System.out.println(itemType05+"は販売中です");
例題1-3の問題点

このプログラムには問題があります

出力結果を考えてみよう!
出力結果
1000番の商品種類は現在取り扱い中です。
1001番の商品種類は現在取り扱い中です。
1002番の商品種類は現在取り扱い中です。
-1番の商品種類は現在取り扱い中です。
-1番の商品種類は現在取り扱い中です。
…
-1は表示したく
ありません。
1.4.2 条件分岐を使う

入っていないときは出力しないように修正
例題1-4
(Example1_4.java)
//取扱う商品種類を表示する
if(itemType01 == -1){//入ってない
//何もしない
}else{//入っている
System.out.println(itemType01+"は販売中です");
}
Javaの文法③-条件分岐ー
条件式
if(itemType01 == -1){
成立(true)のときはここを実行
}else{
不成立(false)のときはここを実行
}
1.4.3 さまざまな条件式

条件式を工夫することによって、
より目的に近いプログラムに
//取扱う商品種類を表示する
例題1-4
(Example1_4.java)
if(itemType01 == -1){//入ってない
//何もしない
}else{//入っている
System.out.println(itemType01+"は販売中です");
}
例題1-5
(Example1_5.java)
//取扱う商品種類を表示する
if(itemType01 != -1){//入っている
System.out.println(itemType01+"は販売中です");
}
Javaの文法④ー条件式ー(1)
int i=100;
if(i == 100)
true
boolean b=true;
if(b == true)
int i=50;
if(i == 100)
false
boolean b=true;
if(b == false)
int i=100;
if(i != 100)
boolean b=true;
if(b != false)
int i=100;
if(i > 100)
boolean b=true;
if(b)
int i=100;
if(i >= 100)
boolean b=false;
if(b)
条件式(1)答え
int i=100;
if(i == 100)
true
boolean b=true;
if(b == true)
true
int i=50;
if(i == 100)
false
boolean b=true;
if(b == false)
false
int i=100;
if(i != 100)
false
boolean b=true;
if(b != false)
true
int i=100;
if(i > 100)
false
boolean b=true;
if(b)
true
int i=100;
if(i >= 100)
true
boolean b=false;
if(b)
false
Javaの文法④ー条件式ー(2)
boolean b1=true; boolean b2 = false;
if(b1 == true && b2 == false)
boolean b1=true; boolean b2 = false;
if(b1 == true || b2 == true)
boolean b1=true; boolean b2 = false;
if(b1 && b2)
boolean b1=true; boolean b2 = false;
if(b1 || b2)
boolean b1=false; boolean b2 = false;
if(b1 || b2)
条件式(2)答え
boolean b1=true; boolean b2 = false;
if(b1 == true && b2 == false)
true
boolean b1=true; boolean b2 = false;
if(b1 == true || b2 == true)
true
boolean b1=true; boolean b2 = false;
if(b1 && b2)
false
boolean b1=true; boolean b2 = false;
if(b1 || b2)
true
boolean b1=false; boolean b2 = false;
if(b1 || b2)
false