顯示具有 java範例 標籤的文章。 顯示所有文章
顯示具有 java範例 標籤的文章。 顯示所有文章

2010年1月19日 星期二

Here Document與Java程式的搭配使用

這幾天一直百思不得其解,從前利用Here Document來傳值給C++/Fortran程式都能夠輕易完成;昨天寫了一個小小的轉換格式的程式想搭配shell script完成任務卻出現了NoSuchElementException 的尷尬問題,怎麼嘗試都不成功。

所謂Here Document,意思就是在子process裡傳入參數。在父process還在運行的時候,預先把參數值寫好,等到運行到子process的時候,不必等待使用者提示即可傳值。舉個例子:

假設someprog是一個C++/Fortran程式,過程中會提示,輸入兩個字串兩個數值:

#!/bin/sh
/usr/local/bin/someprog << END
vespa.env.out
vespa.ent.OUT
23.5
2.0
END

這種在script裡就先把要傳入的參數先寫好的方法,便是常被使用的Here Document。然而,今天我也寫了一個落落長的java互動式程式,卻拋出了NoSuchElementException 的例外。為了檢查到底是哪裡出問題,我寫了一個更簡單的程式來代替:

假設這個程式稱為TestString:

import java.util.*;

public class TestString{
  public static void main(String[] args){
    System.out.println("1st enter:");
    String tmpstr = new Scanner(System.in).nextLine();

    System.out.println("1st enter is "+tmpstr+". Now enter 2nd :");
    tmpstr = new Scanner(System.in).nextLine();

    System.out.println("2nd enter is "+tmpstr);
 }
}

編譯他並包成jar檔:
jar -cmvf menifest.mf TestString.class
當然,你的menifest.mf在預設套件的情況下可能會長這樣:
Main-Class: TestString

由於java程式是byte-code而非native-code,因此需要jvm去驗證並啟動他;想要模擬C++程式直接呼叫binary這樣的方法,只需要一個小小的script來解決:首先建立一個跟java程式同檔名的文字檔,以此例即為TestString,其內容如下:

#!/bin/bash
#Program TestString
[ -e `which java` ] && java -jar /home/maxsolar/bin/TestString.jar

exit 0;

當然別忘記把這個script加上可執行屬性,並放在你的PATH範圍裡。
執行以下的script來試試看!

#!/bin/bash
TestString << END
string1
string2
END

結果卻出現了下列錯誤訊息:
1st enter:
1st enter is string1. Now enter 2nd :
Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.util.Scanner.nextLine(Scanner.java:1516)
    at TestString.main(TestString.java: 9)

對還不太能掌握java的我,實在不清楚究竟是為了麼值會傳不進去。困擾我一整天之後,決定到台灣最大的JavaWorld@TW論壇去爬文,卻沒有跟我的情況有類似的問題。後來在版上發問,沒想到很快的就有高手來解決我的問題:

Scanner 在某些操作上會有 buffering 的行為,如果要透過 Scanner 來處理 standard input 裡的數據,應只使用一個 Scanner instance。

import java.util.*;
public class TestString {

    public static void main(String[] args) {
        System.out.println("1st enter:");
        final Scanner scanner = new Scanner(System.in);
        String tmpstr = scanner.nextLine();

        System.out.println("1st enter is " + tmpstr + ". Now enter 2nd :");
        tmpstr = scanner.nextLine();

        System.out.println("2nd enter is " + tmpstr);
    }
}

如此一來,我使用的Scanner物件將會是唯一。先前我所使用的是anonymous的方法產生物件並直接傳到tmpstr這個字串物件接收,但是根據Dunkan前輩的建議,要使用一個唯一的Scanner物件來接收我的標準輸入,才能擺脫被buffered在記憶體的問題。

非常感謝Dunkan前輩精確且迅速的解答,因此把這篇作成筆記,好讓自己跟需要的Java與linux同好可以有機會參考。

參考連結:
[請益]shell script呼叫java程式並傳入值的問題

2009年2月12日 星期四

Java小練習(16)--關於字串

題目要求: 撰寫一個名為Dog的class,並使其含有兩個公開的String : name以及says。在main()中分產生兩個Dog的物件,並將其命名為"spot",says值為"Ruff!"、以及"scruff",says值為"Wuff!"。印出他們的name以及says。 接著產生Dog的reference並且將他指派到表示spot的物件,分別使用"=="以及".equels()"來比降所有的reference。 ------------- code starts ------------------
public class Dog {

   public String name;
   public String says;

   public static void main(String[] args) {
       Dog d1 = new Dog();
       d1.name = "spot";
       d1.says = "Ruff!";

       Dog d2 = new Dog();
       d2.name = "scruffy";
       d2.says = "Wurf!";

       System.out.println("第1隻狗叫" + d1.name + ";而且他說:" + d1.says);
       System.out.println("第2隻狗叫" + d2.name + ";而且他說:" + d2.says);
       System.out.println("----------");

       System.out.println("把第2隻狗的名字指定給第1隻狗");
       d1.name = d2.name;
       System.out.println("第1隻狗叫" +d1.name);
       System.out.println("第2隻狗叫" +d2.name);
       System.out.println("兩隻狗物件的位置是否相同:" +(d1 == d2));
       System.out.println("兩隻狗名字的位置是否相同:"+(d1.name == d2.name));
       System.out.println("兩隻狗名字的內容是否相同:"+(d1.name).equals(d2.name));
       System.out.println("兩隻狗說話的內容是否相同:"+(d1.says).equals(d2.says));
       System.out.println("--------------------------");

       System.out.println("把第2隻狗整個物件指定給第1隻狗");
       d1 = d2;
       System.out.println("第1隻狗叫" +d1.name);
       System.out.println("第2隻狗叫" +d2.name);
       System.out.println("兩隻狗物件的位置是否相同:" +(d1 == d2));
       System.out.println("兩隻狗名字的位置是否相同:"+(d1.name == d2.name));
       System.out.println("兩隻狗名字的內容是否相同:"+(d1.name).equals(d2.name));
       System.out.println("兩隻狗說話的內容是否相同:"+(d1.says).equals(d2.says));

   }
}
------------- code ends ------------------ 雖然java傳值的方式是pass-by-value,對於基本型別來說容易理解,對於類別型別來說感覺上卻是pass-by-references。 不過我們可以這樣理解:java物件的pass-by-value是指記憶體的參考位置的值,所以傳遞的是reference的位置的值。很多程式設計師都說java的pass-by-value是強詞奪理,不過我們就聽聽吧!

2009年2月10日 星期二

Java小練習(15)--break與continue練習

break與continue搭配label來控制迴圈是很有趣的方法,我經常用他來判斷自己的想法正不正確。 我作一個巢狀迴圈,外迴圈跑6次,內迴圈跑4次,加入continue跟break來看看會發生甚麼有趣的事情。 --------- example 1 -----------
public class LoopTest {

  public static void main(String[] args) {
      byte i, j;

      L1:
      for (i = 1; i <= 6; i++) {             System.out.print("i=" + i);             System.out.print("\t");             continue L1;
          L2:
          for (j = 1; j <= 4; j++) {                 System.out.print("j=" + j);                 System.out.print("\t");              }             System.out.println();         }     } }
--------- example 1 ends ----------- continue放在第一層for迴圈的結果,會導致L2完全沒機會被執行到,執行結果是:
i=1        i=2        i=3        i=4        i=5        i=6
--------- example 2 ---------
public class LoopTest {

  public static void main(String[] args) {
      byte i, j;

      L1:
      for (i = 1; i <= 6; i++) {             System.out.print("i=" + i);             System.out.print("\t");             break L1;
          L2:
          for (j = 1; j <= 4; j++) {                 System.out.print("j=" + j);                 System.out.print("\t");              }             System.out.println();         }     } }
--------- example 2 ends --------- break放在第一層for迴圈的結果,會導致L2完全沒機會被執行到,執行結果是:
i=1
然而我們無法在這個地方放置break L2或continue L2,她會顯示找不到L2個標籤。 --------- example 3 ---------
public class LoopTest {

