Java实现计算器——升级记录中19.5.14……

这是入门java以来的第一个小项目,希望可以从中学到东西,而不是单纯地懂得Swing的一些功能,持续更新中

/*************************************************************************/

19.5.14 

//第一个类:主类
package Calculator_advance;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
public class Calculator_advance {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new WindowFlow("计算器");
	}
}




//第二个类:布局
package Calculator_advance;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;

public class WindowFlow extends JFrame implements ActionListener{
		JMenuBar menubar;
		JMenu menu;
		JMenuItem item1,item2,item3;
		JLabel inputScreen = new JLabel();
		int count=0;
		String str;
		static int choose=0;
		
		WindowFlow(String s)
		{
			setTitle(s);			
			setBounds(100,100,300,450);
			setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			//第一种:菜单选择
			menubar = new JMenuBar();
			menu = new JMenu("模式选择");
			item1 = new JMenuItem("基本型");
			item2 = new JMenuItem("科学型");
			item3 = new JMenuItem("关闭");
			menu.add(item1);
			menu.add(item2);
			menu.add(item3);
			menubar.add(menu);
			setJMenuBar(menubar);
		

			
			inputScreen.setSize(280,100);
			add(inputScreen,BorderLayout.NORTH);
			inputScreen.setText("0");
			inputScreen.setFont(new Font("SERIF",Font.BOLD,40));
			inputScreen.setHorizontalAlignment(JLabel.RIGHT);
			inputScreen.setBorder(BorderFactory.createLineBorder(Color.black));
			JPanel ButtonContainer = new JPanel();
			add(ButtonContainer);
			
			String Buttonnumbers[] = {"7","8","9","+", 
					                  "4","5","6","-", 
					                  "1","2","3","*", 
					                  "0",".","/","=",
					                  "clear"};
			for(String string:Buttonnumbers)
			{
				JButton b = new JButton(string);
				if(string !="clear")
				  b.setPreferredSize(new Dimension(60,60));
				else  b.setPreferredSize(new Dimension(240,60));
				ButtonContainer.add(b);
				b.addActionListener(this);
			}
			setVisible(true);	
			validate();
			
			/*
			 * 事件处理
			 */
			item1.addActionListener(new ActionListener() {
				   public void actionPerformed(ActionEvent e) 
				   {				
					  choose=1;
					  System.out.println(choose);
				   }
			   });
			item2.addActionListener(new ActionListener() {
				   public void actionPerformed(ActionEvent e) 
				   {				
					  choose=2;
					  System.out.println(choose);
				   }
			   });
			item3.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) 
				{
					System.exit(0);
				}
			});						
	}

		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			MathSampleOperation Math =new MathSampleOperation();
			
			count++;
			if(count==1)
			  inputScreen.setText("");//不显示0
			
			if(e.getActionCommand()!="=")
			  inputScreen.setText(inputScreen.getText()+e.getActionCommand());
			else 
			{
				inputScreen.setText(inputScreen.getText()+"="+Math.eval(inputScreen.getText()));
			}
			if(e.getActionCommand().equals("clear")==true)
			{
				inputScreen.setText("0");
				count=0;
			}
			
		}	
}


//第三个类:算术操作
package Calculator_advance;

public class MathSampleOperation {

	public String str;
	public double numa,numb;
	public double eval(String str)//此处划分可以再优化
	{
		
	    String[] strnum = str.split("[\\p{Punct}]+");//\n 6\n9
	    String[] strstr = str.split("[\\d]+");// \n +
	    numa = Double.parseDouble(strnum[0]);
	    numb = Double.parseDouble(strnum[1]);    
	   switch (strstr[1]) {
	case "+":
		return numa+numb;
	case "-":
		return numa-numb;
	case "*":
		return numa*numb;
	case "/":
		return numa/numb;
	default:
		return Math.E;
	 }		 
   }
}



效果如图: 

上面主要实现的仅仅是基本型的整体布局和简单的两个数之间的运算!

接下来就需要不断完善功能啦,我会分时间段来完善,希望最后呈现给大家的是一个功能齐全的计算器! 

 

/*************************************************************************/

 

19.5.15——>主要实现了基本型的混合运算,只改了混合型运算的代码

//仅改动了第三个类——算术操作类(但这个方法比较麻烦,而且实现过程中自己忽略了一些知识点,导致找了很久)

//String类型的比较一定要用str.equals();不能用'=='

我开始习惯性地用了'==',之后过程测试中发现出现并没有进入条件语句中

package Calculator_advance;

import java.util.Scanner;

public class MathSampleOperation {

	public String str;
	
	public double eval(String str)//此处划分可以再优化
	{
		int i,k=0,count=0;
		double sum=0;
		double[] number = new double[20];
		String[] strArray =new String[20];
		
		double[] newnumber = new double[20];
		String[] newstrArray =new String[20];
		
	    String[] strnum = str.split("[\\p{Punct}]+");
	    String[] strstr = str.split("[\\d]+");
	    //输出部分为过程测试
	    for(i=0;i<strnum.length;i++)     //数字串
	    {
	       number[i] = Double.parseDouble(strnum[i]);
//	       System.out.print(number[i]+" ");
	    } 
//	    System.out.println();
	    for(i=0;i<strstr.length-1;i++)   //字符串
	    {
	       strArray[i] = strstr[i+1];  
//	       System.out.print(strArray[i]+" ");    		   
	    }
//	    System.out.println();
	    
	    //String类型的比较一定要用str.equals();不能用'=='
	    	  for(i=0;i<strstr.length-1;i++)
	    	  {	    	
	    		  
	    		 if((strArray[i].equals("*") || strArray[i].equals("/")) && count==0)
	    		 {
	    			 sum=sum+number[i];
	    			 count++;
	    			 switch(strArray[i])
	    			 {
	    			 case "*":
	    				 sum=sum*number[i+1];
	    				 break;
	    			 case "/":
	    				 sum=sum/number[i+1];
	    				 break;
	    			 }	    			 
	    		 }
	    		 else if((strArray[i].equals("*") || strArray[i].equals("/")) && count!=0)
	    		 {	 
	    			 switch(strArray[i])
	    			 {
	    			 case "*":
	    				 sum=sum*number[i+1];
	    				 break;
	    			 case "/":
	    				 sum=sum/number[i+1];
	    				 break;
	    			 default:
	    				 break;
	    			 }
	    		 }
	    		 else if(!strArray[i].equals("*") && !strArray[i].equals("/") && i!=0 && count==0)
	    		 {
	    			 newnumber[k]=number[i];
	    			 newstrArray[k]=strArray[i];
	    			 k++;
	    			 sum=0;
	    			 count=0;
	    		 }
	    		 else if(!strArray[i].equals("*") && !strArray[i].equals("/") && i!=0 && count!=0)
	    		 {
	    			 newnumber[k]=sum;
	    			 newstrArray[k]=strArray[i];
	    			 k++;
	    			 sum=0;
	    			 count=0;
	    		 }
	    		 else if(!strArray[i].equals("*") && !strArray[i].equals("/") && i==0)
	    		 {
	    			 newnumber[k]=number[0];
	    			 newstrArray[k]=strArray[0];
	    			 k+
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值