You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

127 lines
4.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class uml10_10 {
// 将任意进制字符串转换为十进制整数
public static int toDecimal(String number, int base) {
int decimal = 0;
int power = 0;
// 从字符串的末尾开始处理
for (int i = number.length() - 1; i >= 0; i--) {
char digit = number.charAt(i);
// 如果是数字字符0-9
if (Character.isDigit(digit)) {
int value = Character.getNumericValue(digit);
decimal += value * Math.pow(base, power);
}
// 如果是字母字符A-F 或 a-f表示10-15
else if (Character.isLetter(digit)) {
char upperDigit = Character.toUpperCase(digit);
int value = upperDigit - 'A' + 10;
decimal += value * Math.pow(base, power);
} else {
throw new IllegalArgumentException("Invalid character in number: " + digit);
}
power++;
}
return decimal;
}
// 将十进制整数转换为任意进制字符串
public static String fromDecimal(int number, int base) {
if (number == 0) {
return "0";
}
StringBuilder result = new StringBuilder();
char[] digits = "0123456789ABCDEF".toCharArray(); // 支持到16进制
boolean isNegative = number < 0;
if (isNegative) {
number = -number;
}
while (number > 0) {
int remainder = number % base;
result.insert(0, digits[remainder]);
number /= base;
}
if (isNegative) {
result.insert(0, '-');
}
return result.toString();
}
public static void main(String[] args) {
// 创建窗口
JFrame frame = new JFrame("进制转换器");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
frame.setLayout(new GridLayout(5, 2)); // 网格布局
// 创建组件
JLabel sourceBaseLabel = new JLabel("源进制2-16");
JTextField sourceBaseField = new JTextField();
JLabel targetBaseLabel = new JLabel("目标进制2-16");
JTextField targetBaseField = new JTextField();
JLabel numberLabel = new JLabel("要转换的数字:");
JTextField numberField = new JTextField();
JButton convertButton = new JButton("转换");
JLabel resultLabel = new JLabel("转换结果:");
// 添加组件到窗口
frame.add(sourceBaseLabel);
frame.add(sourceBaseField);
frame.add(targetBaseLabel);
frame.add(targetBaseField);
frame.add(numberLabel);
frame.add(numberField);
frame.add(convertButton);
frame.add(resultLabel);
// 添加按钮事件处理
convertButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
int sourceBase = Integer.parseInt(sourceBaseField.getText().trim());
int targetBase = Integer.parseInt(targetBaseField.getText().trim());
String number = numberField.getText().trim();
// 验证源进制数字是否有效
for (char c : number.toCharArray()) {
if (!Character.isDigit(c) &&
!(Character.isLetter(c) && (Character.toUpperCase(c) >= 'A' && Character.toUpperCase(c) <= 'F') && sourceBase > 10)) {
throw new IllegalArgumentException("Invalid character in source base number: " + c);
}
}
// 将源进制数字转换为十进制
int decimalNumber = toDecimal(number, sourceBase);
// 将十进制数字转换为目标进制
String convertedNumber = fromDecimal(decimalNumber, targetBase);
// 显示结果
resultLabel.setText("转换后的" + targetBase + "进制数字是:" + convertedNumber);
} catch (IllegalArgumentException ex) {
JOptionPane.showMessageDialog(frame, "错误: " + ex.getMessage(), "输入错误", JOptionPane.ERROR_MESSAGE);
}
}
});
// 显示窗口
frame.setVisible(true);
}
}