  public static void main(String[] args) {
      byte i, j;

      L1:
      for (i = 1; i <= 6; i++) {             System.out.print("i=" + i);             System.out.print("\t");              L2:             for (j = 1; j <= 4; j++) {                 System.out.print("j=" + j);                 System.out.print("\t");                 continue L2;
          }
          System.out.println();
      }
  }
}
--------- example 3 ends ---------
i=1        j=1        j=2        j=3        j=4     
i=2        j=1        j=2        j=3        j=4     
i=3        j=1        j=2        j=3        j=4     
i=4        j=1        j=2        j=3        j=4     
i=5        j=1        j=2        j=3        j=4     
i=6        j=1        j=2        j=3        j=4  
跑出來的結果可想而知,會跟沒有continue是一樣的,因為她本來就會重複作。 那麼如果是continue L1會如何呢? --------- example 4 ----------
public class LoopTest {

  public static void main(String[] args) {
      byte i, j;

      L1:
      for (i = 1; i <= 6; i++) {             System.out.print("i=" + i);             System.out.print("\t");              L2:             for (j = 1; j <= 4; j++) {                 System.out.print("j=" + j);                 System.out.println("\t"); //換行以方便顯示
              continue L1;
          }
          System.out.println();
      }
  }
}
--------- example 4 ends ---------
i=1        j=1     
i=2        j=1     
i=3        j=1     
i=4        j=1     
i=5        j=1     
i=6        j=1
內迴圈作一次之後沒機會作第二次就跑到外迴圈了,所以苦命的內迴圈用永都只能作第一次。 --------- example 5 ---------
public class LoopTest {

  public static void main(String[] args) {
      byte i, j;

      L1:
      for (i = 1; i <= 6; i++) {             System.out.print("i=" + i);             System.out.print("\t");              L2:             for (j = 1; j <= 4; j++) {                 System.out.print("j=" + j);                 System.out.print("\t");                 break L2;
          }
          System.out.println();
      }
  }
}
--------- example 5 ends --------- break會脫離所標示的迴圈:即內迴圈,因此內迴圈永遠只能作一次。example 4跟5是一樣的結局。
i=1        j=1     
i=2        j=1     
i=3        j=1     
i=4        j=1     
i=5        j=1     
i=6        j=1
--------- example 6 ---------
public class LoopTest {

  public static void main(String[] args) {
      byte i, j;

      L1:
      for (i = 1; i <= 6; i++) {             System.out.print("i=" + i);             System.out.print("\t");              L2:             for (j = 1; j <= 4; j++) {                 System.out.print("j=" + j);                 System.out.print("\t");                 break L1;
          }
          System.out.println();
      }
  }
}
--------- example 6 ends --------- break會跳離標籤所示的迴圈:即外迴圈,因此只做一次就結束了。
i=1        j=1
很好玩吧!

Java小練習(14)--二維陣列

從練習13,我們作一個轉換:請印出下列表格:
28916981251
324196100364
361225121499
4002561446416
可以發現這是練習13順時針旋轉90度。但是我們從1~400給值必須從 [0][4]->[1][4]->[2][4]->[3][4]->換列 [0][3]->[1][3]->[2][3]->[3][3]->換列 [0][2]->[1][2]->[2][2]->[3][2]->換列 [0][1]->[1][1]->[2][1]->[3][1]->換列 [0][0]->[1][0]->[2][0]->[3][0]-> end 值給定之後,就可以依序列印。 ------------ code starts --------------------------
public class ArrayAssign2 {

    public static void main(String[] args) {
        int[][] bb = new int[4][5]; //建立一個4x5陣列

        int num = 1;
        for (int col = bb[0].length - 1; col >= 0; col--) {
            for (int row = 0; row < bb.length; row++) {
                bb[row][col] = (int) Math.pow(num, 2);
                num++;
            }
        }
        for (int row = 0; row < bb.length; row++) {
            for (int col = 0; col < bb[0].length; col++) {
                System.out.print(bb[row][col]);
                System.out.print("\t");
            }
            System.out.println();
        }

    }
}
------------------- code ends ---------------------------------------

