Bootstrap

CH2-Java编程基础(7个案例实现)

【案例2-1】 库房出入货物程序设计

【案例介绍】

  1. 任务描述

​ 现要对华为和小米两种手机产品进行入库,本案例要求编写一个模拟商品入库的程序,可以在控制台输入入库商品的数量,最后打印出仓库中所有商品详细信息以及所有商品的总库存数和库存商品总金额。

商品信息如下:

  • 品牌型号

  • 尺寸

  • 价格

  • 配置

  • 库存

  • 总价

  1. 运行结果

手机屏幕截图  描述已自动生成

图2-1 运行结果

【案例目标】

  • 学会分析”库房出入货物”任务实现的逻辑思路。

  • 能够独立完成”库房出入货物”程序的源代码编写、编译以及运行。

  • 能够在程序中使用算术运算符进行运算操作。

  • 能够在程序中使用赋值运算符进行赋值操作。

  • 掌握Java中的变量和运算符的知识点。

【案例思路】

​ (1) 查看运行结果后,可以将该程序分为3部分实现(商品入库、库存清单、总库存数与库存商品总金额)

​ (2) 商品入库是变化的数据,需要记录商品信息后打印,通过运行结果,我们可以分析出如下属性。

​ 品牌型号:商品的名称,String类型。

​ 尺寸:手机的大小,double类型。

​ 价格:手机的单价,double类型。

​ 配置:手机的内存等配置,String类型。

​ 库存数:此项数据为用户输入的数据,用户输入需要使用Scanner类,以下代码使用户能够从System.in中读取一个数字。

Scanner sc1 = new Scanner(System.in);

int Count=sc1.nextInt();

​ 总价:经过计算后打印,可以设置单独的变量,double类型。

​ (3) 库存清单中又包含了3部分,顶部为固定的数据,直接打印;中部为变化的数据,与商品入库的数据一致,打印出所有商品的详情,底部也为固定样式,直接打印即可。

​ (4) 总库存数与库存商品总金额是统计操作,需经过计算后打印,可以设置两个单独的变量:所有商品的库存总数:int类型。

​ 库存商品总金额:double类型。

【案例实现】

文件2-1 access.java

