结对编程:对队友代码的分析

    不同于我选择C++来实现个人项目,我的队友使用了Java来解决题目,其中包括注册,产生题目和文件输出三个部分,下面我们来看一下代码的优缺点。

优点:

1.代码习惯

    可以看到,我的队友的代码习惯非常良好,代码中变量的名字均有实际含义而非“x,y,z”这类无意义的字母

    代码结构也很标准,视觉上感觉很舒服。

package zuoye;

public class User {
	private String username;
	private String password;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	
}

2.代码优化

    可以看到我的队友对他的代码进行了优化,从而保证了代码运行的效率。这是一个很好的编程习惯,如果代码不进行优化的话,随着代码量的不断增加,整个程序的运行效率也会越来越低,最终被淘汰掉。

3.代码功能

    我队友的代码整体上大概实现了需求中要求的功能,同时自己增加了一个简单的UI界面,也为我们结对编程完成项目打下了基础。

缺点:功能实现还有些小bug

1.初中题目中对于平方和根号的处理,不能出现在同一个位置,只能分开放,这样的话题目出的就会少了一些情况,不够全面。

2.对于括号的处理,无法实现括号只在需要出现的地方出现,即有时候会出现“无效”括号,括号有没有对于计算结果不产生影响。

总结:

    可以看出,我的队友编程基础还是比较好的,希望他可以带飞我(最好可以采用极限编程,我极限他编程那种)。

附代码:

package zuoye;

import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Label;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class CalFrame extends JFrame{
	public void showUI(String username,String password) {
		FirstProject f=new FirstProject();
		this.setTitle("界面");
		this.setSize(800, 600);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLayout(new GridLayout());
		String [] shapeArr= {"小学","初中","高中"};
		JTextField [] jtf=new JTextField [3];
		CalListener l=new CalListener();
		l.setG(username, password);
		JLabel label=new JLabel("欢迎来到试卷生成系统,请在对应按钮下输入试卷题目数量,将自动在"+f.iniD+"目录上创建"+
		username+"文件夹和相应试卷");
		this.add(label);
		setLayout(new GridLayout(8,1));
		
		getContentPane().add(label);
		
		for(int i=0;i<shapeArr.length;i++) {
			JButton btn=new JButton(shapeArr[i]);
			jtf[i]=new JTextField(20);
			getContentPane().add(btn);
			getContentPane().add(jtf[i]);
			btn.addActionListener(l);
		}
		l.setGrade(jtf,shapeArr);
		this.setVisible(true);
	}
	
}

  

package zuoye;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.JTextField;

public class CalListener implements ActionListener{
	String Arr="";
	FirstProject f=new FirstProject();
	String un,pwd;
	JTextField [] jtf;
	String [] shapeArr;
	
	public void setG(String un,String pwd) {
		this.un=un;
		this.pwd=pwd;
	}
	public void setGrade(JTextField [] jtf,String [] shapeArr) {
		this.jtf=jtf;
		this.shapeArr=shapeArr;
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		Arr=e.getActionCommand();
		int g=0;
		
			for(int i=0;i<3;i++) {
				if(shapeArr[i].equals(Arr)) {
					if("".equals(jtf[i].getText()))System.out.println("输入错误");
						
					else g=Integer.parseInt(jtf[i].getText());
				}
			}
			if(g!=0) {
				try {
					f.work(un, pwd, Arr,g);
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}	
			}
	}
	
}

  

package zuoye;

import java.sql.DriverManager;
import java.sql.ResultSet;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.Statement;

public class ConnDB {
		public Connection conn=null;
		public PreparedStatement stmt=null;
		public ResultSet rs=null;
		//驱动类的类名
		private static String dbClassName="com.mysql.jdbc.Driver";
		private static String dbUrl="jdbc:mysql://localhost:3306/usercontroldb";
		private static String username="root";
		private static String password="123456";
		