Java小練習(13)--二維陣列

利用迴圈印出如下的排列:
12916
25364964
81100121144
169196225256
289324361400
由上表可以觀察出每個數字分別是由陣列[0][0]到[4][3]依序填入1~20的平方。只要我們能依序填入1~20,就有辦法填入他們的平方。 -------------- code starts -----------------------
public class ArrayAssign1 {

    public static void main(String[] args) {
        int[][] aa = new int[5][4]; //建立一個5x4陣列

        int num = 1;
        for (int r = 0; r < aa.length; r++) {
            for (int c = 0; c < aa[0].length; c++) {
                //利用兩個for迴圈把值一個一個塞進去
                //再利用Math.pow()來作平方計算
                aa[r][c] = (int)Math.pow(num, 2);
                System.out.print(aa[r][c]);
                System.out.print("\t");
                num++;
            }
            System.out.println();
        }
    }
}
------------------ code ends --------------------------

2009年2月9日 星期一

Java小練習(12)--二維陣列

根據Java小練習(11),我們用兩個一維陣列來完成。如果我們把程式碼改寫成一個二維陣列,寫法會比較靈活!
public class ArrayTest3 {

    public static void main(String[] args) {
        //data[月份][銷售業績],12x2的陣列
        int[][] data = { {1, 16}, {2, 15}, {3, 13}, {4, 11}, {5, 10}, {6, 10},
                                {7, 8}, {8, 7}, {9, 4}, {10, 3}, {11, 1}, {12, 0} };

        System.out.println("Microsoft vista九十七年度銷售業績");
        System.out.println("月份\t業績");
        System.out.println("---------------------------------");

        for (int m = 0; m < data.length; m++) {//列印月份
            System.out.print("data[m][0]");
            System.out.print("\t");
            for (int star =1; star<=data[m][1]; star++){//列印業績的*號
                System.out.print("*");
            }
            System.out.println(); //*號印完換列
        }
        //for 迴圈結束,列印總數
        System.out.println("----------------------------------");
        int sum = 0;
        for (int i=0; i< data.length; i++){
            sum += data[i][1];
        }
        System.out.println("the total is:" +sum+"萬元");
    }
}

Java小練習(11)

題目要求:印出如下表格:
Microsoft vista九十七年度銷售業績
    月份     業績
    ------  ------------------------------------------
    1
    2         ********
    3         *******
    4         *************
    5         *********
    6         ************
    7         **********
    8         ********
    9         **************
    10        *************
    11        **************
    12        ***************
   ----------------------------------------------------
    銷售金額:??百萬元
-------- code starts ---------
public class ArrayTest2 {

    public static void main(String[] args) {
        //month ->代表月份
        int[] month = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
        //data     ->代表銷售業績金額
        int[] data = {16, 15, 13, 11, 10, 10, 8, 7, 4, 3, 1, 0};

        System.out.println("Microsoft vista九十七年度銷售業績");
        System.out.println("月份\t業績");
        System.out.println("---------------------------------");
        //印出月份與業績
        for (int i = 0; i < month.length; i++) {
            System.out.print(month[i]);
            System.out.print("\t");
            //以下為列出*的迴圈,印初次數為data[i]
            for (int j = 1; j <= data[i]; j++) {
                System.out.print("*");
            }
            System.out.println();
        }

        System.out.println("----------------------------------");
        int sum = 0;
        for (int k = 0; k < data.length; k++) {
            sum = data[k] + sum;
        }
        System.out.println("總金額:" + sum + "百萬元");
    }
}

2009年2月8日 星期日

Java小練習(10) -- 亂數小練習

題目要求1:產生六個相鄰兩數不重複的亂數,亂數值介於1~100之間,並印出來。 想法:相鄰兩數不重複,可以用if作判斷;作六次可以用while來控制。
public class RandomTest {

