应用所学面向对象程序设计的知识和理论,设计一个数组处理系统,系统要求实现以下基本功难:
(1)要具有基本的gui界面
(2)自动生成随机的整数数组;数组保存到指定的文件;对数组进行升序、降序排列;查找出最小值/最大值所在的数组元素,包括元素下标和元素值;计算数组的平均值
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class ArrayProcessingSystem extends JFrame implements ActionListener{
private static final long serialVersionUID = 1L;
private JLabel label;
private JTextField textField;
private JButton button;
private String arrayString;
public ArrayProcessingSystem() {
super("数组处理系统");
setBounds(100, 100, 400, 150);
setLayout(new FlowLayout());
label = new JLabel("生成一个包含多少个随机整数的数组:");
add(label);
textField = new JTextField(10);
add(textField);
button = new JButton("生成数组");
add(button);
button.addActionListener(this);
}
public void actionPerformed(ActionEvent event) {
if (event.getSource() == button) {
int num = Integer.parseInt(textField.getText());
Random r = new Random();
int[] array = new int[num];
arrayString = "随机生成的数组为:\n[";
for (int i = 0; i < num; i++) {
array[i] = r.nextInt(100);
arrayString += array[i];
if (i != num - 1) {
arrayString += ", ";
}
}
arrayString += "]";
label.setText(arrayString);
}
}
public static void main(String[] args) {
ArrayProcessingSystem arrayProcessingSystem = new ArrayProcessingSystem();
arrayProcessingSystem.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
arrayProcessingSystem.setVisible(true);
}
}
编写回溯算法代码时,要先考虑这个问题是一个什么搜索树,然后套用那个搜索树模板就行了。(例如:子集树就是:判断是否满足约束条件——计算、x[i]=1——递归左子树——归还——x[i]=0、递归右子树(注意限界思想))
(例如:排列树就是:循环——判断是否满足约束条件——交换——计算——递归(注意限界思想)——归还)
当然具体算法要具体分析
还要注意及时更新解和存储解,别忘了进入右子树、循环结束前,要将你算的、交换过的东西,要归还回去。注意到达叶结点干什么,没有到达怎么做
而分支限界算法的代码编写,首先编写三个类:活结点类、活结点属性类、入队类。然后选择好什么样的队列方式。一定要考虑好属性,然后什么时候添加结点、以及出队、和存储最优解
两个算法编写,还要注意限界函数的设置,怎么设计一个好的代价函数可以裁掉更多的空间。这就是两个算法的优化思想。
当然最重要的还要考虑好约束条件。
具体逻辑代码还是多写多练。多去总结。这里也就只讲个大体思路。