JAVA《第一次作业》
(一)学习总结
1.在java中通过Scanner类完成控制台的输入,查阅JDK帮助文档,Scanner类实现基本数据输入的方法是什么?不能只用文字描述,一定要写代码,通过具体实例加以说明。
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int x=input.nextInt();
System.out.println(" "+x);
}
2..Random类和Math类的random()方法都能产生随机数,这两种方式有什么区别,各有什么特点呢?查阅JDK帮助文档,并举例加以说明。
public static void main(String[] args) {
int x=(int)(Math.random()*100);
//产生随机数的方法一
Random rand=new Random();
int y=rand.nextInt(3);
System.out.println(x);
System.out.println(y);
}
(1)Math.random();只能产生double的随机值,(返回值为double)想要生成int型的随机数 前面需要int强制转换。
(2)而Random类是工作Random类的相关方法,有多种类型的随机值的获取方法,如nextBoolean()、 nextInt()等。
3.运行下列程序,结果是什么?查阅资料,分析为什么。
public class Test {
public static void main(String args[]) {
double a = 0.1;
double b = 0.1;
double c = 0.1;
if((a + b + c) == 0.3){
System.out.println("等于0.3");
}else {
System.out.println("不等于0.3");
}
}
}
结果是“不等于0.3”。
public static void main(String args[]) {
double a = 0.1;
double b = 0.1;
double c = 0.1;
if((a + b + c) == 0.3){
System.out.println("等于0.3");
}else {
System.out.println("不等于0.3");
}
System.out.println(a+b+c);
}
将这三个数相加结果输出会发现结果为0.30000000000000004。
计算机在进行二进制算法时发生精度损失,产生了实际误差,为了处理精度损失的问题,可以使用java.math.BigDecimal类。
解决方法:
第一种方法:
public static void main(String args[]) {
double a = 0.1;
double b = 0.1;
double c = 0.1;
BigDecimal a1=new BigDecimal(a);
BigDecimal b1=new BigDecimal(b);
BigDecimal c1=new BigDecimal(c);
if((c1.add(b1).add(a1).round(new MathContext(1)).equals(new BigDecimal("0.3")))){
System.out.println("等于0.3");
}else {
System.out.println("不等于0.3");
}
}
第二种方法:
public static void main(String args[]) {
double a = 0.1;
double b = 0.1;
double c = 0.1;
if((a + b + c)-0.3<1e-6){
System.out.println("等于0.3");
}else {
System.out.println("不等于0.3");
}
}
4.本次学习要点中其他需要总结的内容:因人而异,根据自己的学习情况,记录难掌握或难理解的内容,以及学有心得的内容。还存在哪些问题,也可以提出来,对于同学在博客中提出的问题,大家可以积极讨论,互帮互学。
1.使用方法很重要!现在心里还有种抵触函数心理,但是要迎难而上,尽量主函数中没有过多代码,多写方法。
2.逻辑关系有时候很混乱,先搞清楚关系,再动手写,要不然代码写得太乱。
3.刚开始学java代码风格还基本上是c的风格
(二)实验总结
实验内容:
1.看商品猜价格:
public static void main(String[] args) {
// TODO Auto-generated method stub
int n=5,j,m=100;
int x=(int)(Math.random()*100);
double y,z;
Scanner input = new Scanner(System.in);
System.out.println("请输入你认为商品的价格,你有五次机会:");
while(input.hasNextDouble())
{
n--;
y=input.nextDouble();
if(x==y)//读取双精度数据
{
j=5-n;
m=100-j*20+20;
System.out.println( "恭喜你猜对了!!!用了"+j+"次机会" );
System.out.println("你的最终得分为:"+m);
System.out.println("是否继续下一轮游戏?输入1进行下一轮游戏,2结束游戏");
z=input.nextDouble();
if(z==1)
{
n=5;
x=(int)(Math.random()*100);
continue;
}
else
{
break;
}
}
else if(n==0)
{
System.out.println("机会用完了,正确答案是: "+x);
System.out.println("你的最终得分为0");
System.out.println("是否继续下一轮游戏?1进行下一轮游戏,2结束游戏");
z=input.nextDouble();
if(z==1)
{
n=5;
x=(int)(Math.random()*100);
continue;
}
else
{
break;
}
}
else
{
if(x<=y)
{
System.out.println("猜大了");
}
else if(x>=y)
{
System.out.println("猜小了");
}
System.out.print( "没有猜对你还有"+n+"次机会");
}
}
}
程序设计思路:首先调用生成随机数的函数生成随机数,创建一个循环,循环中运用if语句通过判断键盘输入的数和随机生成的数进行对比,产生对应结果。如果想进行下一轮的话,运用contibue跳出if从句,继续进行循环。(这里要注意:要再次进行随机数的生成,否则的话随机数不会发生改变)
问题:当时在进行下轮游戏时发现随机数没有改变,原因是随机数在循环之前产生的,再进行循环的话并没有改变,需要再次产生新的随机数。
2.万年历
package shiyanyi;
import java.util.Scanner;
public class shiyanyi2 {
static final int N = 1900;//1900年为初始年
public static void main(String[] args) { //主函数
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
System.out.println("输入年份和月份,用回车隔开");
int year=input.nextInt();
int month=input.nextInt();
printCalender(year,month);
}
public static boolean isLeap(int year) { //判断闰年
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
return true;
}else{
return false;
}
}
public static int days(int year,int month) {//判断某年某月有多少天
int result = 0;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
result = 31;
break;
case 4:
case 6:
case 9:
case 11:
result = 30;
break;
case 2:
result = 28;
if (isLeap(year)) {
result = 29;
}
break;
}
return result;
}
public static int totalDays(int year,int month) {//计算某年某月之前距离1900年1月1日的总天数
int i,s = 0;
int a=0;
for(i=1900; i<year; i++)
{
s += 365;
if(isLeap(year))
++s;
}
for(i=1;i<month;i++){
a=a+days(year,i);
}
return s+a+1;
}
public static void printCalender(int year,int month) {//输出某年某月日历
int a=0,i,day;
day=days(year,month);
System.out.println("\t\t\t\t\t\t\t"+year+"年"+month+"月");
System.out.println("\t星期日\t"+"\t星期一\t"+"\t星期二\t"+"\t星期三\t"+"\t星期四\t"+"\t星期五\t"+"\t星期六\t");
a=1+totalDays(year,month)%7;
if(a==1)
{
System.out.print("\t\t\t");
}
else if(a==2)
{
System.out.print("\t\t\t\t\t");
}
else if(a==3)
{
System.out.print("\t\t\t\t\t\t\t");
}
else if(a==4)
{
System.out.print("\t\t\t\t\t\t\t\t\t");
}
else if(a==5)
{
System.out.print("\t\t\t\t\t\t\t\t\t\t\t");
}
else if(a==6)
{
System.out.print("\t\t\t\t\t\t\t\t\t\t\t\t\t");
}
else if(a==7)
{
System.out.print("\t");
}
for(i=1;i<=day;i++)
{
System.out.print(" "+i);
System.out.print("\t\t");
if((a+i)%7==0){
System.out.println("");
System.out.print("\t");
}
}
}
}
程序设计思路:分别创建“判断闰年”“某年某月多少天”(先把普通的月份天数确定,二月的天数通过判断闰年方法确定天数)“距离1900年天数(先计算这个年之前到1900年天数再加上这几个月的天数)”“输出函数”这几个方法进行程序设计。其中判断某月天数时用到闰年方法,计算据1900年总天数会用到某月多少天的方法,最后通过1+totaldays(year,month)%7,算出星期几,最后进行输出。
问题:刚开始没有一点头绪,后来先把实验要求的方法写出来之后才有了思路,方法之间相互联系。
3.评分系统
package shiyanyi;
import java.util.Scanner;//文本扫面类
public class shiyanyi3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
double a[][]=new double [5][10];
double b[]=new double [5];
int i,j,k;
Scanner input = new Scanner(System.in);
System.out.println("请依次输入各个评委对各个选手的评分,评分最高分为10分");
for(j=0;j<5;j++)
{
for(i=0;i<10;i++)
{
System.out.println("第"+(j+1)+"个评委请打分:");
System.out.println("第"+(i+1)+"个选手");
a[j][i]=input.nextDouble();
}
}
maxmin(a);
pingjun(a);
}
public static double pingjun(double a[][]) {
int j,i,z;
int c[]=new int [5];
double b[]=new double [5];
double ave[]=new double [5];
double t,ma = 0,mb=0,mc=0,md=0,me=0,ave1,ave2,ave3,ave4,ave5;;
c[0]=1;
c[1]=2;
c[2]=3;
c[3]=4;
c[4]=5;
for(j=0;j<5;j++)
for(i=1;i<9;i++)
{
if(j==0) {
ma=ma+a[j][i];
}
else if(j==1) {
mb=mb+a[j][i];
}
else if(j==2) {
mc=mc+a[j][i];
}
else if(j==3) {
md=md+a[j][i];
}
else if(j==4) {
me=me+a[j][i];
}
}
ave1=ma/8;
ave2=mb/8;
ave3=mc/8;
ave4=md/8;
ave5=me/8;
ave[0]=ave1;
ave[1]=ave2;
ave[2]=ave3;
ave[3]=ave4;
ave[4]=ave5;
for(i=0;i<5;i++) {
System.out.println(+i+"号选手的平均分为:"+ave[i]);
}
b[0]=ave1;
b[1]=ave2;
b[2]=ave3;
b[3]=ave4;
b[4]=ave5;
for(i=0;i<5;i++)
for(j=0;j<4;j++)
if(b[j]<b[j+1]) {
t=b[j];
b[j]=b[j+1];
b[j+1]=t;
z=c[j];
c[j]=c[j+1];
c[j+1]=z;
}
System.out.println("选手得分从高到低排名为:");
for(i=0;i<5;i++)
{
System.out.println("选手"+c[i]+"\t"+b[i]);
}
return 0;
}
public static double maxmin(double a[][]) {
double t;
int i,j,k;
for(i=0;i<5;i++)
for(j=0;j<10;j++)
for(k=0;k<9;k++)
if(a[i][k]>a[i][k+1]) {
t=a[i][k];
a[i][k]=a[i][k+1];
a[i][k+1]=t;
}
for(i=0;i<5;i++) {
System.out.println(i+"号选手的最高分为:"+a[i][9]+"最低分为:"+a[i][0]);
}
return 0;
}
}
程序设计思路:创建一个二维数组用来存储选手的成绩,两个for循环嵌套进行分数输入。先将选手成绩数组排序,然后for循环不取第一个和最后一个求平均分即去掉最高分和最低分。最后对选手成绩排序,输出成绩排名。
问题:刚开始排完序后没有选手编号,又定义了一个选手序号数组在拍平均值时同时排序,得到各个选手对应的序号。对于重复的输出尽量用循环操作。