    public static void main(String[] args) {
        byte temp = 0;
        byte count = 0;
        RandomTest ob1 = new RandomTest();
        temp = ob1.getRandom();
        count++;
        System.out.println("第" + count + "次的亂數值為" + temp);

        label:
        while (count < 6) {
            byte _temp = ob1.getRandom();
            if (_temp != temp) {
                temp = _temp;
                count++;
                System.out.println("第" + count + "次的亂數值為" + temp);
                continue label; //再回去取下一個亂數值。
            } else {
                continue label; //甚麼也不做,再取一次。
            }
        }

    }

    //取1-100之間的亂數方法
    public byte getRandom() {
        return ((byte) (Math.random() * 8 + 1));
    }
}
題目要求2: 改進要求1,取六個亂數,但這六個亂數絕對不能重複。 想法:
先做一個100個空間的陣列,依序放1-100
再依序由此陣列提取亂數6次。
提取陣列後便將該欄位清空為零,
從此陣列提取數值時,為零的就不提取,以保證不會重複。
public class ArrayTest1 {

    public static void main(String[] args) {
        int[] data = new int[100]; //作一個100個空間的整數陣列
        for (int i = 0; i < data.length; i++ ) {//依序放1-100
            data[i] = i + 1;
        }
        int count = 0; //用計數器取六次
        while (count != 6) {
            //作一個0~99的亂數當成陣列索引值。
            int random = (int) ( Math.random()*100 ); 
            //取出後就把該值設為0,遇到0就不取值。
            if (data[random] != 0) {
                System.out.println(data[random]);
                data[random] = 0;
                count++;
            }
        }
    }
} 

2009年1月14日 星期三

Java小練習(9)

本程式要作一個猜數字的遊戲 作法及提示: 1. 請使用 Math.random() 產生介於 1 ~ 50 之間亂數值 2. 接受玩家輸入值之後進行判斷 3. 提示比較後的值是過大還是過小 執行後類似: 輸入介於 1 ~ 50 之間亂數: 26 數字太小、請增加 輸入介於 1 ~ 50 之間亂數: 40 數字太大、請減少 輸入介於 1 ~ 50 之間亂數: 35 數字太小、請增加 輸入介於 1 ~ 50 之間亂數: 37 恭禧您猜對了! ##### source code starts #############################
import java.util.*;
public class Lab_8 {
    public static void main(String[] args) {
        Scanner keyin = new Scanner(System.in);
        byte number = 0;//初始值
        byte RANDOM = (byte)(Math.random()*49+1);
        //Math.random()會產生0~1之間的亂數
        System.out.println(RANDOM);
        byte count = 5;


        System.out.println("請輸入1~50之間的整數:");
        System.out.println("您只有5次機會:");
        number = keyin.nextByte();

        do{
            if(number > RANDOM){
                System.out.println("再小一點!");
                --count;
                System.out.println("你還有"+count+"次機會");
                number = keyin.nextByte();
            }else if(number < RANDOM){
                System.out.println("再大一點!");
                --count;
                System.out.println("你還有"+count+"次機會"); 
                number = keyin.nextByte();
            }
        }while( number != RANDOM && count > 1);  
  
        if (number != RANDOM){
            System.out.println("你太遜啦!");
        }else{
            --count;
            System.out.println("你還有"+count+"次機會"); 
            System.out.println("你真厲害!");        
        }
    }
}
##### source code ends ###############################

Java小練習(8)

本程式需要取出一字串內的某些文字。 取出"台南資訊展98年1月8日至13日" 將數字提取出來,不要文字。 #######source code starts ######################
public class Test5 {
    public static void main(String args[]){
        String message = "台南資訊展98年1月8日至13日";
        int index=0;

//       while ( index < message.length()) { 
//取得字串長度( 用length() )
//          if( (int)message.charAt(index) >=48 &&  (int)message.charAt(index) <=57 ){
//               System.out.print(message.charAt(index));//charAt()取得第x個字元,由0開始。
//          }
//           index++;
//       }

        for (index =0 ; index< message.length(); index++){
               if( (int)message.charAt(index) >=48 &&  
                                      (int)message.charAt(index) <=57 ){
               System.out.print(message.charAt(index));
               }
        }
        System.out.println("");
    }
}
由於我不太會改blogspot的template,超過頁面的部份請點html原始碼起來看吧!

Java小練習(7)

