はじめに
おはようございます。今日でいよいよお正月も終わりですね。
皆さんはゆっくり出来ましたか?
私は、スラムダンクを一気見してました。
さて、今年からプログラミングがんばろ!と思っている人に
Javaの基礎構文を本買わなくても理解してもらえたらなと思いまして
Javaの文法について解説していきたいと思います。
本日紹介するのは、数多の文法があるうちの頻出と言われる
繰り返しと条件分岐についてメインで扱っていきたいと思います。
初めてなので、うまく解説できるか不安ですが
ぜひ最後まで良ければご覧ください。
Java基礎構文演習
解説はただ、文法の公式を載せて
「覚えてください!」
という教え方はしません。
というのも私自身、プログラミングの勉強中に感じた事なのですが
文法はわかったから活用の仕方を教えてくれ…!ってなりません?
なので、Atcoderの問題を利用しながら解説していき
実際に活用しているところから一緒に学んで頂けたらなと思います。
今回使う問題はこれ
https://atcoder.jp/contests/tenka1-2018-beginner/tasks/tenka1_2018_b
もしまだ、AtcoderやPaizaについて知らない人がいたら、過去記事で
紹介してるので見ていって下さい。
答えは先に見せます。
import java.util.*について
最初の1行目ですが、知らない人は「なんやこれ…」って感じですよね。
Javaには既に用意されている関数やクラスが存在します。
例えば日付を取得したり、配列を作ったり、キーボードから入力した文字列を
読み取ったりする便利なツールを既に頭のいい人たちが用意してくれているのです。
なのでこれを使わせてもらうためにimport文を使って、それらを全部使用出来る
ように宣言しています。
- import文は既に用意されているクラスやパッケージを利用するためのもの
Scannerについて
Scannerとはjavaで標準入力されたものを取得する際に使用します。
今回は問題の入力例1を見ると「5 4 2」とありますね。
この値をなんとかプログラムで取得して処理を実行し結果を出力したい。
それが今回の問題を解くにあたっての、ポイントとなります。
Scanner sc = new Scanner(System.in);
あるクラスから別のクラスを利用する場合、
まずはそのクラスのインスタンスを生成する必要があります。
Scannerクラスを呼び出し、その名前を「sc」と決めます。
これで、scという名前でScannerクラスに定義されている処理は使用できます。
今、私たちはmainクラスを作成しています。コードの3行目に
public class main{
public static void main(String[] args)throws Exception
とありますね。これはすごいザックリした説明をすると
mainクラスを作成中という事になります。
そのmainクラスの中で、別のクラス(今回はScannerクラス)を使用したい
場合にインスタンスを生成します。
//インスタンス生成方法
クラス名 変数名 = new クラス名();
ちなみにこうも簡単な記述でScannerクラスを利用できるのは
最初にimportしたからなんですね。
ね!便利でしょ!
- インスタンス生成時は クラス名 変数名 = new クラス名();で宣言する
- Scannerクラスは標準入力された文字を取得したい際に使用する
変数の宣言と型について
変数を宣言する際には
データ型 変数名;
で宣言できます。私が記述している文章は変数の宣言と代入を一緒に行っている
省略形です。
丁寧に書くなら、以下のように書きます。
int A;
A = sc.nextInt();
Aというのは変数名ですので、自分で名前を決めていますが
そのデータ型は何ですか?と言うのをちゃんと記述しなければいけません。
今回の入力例は数値なので、整数を意味するint型で宣言しています。
型名 | 意味 | 範囲 |
int | 整数 | -2147483648~2147483647 |
long | 倍長整数 | -9223372036854775808~ 9223372036854775807 |
double | 浮動小数点数 | 有効桁16桁 |
char | 文字型 | 16ビットのUnicode |
String | 文字型 | |
boolean | 論理型 | true /false |
このAという変数に先ほど生成したScannerクラスのnextメソッドを使って
値を代入します。
- データ型 変数名 で変数の宣言
- データ型は入力例にあったものを選んでね!
- 変数名=代入したい値
- 応用として データ型 変数名 = 代入したい値
繰り返しfor文について
次はfor文と言われる、指定した回数ずっとループするものを解説します。
(うまくできるかな……。)
for (初期化式; 条件式; 増分式){
//繰り返し実行する処理を書く
}
まずは初期化式の i=0 から説明すると今回問題の条件として
高橋君と青木君のクッキーの交換はK回行うと書いてあります。
つまりK回ループ分を回したいですね。Kが2であれば2回ループを回したいので
i = 0と宣言し、条件式を K < 2と記載します。Kが2未満の時にループは終了する
条件を意味するのです。
増分式にはどのような規則でiの数値を上げていくかを記載してあげます。
iは0で設定していますのでK回ループさせるには、1ずつ増加させていきたいです。
その時に使用するのがインクリメントと呼ばれる演算子です。
++i = i + 1
を意味します。
これでiがループするごとに1ずつ足され、i = K(K回ループ)で終了する
処理が記述出来た事になります。
- for文には開始と終了する時の条件を記述しよう
- 増減式はインクリメントを使って記載すると1ずつ増える事を表現できる
条件分岐のif文、if else文
今回使用しているのはif else文というif文にさらに不一致した際の処理を加えたものに
なります。
まずはif else文の基礎構文を記載します。
if (条件式) {
//条件を満たすときに実行したい処理を記載
}else {
//条件を満たさない時に実行したい処理を記載
}
今回の問題は1回目(i = 0)に高橋君が青木君にクッキーを渡して
次の2回目(i = 1)で青木君が高橋君にクッキーを渡します。
これを制御するための方針としてはiが偶数か、奇数かで処理を分けることが
出来そうですね。
i % 2 == 0
iを2で割った時の余りが0の時の条件式を表してます。
値+値 | 足し算 |
値ー値 | 引き算 |
値*値 | 掛け算 |
値/値 | 割り算(商を求める) |
値%値 | 割り算(余りを求める) |
数学でいうところのイコール=を表すときはjavaの世界では==で表記します。
B += A / 2;
ここの処理ではAを2で割った時の商をBに足すという事をしています。
演算記号 | 使い方 | 意味 |
+= | a += b | a = a + bと同じ意味 |
-= | a -= b | a = a – bと同じ意味 |
*= | a *= b | a = a * bと同じ意味 |
/= | a /=b | a = a / bと同じ意味 |
%= | a %= b | a = a % bと同じ意味 |
elseでは「i % 2 == 0」以外の時に
A += B / 2;を実行するように記載されており、青木君が高橋君に
クッキーを渡している様子を表しています。
- if else文を使って一致した時と不一致の時で処理を記述
- 複合代入演算子を活用して短く書こう
System.out.println
最後にやっと最後のパートに来ました。
答えを出力する部分です。
実行した処理の結果を出力する際にはSystem.out.printlnを使って表示します。
System.out.printl(表示させたいものを記述);
- System.out.println()で出力する事ができる
まとめ
いかがだっただろうか。
プログラミングの解説を初めてやったが、解説する際に前提となる知識がいる箇所があったので
そこをうまく説明するのが難しいと感じた。
Java構文はまだまだいっぱいあり、今回はほんの一部なので
また問題を使って解説していきたい。
コメント