《Java编程语言:原理与范例》课后实验源代码

更新时间:2024-05-03 05:21:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第一章 实验一

package ch01;

import java.text.SimpleDateFormat; import java.util.Date;

class Timer extends Thread {

private SimpleDateFormat sdf = new SimpleDateFormat(\年MM月dd日 HH:mm:ss\

public void run() { while (true) {

System.out.print(\现在时间是:\ Date now = new Date();

System.out.print(sdf.format(now)); try {

sleep(1000);

} catch (InterruptedException e) { e.printStackTrace(); } } } }

public class Clock {

public static void main(String[] args) { Timer timer = new Timer(); timer.start(); } }

实验二

package ch01;

import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Random;

import javax.swing.JButton; import javax.swing.JFrame;

public class MagicButton extends MouseAdapter { JFrame win;

JButton button = new JButton(\你点不到我\ Random rand = new Random();

void initUI() {

win = new JFrame(); win.setLayout(null);

button.setSize(100, 40);

button.addMouseListener(this);

win.add(button);

win.setSize(400, 300); win.setResizable(false);

win.setLocationRelativeTo(null);

win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); win.setVisible(true); }

public static void main(String[] args) {

MagicButton demo = new MagicButton(); demo.initUI(); }

public void mouseEntered(MouseEvent e) { int mouseX = button.getX() + e.getX(); int mouseY = button.getY() + e.getY();

while (true) {

int buttonX = rand.nextInt(win.getWidth() - button.getWidth()); int buttonY = rand.nextInt(win.getHeight() - button.getHeight()); button.setLocation(buttonX, buttonY);

if (!button.getBounds().contains(mouseX, mouseY)) { break; } } } }

第二章 实验一

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

2. 交换两个变量的值(不允许使用中间变量)。 **********************************/ package ch03;

public class Exp2_2 { public static void main(String[] args) { int a = 2, b = 3; int s = a * b; a = s / a; b = s / a; System.out.println(\ } }

实验二

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

3. 逆序输出一个7位整数,如8639427输出为7249368(不允许使用循环语句)。 **********************************/ package ch03;

public class Exp2_3 { public static void main(String[] args) { long a = 8639427; System.out.print(a % 10); System.out.print(a / 10 % 10); System.out.print(a / 100 % 10); System.out.print(a / 1000 % 10); System.out.print(a / 10000 % 10); System.out.print(a / 100000 % 10); System.out.print(a / 1000000 % 10); } }

实验三

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

4. 对于int型变量a,以最快的速度计算34×a的值。 **********************************/ package ch03;

public class Exp2_4 { public static void main(String[] args) { int a = 3; int b = (a << 5) + (a << 1);

System.out.println(a + \ } }

实验四

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

5. 字符型变量ch中存放着一个大小写未知的英文字母,判断其大小写后,将ch的值转为小写或大写字母(不允许使用加减运算符和if语句)。 **********************************/ package ch03;

public class Exp2_5 { public static void main(String[] args) { char ch = 'E'; ch = (char) ((ch & 32) == 0 ? ch | 32 : ch & (Integer.MAX_VALUE - 32)); System.out.println(\ } }

实验5

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

6. 使用嵌套的条件运算符,求a、b、c中的最大者。 **********************************/ package ch03;

public class Exp2_6 { public static void main(String[] args) { int a = 2, b = 4, c = 3; int max = (a > b ? a : b) > c ? (a > b ? a : b) : c; System.out.println(\ } }

第三章 实验一

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

2. 使用循环结构逆序输出任意位数的整数。 **********************************/ package ch04;

import java.util.Scanner;

public class Exp3_2 { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println(\输入整数:\ long n = s.nextLong(); while (n > 0) { System.out.print(n % 10); n /= 10; } } }

实验二

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

3. 输出以下由数字组成的菱形(要求将输出行数存放于变量中以便随时更改)。 1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1 1 2 3 2 1 1 2 1 1

**********************************/ package ch04;

import java.util.Scanner;

public class Exp3_3 { public static void main(String[] args) { int rows; Scanner s = new Scanner(System.in); System.out.print(\输入行数:\ rows = s.nextInt(); for (int i = -rows / 2; i <= rows / 2; i++) {

return i; } } return i; } void insert(int i, int x) { for (int j = a.length - 2; j >= i; j--) { a[j + 1] = a[j]; } a[i] = x; } public static void main(String[] args) { Exp4_2 t = new Exp4_2(); t.print(false); System.out.print(\输入要插入的数:\ Scanner s = new Scanner(System.in); int x = s.nextInt(); int i = t.findInsertLocation(x); if (i == -1) { System.out.println(x + \在数组中已经存在,放弃插入!\ } else { t.insert(i, x); t.print(true); } } }

实验三

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

3. 找出阶数不小于8的方阵的鞍点值及位置(鞍点值在该行上最大、该列上最小),若无鞍点则提示。

**********************************/ package ch05;

import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.Scanner; /**

* 鞍点对象类 */

class AnDian { private int row; // 鞍点所在行下标 private int col; // 鞍点所在列下标 private int value; // 鞍点值 // 完全构造方法 public AnDian(int row, int col, int value) { this.row = row; this.col = col; this.value = value; } // getters and setters public int getRow() { return row; } public void setRow(int row) { this.row = row; } public int getCol() { return col; } public void setCol(int col) { this.col = col; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } } /**

* 测试类(整体上是若干个并列的2重循环,时间复杂度较3重循环低) */

public class Exp4_3 {

int[][] a; // 矩阵 int maxOfRows[]; // 存放每行的最大值 int minOfCols[]; // 存放每列的最小值 final int LIMIT = 3; // 矩阵元素值的上限(为测试方便此处写死,也可在运行时由用户输入) // 初始化矩阵 void initArray() { Scanner scanner = new Scanner(System.in); System.out.print(\输入矩阵行数:\ int m = scanner.nextInt(); // 矩阵行数 System.out.print(\输入矩阵列数:\ int n = scanner.nextInt(); // 矩阵列数 // 构造各数组 a = new int[m][n]; maxOfRows = new int[m]; minOfCols = new int[n]; // 以随机数填充矩阵 Random random = new Random(); for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[i].length; j++) { a[i][j] = random.nextInt(LIMIT); } } // 记录每行的最大值 int max; for (int i = 0; i < a.length; i++) { max = a[i][0]; for (int j = 1; j < a[i].length; j++) { if (max < a[i][j]) { max = a[i][j]; } } maxOfRows[i] = max; } // 记录每列的最小值 int min; for (int j = 0; j < a[0].length; j++) { min = a[0][j]; for (int i = 1; i < a.length; i++) {

if (min > a[i][j]) { min = a[i][j]; } } minOfCols[j] = min; } } // 打印矩阵 void printArray() { System.out.println(\得到的矩阵为:\ for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[i].length; j++) { System.out.printf(\ } System.out.println(); } } // 找鞍点(可能有多个),返回类型为线性表类型(List),尖括号语法为泛型,表示线性表的元素为AnDian对象,具体看教材 List findAnDian() { List anDians = new ArrayList(); // 构造线性表对象 for (int i = 0; i < a.length; i++) { // 扫描矩阵中的每个元素 for (int j = 0; j < a[i].length; j++) { // 是当前行最大且当前列最小 if (a[i][j] == maxOfRows[i] && a[i][j] == minOfCols[j]) { AnDian p = new AnDian(i, j, a[i][j]); // 构造AnDian对象 anDians.add(p); // 加入AnDian对象到线性表 } } } return anDians; // 返回线性表 } // 测试入口 public static void main(String[] args) { Exp4_3 o = new Exp4_3(); o.initArray(); o.printArray(); List anDians = o.findAnDian(); System.out.println(\ if (anDians.size() == 0) { // 返回的线性表元素个数为0

System.out.println(\没有鞍点。\ } else { int i = 0; for (AnDian e : anDians) { // 迭代性for循环的语法也可用于线性表类型 System.out.printf(\鞍点%-4d:a[%-3d][%-3d] = %-8d\\n\++i, e.getRow(), e.getCol(), e.getValue()); } } } }

实验四

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

4. 编写如下图所示的程序以模拟命令行的copy命令。 **********************************/ package ch05;

public class Exp4_4 { public static void main(String[] args) { if (args.length != 2) { System.err.println(\命令语法不正确,使用格式为:java Exp4_4 要复制的文件 复制到的路径\ return; } System.out.println(\成功将\\\复制到 \\\。\ } }

实验五/*********************************

5. 输出如上图所示的循环移位方阵(第一行存于一维数组,循环右移该行元素一个位置以产生下一行,以此类推)。

7 4 8 9 1 5 5 7 4 8 9 1 1 5 7 4 8 9 9 1 5 7 4 8 8 9 1 5 7 4 4 8 9 1 5 7

**********************************/ package ch05;

public class Exp4_5 { void shift(int[] a) { int last = a[a.length - 1]; for (int i = a.length - 2; i >= 0; i--) { a[i + 1] = a[i]; }

public class Exp7_5 extends JFrame { private JPanel[] thumbPanels; // 缩略图面板数组 private JLabel[] thumbLabels; // 缩略图标签数组 private File[] imageFiles; // 图片文件数组 private JScrollPane bottom; // 下部的可滚动面板 private int currentImageId = -1; // 当前查看的图片id private JLabel fullImageLabel; // 完整图片标签 private JButton next; // 下一张按钮 private JButton pre; // 上一张按钮 // 获得path路径下所有的图片,并生成面板 private JPanel[] getThumbPanels(String path) throws URISyntaxException { URL url = super.getClass().getClassLoader().getResource(path); File dir = new File(url.toURI()); // 图片根目录 imageFiles = dir.listFiles(); // 得到目录下的所有文件 thumbPanels = new JPanel[imageFiles.length]; thumbLabels = new JLabel[imageFiles.length]; // 鼠标点击缩略图标签的事件监听器 MouseListener mouseListener = new MouseAdapter() { public void mouseClicked(MouseEvent e) { JLabel clickedLabel = (JLabel) (e.getSource());// 得到点击的那个标签 for (int i = 0; i < thumbLabels.length; i++) {// 所有标签边框复位 thumbLabels[i].setBorder(BorderFactory.createLineBorder(Color.BLACK)); if (thumbLabels[i] == clickedLabel) { currentImageId = i; // 修改当前查看的图片id } } clickedLabel.setBorder(BorderFactory.createLineBorder(Color.RED, 5));// 点击的标签加框 ImageIcon image = new ImageIcon(imageFiles[currentImageId].getAbsolutePath()); // 伸缩图片到上部完整图片标签大小 image.setImage(image.getImage().getScaledInstance(fullImageLabel.getWidth(), fullImageLabel.getHeight(), Image.SCALE_DEFAULT)); fullImageLabel.setIcon(image); checkButtons();// 更新上一张/下一张按钮的状态 } // 鼠标进入缩略图标签时改变鼠标指针

public void mouseEntered(MouseEvent e) { JLabel imageLabel = (JLabel) (e.getSource()); imageLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); } }; for (int i = 0; i < imageFiles.length; i++) { ImageIcon image = new ImageIcon(imageFiles[i].getAbsolutePath()); JPanel p = new JPanel(new BorderLayout()); thumbLabels[i] = new JLabel(); // 缩放图片到缩略图标签大小 thumbLabels[i].setIcon(new ImageIcon(image.getImage().getScaledInstance(100, 80, Image.SCALE_DEFAULT))); thumbLabels[i].setBorder(BorderFactory.createLineBorder(Color.BLACK)); thumbLabels[i].addMouseListener(mouseListener); // 加鼠标事件监听器 JLabel textLabel = new JLabel(imageFiles[i].getName()); // 图片下方文字标签 textLabel.setHorizontalAlignment(JLabel.CENTER); p.add(thumbLabels[i], BorderLayout.CENTER); p.add(textLabel, BorderLayout.SOUTH); thumbPanels[i] = p; } return thumbPanels; } void initUI() throws URISyntaxException { fullImageLabel = new JLabel(); fullImageLabel.setBorder(BorderFactory.createLineBorder(Color.RED)); next = new JButton(new ImageIcon(super.getClass().getClassLoader().getResource(\ pre = new JButton(new ImageIcon(super.getClass().getClassLoader().getResource(\ // 上一张/下一张按钮点击事件的监听器 ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent e) { if (e.getSource() == next) { currentImageId++; } else { currentImageId--; }

// 复位所有缩略图标签的边框 for (int i = 0; i < thumbLabels.length; i++) { thumbLabels[i].setBorder(BorderFactory.createLineBorder(Color.BLACK)); } // 选中相应的缩略图标签 thumbLabels[currentImageId].setBorder(BorderFactory.createLineBorder(Color.RED, 5)); // 滚到到该缩略图标签 bottom.getHorizontalScrollBar().setValue(thumbPanels[currentImageId].getLocation().x); // 改变上部的完整图片标签 ImageIcon image = new ImageIcon(imageFiles[currentImageId].getAbsolutePath()); image.setImage(image.getImage().getScaledInstance(fullImageLabel.getWidth(), fullImageLabel.getHeight(), Image.SCALE_DEFAULT)); fullImageLabel.setIcon(image); checkButtons(); } }; next.addActionListener(listener); pre.addActionListener(listener); JPanel buttonsPanel = new JPanel(); buttonsPanel.add(pre); buttonsPanel.add(next); // 上部面板(包含完整图片标签和2个按钮) JPanel top = new JPanel(new BorderLayout(0, 10)); top.add(fullImageLabel, BorderLayout.CENTER); top.add(buttonsPanel, BorderLayout.SOUTH); top.setSize(705, 410); top.setLocation(5, 5); add(top); // 下部缩略图面板 JPanel thumbPanel = new JPanel(); bottom = new JScrollPane(thumbPanel); JPanel[] thumbPanels = getThumbPanels(\ for (int i = 0; i < thumbPanels.length; i++) { thumbPanel.add(thumbPanels[i]);

}

}

}

setLayout(null);

bottom.setSize(705, 130); bottom.setLocation(5, 430); add(bottom);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); setSize(720, 600); setVisible(true);

private void checkButtons() { if (currentImageId == 0) { // 第一张 pre.setEnabled(false); } if (currentImageId == imageFiles.length - 1) { // 最后一张 next.setEnabled(false); } if (currentImageId > 0 && currentImageId < imageFiles.length - 1) { pre.setEnabled(true); next.setEnabled(true); } }

public static void main(String[] args) throws URISyntaxException { Exp7_5 t = new Exp7_5(); t.initUI(); }

第八章 实验一

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

1. 点击窗口的关闭按钮时,弹出包含“是”和“否”选项的模态对话框, 点击“是”则关闭窗口,否则不关闭。 **********************************/ package ch09;

import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

public class Exp8_1 extends JFrame { void initUI() { addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { int b = JOptionPane.showConfirmDialog(Exp8_1.this, \确认要关闭按窗口吗?\提示\ if (b == JOptionPane.YES_OPTION) { System.exit(-1); } } }); setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); setResizable(false); setSize(600, 400); setVisible(true); } public static void main(String[] args) { Exp8_1 t = new Exp8_1(); t.initUI(); } }

实验二

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

2. 编写GUI程序模拟IE浏览器,具体要求如下。

① 在窗口顶部有一个可编辑的下拉列表,以输入网址。

② 若输入的网址之前未输入过,则添加到下拉列表中(模拟IE的历史记录)。 ③ 输入或选择了一个网址后,在窗口下部的编辑器面板中显示相应网页。 **********************************/

本文来源:https://www.bwwdw.com/article/nbmg.html

Top