		public boolean findUser(String un,String pwd) {
			User u=null;
			try {
				conn=(Connection) DriverManager.getConnection(dbUrl, username, password);
				String sql="SELECT * FROM teacher WHERE username=? and userpassword=?";
				stmt=(PreparedStatement) conn.prepareStatement(sql);	
				stmt.setString(1,un);
				stmt.setString(2,pwd);
				rs=stmt.executeQuery();
				if(rs.next()) {
					u=new User();
					u.setUsername(rs.getString(2));
					u.setPassword(rs.getString(3));
				}
			}catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
			if(u.getUsername()!=null&&u.getPassword()!=null) {
				return true; 
			}
			return false;
		}
//		public  static void main(String [] args) {
//			String name="张三1";
//			String pwd="123";
//			ConnDB connDB=new ConnDB();
//			if(connDB.findUser(name, pwd))System.out.println("1");
//			System.out.println(u.getUsername());
//			System.out.println(u.getPassword());
//		}
}

  

package zuoye;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.Scanner;

public class FirstProject {
	public static Random random=new Random();
	private char[] sign1= {'+','-','*','/'};//符号
	private char[] sign2= {'√','^','%'};//根号,平方和,取余(可加可不加)
	private String[] sign3= {"sin","cos","tan"};//三角函数
	private static String [] grade={"小学","初中","高中"};
	int p=3;//算式符号出现的概率1/3
	String iniD="D:/java/calculate/";//初始目录
	
	//work方法用以执行整个过程
	public void work(String un,String pwd,String g,int n) throws IOException {
		Scanner scanner=new Scanner(System.in);
		FirstProject f=new FirstProject();
	
		//做计算//创建文件
			SimpleDateFormat dFormat=new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
			String title=dFormat.format(new Date()).toString();
			File file=new File(iniD+un+"/");
			if(!file.exists()) {
				file.mkdirs();
			}
			file=new File(iniD+un+"/"+title+".txt");
			FileOutputStream out=new FileOutputStream(file) ;
			PrintStream printToFile=new PrintStream(out);
			PrintStream printToConsole=System.out;
			f.prepare(g);
			
			if(!f.judgeover(n))
			System.out.println("数量应在10~30,请重新输入");
				
			//第一次题目的输出
			else f.result(f, n, g, printToFile, printToConsole);
			//System.out.println("请输入“切换为xx”或者“继续输入”");
	}
	public void result(FirstProject f,int n,String g,PrintStream printToFile,PrintStream printToConsole) throws IOException {
		System.out.println("开始输出到文件");
		System.setOut(printToFile);
		f.calculate(4,n,g);
		System.setOut(printToConsole);
		System.out.println("输出成功");
	}
	public void prepare(String g) {
		Scanner scanner=new Scanner(System.in);
		System.out.println("当前选择为"+g+"出题");
		System.out.println("准备生成"+g+"数学题目,请输入生成题目数量:");
	}
	
	public boolean judgeover(int n) {//判定题数是否合适
		if(n<10||n>30) {
			return false;
		}
		return true;
	}
		
