//
/* ---------------------------------------------------------------------------------------------- information.java 情報量 ver. 2.10 (JDK 1.02) ueyama@infonet.co.jp 2003.02.15 update: 2011.08.10 ---------------------------------------------------------------------------------------------- */ import java.applet.Applet; import java.awt.*; import java.lang.Math; public class information extends Applet { int Kox=15, Koy=60, Dox=15, Doy=15; // キー・液晶 表示基準座標 int Kx[]={ 0, 0, 46, 92, 0, 46, 92, 0, 46, 92, 46, 92, 92}; // キー表示座標値 int Ky[]={152,114,114,114, 76, 76, 76, 38, 38, 38,152,152, 0}; // 0,1,2,3,4,5,6,7,8,9,.,=,P int Dp=-1; // 小数点位置 String Key="1"; // キー入力値 boolean Eq =true; // true: '=' キーをクリック boolean Err=false, One=true; double Val=0.0; // 情報量 (bit) Image Img; public void init() { String bg=getParameter("bgcolor"); int Bgc=Integer.valueOf(bg,16).intValue(); setBackground(new Color(Bgc)); MediaTracker mt=new MediaTracker(this); Img=getImage(getCodeBase(), getParameter("figure")); mt.addImage(Img, 0); try { mt.waitForID(0); } catch(InterruptedException e){}; } public boolean inside(int x, int a, int b) { return (x<=Math.max(a,b) && x>=Math.min(a,b)) ? true:false; } public void dsp_p(int x, int y, int n, int c) // 図や文字を描く { int w=0, h=0, ox=0, oy=0; switch(c) { case 0: w=14; h=17; ox= 0; oy= 0; break; // キー数字 case 1: w=38; h=31; ox= 0; oy=59; break; // キー case 2: w=13; h=21; ox= 0; oy=17; break; // 液晶数字 case 3: w=13; h=21; ox= 0; oy=38; break; // 液晶数字(小数点付き) case 4: w=20; h=12; ox=130; oy=59; break; // "bit" case 5: w=37; h=21; ox=143; oy=17; break; // "Err." } Graphics gx=getGraphics(); gx.clipRect(x,y,w,h); gx.drawImage(Img,x-(ox+n*w),y-oy,this); gx.dispose(); } public void dsp_lcd() // 液晶表示 { int i=0,m=0,l=0, in=0, dc=0; double real=0.0, dec=0.0; Graphics gx=getGraphics(); gx.setColor(new Color(181,181,156)); gx.fillRect(Dox-4,Doy-4,138,40); // 液晶部のクリア Dp=Key.indexOf("."); // キー入力文字列中の小数点の位置 String ks=(Dp>=0)? Key.substring(0,Dp)+Key.substring(Dp+1): Key; // 液晶表示用文字列("." を含まない) if(Eq) // 情報量の表示 ('=' キークリック時) { i=Integer.parseInt(ks); if(i==0) Err=true; if(i==1 && Dp==-1) One=true; if(Dp>=0) // 小数点を含むとき { String ds=ks.substring(Dp); // 入力値 小数部文字列 if(Dp>0) in=Integer.parseInt(ks.substring(0,Dp)); // 入力値 整数部 dc=Integer.parseInt(ds); // 入力値 小数部 real=in+dc/Math.pow(10, ds.length()); // 入力値 実数値 if(real>1.0) real=1/real; // 逆数入力時 } else { real=Integer.parseInt(ks); // 入力値 real=1/real; // 逆数入力モード時 } Val = -1 * Math.log(real) / Math.log(2.0); // 情報量 ks=""+(int)Val; // 情報量 整数部(文字列) Dp=ks.length(); // 情報量 整数部桁数(情報量の表示のため) dec=Val-(int)Val; // 情報量 小数部 for(i=0; i<8; i++) // 情報量 小数部を1桁ずつ ks に加える { // (表示桁数確保のため) dec*=10.0; ks+=(int)dec; dec-=(int)dec; } if(One) ks="0"; else { l=ks.length(); while(ks.endsWith("0") && l>Dp) // 情報量 末尾の '0' を削除 { ks=ks.substring(0,l-1); l=ks.length(); } } if(ks.length()==Dp) Dp=-1; if(!Err) dsp_p(108+Dox, 23+Doy, 0, 4); // "bit" の表示 } if(Err) dsp_p(91+Dox, Doy, 0, 5); // "Err." の表示 else // 数値 (入力値 or 情報量) の表示 { l=10-ks.length(); if(l<10) { for(i=0; i<10; i++) { m=(i>=l)? Integer.parseInt(ks.substring(i-l, i-l+1)): 10; dsp_p(13*i+Dox, Doy, m, (i-l+1==Dp && Dp>=0)? 3:2); } } else dsp_p(13*9+Dox, Doy, 10, (Dp<0)?2:3); // 最初に入力された "." の表示 } } public void paint(Graphics g) { int i,j; g.clearRect(0,0,size().width,size().height); g.setColor(new Color(181,181,156)); g.fillRect(Dox-5,Doy-5,140,42); // 液晶部 g.drawRoundRect(0, 0, size().width-1, size().height-1,10,10); // 外枠 g.setColor(new Color(120,120,100)); g.drawRect(Dox-5,Doy-5,140,42); // 液晶部枠 for(i=0; i<12; i++) dsp_p(Kx[i]+Kox, Ky[i]+Koy, 0, 1); // キーの表示 for(i=0; i<12; i++) dsp_p(Kx[i]+Kox+12, Ky[i]+Koy+7, i, 0); // キー文字の表示 dsp_p(Kx[i]+Kox, Ky[i]+Koy, 1, 1); // P, 1/P キー dsp_lcd(); // 液晶 数値の表示 } public boolean mouseDown(Event e, int mx, int my) { int i, n=Key.length(); for(i=0;i<13;i++) if(inside(mx,Kx[i]+Kox,Kx[i]+Kox+38) && inside(my,Ky[i]+Koy,Ky[i]+Koy+31)) break; if(i<13) // キーがクリックされた { Val=0.0; if(Eq) Key=""; Eq=Err=One=false; if(i<10 && n<9) Key+=i; // 数値キー if(i==10) Key+="."; // '.' if(i==11 && n>0) Eq=true; // '=' if(i==12 && n>0 && !Eq) Key=Key.substring(0, n-1); // "BS" dsp_lcd(); // キー入力値 or 情報量の表示 } return true; } } //戻る