2010/01/29

p004 LC-Display

為了要方便表示,我們可以先做個約定


/* 
  * LED representation for each number, according to 
  * the following convention:
  *
  *  -0-
  * |   |
  * 2   1
  * |   |
  *  -3-
  * |   |
  * 5   4
  * |   |
  *  -6-
  *
  */


然後建立陣列

char[][] conversionTable = {
          /* 0   1   2   3   4   5   6 */
    /* 0 */{'-','|','|',' ','|','|','-'},   
    /* 1 */{' ','|',' ',' ','|',' ',' '},
    /* 2 */{'-','|',' ','-',' ','|','-'},
    /* 3 */{'-','|',' ','-','|',' ','-'},
    /* 4 */{' ','|','|','-','|',' ',' '},
    /* 5 */{'-',' ','|','-','|',' ','-'},
    /* 6 */{'-',' ','|','-','|','|','-'},
    /* 7 */{'-','|',' ',' ','|',' ',' '},
    /* 8 */{'-','|','|','-','|','|','-'},
    /* 9 */{'-','|','|','-','|',' ','-'},
  };

row分別代表1~9的數字,而0~6就是我們的約定位置。


import java.util.Scanner;

public class JAVA {
   
 public static void main(String[] args) {
  
  Scanner sc = new Scanner(System.in);
  
  char[][] conversionTable = {
          /* 0   1   2   3   4   5   6 */
    /* 0 */{'-','|','|',' ','|','|','-'},   
    /* 1 */{' ','|',' ',' ','|',' ',' '},
    /* 2 */{'-','|',' ','-',' ','|','-'},
    /* 3 */{'-','|',' ','-','|',' ','-'},
    /* 4 */{' ','|','|','-','|',' ',' '},
    /* 5 */{'-',' ','|','-','|',' ','-'},
    /* 6 */{'-',' ','|','-','|','|','-'},
    /* 7 */{'-','|',' ',' ','|',' ',' '},
    /* 8 */{'-','|','|','-','|','|','-'},
    /* 9 */{'-','|','|','-','|',' ','-'},
  };
  
  int i, j, k;
  
  while(sc.hasNext()) {
   
   int s = sc.nextInt();
   
   if(s == 0)
    break;
   
   //String digitNumber = readToken();
   String digitNumber = sc.next();
   int n = digitNumber.length();
 
   int digit;
   
   // display digitNumber in s size
   // Each digit occupies exactly s+2 columns and 2s+3 rows.
   for(i = 0; i < 2*s+3; i++) {
    for(j = 0; j < n; j++) {
     
     digit = digitNumber.charAt(j) - '0';

     /* upper, middle and lower parts */
     if ((i % (s + 1)) == 0) {
      System.out.printf(" ");
      for (k = 0; k < s; k++) {
       System.out.printf("%c", conversionTable[digit][(i / (s + 1)) * 3]);
      }
      System.out.printf(" ");
     }
     
     /* between upper and middle parts */
     if (i > 0 && i < (s + 1)) {
      System.out.printf("%c", conversionTable[digit][2]);
      for (k = 0; k < s; k++) {
       System.out.printf(" ");
      }
      System.out.printf("%c", conversionTable[digit][1]);
     }

     
     /* between middle and lower parts */
     if (i > (s + 1) && i < (2*s + 2)) {
      System.out.printf("%c", conversionTable[digit][5]);
      for (k = 0; k < s; k++) {
       System.out.printf(" ");
      }
      System.out.printf("%c", conversionTable[digit][4]);
     }
     
     /* if not the last number */
     if (j != n-1)
      System.out.printf(" ");
    }
    System.out.println();
   }
   System.out.println();
   
  }
 }
}
我們注意到幾個地方:
  • 每一個數字都佔有2s+3列跟s+2行(s代表輸入的大小)

    • 整個處理分成三個部份
    • 第一部份是正中間的上中下 i % (s + 1) == 0
    • 第二部份是上跟中的中間 s+1
    • 第三部份是中跟下的中間 2s+2
可以參考下圖~會更瞭解為什麼運算式這樣判斷



    參考資料:http://snippets.dzone.com/posts/show/5244

    No comments:

    Post a Comment