產(chǎn)銷(xiāo)不平衡用NBPSProcedure,平衡用BPSProcedure
站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到耒陽(yáng)網(wǎng)站設(shè)計(jì)與耒陽(yáng)網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類(lèi)型包括:成都做網(wǎng)站、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋耒陽(yáng)地區(qū)。
public class ProductSaleBTProb {
public static void main(String[] args) {
float[][] costMatrix=new float[][]{{1.5f,2f,0.3f,3f},{7f,0.8f,1.4f,2f},{1.2f,0.3f,2f,2.5f}};
/*
* 測(cè)試行、列位勢(shì)方法
float[][] ASMatrix=new float[6][7];
ASMatrix[0]=new float[]{20f,0f,80f,0f,0f,0f,0f};
ASMatrix[1]=new float[]{0f,70f,0f,10f,0f,0f,0f};
ASMatrix[2]=new float[]{30f,0f,0f,20f,0f,0f,0f};
doLCPosiPower(costMatrix, ASMatrix, 3, 4);
for(int i=0;i6;i++){
System.out.println(Arrays.toString(ASMatrix[i]));
}
*/
/*
* 測(cè)試pw為產(chǎn)地產(chǎn)量,sw為銷(xiāo)售地效率,費(fèi)用矩陣costMatrix
*/
int[] pw=new int[]{100,80,50};
int[] sw=new int[]{50,70,80,30};
int[] rv=BPSProcedure(costMatrix, 3, 4, pw, sw);
for(int i=0;irv.length;i+=3){
System.out.print("編號(hào)"+rv[i]+"的產(chǎn)地,向編號(hào)"+rv[i+1]+"的銷(xiāo)地運(yùn)輸:"+rv[i+2]+"\n");
}
/*
*產(chǎn)銷(xiāo)不平衡測(cè)試
costMatrix=new float[][]{{4f,2f,5f},{3f,5f,3f},{1f,3f,2f}};
int[] pw=new int[]{8,7,4};
int[] sw=new int[]{4,8,5};
int[] rv=NBPSProcedure(costMatrix, 3, 3, pw, sw);
for(int i=0;irv.length;i+=3){
System.out.print("編號(hào)"+rv[i]+"的產(chǎn)地,向編號(hào)"+rv[i+1]+"的銷(xiāo)地運(yùn)輸:"+rv[i+2]+"\n");
}
*/
}
//產(chǎn)銷(xiāo)平衡運(yùn)輸費(fèi)用最低問(wèn)題,保證pw和sw相等
//costMatrix為費(fèi)用矩陣,pnum為產(chǎn)地個(gè)數(shù),即costMatrix的行數(shù),snum為銷(xiāo)地個(gè)數(shù),即costMatrix的列數(shù)
//pw表示不同產(chǎn)地產(chǎn)量,sw表示不同銷(xiāo)地銷(xiāo)量,由于是float浮點(diǎn)運(yùn)算,保留2位小數(shù)
//返回值沒(méi)三位表示一個(gè)信息,比如{...,0,1,40,1,2,60..}表示編號(hào)0的產(chǎn)地向編號(hào)1的銷(xiāo)售地運(yùn)輸40,編號(hào)1的產(chǎn)地向編號(hào)2的銷(xiāo)售地運(yùn)輸60,
public static int[] BPSProcedure(float[][] costMatrix,int pnum,int snum,int[] pw,int[] sw){
int i,j;
//構(gòu)造一個(gè)分配矩陣,增加3行3列,增加的第1行列表示分配的和,第2行列表示行列差,第3行列表示行、列位勢(shì)
float[][] ASMatrix=new float[pnum+3][snum+3];
int tmpsum=0; //記錄初始解是否分配完畢,
while(tmpsumpnum){
//運(yùn)用行、列差值法分別求行、列差,對(duì)即沒(méi)有給運(yùn)量又沒(méi)有打叉的進(jìn)行統(tǒng)計(jì)
float min1=0,min2=0;
for(i=0;ipnum;i++){
//該行打叉則跳過(guò)
if(ASMatrix[i][snum+1]==-1)continue;
min1=0;min2=0;
for(j=0;jsnum;j++){
//如果ij有運(yùn)量或者已經(jīng)該行或該列打叉則不統(tǒng)計(jì)
if(ASMatrix[i][j]0||ASMatrix[pnum+1][j]==-1)
continue;
else if(min1==0)min1=costMatrix[i][j];
else if(min2==0){
if(min1costMatrix[i][j]){
min2=min1;
min1=costMatrix[i][j];
}else
min2=costMatrix[i][j];
}else{
if(!(min2costMatrix[i][j])) continue;
else if(!(min1costMatrix[i][j]))
min2=costMatrix[i][j];
else{
min2=min1;
min1=costMatrix[i][j];
}
}
}
if(min2!=0) //如果min2有值,則計(jì)算差額
ASMatrix[i][snum+1]=Math.round((min2-min1)*100)/100f;
else
ASMatrix[i][snum+1]=min1;
}
for(j=0;jsnum;j++){
//該列打叉則跳過(guò)
if(ASMatrix[pnum+1][j]==-1)continue;
min1=0;min2=0;
for(i=0;ipnum;i++){
//如果有運(yùn)量或者該行打叉則跳過(guò)
if(ASMatrix[i][j]0||ASMatrix[i][snum+1]==-1)
continue;
else if(min1==0) min1=costMatrix[i][j];
else if(min2==0){
if(min1costMatrix[i][j]){
min2=min1;
min1=costMatrix[i][j];
}else
min2=costMatrix[i][j];
}else{
if(!(min2costMatrix[i][j])) continue;
else if(!(min1costMatrix[i][j]))
min2=costMatrix[i][j];
else{
min2=min1;
min1=costMatrix[i][j];
}
}
}
if(min2!=0)
ASMatrix[pnum+1][j]=Math.round((min2-min1)*100)/100f;
else
ASMatrix[pnum+1][j]=min1;
}
//找出沒(méi)有被標(biāo)記為-1的行、列差額最大的并按照滿足一方最大分配,當(dāng)分配數(shù)和等于最大值時(shí)對(duì)應(yīng)行列差標(biāo)記為-1,循環(huán)進(jìn)行,直到分完
float lcpospowmax=-1;
int lindex=-1,cindex=-1;
for(i=0;ipnum;i++){
if(ASMatrix[i][snum+1]==-1)continue;
if(ASMatrix[i][snum+1]!=-1lcpospowmaxASMatrix[i][snum+1]){
lcpospowmax=ASMatrix[i][snum+1];
lindex=i;
}
}
for(j=0;jsnum;j++){
if(ASMatrix[pnum+1][j]==-1)continue;
if(ASMatrix[pnum+1][j]!=-1lcpospowmaxASMatrix[pnum+1][j]){
lcpospowmax=ASMatrix[pnum+1][j]; cindex=j;
}
}
float mincost=0;
//在列上找到最大值
if(cindex!=-1){
lindex=-1;
for(i=0;ipnum;i++){
//如果該位置有運(yùn)量或者被叉掉則不在統(tǒng)計(jì)之內(nèi)
if(ASMatrix[i][cindex]0||ASMatrix[i][snum+1]==-1)
continue;
else if(mincost==0){
mincost=costMatrix[i][cindex];
lindex=i;
}else{
if(mincostcostMatrix[i][cindex]){
mincost=costMatrix[i][cindex];
lindex=i;
}
}
}
//最終找到lindex、cindex對(duì)應(yīng)格子分配,盡量滿足一方
//ASMatrix[pnum][cindex]表示第cindex已經(jīng)分配數(shù)、ASMatrix[lindex][snum]表示已經(jīng)供應(yīng)的數(shù)量
//需求量和分配量之間的關(guān)系,分配后標(biāo)記每行、列和的格子也相應(yīng)加上
if((sw[cindex]-ASMatrix[pnum][cindex])(pw[lindex]-ASMatrix[lindex][snum])){
ASMatrix[lindex][cindex]=Math.round((sw[cindex]-ASMatrix[pnum][cindex])*100)/100f;
ASMatrix[pnum+1][cindex]=-1; //該列已經(jīng)分配完畢
}else if((sw[cindex]-ASMatrix[pnum][cindex])(pw[lindex]-ASMatrix[lindex][snum])){
ASMatrix[lindex][cindex]=Math.round((pw[lindex]-ASMatrix[lindex][snum])*100)/100f;
ASMatrix[lindex][snum+1]=-1;
tmpsum++; //該行生產(chǎn)量分配完畢
}else{
ASMatrix[lindex][cindex]=pw[lindex]-ASMatrix[lindex][snum];
ASMatrix[lindex][snum+1]=-1;
ASMatrix[pnum+1][cindex]=-1;
tmpsum++;
}
ASMatrix[lindex][snum]=Math.round((ASMatrix[lindex][snum]+ASMatrix[lindex][cindex])*100)/100f;
ASMatrix[pnum][cindex]=Math.round((ASMatrix[pnum][cindex]+ASMatrix[lindex][cindex])*100)/100f;
}else if(lindex!=-1){
mincost=0;
cindex=-1;
for(j=0;jsnum;j++){
if(ASMatrix[lindex][j]0||ASMatrix[pnum+1][j]==-1)
continue;
else if(mincost==0){
mincost=costMatrix[lindex][j];
cindex=j;
}else{
if(mincostcostMatrix[lindex][j]){
mincost=costMatrix[lindex][j];
cindex=j;
}
}
}
//最終找到lindex、cindex對(duì)應(yīng)格子分配
if((sw[cindex]-ASMatrix[pnum][cindex])(pw[lindex]-ASMatrix[lindex][snum])){
ASMatrix[lindex][cindex]=Math.round((sw[cindex]-ASMatrix[pnum][cindex])*100)/100f;
ASMatrix[pnum+1][cindex]=-1; //該列已經(jīng)分配完畢
}else if((sw[cindex]-ASMatrix[pnum][cindex])(pw[lindex]-ASMatrix[lindex][snum])){
ASMatrix[lindex][cindex]=Math.round((pw[lindex]-ASMatrix[lindex][snum])*100)/100f;
ASMatrix[lindex][snum+1]=-1;
tmpsum++; //該行生產(chǎn)量分配完畢
}else{
ASMatrix[lindex][cindex]=pw[lindex]-ASMatrix[lindex][snum];
ASMatrix[lindex][snum+1]=-1;
ASMatrix[pnum+1][cindex]=-1;
tmpsum++;
}
ASMatrix[lindex][snum]=Math.round((ASMatrix[lindex][snum]+ASMatrix[lindex][cindex])*100)/100f;
ASMatrix[pnum][cindex]=Math.round((ASMatrix[pnum][cindex]+ASMatrix[lindex][cindex])*100)/100f;
}
}
//至此,用行列差法找到了初始分配方案ASMatrix[i][j]==0表示叉去的格子,ipnum,jsnum
boolean findSolu=false;
int tmp1=0;
for(i=0;ipnum;i++)
for(j=0;jsnum;j++){
if(ASMatrix[i][j]0)
tmp1+=1;
}
if(tmp1(pnum+snum-1))
findSolu=true;
while(!findSolu){
// 位勢(shì)法求Rij,如果能找到0的說(shuō)明要調(diào)整,否則找到最優(yōu)解
doLCPosiPower(costMatrix,ASMatrix,pnum,snum);
//Rij=cij-(ui+vj);對(duì)于分派矩陣中空格計(jì)算Rij
float rijmin=0; //存放最小的空格校驗(yàn)值
int rijminl=-1,rijminc=-1;
for(i=0;ipnum;i++){
for(j=0;jsnum;j++){
if(!(ASMatrix[i][j]0)((costMatrix[i][j]-ASMatrix[i][snum+2]-ASMatrix[pnum+2][j])rijmin)){
rijmin=Math.round((costMatrix[i][j]-ASMatrix[i][snum+2]-ASMatrix[pnum+2][j])*100)/100f;
rijminl=i;rijminc=j;
}
}
}
//如果校驗(yàn)值小于0,則用閉回路進(jìn)行調(diào)整
if(rijmin0){
//找閉回路,
int rijminOVl=-1,rijminOVc=-1; //rijmin對(duì)應(yīng)點(diǎn)的閉回路的頂點(diǎn)的i、j
boolean find=false;
// 向右邊上下找
for(j=rijminc+1;jsnum!find;j++){
if(ASMatrix[rijminl][j]0){
for(i=rijminl+1;ipnum;i++){
if(ASMatrix[i][rijminc]0(ASMatrix[i][j]0)){
rijminOVl=i;rijminOVc=j;
find=true;
break;
}
}
for(i=rijminl-1;i=0;i--){
if(ASMatrix[i][rijminc]0(ASMatrix[i][j]0)){
rijminOVl=i;rijminOVc=j;
find=true;
break;
}
}
}
}
// 向左邊上下找
for(j=rijminc-1;j=0!find;j--){
if(ASMatrix[rijminl][j]0){
for(i=rijminl+1;ipnum;i++){
if(ASMatrix[i][rijminc]0(ASMatrix[i][j]0)){
rijminOVl=i;rijminOVc=j;
find=true;
break;
}
}
for(i=rijminl-1;i=0;i--){
if(ASMatrix[i][rijminc]0(ASMatrix[i][j]0)){
rijminOVl=i;rijminOVc=j;
find=true;
break;
}
}
}
}
//記錄rijmin閉回路相鄰點(diǎn)中最小的,并調(diào)整分派矩陣
float minW=ASMatrix[rijminl][rijminOVc]ASMatrix[rijminOVl][rijminc]?
ASMatrix[rijminl][rijminOVc]:ASMatrix[rijminOVl][rijminc];
ASMatrix[rijminl][rijminOVc]=Math.round((ASMatrix[rijminl][rijminOVc]-minW)*100)/100f;
ASMatrix[rijminOVl][rijminc]=Math.round((ASMatrix[rijminOVl][rijminc]-minW)*100)/100f;
ASMatrix[rijminOVl][rijminOVc]=Math.round((ASMatrix[rijminOVl][rijminOVc]+minW)*100)/100f;
ASMatrix[rijminl][rijminc]=minW;
}else
findSolu=true;
}
ListInteger rv=new ArrayListInteger();
for(i=0;ipnum;i++)
for(j=0;jsnum;j++){
if(ASMatrix[i][j]0){
rv.add(i);
rv.add(j);
rv.add((int)ASMatrix[i][j]);
}
}
int[] tmprv=new int[rv.size()];
for(i=0;irv.size();i++){
tmprv[i]=rv.get(i);
}
return tmprv;
}
//根據(jù)分配矩陣和費(fèi)用矩陣求出分配矩陣中的行、列位勢(shì),pnum+2、sunm+2表示行、列位勢(shì)在ASMatrix中的位置
//由于方程組都是cij=ui+vj的形式,根據(jù)矩陣可以逐行逐列求解。
public static void doLCPosiPower(float[][] costMatrix,float[][] ASMatrix,int pnum,int snum){
int ansnum=0,lp=snum+2,cp=pnum+2; //lp列位置,cp行位置
boolean[] bs=new boolean[pnum+snum]; //0..pnum-1為行位勢(shì)
ASMatrix[0][lp]=0; //令u0=0
bs[0]=true;
ansnum+=1;
int i,j;
while(ansnumpnum+snum){
for(i=0;ipnum;i++){ //逐行求解,根據(jù)costMatrix[i][j]=ASMatrix[i][lp]+ASMatrix[cp][j]
for(j=0;jsnum!bs[i];j++){ //根據(jù)列位勢(shì)求行位勢(shì)
if(ASMatrix[i][j]0bs[pnum+j]){
ASMatrix[i][lp]=Math.round((costMatrix[i][j]-ASMatrix[cp][j])*100)/100f;
ansnum+=1;
bs[i]=true;
}
}
if(!bs[i])continue;
for(j=0;jsnum;j++){ //根據(jù)行位勢(shì)求列位勢(shì)
if(ASMatrix[i][j]0!bs[pnum+j]){
ASMatrix[cp][j]=Math.round((costMatrix[i][j]-ASMatrix[i][lp])*100)/100f;
ansnum+=1;
bs[pnum+j]=true;
}
}
}
}
}
/*
* 產(chǎn)銷(xiāo)不平衡,把它增加產(chǎn)地或者銷(xiāo)地轉(zhuǎn)化為平衡問(wèn)題
* costMatrix費(fèi)用矩陣,pnum產(chǎn)地個(gè)數(shù),snum銷(xiāo)地個(gè)數(shù)
*/
public static int[] NBPSProcedure(float[][] costMatrix,int pnum,int snum,int[] pw,int[] sw){
int pwsum=0,swnum=0;
int i,j;
for(i=0;ipw.length;i++)
pwsum+=pw[i];
for(i=0;isw.length;i++)
swnum+=sw[i];
//產(chǎn)大于銷(xiāo) 增加一個(gè)銷(xiāo)地,單位費(fèi)用為0
int[] rv;
if(pwsumswnum){
float[][] nCostMatrix=new float[pnum][snum+1];
for(i=0;ipnum;i++)
for(j=0;jsnum;j++)
nCostMatrix[i][j]=costMatrix[i][j];
for(i=0;ipnum;i++)
nCostMatrix[i][snum]=0f;
int[] nsw=new int[snum+1];
for(i=0;isnum;i++)
nsw[i]=sw[i];
nsw[snum]=pwsum-swnum;
rv=BPSProcedure(nCostMatrix, pnum, snum+1, pw, nsw);
}
//銷(xiāo)大于產(chǎn) 增加一個(gè)產(chǎn)地
else if(pwsumswnum){
float[][] nCostMatrix=new float[pnum+1][snum];
for(i=0;ipnum;i++)
for(j=0;jsnum;j++)
nCostMatrix[i][j]=costMatrix[i][j];
for(j=0;jsnum;i++)
nCostMatrix[pnum][j]=0f;
int[] npw=new int[pnum+1];
for(i=0;ipnum;i++)
npw[i]=pw[i];
npw[pnum]=swnum-pwsum;
rv=BPSProcedure(nCostMatrix, pnum+1, snum, npw, sw);
}else
rv=BPSProcedure(costMatrix, pnum, snum, pw, sw);
return rv;
}
}
將成績(jī)分為幾個(gè)等級(jí),且每個(gè)等級(jí)都有一個(gè)標(biāo)記符,然后使用switch case來(lái)匹配標(biāo)記符分別來(lái)判斷,即可實(shí)現(xiàn)。 示例: switch(表達(dá)式){ case 常量表達(dá)式1: //執(zhí)行語(yǔ)句1; break; case 常量表達(dá)式2: //執(zhí)行語(yǔ)句2; break; default: //執(zhí)行語(yǔ)句; break; }
原理:用一個(gè)數(shù)除以,除它本身和1以外的所有數(shù),都不能整除;
public static void main(String args[])
{
int i, j; //聲明變量i,j;
int sum=0; //聲明sum初始值為0;
for (i = 2; i = 100; i++) //1至100的數(shù),被除數(shù)
{
for (j = 2; j i; j++) //除數(shù)
{
if (i % j == 0) {
break; //如果余數(shù)為0這跳出if跳到第一個(gè)for循環(huán),再次執(zhí)行
}
if (j =(i-1)) //滿足第一個(gè)if并滿足第二個(gè)if則輸出i的值
{ sum=sum+i; //所有素?cái)?shù)相加;
System.out.println(i);//輸出i的值
}
}
System.out.println("所有素?cái)?shù)何為"+sum);
}
}
1+X職業(yè)技能等級(jí)證書(shū)編碼采用24位數(shù)字編碼結(jié)構(gòu)。
1.第1位為證書(shū)類(lèi)型代碼,面向職業(yè)院校在校學(xué)生的職業(yè)技能等級(jí)證書(shū)取值為1,面向社會(huì)成員的職業(yè)技能等級(jí)證書(shū)取值為2。
2.第2-7位為證書(shū)對(duì)應(yīng)的職業(yè)技能等級(jí)標(biāo)準(zhǔn)代碼,表示標(biāo)準(zhǔn)主要面向的職業(yè)技能領(lǐng)域。
3.第8-10位為開(kāi)發(fā)職業(yè)技能等級(jí)證書(shū)的職業(yè)教育培訓(xùn)評(píng)價(jià)組織代碼。
4.第11-12位為證書(shū)等級(jí)及拓展代碼,其中第11位為等級(jí)代碼,初級(jí)為1,中級(jí)為2,高級(jí)為3;第12位為預(yù)留的等級(jí)拓展位,目前統(tǒng)一暫定為5;未來(lái)可限據(jù)需要拓展,如在初級(jí)中拓展一級(jí)、二_等。
5.第13-14位為考核站點(diǎn)所在區(qū)域代碼,取值見(jiàn)區(qū)域代碼對(duì)照表。
6.第1b750位為所在區(qū)域內(nèi)考核站點(diǎn)序列號(hào),由三位數(shù)字(不足三位時(shí)在前面加零補(bǔ)足r組成%.爾同區(qū)域份別從0C開(kāi)始編排,
7.第18-19位為證書(shū)考核年份代碼,如2019年考核證書(shū)的年份代碼為19,2020年考核證書(shū)的年份代碼為20,以此類(lèi)推n
8.第20-24位為證書(shū)核發(fā)序列號(hào),按照每年度該考核站點(diǎn)考核通過(guò)的證書(shū)各等級(jí)從000-99999依次順序取值。
以上第1、4、b、6、1、8條有關(guān)編碼由培訓(xùn)評(píng)價(jià)組織根據(jù)規(guī)則確定,第2、3條由教育部職業(yè)技術(shù)教育中心研究所賦碼。
我有計(jì)算器程序
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
/**
* 我的計(jì)算器。MyCalculator 繼承于 JFrame,是計(jì)算器的界面
*/
public class Calculator extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
private Border border = BorderFactory.createEmptyBorder(5, 5, 5, 5);
private JTextField textbox = new JTextField("0");
private CalculatorCore core = new CalculatorCore();
private ActionListener listener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
JButton b = (JButton) e.getSource();
String label = b.getText();
String result = core.process(label);
textbox.setText(result);
}
};
public Calculator(String title) throws HeadlessException {
super(title); // 調(diào)用父類(lèi)構(gòu)造方法
setupFrame(); // 調(diào)整窗體屬性
setupControls(); // 創(chuàng)建控件
}
private void setupControls() {
setupDisplayPanel(); // 創(chuàng)建文本面板
setupButtonsPanel(); // 創(chuàng)建按鈕面板
}
// 創(chuàng)建按鈕面板并添加按鈕
private void setupButtonsPanel() {
JPanel panel = new JPanel();
panel.setBorder(border);
panel.setLayout(new GridLayout(4, 5, 3, 3));
createButtons(panel, new String[]{
"7", "8", "9", "+", "C",
"4", "5", "6", "-", "CE",
"1", "2", "3", "*", "", // 空字符串表示這個(gè)位置沒(méi)有按鈕
"0", ".", "=", "/", ""
});
this.add(panel, BorderLayout.CENTER);
}
/**
* 在指定的面板上創(chuàng)建按鈕
*
* @param panel 要?jiǎng)?chuàng)建按鈕的面板
* @param labels 按鈕文字
*/
private void createButtons(JPanel panel, String[] labels) {
for (String label : labels) {
// 如果 label 為空,則表示創(chuàng)建一個(gè)空面板。否則創(chuàng)建一個(gè)按鈕。
if (label.equals("")) {
panel.add(new JPanel());
} else {
JButton b = new JButton(label);
b.addActionListener(listener); // 為按鈕添加偵聽(tīng)器
panel.add(b);
}
}
}
// 設(shè)置顯示面板,用一個(gè)文本框來(lái)作為計(jì)算器的顯示部分。
private void setupDisplayPanel() {
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setBorder(border);
setupTextbox();
panel.add(textbox, BorderLayout.CENTER);
this.add(panel, BorderLayout.NORTH);
}
// 調(diào)整文本框
private void setupTextbox() {
textbox.setHorizontalAlignment(JTextField.RIGHT); // 文本右對(duì)齊
textbox.setEditable(false); // 文本框只讀
textbox.setBackground(Color.white); // 文本框背景色為白色
}
// 調(diào)整窗體
private void setupFrame() {
this.setDefaultCloseOperation(EXIT_ON_CLOSE); // 當(dāng)窗體關(guān)閉時(shí)程序結(jié)束
this.setLocation(100, 50); // 設(shè)置窗體顯示在桌面上的位置
this.setSize(300, 200); // 設(shè)置窗體大小
this.setResizable(false); // 窗體大小固定
}
// 程序入口
public static void main(String[] args) throws Exception {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
Calculator frame = new Calculator("我的計(jì)算器");
frame.setVisible(true); // 在桌面上顯示窗體
}
}
/**
* 計(jì)算器核心邏輯。這個(gè)邏輯只能處理 1~2 個(gè)數(shù)的運(yùn)算。
*/
class CalculatorCore {
private String displayText = "0"; // 要顯示的文本
boolean reset = true;
int MaxLen = 30;
private BigDecimal number1, number2;
private String operator;
private HashMapString, Operator operators = new HashMapString, Operator();
private HashMapString, Processor processors = new HashMapString, Processor();
CalculatorCore() {
setupOperators();
setupProcessors();
}
// 為每種命令添加處理方式
private void setupProcessors() {
processors.put("[0-9]", new Processor() {
public void calculate(String command) {
numberClicked(command);
}
});
processors.put("\\.", new Processor() {
public void calculate(String command) {
dotClicked();
}
});
processors.put("=", new Processor() {
public void calculate(String command) {
equalsClicked();
}
});
processors.put("[+\\-*/]", new Processor() {
public void calculate(String command) {
operatorClicked(command);
}
});
processors.put("C", new Processor() {
public void calculate(String command) {
clearClicked();
}
});
processors.put("CE", new Processor() {
public void calculate(String command) {
clearErrorClicked();
}
});
}
// 為每種 operator 添加處理方式
private void setupOperators() {
operators.put("+", new Operator() {
public BigDecimal process(BigDecimal number1, BigDecimal number2) {
return number1.add(number2);
}
});
operators.put("-", new Operator() {
public BigDecimal process(BigDecimal number1, BigDecimal number2) {
return number1.subtract(number2);
}
});
operators.put("*", new Operator() {
public BigDecimal process(BigDecimal number1, BigDecimal number2) {
return number1.multiply(number2);
}
});
operators.put("/", new Operator() {
public BigDecimal process(BigDecimal number1, BigDecimal number2) {
return number1.divide(number2, 30, RoundingMode.HALF_UP);
}
});
}
// 根據(jù)命令處理。這里的命令實(shí)際上就是按鈕文本。
public String process(String command) {
for (String pattern : processors.keySet()) {
if (command.matches(pattern)) {
processors.get(pattern).calculate(command);
break;
}
}
return displayText;
}
// 當(dāng)按下 CE 時(shí)
private void clearErrorClicked() {
if (operator == null) {
number1 = null;
} else {
number2 = null;
}
displayText = "0";
reset = true;
}
// 當(dāng)按下 C 時(shí),將計(jì)算器置為初始狀態(tài)。
private void clearClicked() {
number1 = null;
number2 = null;
operator = null;
displayText = "0";
reset = true;
}
// 當(dāng)按下 = 時(shí)
private void equalsClicked() {
calculateResult();
number1 = null;
number2 = null;
operator = null;
reset = true;
}
// 計(jì)算結(jié)果
/**
*
*/
private void calculateResult() {
number2 = new BigDecimal(displayText);
Operator oper = operators.get(operator);
if (oper != null) {
try {
BigDecimal result = oper.process(number1, number2);
displayText = result.toString();
} catch (RuntimeException e) {
clearClicked();//將計(jì)算器置為初始狀態(tài)
JOptionPane.showMessageDialog(null,"不能用零作除數(shù)","出錯(cuò)了",JOptionPane.OK_OPTION);
//e.printStackTrace();
}
}
}
// 當(dāng)按下 +-*/ 時(shí)(這里也可以擴(kuò)展成其他中間操作符)
private void operatorClicked(String command) {
if (operator != null) {
calculateResult();
}
number1 = new BigDecimal(displayText);
operator = command;
reset = true;
}
// 當(dāng)按下 . 時(shí)
private void dotClicked() {
if (displayText.indexOf(".") == -1) {
displayText += ".";
} else if (reset) {
displayText = "0.";
}
reset = false;
}
// 當(dāng)按下 0-9 時(shí)
private void numberClicked(String command) {
if (reset) {
displayText = command;
} else {
if(displayText.length() MaxLen)
displayText += command;
else
JOptionPane.showMessageDialog(null,"輸入的數(shù)字太長(zhǎng)了","出錯(cuò)了",JOptionPane.OK_OPTION);
}
reset = false;
}
// 運(yùn)算符處理接口
interface Operator {
BigDecimal process(BigDecimal number1, BigDecimal number2);
}
// 按鈕處理接口
interface Processor {
void calculate(String command);
}
}
當(dāng)前文章:java銷(xiāo)售等級(jí)代碼 java開(kāi)發(fā)工程師等級(jí)劃分
網(wǎng)站路徑:http://jinyejixie.com/article8/dodhdip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站導(dǎo)航、網(wǎng)站維護(hù)、品牌網(wǎng)站制作、微信公眾號(hào)、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)