条件分岐
Markdownでテーブル使ってみた。rowspan的なシンタックスは今のところないっぽい。
種類 | 制御文 |
---|---|
条件分岐 | if, switch |
繰り返し | for, while, do-while |
繰り返し制御 | break, continue |
例外 | try-catch |
演算子
関係演算子 : <, >, ==, <=, >=, !=。
以下は関係演算子のサンプル。
public class IfTest {
public static void main(String[] args) {
int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);
if (a > b) {
System.out.println(args[0] + "は" + args[1] + "より大きい");
}
else if (a < b) {
System.out.println(args[0] + "は" + args[1] + "より小さい");
}
if (a >= b) {
System.out.println(args[0] + "は" + args[1] + "以上である");
}
else if (a < b) {
System.out.println(args[0] + "は" + args[1] + "以下である");
}
if (a == b) {
System.out.println(args[0] + "は" + args[1] + "と等しい");
}
}
}
条件演算子
//<条件式> ? <trueのときの結果> : <falseのときの結果> ;`
System.out.println(score > 50 ? "合格です" : "不合格です");
switch、if文
他言語で理解しているのでノートはしない。
以下は入力値の判定。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class InputIf {
public static void main(String[] args) {
System.out.println("数値を入力してください。");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try{
String str = reader.readLine();
int i = Integer.parseInt(str);
/*
if(i > 100){
System.out.println("入力した値" + i + "は100より大きいです。" );
}else{
System.out.println("入力した値" + i + "は100より小さいです。" );
}
*/
//三項演算子(条件演算子)を使ってみる
System.out.println(i > 100 ? "入力した値" + i + "は100より大きいです。" : "入力した値" + i + "は100と同じか小さいです。");
}
catch(IOException e){
System.out.println("エラーです。");
}
catch(NumberFormatException e){
System.out.println("数値を入力してください。");
}
}
}
論理演算子
用例 | |
---|---|
&& または & | 論理積 |
ll または l | 論理和 |
^ | 排他的論理和 |
! | 論理否定 |
問題
BMIを計算するプログラムの発展形を書きなさい。
BMI値 | 判定結果 |
---|---|
18.5未満 | やせ |
18.5以上 - 25未満 | 標準 |
25以上 - 30未満 | 肥満 |
30以上 | 高度肥満 |
public class BMISample {
public static void main(String[] args) {
//身長、体重を実行時引数で渡す、変数に代入
double height = Double.parseDouble(args[0]);
double weight = Double.parseDouble(args[1]);
//身長をcmからmに変換
height /= 100;
//BMI値を計算
double bmi = weight / (Math.pow(height , 2));
System.out.println("bmi = " + bmi);
if(bmi < 18.5){
System.out.println("やせ");
}else if(bmi < 25){
System.out.println("標準");
}else if(bmi < 30){
System.out.println("肥満");
}else{
System.out.println("高度肥満");
}
}
}
ProcessingとJava
ちょっと頭の休憩的に、JavaとProcessingについて調べて、サンプルコード書き換えたりしてみた。
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
public class JavaProcessing extends Applet{
public void paint(Graphics g){
g.setColor(Color.white);
g.fillRect(0, 0, 200, 200);
g.setColor(Color.black);
g.drawLine(0, 0, 200, 200);
g.drawLine(200, 0, 0, 200);
g.drawOval(25, 25, 150, 150);
}
}
その他
Eclipseのコード自動整形はctrl + i。
ctrl + shift + fでも整形されるっぽい。違いは後で調べる。
『 Eclipseショートカットキーまとめ - wyukawa’s blog』
Markdown用のリンク作成ブックマークレット作ってみた
ウェブページ参照しながらMarkdownでリンク記述するの面倒臭かったので、ブックマークレットを作成してみた。Chromeあたりでブックマークバーを右クリック→ページを追加→名前は適当に、URLのところに下記コードを改行なしで入力する。
javascript:var url=location.href.split('?rt=na')[0].split('?PSID=')[0].split('?P=')[0].split('?f=topic')[0].split('summary.html?rss')[0].split('&feature')[0].split('&eurl')[0].split('?feedType')[0].split('?vos')[0].split('?utm_')[0].split('index.html')[0].split('?intcid')[0].split('?_c=feed-rss')[0].split('?cid=')[0].split('?FM=')[0].split('&from=')[0].split('?from=')[0].split('?L=rss')[0].split('&lindID')[0].split('?rss')[0].split('?ref=')[0].split('&ref=')[0].split('?set=')[0].split('?ST=')[0].split('&ST=')[0].split('?mail')[0].split('?AAA')[0];var title=document.title;var linkTag ='['+title+']'+'('+url+')';var x = prompt('文字列をコピー',linkTag);
トークン
ソースコードの単語、記号のことをトークンと言う。
進数
10進数 : 普段使ってる表記方法
2進数 : 0と1を使って記述する
8進数 : 0-7の値を使って記述する
16進数 : 0-9,A-Fを使って記述する
よくわからないけどNetBeansで関数操作のリファクタリングを実行してみた
はてぶにJavaの記事がホッテントリに入ってたので読んでみた。
「そろそろJavaみなおしてもええんやで」というプレゼンしてきた - きしだのはてな
for(int num : nums){
if(num > 10) continue;
sum += num * 2;
}
コード自体の意味がわかってない状態で、上記コードを実行しようとしてみた。初起動のNetBeans 8.0で新規プロジェクトを作成して、コードコピペしてメニューからリファクタリングしようとしてみたが、なんだか関数操作がでない、というか項目としてない。途方に暮れながらマウスを右往左往させてしていると、行番号のあたりのところで、警告表示が出てるようなので、読んでみるとsumが(numsも)宣言されてないよ、ということらしいので、for文の上で宣言して、関数操作を実行してみた。
すると、該当警告部分をクリックして「関数操作の使用」を選ぶと、以下のように書き換えられた。
sum = nums.stream().filter((num) -> !(num > 10)).map((num) -> num * 2).reduce(sum, Integer::sum);
ちょっと何言ってるかわからない。ので一旦放置して、変換前のコードを読んでみる。
for(int num : nums){...}
に関してはJavaお決まりの配列のループ処理の書き方っぽい。
わかってる人にはスコープ外の変数もあることが前提で不要なんだろうけど、わかってないのでコメント含めて書いてみる。
int[] nums = {1, 4, 9, 16, 25}; //nの2乗の配列
int sum = 0; //合計値
for(int num : nums){
if(num > 10) continue; //num10より大きいとき処理をスキップ
sum += num * 2; //sumに numの2倍を加算
}
System.out.println(sum); //コンソールに出力=>28
でも
int[] nums = {1, 4, 9, 16, 25}; //nの2乗の配列
int sum = nums.stream().filter((num) -> !(num > 10)).map((num) -> num * 2).reduce(sum, Integer::sum);
System.out.println(sum); //コンソールに出力=>28
と書いて実行すると、エラーが表示されてしまう。
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - Erroneous sym type: Array.stream.filter.map.reduce at javaapplication1.JavaApplication1.main(JavaApplication1.java:21)
filter(),stream(),map(),reduce()のメソッドの意味を調べると、
- stream() : JDK1.8で採用。
- filter() :
- map() :
- reduce() :
っと、途中でタイムアップ。明日以降調べます。
買った本届いてた。