輸入西元年及月份求當月天數為何? 潤月規則: A. 年可以被 4 整除但不得同時被 100 整除者 OR B. 年可以單獨被 400 整除者 輸出結果類似: 西元 2004 年 2 月 => 29天 西元 2005 年 12 月 => 31天 ######source code starts ###############
import java.util.Scanner;

public class Lab5{
    public static void main(String args[]){
        System.out.println("本程式可輸入年份及月份求出當月天數 ");
        System.out.print("請輸入年份 ");
        Scanner keyin =new Scanner(System.in);

        int year =  keyin.nextInt();
        System.out.print("請輸入月份 ");
        int month = keyin.nextInt();
        int day = 0;

        switch (month){
            case 1:case 3:case 5:case 7:case 8:case 10:case 12:
               day = 31; break;
            case 2:
               if((year % 4 == 0 && year % 100 != 0) || 
                                              year % 400 == 0){
                  day = 28;//閏月28天
               }else{
                  day = 29;//非閏月29天
               }
             break;
      case 4:case 6: case 9: case 11:
  day = 30; break;
            }
            System.out.println("西元"+year+" "+month+"月共有"
                                                      +day+"天");

        }
}
####### source code ends #########################

Java小練習(6)

撰寫一個程式,使用者可以輸入R、L、U、D來分別顯示向右走、向左走、向上走、向下走。 ######## code starts form here ######################
import java.util.Scanner;

public class Test6 {