	public void calculate(int si,int n,String g) {//计算过程 si表示sign1用到的符号个数,n表示数字个数
		System.out.println(g+"试卷");
		for(int i=0;i<n;i++) {
			boolean [] cou= {false,false,false};//用以判定直到最后是否出现了根号,三角函数,如果没有,就让最后一个数带上
			int count=random.nextInt(2)+3;//操作数的个数
			System.out.print(i+1+"、");
			for(int j=0;j<count;j++) {
				int number=random.nextInt(100)+1;
				int number2=random.nextInt(100)+1;
				int temp=0;
				
				int bracket=random.nextInt(p);//随机出现括号,概率为1/3
				int sqrt=random.nextInt(p);
				int square=random.nextInt(p);
				int tri=random.nextInt(p);
				if(bracket==2) {//加括号的情况输出类似于(x+y)-
					bracket(number, number2, temp, si);
					System.out.print(sign1[temp]);
					j++;
				}
				if(g.equals(grade[1])&&(sqrt==2)){//只输出根号		
					sqrt();
					cou[1]=true;
				}
				if(g.equals(grade[2])&&tri==2) {//只输出三角函数符号
					trigonometric();
					cou[2]=true;
				}
				if(j==count-1&&g.equals(grade[2])&&!cou[2])trigonometric();
				System.out.print(number);
				if(g.equals(grade[1])&&(square==2)){//只输出平方		
					square();
//					cou[3]=true;
				}
				temp=random.nextInt(si);
				if(j<count-1) System.out.print(sign1[temp]);//保证最后一个符号是数字
//				if(j==count-1&&g.equals(grade[1])&&!cou[1]&&!cou[3])square();
			}
			System.out.println("=");
			System.out.println();
		}
	}
	public void bracket(int number,int number2,int temp,int sig) {
			System.out.print("(");
			System.out.print(number);
			temp=random.nextInt(sig);
			System.out.print(sign1[temp]);
			System.out.print(number2);
			System.out.print(")");
	}
	//根号和平方位置不同,只能分开,目前不知道怎么办,很烦
	public void sqrt() {
		System.out.print(sign2[0]);
	}
	public void square() {
		System.out.print(sign2[1]);
	}
	public void trigonometric() {
		int temp=random.nextInt(3);
		System.out.print(sign3[temp]);
	}

	
}

  

package zuoye;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.TextField;
import java.net.PasswordAuthentication;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class LoginFrame extends JFrame{
	public void showUI() {
		this.setTitle("界面");
		this.setSize(400, 300);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//		this.setLayout(new FlowLayout());
		this.setLayout(new GridLayout());
		
		Container container=getContentPane();
		container.setLayout(new GridLayout(4, 2,10,10));
		JLabel label=new JLabel("用户名");
		JTextField username=new JTextField(50);
		container.add(label);
		container.add(username);
		
		JLabel label2=new JLabel("密码");
		JPasswordField password=new JPasswordField(100);
		this.add(label2);
		this.add(password);
		
		LoginListener login=new LoginListener();
		login.setC(username, password);//传用户名和密码
		JButton btn1=new JButton("登录");
		JButton btn2=new JButton("注册");
		btn1.addActionListener(login);
		btn2.addActionListener(login);
		this.add(btn1);
		this.add(btn2);
		this.setVisible(true);
	}
	public static void main(String[] args) {
		LoginFrame l=new LoginFrame();
		l.showUI();
	}
}

  

package zuoye;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.PasswordAuthentication;

import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class LoginListener implements ActionListener{
	String [] UserName= {"张三1","张三2","张三3","李四1","李四2","李四3","王五1","王五2","王五3"};
	FirstProject f=new FirstProject();
	CalFrame cFrame=new CalFrame();
	String Arr="";
	JTextField username;
	JPasswordField password;
	public void setC(JTextField username,JPasswordField password) {
		this.username=username;
		this.password=password;
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		Arr=e.getActionCommand();
		String un=username.getText();
	    String pwd=String.valueOf(password.getPassword());//获取密码的方式比较特殊
	    System.out.println(un+pwd);
	    ConnDB connDB=new ConnDB();
	   
		if("登录".equals(Arr)) {
			//这一行if用以在数据库中查找,如果不连接mysql,就注释,在数组中查找
			 //if(connDB.findUser(un, pwd))
			for(int i=0;i<9;i++) {
				if(un.equals(UserName[i])&&pwd.equals("123")) {
					cFrame.showUI(un,pwd);
					break;
				}
				else if(i==8)System.out.println("用户名或密码错误");
			}	
		}
		
		
		
	}
}

  

package zuoye;

public class User {
	private String username;
	private String password;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	
}

  

猜你喜欢

转载自www.cnblogs.com/Need-GF/p/9716645.html