目录
实验日期:2022-03-16
一、实验目的
二、实验内容
三、命名和注释要求
四、实验环境
1. 使用的操作系统及版本
2. 使用的开发工具及版本
五、实验步骤及说明
1.Unicode表转换
2.水仙花数
(1)使用位数分离法
(2)使用循环嵌套法
3.石头剪刀布游戏
六、实验小结及思考
七、自评分和自评语
熟悉Java基本语法,基本数据类型,各种运算符及表达式的使用,掌握运算符优先级,熟悉使用Java的选择语句、循环语句。
1、编写Java程序求“程序”这2个汉字分别在Unicode表中的顺序位置。提示:观察一个字符在Unicode表中的顺序位置,需使用int类型转换,如(int)a。不可以使用short转换。要得到一个0-65535之间的数所代表的Unicode表中相应位置上的字符,需使用char型转换。
2、编写Java程序输出 “水仙花” 数 (它的个、十、百位数字的立方的和等于该数本身,如:153=1^3+5^3+3^3)
3、编写一个剪刀石头布游戏的Java程序,程序启动后随机生成1-3的随机数,分别代表石头、剪刀、布,玩家通过键盘输入石头、剪刀、布与电脑进行5轮游戏,赢的次数多的一方为赢家。需要考虑平局情况。
命名要求:在IDEA中创建“HelloJava”项目,模块名为“lab2”,包名为“com.你的姓名拼音缩写”(比如张三的包名:com.zhs),3个小题的类名分别为Exercise1、Exercise2、Exercise3。
注释要求:每个文件开始位置、关键代码需要规范填写注释。示例如下:
macOS 12.2.1
JDK版本:17.0.2 IDE版本:2021.3.2
此处使用char数据类型,最初使用双引号导致程序无法运行,后面才想起使用单引号引用字符。双引号引用的是字符串(String类型),这点与C语言类似。
项目结构:
程序源代码:
运行结果
程序猿代码
/*
File Name:Exercise.java
Package Name:com.zzh
Author:张志豪
Description:求水仙花数
*/
package com.zzh;
public class Exercise2 {
public static void main(String args[]){
int a,b,c;
System.out.println("水仙花数如下:");
for(int i=100;i<1000;i++){
a=i%10;
b=i/10%10;
c=i/100;
if(a*a*a+b*b*b+c*c*c==i) {
System.out.println(i);
}
}
}
}
ublic class Exercise2 {
public static void main(String args[]) {
int a, b;
System.out.println("水仙花数如下:");
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
for (int k = 0; k < 10; k++) {
a=i + j * 10 + k * 100;
b= i*i*i+j*j*j+k*k*k;
if (a == b&&a!=0&&a!=1)//排除非法结果,如0
System.out.println(a);
}
}
}
}
(3)程序运行结果
(1)由于程序需要输入石头、剪刀、布,于是采用String类型变量。查阅教材后,
对于字符串输入,发现可以采用next()或nextLine()进行输入;
对于字符串的比较,可采用a.equals(b)进行内容的比较。
(2)程序源代码
package com.zzh;
//导包
import java.util.*;
public class Exercise3 {
public static void main(String args[]) {
//创建对象
Random sc = new Random();
Scanner ss = new Scanner(System.in);
//此处规定:1--✊ 2--✂️ 3--布
//定义变量magic,获得电脑产生的1~3的随机数
int magic;
//定义两个计数变量:count1表示电脑赢的次数,count2表示玩家赢的次数
int count1 = 0, count2 = 0;
//定义两个String类型变量,guess为输入的字符串。
String guess;
String model;
for (int i = 1; i <= 5; i++) {
magic = sc.nextInt(3) + 1;//产生1~3的随机数,分别代表石头,剪刀,布
//此处model将电脑产生的1~3数字对应转换为"石头、剪刀或布"
if (magic == 1) model = "石头";
else if (magic == 2) model = "剪刀";
else model = "布";
System.out.println("请输入您的猜拳结果:");
guess = ss.next();
System.out.println("第" + i + "轮游戏电脑猜拳结果为:" + model);
//以下if-else语句中的else后续语句,可巧妙的对非法数据输入进行提示
switch (magic) {
case 1:
if (guess.equals("剪刀")) {
count1++;
System.out.println("此轮电脑获胜!");
} else if (guess.equals("石头"))
System.out.println("此轮为平局");
else if (guess.equals("布")) {
count2++;
System.out.println("此轮玩家获胜!");
}
else {
System.out.println("您的输出有误,请重新输入石头或剪刀或布");
//此处i--,在程序出现非法输入时,仍然能够正常进行五次游戏,下面几次作用一样
i--;
}
break;
case 2:
if (guess.equals("布")) {
count1++;
System.out.println("此轮电脑获胜!");
} else if (guess.equals("剪刀"))
System.out.println("此轮为平局");
else if (guess.equals("石头")) {
count2++;
System.out.println("此轮玩家获胜!");
} else {
System.out.println("您的输出有误,请重新输入石头或剪刀或布");
i--;
}
break;
case 3:
if (guess.equals("石头")){
count1++;
System.out.println("此轮电脑获胜!");
}
else if (guess.equals( "布"))
System.out.println("此轮为平局");
else if (guess.equals("剪刀")){
count2++;
System.out.println("此轮玩家获胜!");
}
else {
System.out.println("您的输出有误,请重新输入石头或剪刀或布");
i--;
}
break;
}
}
System.out.println("**********************");
if (count1 > count2)
System.out.println("最终结果:电脑为赢家!!!");
else if (count1 < count2)
System.out.println("最终结果:玩家为赢家!!!");
else
System.out.println("最终结果:平局");
}
}
(3)程序运行结果:
(第二次输入了aaaaaaa,程序提示输入错误,但由于i--,程序仍然能够正常进行五次游戏)
体会收获:通过第一题,我进一步了解了Unicode表,知道了编码与字符的转换方法。在第三题编写过程中,学习了String这样一种数据类型,并深入了解它的不一样的输入格式,如next()、nextLine()。在后面进行剪刀石头布的字符串比较过程中,由于未找到与C语言中类型的比较函数,采用“==”进行比较,导致程序运行结果有时会出现错误。查阅资料后发现 ,“==”比较的是字符串的地址,而比较内容应该使用equals关键字。其次,采用else语句来处理不合法字符的输入,间接的提高了程序的健壮性。
在导包的过程中,偶然发现只需导入java.util.*即可。查阅资料后,了解到Random类和Scanner类均属于java.util.*包里面的内容,因此导入java.util.*可以达到相同的效果,同时还能使代码更简洁。
1.自评分:100
2.自评语:第一题中按要求完成了字符与编码之间的转换 ,得到了字符的位置关系。然后采用了两种算法来得到水仙花数。第三题通过查阅资料采用String,和equals完成了石头剪刀布游戏的程序代码编写。