    public static void main(String args[]) {
        System.out.println("輸入R、L、U、D來分別顯示
                      向右走、向左走、向上走、向下走");
        System.out.println("ctrl+c以結束程式:");

        Scanner keyin = new Scanner(System.in);
//        System.out.println((int)'A');
//        System.out.println((int)'Z');
//        System.out.println((int)'a');
//        System.out.println((int)'z');
//利用以上得知英文字母大小寫的字元碼
        char input;
        
 do{
     input = keyin.next().charAt(0);
//沒有nextChar()這個方法,因此只好用charAt()取第一個字元傳回input
            if (input == 'R'||input == 'r') {
                System.out.println("向右走");
            } else if (input == 'L'|| input == 'l') {
                System.out.println("向左走");
            } else if (input == 'U'|| input == 'u') {
                System.out.println("向上走");
            } else if (input == 'D'|| input == 'd') {
                System.out.println("向下走");
            } else {
                System.out.println("請輸入R、L、U、D
                                      或是注意大小寫!");
            }
  }while( ((int)input >=65 && (int)input <=90) || 
          ((int)input >= 97 && (int)input <= 122));
        //當輸入為A-Z或是a-z才會繼續執行!
         }
}

######## code ends ##################################

Java小練習(5)

本程式需要讓使用者輸入華氏或攝氏溫度,以進行互換。 #####source code starts ########################
import java.util.Scanner;

public class temptrans {
    public static void main(String[] args){
         
        Scanner input = new Scanner(System.in);
         
        System.out.println("簡易溫度互換程式:");
        System.out.println("1:以攝氏轉華式  2:以華氏轉攝氏");
        byte type = input.nextByte();
         
        if(type == 2 ){
            System.out.println("請輸入華氏溫度");
            float F = input.nextFloat();
            System.out.println("攝氏溫度為:"+((F-32)*5/9));
            System.out.println("絕對溫度為:"+(((F-32)*5/9)+273.15));
        }else if(type == 1 ){
            System.out.println("請輸入攝氏溫度");
            float C = input.nextFloat();
            System.out.println("華氏溫度為:"+(9*C/5+32));
            System.out.println("絕對溫度"+(C+273.15));
        }else{
            System.out.println("請輸入1或2,不要來亂!");
        }
    }
}

Java小練習(4)

本程式需要處理分數等級。使用者輸入分數,能顯示等級。
 條件   輸出結果
##############################################
   分數高於90  分數 ? 分、等級 A+
分數低於90高等於80  分數 ? 分、等級 A
分數低於80高等於70  分數 ? 分、等級 B
分數低於70高等於60  分數 ? 分、等級 C
   分數低於60  分數 ? 分、等級 Failed
##############################################
####### source code starts ###################
import java.util.Scanner;

public class Lab4{
    public static void main(String args[]){
        System.out.println("Please enter your score:");
        Scanner keyin = new Scanner(System.in);
        int score = keyin.nextInt();
        if(score > 90){
            System.out.println("You got A+ !");
        }else if(score >= 80){
            System.out.println("You got A !");
        }else if(score >= 70){
            System.out.println("You got B !");
        }else if(score >= 60){
            System.out.println("You got C !");
        }else{
            System.out.println("Asshole! You failed!");
        }
    }
}

Java小練習(3)

這個程式需要作到電影分級制度檢查處理,輸出結果大致如下要求:
條件   輸出結果
-----------------------------------------------
年齡滿18       年齡 ? 歲、可觀賞限制級電影
年齡滿12未滿18  年齡 ? 歲、可觀賞輔導級電影
年齡6未滿12    年齡 ? 歲、可觀賞保護級電影
年齡未滿6      年齡 ? 歲、可觀賞普通級電影
-----------------------------------------------
//######source code starts ####################
import java.util.Scanner;

public class Lab3 {
   public static void main(String args[]){
       System.out.println("請輸入年齡以得知電影分級:");
       Scanner keyin = new Scanner(System.in);
       int age = keyin.nextInt();

       if (age < 6 ){            
          System.out.println("年齡"+age+", 可看普通級電影");        
       }else if(age < 12){            
          System.out.println("年齡"+age+", 可看保護級電影");        
       }else if(age < 18){            
          System.out.println("年齡"+age+", 可看輔導級電影");        
       }else{            
          System.out.println("年齡"+age+", 可看限制級電影");        
       }    
    }
} 
//###### end of code ###################

Java小練習(2)

某百貨公司舉行週年慶,給消費者的折扣為:購物金額小於2000元打九五折,購物金額滿2000元打九折,滿3000元打八五折,,滿4000元打八 折,滿5000元打七五折。 請撰寫一程式,輸入一購物金額,輸出打折後的需付金額。 看來用簡單的if else就可以解決。 //######## source code starts from here #################
import java.util.Scanner;

public class Lab2{
    public static void main(String args[]){
        System.out.println("請輸入購物金額");
        Scanner keyin = new Scanner(System.in);
        int charge = keyin.nextInt();

        if (charge < 2000){
            int fee = (int)(charge*0.95);
            System.out.println("你的金額是:"+charge+",打折後為 "+fee);
        }else if(charge <3000){
            int fee = (int)(charge*0.9);
            System.out.println("你的金額是:"+charge+",打折後為 "+fee);
        }else if(charge < 4000){
            int fee = (int)(charge*0.85);
            System.out.println("你的金額是:"+charge+",打折後為 "+fee);
        }else if(charge < 5000){
            int fee = (int)(charge*0.8);
            System.out.println("你的金額是:"+charge+",打折後為 "+fee);
        }else{
            int fee = (int)(charge*0.75);
            System.out.println("你的金額是:"+charge+",打折後為 "+fee);
        }

    }
}
//######### source code ends #########################

Java小練習(1)

1. 請設計一程式分別可以接受使用者輸入「國文、英文、數學」分數後, 將總分及平均顯示出來。 //######### source code starts from here #################
import java.util.Scanner;
//因為需要接收使用者輸入,因此因此import  java.util.Scanner這個套件。

public class Lab{
   public static void main(String args[]){
       Scanner keyin = new Scanner(System.in);

       System.out.println("score of chinese");
       float chi = keyin.nextFloat();

       System.out.println("score of English");
       float eng = keyin.nextFloat();

       System.out.println("score of Math");
       float math = keyin.nextFloat();

       float sum = (float)chi+eng+math;
       float avg = sum/3.0F;
       System.out.println("Yor score is "+sum+" and the avg is "+avg);
       System.out.print("this semester is :");
       System.out.println(avg>=60? "Passed!" : "Failed!");
       //二擇一的情況可以不需要用到if/else敘述
   }
}
//##### source code ends ###############