package chapter0201;
import java.util.Scanner;
public class access {
  public static void  main (String[] args) {
     /*
	 *现在有两款手机华为与小米需要做入库处理,我们需要编写一个程序来实现商品的入库,
      *入库完成后,打印入库商品的详细信息并计算出入库商品的数量与入库商品总金额。
	 */
	      //华为手机
	  String  huaweiBrand ="华为";
	  double huaweiSize=5.5;
	  double huaweiPrice=3688.88;
	  String  huaweiConfig="8+128g 全面刘海屏";
	  //小米手机
	  String  xiaomiBrand ="小米";
	  double xiaomiSize=5.0;
	  double xiaomiPrice=2988.88;
	  String  xiaomiConfig="4+64g 全面屏";
	  //华为手机入库
	  System.out.println("品牌型号:"+huaweiBrand);
	  System.out.println("尺寸:"+huaweiSize);
	  System.out.println("价格:"+huaweiPrice);
	  System.out.println("配置:"+huaweiConfig);
	  Scanner sc1 = new Scanner(System.in); 
	  System.out.println("请输入"+huaweiBrand+"手机的库存");
	  int huanweiCount=sc1.nextInt();
	  double huaweiTotal=huanweiCount*huaweiPrice;
	  System.out.println("库存"+huaweiBrand+"手机的总金
                              额:"+huaweiTotal);
	 //小米手机入库
	  System.out.println("品牌型号:"+xiaomiBrand);
	  System.out.println("尺寸:"+xiaomiSize);
	  System.out.println("价格:"+xiaomiPrice);
	  System.out.println("配置:"+xiaomiConfig);
	  System.out.println("请输入"+xiaomiBrand+"手机的库存");
	  int xiaomiCount=sc1.nextInt();
	  double xiaomiTotal=xiaomiCount*xiaomiPrice;
	  System.out.println("库存"+xiaomiBrand+"手机的总金额:
                              "+xiaomiTotal);
      //库存清单
	  System.out.println("------------库存清单------------");
	  System.out.println("品牌型号   尺寸   价格            配置       库存数
                              量   总价");
	  System.out.println(huaweiBrand+"       "+huaweiSize+"   
       "+huaweiPrice+"  "+huaweiConfig+"      "+huanweiCount+"       
       "+huaweiTotal);
	  System.out.println(xiaomiBrand+"       "+xiaomiSize+"     
       "+xiaomiPrice+"      "+xiaomiConfig+"       "+xiaomiCount+"       
       "+xiaomiTotal);
	  System.out.println("---------------------------------");
	  int total=huanweiCount+xiaomiCount;
	  double totalMoney=huaweiTotal+xiaomiTotal;
       //总库存数量与库存总价
	  System.out.println("总库存:"+total);
	  System.out.println("库存总价:"+totalMoney+"¥");  
  }
}
	第`10~18`行代码记录了清单中2种商品的详细信息,包括品牌型号、尺寸、价格、配置和库存数;

​ 第20~39行代码是商品入库的代码,先打印商品的详细信息,用户在输入入库的数量,计算出总价,最后打印即可。

​ 第41~52行代码用于打印所有商品的信息,需要注意的是,此处商品信息应该与列表顶部的商品信息的顺序一致,否则会造成商品信息显示错乱;

​ 第50~55行显示的是清单底部信息,包括总库存数与库存商品的总金额,它们都需要通过计算获得。

【案例2-2】 小明都可以买什么

【案例介绍】

  1. 任务描述

​ 编写一个智能购物计算小程序,在一家商店有书本、铅笔、橡皮、可乐、零食五种商品,商品价格如下表所示。

商品名称价格
书本12元
铅笔1元
橡皮2元
可乐3元
零食5元

​ 假如你带了20元,且必须购买一本书,剩余的钱还可以购买哪种商品,可以购买几件,购买完后又能剩余多少钱?

  1. 运行结果

​ 任务运行结果如图2-2所示。

手机屏幕截图  描述已自动生成

​ 图2-2 运行结果

【案例目标】

  • 学会分析"智能购物"程序的实现思路

  • 根据思路独立完成”智能购物”的源代码编写、编译及运行。

  • 掌握在程序中使用switch条件语句进行运算操作。

【案例思路】

​ (1) 从任务描述中可知,要实现此功能,我们需要先定义5种商品,定义五个int值作为这五种商品的价格。

​ (2) 从运行结果可知,我们需要先打印各个商品的价格以及带了多少钱,并选择需要购买商品的序列号。

​ (3) 选择到序列号后,我们需要使用switch条件语句进行判断用户要购买那件商品,并在switch条件语句中,计算可以购买多少其他商品和剩余多少钱。

【案例实现】

​ 智能购物的实现代码,如文件2-2所示。

文件2-2 shopping.java

package chapter0202;
import java.util.Scanner;
public class shopping {
	  public static void  main (String[] args) {
		  /*
		   * 假如你有20元,至少需要购买1本书,剩余的钱还可以购买那些东西。
		   */
		  int pencil=1;   //铅笔价格
		  int rubber=2;   //橡皮价格
		  int cola=3;     //可乐价格
		  int book=12;    //书本价格
		  int snacks=5;   //零食价格
		  System.out.println("书本的价格为"+book+"元,您总共有20元");
		  System.out.println("1.铅笔的价格为:"+pencil+"元");
		  System.out.println("2.橡皮的价格为:"+rubber+"元");
		  System.out.println("3.可乐的价格为:"+cola+"元");
		  System.out.println("4.零食的价格为:"+snacks+"元");
		  Scanner sc1 = new Scanner(System.in);
		  System.out.println("请输入其他需要购买商品的序列号:");
		  int id=sc1.nextInt();
		  switch (id){
		  case 1:
			  int pencilmoney=20-book;
			  int pencilsum=pencilmoney/pencil;
			  int pencilsurplus=pencilmoney%pencil;
			  System.out.println("购买完书本后还可以购买铅笔"+pencilsum+"
                                        个,还剩"+pencilsurplus+"元");
			  break;
		  case 2:
			  int rubbermoney=20-book;
			  int rubbersum=rubbermoney/rubber;
			  int rubbersurplus=rubbermoney%rubber;
			  System.out.println("购买完书本后还可以购买橡皮"+rubbersum+"
                                        个,还剩"+rubbersurplus+"元");
			  break;
		  case 3:
			  int colamoney=20-book;
			  int colasum=colamoney/cola;
			  int colasurplus=colamoney%cola;
			 System.out.println("购买完书本后还可以购买可乐"+colasum+"个,
                                        还剩"+colasurplus+"元");
			  break;
		  case 4:
			  int snacksmoney=20-book;
			  int snackssum=snacksmoney/snacks;
			  int snackssurplus=snacksmoney%snacks;
			  System.out.println("购买完书本后还可以购买零食"+snackssum+"
                                        个,还剩"+snackssurplus+"元");
			  break;
		  default:
			  System.out.println("您的输入有误。");
			  break;
		  }
		  
	  }
}

​ 第8~12行代码定义了5个商品的价格,第12~17行代码打印了商品的价格,第18~20行代码是让用户输入需要购买的商品序号,第21~53行代码使用了switch条件选择判断用户购买的那中商品,再在switch中计算可以购买多少个以及剩余多少钱。

【实验2-3】 超市购物小程序

【任务介绍】

  1. 任务描述

​ 编写一个超市购物程序,在一家超市有牙刷、毛巾、水杯、苹果和香蕉五种商品,商品价格如下表所示。

编号商品名称价格
1牙刷8.8元
2毛巾10.0元
3水杯18.8元
4苹果12.5元
5香蕉15.5元

​ 用户输入商品序列号进行商品购买,用户输入购买数量后计算出所需要花费的钱,一次购买结束后,需要用户输入“Y”或“N”,“Y”代表继续购买,“N”代表购物结束。

  1. 运行结果

任务运行结果如图2-1所示。

img

图2-1 运行结果

【任务目标】

  • 学会分析” 超市购物 ”程序的实现思路。

  • 根据思路独立完成” 超市购物 ”的源代码编写、编译及运行。

  • 掌握在程序中使用while循环结构和switch循环结构语句进行运算操作。

【实现思路】

​ (1) 从运行结果可以看出,我们需要先定义5个商品的价格,double类型,再打印出5种商品的价格。

​ (2) 从运行结果可以看出,这里我们让用户填写购买商品的序列号以及购买的数量,需要使用到Scanner类,

​ (3) 从运行结果可以看出,我们循环了选择购买的条件语句,这里使用while嵌套switch语句可以达到我们的目的,我们需要使用while循环switch的选择结构,而switch是判断用户选择购买商品序列号的条件语句。

【实现代码】

	超市购物程序的实现代码,如文件2-3所示。

文件2-3 supermarket.java

package chapter0203;
import java.util.Scanner;
public class supermarket {
	/*
	 * 模拟商城购物小系统:1.用户选择商品后,后台计算商品价格;
	 *                     2.使用while循环实现用户多次购买商品。
	 */
	  public static void  main (String[] args) {
		       double toothbrush=8.8;   //牙刷价格
		  double towel=10.0;        //毛巾价格
		  double cup=18.8; 		    //水杯价格
		  double apple=12.5;        //苹果价格
		  double banana=15.5;       //香蕉价格
		  int i=0;
		  String a="Y";
		  System.out.println("-------------黑马小商城-------------");
		  System.out.println("1.牙刷的价格为:"+toothbrush+"元");
		  System.out.println("2.毛巾的价格为:"+towel+"元");
		  System.out.println("3.水杯的价格为:"+cup+"元");
		  System.out.println("4.苹果的价格为:"+apple+"元");
		  System.out.println("5.香蕉的价格为:"+banana+"元");
		  while(a.equals("Y")) {
			  Scanner sc1 = new Scanner(System.in); 
			  System.out.println("请输入你需要购买商品的序列号:");
			  i=sc1.nextInt();
			  switch(i){
			  case 1:
				  System.out.println("请输入你需要购买牙刷的数量:");
				  int toothbrushnnumber=sc1.nextInt();
				  double toothbrushnnum=toothbrushnnumber*toothbrush;
				  System.out.println("你购买了牙刷"+toothbrushnnumber+"
                                          支,需要花费"+toothbrushnnum+"元");
				  System.out.println("需要继续购买请输入Y,否则输入N");
				  a=sc1.next();
				  break;
			  case 2:
				  System.out.println("请输入你需要购买毛巾的数量:");
				  int towelnumber=sc1.nextInt();
				  double towelnum=towelnumber*towel;
				  System.out.println("你购买了毛巾"+towelnumber+"个,需要
                                            花费"+towelnum+"元");
				  System.out.println("需要继续购买请输入Y,否则输入N");
				  a=sc1.next();
				  break;
			  case 3:
				  System.out.println("请输入你需要购买水杯的数量:");
				  int cupnumber=sc1.nextInt();
				  double cupnum=cupnumber*cup;
				  System.out.println("你购买了水杯"+cupnumber+"个,需要花
                                             费"+cupnum+"元");
				  System.out.println("需要继续购买请输入Y,否则输入N");
				  a=sc1.next();
				  break;
			  case 4:
				  System.out.println("请输入你需要购买苹果的数量:");
				  int applenumber=sc1.nextInt();
				  double applenum=applenumber*apple;
				  System.out.println("你购买了苹果"+applenumber+"斤,需要
                                            花费"+applenum+"元");
				  System.out.println("需要继续购买请输入Y,否则输入N");
				  a=sc1.next();
				  break;
			  case 5:
				  System.out.println("请输入你需要购买香蕉的数量:");
				  int banananumber=sc1.nextInt();
				  double banananum=banananumber*banana;
				 System.out.println("你购买了香蕉"+banananumber+"斤,需要
                                            花费"+banananum+"元");
				  System.out.println("需要继续购买请输入Y,否则输入N");
				  a=sc1.next();
				  break;
			  }
		  }
		  System.out.println("期待您的下次光临!");
	  }
}

​ 第9~16行代码我们定义了5种商品的单价以及一个String类型的数据”a”与int类型的数据”i”,”a”用于while循环条件,判断是否继续循环,”i”用于switch选择语句的条件;

​ 第17~22行代码打印了各个商品的价格供用户选择,第23~75行代码,为了实现用户多次购买,我们使用while循环语句嵌套switch条件语句。

【案例2-4】 为新员工分配部门

【案例介绍】

  1. 任务描述

​ 某公司现有java程序开发部门、C#程序开发部门、asp.net程序测试部门、前端程序开发部门四个部门。编写一个程序实现新入职的员工的部门分配,要求根据用户输入的员工姓名和应聘语言确定员工应该分配到哪个部门。若公司没有与输入的语言匹配的部门,则进行相关提示。

  1. 运行结果

任务运行结果如图2-1所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dmF3h0Lf-1649666413127)()]

图2-1 运行结果

【案例目标】

  • 学会分析"新员工分配部门"程序的实现思路。

  • 根据思路独立完成” 新员工分配部门”的源代码编写、编译及运行。

  • 掌握在程序中使用switch条件语句进行运算操作。

【案例思路】

​ (1) 从任务描述中可知,我们需要使用Scanner类让用户输入新员工的姓名以及应聘的语言,并使用两个String数据接收用户输入的内容。

​ (2) 从任务描述中可知,我们可以使用switch条件语句根据语言判断所被分配的部门。

​ (3) 最后在switch条件语句中打印新员工姓名加所处的部门。

【案例实现】

​ 新员工分配部门的实现代码,如文件2-4所示。

文件2-4 department.java

package chapter0204;
import java.util.Scanner;
public class department {
	  public static void  main (String[] args) {
		/*
		 * 根据用户输入的信息确定员工应分配到那个部门。
		 */
		  Scanner sc =new Scanner(System.in);
		  System.out.println("请输入新员工的姓名:");
		  String name=sc.next();
		  System.out.println("请输入新员工应聘的语言:");
		  String language=sc.next();
		  switch(language){
			  case "Java":
                case "java":
				System.out.println(name+"被分配到java程序开发部门");
				break;
			  case "C#":
                case "c#":
				System.out.println(name+"被分配到c#程序开发部门");
				break;
			  case "asp.net":
				System.out.println(name+"被分配到asp.net程序测试部门");
				break;
			  case "html":
                case "Html":
				System.out.println(name+"被分配到前端程序开发部门");
				break;
			  default:
		System.out.println("抱歉,本公司不需要"+language+"语言的人。");
			      break;
		  }
	  }
}

​ 第8~12行代码是让用户输入新员工的姓名和语言并使用String类型的数据接收,第13~32行代码使用switch条件语句根据用户输入的语言判断新员工应该被分配到那个部门。

​ 需要注意的是,在switch语法中每个case关键字可以作为一个条件分支,但是对于多个条件采取相同业主务处理的情况,可以把多个case分支关联在一起,省略它们之间的break语句,而在最后一个相同的case分支中实现业务处理并执行break语句,就像本实例中应用的那样。

【案例2-5】 剪刀石头布小游戏

【案例介绍】

  1. 任务描述

​ “剪刀石头布”的游戏相信大家都不陌生,本案例要求编写一个剪刀石头布游戏的程序。程序启动后会随机生成1~3的随机数,分别代表剪刀、石头和布,玩家通过键盘输入剪刀、石头和布与电脑进行5轮的游戏,赢的次数多的一方为赢家。若五局皆为平局,则最终结果判为平局。

  1. 运行结果

任务运行结果如图2-1所示。

手机屏幕截图  描述已自动生成

图2-1 运行结果

【案例目标】

  • 学会分析"剪刀石头布游戏"程序的实现思路。

  • 根据思路独立完成” 剪刀石头布游戏”的源代码编写、编译及运行。

  • 掌握在程序中使用for循环语句进行循环操作。

  • 掌握在程序中使用if添加判断语句进行游戏的规则判断以及输赢判断。

【案例思路】

​ (1) 从运行结果中分析可知,我们需要使用先打印头部显示的内容。在使用for循环5次Scanner类的用户输入代码以及随机数,这样我们就可以得到5个用户输入和5个随机数。
​ 随机数可以使用Random类中的nextInt(int n)方法,如下代码会生成一个1-9的随机数:

 int randomNumber=new Random().nextInt(10);

​ (2) 从任务描述中可知,我们生成的是1-3的随机数,可以把1代表剪刀,2代表石头,3代表布,首先使用if…else语句判断用户输入的内容,再根据随机生成的数字与玩家输入的内容做判断,可以得出一轮游戏的输赢。

​ (3) 最后在程序的开始定义两个int变量作为记录游戏输赢的值,在游戏中玩家获胜一句时a+1,在游戏平局时b+1,再使用if…else语句判断,将结果分过获胜、和局、失败三种结果。如果玩家与电脑获胜场次一致那结果为和局,如果玩家获胜场次大于电脑那么结果为获胜,反之则为失败。

【案例实现】

​ 剪刀石头布游戏的实现代码,如文件2-5所示。

文件2-5 game.java

package chapter0205;
import java.util.Random;
import java.util.Scanner;
public class game {
	  public static void  main (String[] args) {
	 //通过Random类中的nextInt(int n)方法,生成1-3的随机数   1代表剪刀 2代表           
      //石头 3代表布
	  int a=0;   //玩家获胜场次
	  int b=0;   //平局场次
	  System.out.println("程序已启动");
	  System.out.println("剪刀  石头  布");
	  Scanner sc = new Scanner(System.in);
	  for(int i = 1; i<=5;i++){
		  System.out.println("第"+i+"局");
		  String enter = sc.next();  //接收用户输入的字符
           //随机生成1-3的随机数
		  int randomNumber=new Random().nextInt(3)+1; 
		  if(enter.equals("剪刀")) {    //判断用户输入的字符
			  if(randomNumber==1) {    //判断谁输谁赢
				  System.out.println("电脑本次出的是剪刀");
				  System.out.println("打平了");
				  b++;    //平局后b+1
			  }else if(randomNumber==2) {
				  System.out.println("电脑本次出的是石头");
				  System.out.println("你输了");
			  }else if(randomNumber==3) {
				  System.out.println("电脑本次出的是布");
				  System.out.println("你赢了");
				  a++;      //玩家赢后 a+1
			  }
		  }else if(enter.equals("石头")) {
			  if(randomNumber==1) {
				  System.out.println("电脑本次出的是剪刀");
				  System.out.println("你赢了");
				  a++;
			  }else if(randomNumber==2) {
				  System.out.println("电脑本次出的是石头");
				  System.out.println("打平了");
				  b++;
			  }else if(randomNumber==3) {
				  System.out.println("电脑本次出的是布");
				  System.out.println("你输了");
			  }
		  }else if(enter.equals("布")) {
			  if(randomNumber==1) {
				  System.out.println("电脑本次出的是剪刀");
				  System.out.println("你输了");
			  }else if(randomNumber==2) {
				  System.out.println("电脑本次出的是石头");
				  System.out.println("你赢了");
				  a++;
			  }else if(randomNumber==3) {
				  System.out.println("电脑本次出的是布");
				  System.out.println("打平了");
				  b++;
			  }
		  }else {
			  System.out.println("输入错误,游戏终止!请您认真玩游戏!");
		  }
	  }
	  System.out.println("本次游戏您赢了"+a+"局,平了"+b+"局");
	  int c = 5-a-b;    //计算出电脑胜利的场次
	  if(a==c) {         //和局
		  System.out.println("和局!");
	  }else if(a>b) {   //获胜
		  System.out.println("您赢了!");
	  }else{
		  System.out.println("您输了!");
	  }
	  }
}

​ 第8~9行代码定义了两个int变量用于记录每局游戏的赢或平局。第13~17行代码使用for循序5次,打印了第几局游戏、循环了5次用户输入以及5个1-3的随机数。第18~60行代码使用if…else语句判断,将用户输入的字符分为4类:

  1. 如果用户输入了剪刀,电脑随机出2,用户就可以获胜;电脑随机出1,为平局;电脑随机出3,用户此局为输;

  2. 用户输入石头,电脑随机出1,用户就可以获胜;

  3. 用户如果输入布,电脑随机出2,用户就可以获胜;

  4. 用户如果输入其他字符,则为判断无效,程序将停止;

61~70行代码使用if…else语句判断游戏最终的输赢。

【案例2-6】 登录注册小程序

【案例介绍】

  1. 任务描述

编写程序实现简单的登录注册功能。程序包含以下4个功能:

(1)登录功能,用户输入正确的账号密码进行成功;

(2)注册功能,输入用户名和密码进行注册;

(3)查看功能,查看所有的用户名与密码;

(4)退出功能,退出系统。

​ 用户可以输入对应的编号进行相应的功能操作。例如,输入2进入注册功能,输入用户名和密码进行注册。

  1. 运行结果

任务运行结果如图2-1所示。

手机屏幕截图  描述已自动生成图2-1 运行结果

【案例目标】

  • 学会分析"登录注册"程序的实现思路。

  • 根据思路独立完成”登录注册”的源代码编写、编译及运行。

  • 掌握根据"登录注册"程序功能的不同,将功能封装到不同的方法中。

  • 能够使用数组解决注册功能的添加问题

  • 能够使用数组实现查看功能

  • 掌握方法和数组的使用

【案例思路】

​ (1) 在存储账号密码时,如果对每一个用户的账号密码都定义两个变量存储,则会出现过多孤立的变量,很难一次性将全部数据持有。此时,可以使用数组解决多个数据的存储问题。创建一个可以存储多个用户账号数组和一个可以存储多个用户密码的数组。需要注意的是,需要在两个数组前加上static属性,这样做是为了让本类都可以使用到这两个数组。

​ (2) 从运行结果可以看出,我们首先打印出了可以操作的列表以及序列号,我们可以定print方法来实现打印。

​ (3) 从运行结果可以看出,查看功能是将已有的用户信息打印,我们需要使用for循环打印我们已有的账号数组和密码数组。

​ (4) 注册功能是在定义好的账号数组和密码数组添加新的数据,这里我们会需要的增加账号和密码数组的长度。增加原有数组长度时,需要先定义两组新的数组,在原有数组的长度上增加长度,并将原有的数组复制进新的数组。
​ 将原有的数组复制进新的数组时需要使用到System的arraycopy方法,arraycopy方法的用法如下所示。

     arrayCopy(arr1, 2, arr2, 5, 10);

​ 此句代码是将arr1数组里从索引为2的元素开始, 复制到数组arr2里的索引为5的位置, 复制的元素个数为10个。

​ (5) 登录功能可以使用for循环判断用户输入的字符与数组中的字符是否匹配,以此来判断是否登录成功。

​ (6) 退出功能可以使用System的exit方法。

​ (7) "登录注册"程序明确的分为4个功能,如果将多个独立的功能代码写在一起,代码将会相对冗长,可以使用针对不同功能将其封装到不同的方法中,将完整独立的功能分离出来,然后只需要在程序的main()方法中调用方法即可。

【案例实现】

登录注册程序的实现代码,如文件2-6所示。

文件2-6 user.java

import java.util.Scanner;
public class user {
	// 存储用户名和密码
	public static String arr1[] = new String[3];
	public static String arr2[] = new String[3];
	static int index = 0;
	public static void main(String[] args) {
        arr1[0] = "heima";
        arr2[0] = "123456";
   while (true) {
       print();
       Scanner scan = new Scanner(System.in);
       System.out.println("请选择功能:");
       String str = scan.next();
       if (str.equals("1")) {
          login();
        } else if (str.equals("2")) {
           register();
        } else if (str.equals("3")) {
        	show();                         //用户退出
           break;
        } else if (str.equals("0")) {
        	System.exit(0);
        } else {
        	System.out.println("输入错误");
        }
      }
	}
	/*
	 * 登录功能,键盘输入用户名与密码
	 * 使用for循环加if判断验证输入的用户名与密码是否正确
	 */
	public static void login() {
		for (int i = 0; i < 3; i++) {
			Scanner scan1 = new Scanner(System.in);
			System.out.println("请输入用户名:");
			String str1 = scan1.next();
			Scanner scan2 = new Scanner(System.in);
			System.out.println("请输入密码:");
			String str2 = scan2.next();
			for (int i1 = 0; i1 < arr2.length; i1++) {
				if (str1.equals(arr1[i1]) && str2.equals(arr2[i1])) {
					System.out.println("登录成功!");
					return;
				}
			}
			System.out.println("登录失败,请重新输入!");
		}
	}
	/*
	 * 注册功能,键盘输入用户名与密码
	 * 定义一个boolean变量,使用for循序判断用户是否存在
	 * 如果用户不存在,在数组中插入注册的账号密码时
	 * 可能会有数组长度不够的情况,所以需要使用到
	 * 增加数组的长度,这里调用增加数组长度的方法add()。
	 */
	public static void register() {
		Scanner scan1 = new Scanner(System.in);
		System.out.println("请输入用户名:");
		String str1 = scan1.next();
		Scanner scan2 = new Scanner(System.in);
		System.out.println("请输入密码:");
		String str2 = scan2.next();
		boolean flag = true;
		for (int i = 0; i < arr1.length; i++) {
			if (str1.equals(arr1[i])) {
				System.out.println("用户名已存在");
				flag = false;
			}
		}
		if (flag == true) {
			index++;
			if (index < arr1.length) {
				arr1[index] = str1;
				arr2[index] = str2;
				System.out.println("注册成功!");
			} else {
				add();
				arr1[index] = str1;
				arr2[index] = str2;
				System.out.println("注册成功!");
			}
		}
	}
	/*
	 * 查看功能
	 * 使用for循环打印两个数组的长度
	 */
	public static void show() {
		for (int i = 0; i < arr1.length; i++) {
			if (arr1[i] != null) {
			System.out.println("用户名:" + arr1[i] + "," + "密码:" 
                                           + arr2[i]+ "\n");
			}
		}
	}
	/*
	 * 增加数组长度
	 * 先定义两个新的数组并在原有的数组长度上加3
	 * 使用System的arraycopy方法复制原有的数组到新的数组
	 * 最后将新的数组赋值给原有的arr1与aar2
	 */
	public static void add() {
		String newarray1[] = new String[arr1.length + 3];
		String newarray2[] = new String[arr1.length + 3];
		System.arraycopy(arr1, 0, newarray1, 0, arr1.length);
		System.arraycopy(arr2, 0, newarray2, 0, arr1.length);
		arr1 = newarray1;
		arr2 = newarray2;
		show();
	}
	/*
	 * 可操作功能的显示
	 */
	public static void print() {
		System.out.println("--------------------黑马管理系统--------------------");
		System.out.println(" 1.登录功能 (login) ");
		System.out.println(" 2.注册功能(register) ");
		System.out.println(" 3.查看(show) ");
         System.out.println(" 0.退出(exit) ");
		System.out.println("--------------------黑马管理系统--------------------");
    }
}                                             

​ 在文件2-6中,第5~7行代码使用static定义了全局变量arr1[]数组用于用户名存储,arr2[]数组用于密码存储,index用于数组的下标。第34-50行代码定义了用户登录的方法,使用for循环数组的长度,使用if判断输入的用户名与密码是否与数组中的匹配,可以得出登录成功或者失败。

​ 第58~85行代码是用户注册的方法,定义一个boolean变量,使用for循序判断用户是否存在如果用户不存在,在数组中插入注册的账号密码时可能会有数组长度不够的情况,所以需要使用到增加数组的长度,这里调用增加数组长度的方法add()。

​ 第90~96行代码是查看方法是实现,使用for循环打印arr1[]与arr2[]。

​ 第103~111行代码是增加数组长度的方法,先定义两个新的数组并在原有的数组长度上加3使用System的arraycopy方法复制原有的数组到新的数组最后将新的数组赋值给原有的arr1与aar2。

​ 第115~120行代码是对可操作功能的显示。

​ 第11~28行代码是main方法,使用while循环用户操作,调用封装好的方法实现登录注册小功能。

【案例2-7】 抽取幸运观众

【案例介绍】

  1. 任务描述

​ 在一些节目活动中,经常会有抽取幸运观众环节。本案例要求编写程序实现幸运观众的抽取,在指定人群中随机抽取一名幸运观众。

案例功能要求如下:

(1) 从键盘输入3名观众。

(2) 存储观众姓名。

(3) 总览观众姓名。

(4) 随机选取一名观众,并打印出该观众姓名。

  1. 运行结果

任务运行结果如图2-1所示。

手机屏幕截图  描述已自动生成

图2-1 运行结果

【案例目标】

  • 学会分析"抽取幸运观众"程序的实现思路。

  • 根据思路独立完成” 抽取幸运观众”的源代码编写、编译及运行。

  • 能够根据"抽取幸运观众"程序功能的不同,将功能封装到不同的方法中。

  • 能够使用数组解决多个观众姓名的存储问题。

  • 掌握方法和数组的使用。

【案例思路】

​ (1) 在存储观众姓名时,如果对每个观众都定义一个变量进行姓名存储,则会出现过多鼓励的变量,很难一次性将全部数据持有。此时,可以使用数组解决多个数据的存储问题。创建一个可以存储多个观众姓名的数组,这里我们设置数组的长度为3。

​ (2) 键盘输入观众姓名。将输入的姓名依次赋值给数组各元素,此时便存储了所有观众姓名。键盘输入需要使用Scanner类,以下代码能够从键盘输入中读取一个字符串。

Scanner sc=new Scanner(System.in);

String str=sc.next();

​ (3) 对数组进行遍历,打印出数组每个元素的值,即实现了对每个观众姓名的总览。

​ (4) 根据数组长度,获取随机索引,这里我们的数组长度为3,所以获取的随机索引只能在0-2之间,通过随机索引获取数组中的姓名,该姓名也就是随机的姓名。获取随机索引可以使用Random类中的nextInt(int n)方法。

​ (5) "抽取幸运观众"明确第分为了3个功能,如果将多个独立功能的代码写在一起,代码相对冗长,可以针对不同的功能将其封装到不同的方法中,将完整独立的功能分离出来,然后只需要在程序的main()方法中调用这3个方法即可。

【案例实现】

新员工分配部门的实现代码,如文件2-7所示。

文件2-7 audience.java

import java.util.Random;
import java.util.Scanner;
public class audience {
	/*
	 * 存储姓名
	 * 创建一个存储多个姓名的容器(数组)
	 * 键盘输入每个同学的姓名,存储到容器中(数组)
	 */
	public static void addAudience(String[] audience) {
	    //键盘输入多个姓名到容器中
		Scanner sc=new Scanner(System.in);
		for (int i = 0; i < audience.length; i++) {
			System.out.println("存储第"+(i+1)+"个姓名:");
			//接收控制台录入的姓名字符串
			audience[i]=sc.next();
		}
	}
	/*
	 * 总览全部姓名
	 */
	public static void printAudience(String[] audience) {
	    //遍历数组,得到每个观众姓名
		for (int i = 0; i < audience.length; i++) {
			String name=audience[i];
			System.out.println("第"+(i+1)+"个观众姓名:"+name);
		}
	}
	/*
	 * 随机点名
	 */
	public static String randomAudience(String[] audience) {
	    //根据数组的长度,获取睡觉索引
		int index = new Random().nextInt(audience.length);
		//通过随机索引从数组中获取姓名
		String name=audience[index];
		//返回随机到的姓名
		return name;
	}
    public static void main(String[] args) {
    	System.out.println("--------抽取幸运观众---------");
		//创建一个长度为3的数组存储观众姓名
    	String[] audience=new String[3];
    	//存储观众姓名
    	addAudience(audience);
    	//总览观众姓名
    	printAudience(audience);
    	//随机抽取一名幸运观众
    	String randomName=randomAudience(audience);
    	System.out.println("随机抽取的幸运观众是:"+randomName);
    }
}

​ 在文件2-7中,第10~18行代码定义了一个addAudience()方法,用于实现存储观众姓名的功能。其中,通过创建一个String类型的数组audience来存储多个观众姓名,借助Scanner类通过键盘输入的方式输入观众的姓名,并将这些姓名依次存储到数组元素中;

​ 第22~28行代码定义一个printAudience ()方法,用于实现总览观众姓名的功能,通过遍历数组audience的方式打印每一位观众的姓名;

​ 第32~39行代码定义一个randomAudience ()方法,用于实现随机点名其中一人的功能,通过Random类的nextInt(intn)方法获取随机索引,然后根据随机索引从数组中获取姓名,这个姓名就是幸运观众的姓名。

;