一、快递 E 栈
问题描述
功能介绍:
- 角色切换(快递员和普通用户)
快递员功能:存快递,删除快递,修改快递,查看所有快递
普通用户功能:取快递- 存快递
- 删除快递
- 修改快递
- 查看所有快递
- 取快递
解题思路
代码
错误代码
import java.util.Scanner;
public class Test11 {
static Scanner input = new Scanner(System.in);
static int length = 100;
static String[] numbers = new String[length];
static String[] companies = new String[length];
static int[] codes = new int [length];
static int index = -1;///查找空位置,进行添加
public static void main(String[] args) {
while(true) {
System.out.println("=====欢迎使用新职课快递柜=====");
System.out.println("请输入您的身份:1-快递员,2-用户");
int n = input.nextInt();
switch(n) {
case 1:
deliverChoose();
break;
case 2:
userChoose();
break;
default:System.out.println("输入错误,请重新正确输入您的身份。");
}
}
}
private static void deliverChoose() {
System.out.println("请选择操作:1-存快递 2-删除快递 3-修改快递信息 4-查看所有快递");
int n = input.nextInt();
switch(n) {
case 1:
saveDelivery();
break;
case 2:
deleteDelivery();
break;
case 3:
modifyDelivery();
break;
case 4:
checkDelivery();
break;
default:System.out.println("输入有误,请重新开始");
}
}
private static void userChoose() {
System.out.println("请输入取件码:");
int code = input.nextInt();
for(int i = 0; i < codes.length; i ++) {
if(codes[i] != 0 && codes[i] == code) {
index = i;
break;
}
}
if(index == -1) {
System.out.println("未找到该快递");
}else {
//取快递
numbers[index] = null;
companies[index] = null;
codes[index] = 0;
System.out.println("取件成功");
}
}
private static void saveDelivery() {
System.out.println("请输入快递单号");
String num = input.next();
System.out.println("请输入快递公司");
String company = input.next();
int code =(int)(Math.random()*1000)+1;//生成随机数
for(int i = 0; i < numbers.length; i ++) {
if(numbers[i] == null) {
index = i;
break;
}
}
if(index == -1) {
System.out.println("快递柜已满,无法存入");
}else {
numbers[index] = num;
companies[index] = company;
codes[index] = code;
System.out.println("快递已存入,取件码是:" + code);
}
}
private static void deleteDelivery() {
System.out.println("请输入要删除的快递单号:");
String num = input.next();
//判断是否有该快递单号
for(int i = 0; i < numbers.length; i ++) {
if(numbers[i] != null && numbers[i].equals(num)) {
index = i;
//break;
}
}
if(index == -1) {
System.out.println("未查到快递。");
}else {
numbers[index] = null;
companies[index] = null;
codes[index] = 0;
System.out.println("删除成功。");
}
}
private static void modifyDelivery() {
System.out.println("请输入要修改的快递单号:");
String num = input.next();
//查找快递号是否存在
for(int i = 0; i < numbers.length; i ++) {
if(numbers[i] != null && numbers[i].equals(num)) {
index = i;
break;
}
}
if(index == -1) {
System.out.println("未找到快递。");
}else {
//判断新的号码是否跟以前已有的相同
for(int i = 0; i < numbers.length; i ++) {
System.out.println("请输入新的快递单号:");
String newNum = input.next();
if(numbers[i].equals(newNum)) {
break;
}else {
System.out.println("请输入新的公司名称");
String company1 = input.next();
//取件码不修改
numbers[index] = newNum;
companies[index] = company1;
System.out.println("修改成功");
break;
}
}
}
}
private static void checkDelivery() {
if(numbers[0] == null) {
System.out.println("快递柜为空,暂无数据");
}else {
System.out.println("所有快递信息如下:");
System.out.println("快递单号\t公司名称\t取件码");
for(int i = 0; i < numbers.length; i ++) {
if(numbers[i] != null) {
System.out.println(numbers[i] + "\t" + companies[i] + "\t" + codes[i]);
}
}
}
}
}
运行结果(错误):
输入多次相同的取件码,显示还是取件成功!?
错误源
主要是static关键字未能很好运用,代码中用index查找空位置且被static修饰,此时index一开始就被赋值-1,然后在代码中其他方法执行时,会改变其值,但是这个值是被改变之后的值,而不是-1了,接下来如果运用到index则会使用改变后的值。故出现上面的错误。
知识补充
涉及到static关键字,这个关键字是在该类被第一次加载的时候,就会去加载被static修饰的部分,而且只在类第一次使用时加载并进行初始化,注意这是第一次用就要初始化,后面根据需要是可以再次赋值的。
想了解更更多关于static关键字,那就可以阅读这篇博客Java 关键字static 还搞不懂?看这一篇文章就足够了!详细解释!
正确代码
import java.util.Random;
import java.util.Scanner;
/**
* @Author: 爱摸鱼的TT~
* @Description: 快递E栈
* 运用 变量,流程控制,数组 三部分知识
* @Date Created in 2021-03-25 19:29
* @Modified By:
*/
public class Demo {
static Scanner input = new Scanner(System.in);
static String[] number = new String[100];// 快递单号
static String[] company = new String[100];// 快递公司
static int[] code = new int[100];// 快递取件码
public static void main(String[] args) {
f:while (true) {
System.out.println("-------- 欢迎使用爱摸鱼的TT~快递柜--------");
System.out.println("请输入您的身份:1-快递员,2-用户, 0-退出系统");
int num = input.nextInt();
switch(num){
case 1: // 快递员
deliverChoose();
break;
case 2: // 用户
userChoose();
break;
case 0:// 退出系统
exit();
break f;
default:
System.out.println("您输入有误,请重新输入");
}
}
}
private static void exit() {
System.out.println("欢迎您下次使用爱摸鱼的TT~快递系统");
}
private static void deliverChoose() {
System.out.println("请选择操作:1-存快递,2-删快递,3-修改快递,4-查看所有快递");
int num = input.nextInt();
switch (num) {
case 1://存快递
saveDelivery();
break;
case 2://删快递
deleteDelivery();
break;
case 3:// 改快递
modifyDelivery();
break;
case 4: // 查找快递
checkDelivery();
break;
default:
System.out.println("输入有误,请重新输入!");
}
}
private static void checkDelivery() {
boolean flag = false;
for (int i = 0; i < number.length; i ++){
if(number[i] != null){
flag = true;
}
}
if(flag == false){
System.out.println("快递柜为空,暂无数据");
}else{
System.out.println("所有快递信息如下:");
System.out.println("快递单号\t公司名称\t取件码");
for(int i = 0 ; i <number.length; i ++){
if(number[i] != null){
System.out.println(number[i] + "\t" + company[i] + "\t" + code[i]);
}
}
}
}
private static void modifyDelivery() {
int index = -1;
System.out.println("请输入要修改的快递单号:");
String num= input.next();
//查询是否存在该快递单号
for(int i = 0; i < number.length; i ++){
if(number[i] != null && number[i].equals(num)){
index = i;
break;
}
}
if(index == -1){
System.out.println("未找到该快递!");
}else{
System.out.println("请输入新的快递单号:");
String num_1 = input.next();
// 判断新的快递单号是否存在相同的
for(int i = 0; i <number.length; i ++) {
if (number[i] != null && number[i].equals(num_1)) {
System.out.println("该快递单号与已有的重复,请重新输入!");
System.out.println("请再次输入新的快递单号:");
num_1 = input.next();
}
}
System.out.println("请输入新的快递公司:");
String company_1 = input.next();
// 取件码不变
number[index] = num_1;
company[index] = company_1;
System.out.println("修改成功!");
}
}
private static void deleteDelivery() {
int index = -1; // 标记
System.out.println("请输入您要删除的快递单号:");
String num = input.next();
// 判断是否存在该快递单号
for(int i = 0; i < number.length; i ++){
if(number[i] != null && number[i].equals(num)){
index = i;
break;
}
}
// 判断该快递单号的快递是否找到
if(index == -1){
System.out.println("未找到该快递");
}else{
number[index] = null;
company[index] = null;
code[index] = 0;
System.out.println("删除成功!");
}
}
private static void saveDelivery() {
int index = -1; // 标记
System.out.println("请输入快递单号:");
String num_1 = input.next();
System.out.println("请输入快递公司:");
String company_1 = input.next();
// 生成随机数
Random random = new Random();
int codes = random.nextInt(999999);
f:for(int i = 0; i < number.length; i ++){
if(number[i] == null){
index = i;
break;
}
}
// 判断快递柜是否存满
// 若可以存储,还要比较新的快递单号是否与以往相同
// 若不相同,则把相应信息存储在内
if(index == -1){
System.out.println("快递柜已存满,无法存入了!");
}else{
// 判断快递单号是否已存在(*)
for(int i = 0; i < number.length; i++){
if(number[i] != null && number[i].equals(num_1)){
System.out.println("该快递单号已存在,请重新输入新的快递单号!");
num_1 = input.next();
}else{
number[index] = num_1;
company[index] = company_1;
code[index] = codes;
System.out.println("快递已存入,取件码是:" + codes);
break;
}
}
}
}
private static void userChoose() {
int index = -1; // 标记
System.out.println("请输入取件码:");
int num = input.nextInt();
for(int i = 0; i < code.length; i++){
if(code[i] != 0 && code[i] == num){
index = i;
break;
}
}
if(index == -1){
System.out.println("未找到相应的快递!");
}else{ // 取件成功
// 将相对应的快递单号、公司、取件码都删除。
number[index] = null;
company[index] = null;
code[index] = 0;
System.out.println("取件成功,欢迎下次使用!");
}
}
}
运行结果: