(一)学习总结
1. 在java中通过Scanner类完成控制台的输入,查阅JDK帮助文档,Scanner类实现基本 数据输入的方法是什么?不能只用文字描述,一定要写代码,通过具体实例加以说明。
Java中做输入的方式:通过控制台输入数据,与C语言中的scanf不同需要使用Scanner对象来操作:添加java.util.Sanner到程序中,用Sanner类定义一个对象,通过此对 象的属性来实现对数据的输入,
Scanner word = new Scanner(System.in);
定义整型变量:int a = word.nextInt();
定义字符型变量:String a=word.next();
package test;
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner word=new Scanner(System .in);
System.out.println("输入数字");
int a=word.nextInt();
System.out.println("输入字符");
String b=word.next();
System.out.println("字符:"+b+" 数字:"+a);
}
}
2.Random类和Math类的random()方法都能产生随机数,这两种方式有什么区别,各有什么特点呢?查阅JDK帮助文档,并举例加以说明。
java.util包中Random类——此类的实例用于生成伪随机数流。java.lang包中Math类random() 方法返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。
提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。
package test;
import java.util.Random;
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Random a=new Random();
int arr=a.nextInt();
double brr=Math.random();
System.out.println("调用Random()类产生的随机数");
System.out.println(arr);
System.out.println("调用Math.random()方法产生的随机数");
System.out.println(brr);
}
}
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");
}
}
}
修改代码:
package test;
import java.math.BigDecimal;
import java.math.MathContext;
public class test {
public static void main(String args[]) {
double arr = 0.1,brr = 0.1,crr = 0.1;
if((arr + brr + crr) -0.3>0){
System.out.println("等于0.3");
}
else {
System.out.println("不等于0.3");
}
}
}
使用Rundom方法确定精度范围,需要用到MathContext类。
4.本次学习要点中其他需要总结的内容:因人而异,根据自己的学习情况,记录难掌握或难理解的内容,以及学有心得的内容。还存在哪些问题,也可以提出来,对于同学在博客中提出的问题,大家可以积极讨论,互帮互学。
(二)实验总结
实验内容:
1.看商品猜价格
package first;
import java.util.Random;
import java.util.Scanner;
public class first {
public static void main(String[] args) {
// TODO Auto-generated method stub
int count,score;
String c=null;
Scanner word=new Scanner(System.in);
Random arr=new Random();
int arr1 = arr.nextInt(100)+1;
int i;
do
{
count=1;
System.out.println ("请输入商品价格,最多可以猜5次!");
int price=word.nextInt();
for(i=1;i<5;i++)
{
if (price>arr1)
{
System.out.println ("太大了,请重新输入!");
count++;
}
else if (price<arr1)
{
System.out.println("太小了,请重新输入!");
count++;
}
else if (price==arr1)
{
System.out.println("恭喜你,答对了!");
count++;
break;
}
price=word.nextInt();
if (count==5)
{
System.out.printf("5次都没猜对,正确结果是%d
",arr1);
}
}
System.out.println ("继续下一轮游戏吗?Y(y)orN(n)");
c=word.next();
}
while(c.equals("y"));
score=100-(count-2)*20;
System.out.printf ("一共猜了%d 次,您的得分为%d",count-1,score);
}
}
程序设计思路:
首先根据Random函数产生随机数,再输入数据同随机数进行比较。
定义一个count用于记录猜测次数,再根据算法把最终得分计算出来。
使用do while循环判断是否进入下一轮循环
问题:
使用do while循环输入字符的时候总是报错
原因:
还停留在C的语法上,对JAVA的字符输入不熟悉
解决方案
首先对字符赋初始值String c=null;,再从do while循环中引用c.equals("y")
2.万年历
package rili;
import java.util.Scanner;
public class rili{
public static void main(String[] args) {
System.out.println("1.请输入年份:");
rili.one();
System.out.println("2.请输入年份和月份:");
rili.two();
System.out.println("3.请输入年份和月份:");
rili.three();
System.out.println("4.请输入年份和月份用空格分开:");
rili.four();
}
public static void one(){ //判断平年闰年
Scanner word=new Scanner(System.in);
int y=word.nextInt();
if(y%4==0)
{
System.out.println("该年为闰年!");
}
else {
System.out.println("该年为平年!");
}
}
public static void two(){ //某月有几天
Scanner word=new Scanner(System.in);
int day;
int year=word.nextInt();
int month=word.nextInt();
switch(month) {
case 2:
if(year%4==0&&(year%100!=0)||year%400==0) {
day=29;
}
else {
day=28;
}
break;
case 4:
case 6:
case 9:
case 11:day=30;break;
default:day=31;
}
System.out.printf("该月有%d天
",day);
}
public static void three(){ //某年某月据1900年1月1日有几天
Scanner word=new Scanner(System.in);
int year=word.nextInt();
int month=word.nextInt();
int i,day=0;
int[] daymonth=new int[] {31,28,31,30,31,30,31,31,30,31,30,31};
for(i=1900;i<year;i++) {
if(year%4==0&&(year%100!=0)||year%400==0)
{
day+=366;
}
else {
day+=365;
}
}
if(year%4==0&&(year%100!=0)||year%400==0) {
daymonth[1]=29;
}
for(i=0;i<month-1;i++) {
day+=daymonth[i];
}
System.out.printf("该月份据1900年1月1日有%d天!
",day);
}
public static void four(){ //万年历
Scanner word=new Scanner(System.in);
int year1=word.nextInt();
int month1=word.nextInt();
int year,day = 0,maxday = 0,day1,i,j = 0,maxday1 = 0,month;
while(year1<1900||month1<1||month1>12)
{
System.out.println("Error 请重新输入
");
year1=word.nextInt();
month1=word.nextInt();
}
for(year=1900;year<year1;year++)
{
if(year%4==0&&year%100!=0||year%400==0)
{
day=day+366;
}
else
{
day=day+365;
}
}
for(month=1;month<month1;month++)
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
maxday=maxday+31;
}
else if(month==4||month==6||month==9||month==11)
{
maxday=maxday+30;
}
else if(month==2)
{
if(year1%4==0&&year1%100!=0||year1%400==0)
{
maxday=maxday+29;
}
else
{
maxday=maxday+28;
}
}
}
day1=day+maxday;
System.out.printf("
********%d年%d月********
",year1,month1);
System.out.println("星期日 星期一 星期二 星期三 星期四 星期五 星期六");
switch(day1%7) {
case 0: System.out.printf(" ");j=1;break;
case 1: System.out.printf(" ");j=2;break;
case 2: System.out.printf(" ");j=3;break;
case 3: System.out.printf(" ");j=4;break;
case 4: System.out.printf(" ");j=5;break;
case 5: System.out.printf(" ");j=6;break;
case 6: j=0;break;
}
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
maxday1=31;
}
else if(month==4||month==6||month==9||month==11)
{
maxday1=30;
}
else if(month==2)
{
if(year1%4==0&&year1%100!=0||year1%400==0)
{
maxday1=29;
}
else
{
maxday1=28;
}
}
for(i=1;i<=maxday1;i++)
{
System.out.printf(" %2d ",i);
j++;
if(j%7==0)
{
System.out.printf("
");
}
}
System.out.printf("
");
}
}
程序设计思路:
1.输入年份,根据 year%40&&(year%100!=0)||year%4000 判断平年闰年。
2.输入年份、月份,根据 year%40&&(year%100!=0)||year%4000 判断平年闰年,其中闰年2月29,平年2月28天。判断是那个月份输出天数。
3.输入年份、月份, year%40&&(year%100!=0)||year%4000 判断平年闰年,把1900年到输入的年份总天数求出,再加上当年的月天数。
4.输入年份、月份, year%40&&(year%100!=0)||year%4000 判断平年闰年,把1900年到输入的年份总天数求出,再加上当年的月天数day1,day1%7使用switch语句 控制输出格式打印出万年历。
问题:
1.不符合条件查漏出错
2.万年历格式不对
3.JAVA的运算符+
原因:
1.输入的时候二次定义,最开始的时候定义int year1=word.nextInt();,循环中又定义int year1=word.nextInt();
2.对于System.out.println理解不到位,System.out.println("");本身就有换行的意思
System.out.println("");用于字符串的输出
3.JAVA中的+可用于连接两个字符串
解决方案:
1.循环中再次输入的时候,直接输入year1=word.nextInt();即可不用定义。
2.在应用switch语句时将System.out.println("");改为
switch(day1%7) {
case 0: System.out.printf(" ");j=1;break;
case 1: System.out.printf(" ");j=2;break;
case 2: System.out.printf(" ");j=3;break;
case 3: System.out.printf(" ");j=4;break;
case 4: System.out.printf(" ");j=5;break;
case 5: System.out.printf(" ");j=6;break;
case 6: j=0;break;
}
可控制格式问题
3.评分系统
package third;
import java.util.*;
public class third {
public static void main(String[] args) {
System.out.println("请评委给5位选手在1-10分之内打分!
");
int i,j;
int[][] arr={{9,6,8,8,7,5,6,9,7,8},{9,8,7,9,8,7,9,8,8,5},{6,5,4,9,8,7,8,6,9,7},{8,5,9,6,7,9,6,8,7,8},{9,8,5,6,7,9,8,7,5,6}};
double[] ave = new double[5];
System.out.println("5位选手成绩分别为:");
for(i=0;i<5;i++){
for(j=0;j<10;j++){
System.out.printf("%5d",arr[i][j]);
}
System.out.printf("
");
}
int[] max=maxscore(arr);
System.out.println("5位选手最高成绩分别为:");
for(i=0;i<max.length;i++)
{
System.out.printf("%5d",max[i]);
}
int[] min=minscore(arr);
System.out.println("
5位选手最低成绩分别为:");
for(i=0;i<min.length;i++)
{
System.out.printf("%5d",min[i]);
}
int[] sum=sumscore(arr);
System.out.println("
5位选手去掉最高分最低分的总成绩分别为:");
for(i=0;i<sum.length;i++)
{
System.out.printf("%5d",sum[i]);
}
float[] aver=ave(sum);
System.out.println("
5位选手平均成绩分别为:");
for(i=0;i<aver.length;i++)
{
System.out.printf("%5.1f ",aver[i]);
}
}
public static int[] maxscore(int arr[][]){ //最大
int i,j;
int[] brr=new int[5];
for(i=0;i<5;i++){
brr[i]=arr[i][0];
for(j=0;j<10;j++){
if(brr[i]<arr[i][j])
brr[i]=arr[i][j];
}
}
return brr;
}
public static int[] minscore(int arr[][]){ //最小
int i,j;
int[] crr=new int[5];
for(i=0;i<5;i++){
crr[i]=arr[i][0];
for(j=0;j<10;j++){
if(crr[i]>arr[i][j])
crr[i]=arr[i][j];
}
}
return crr;
}
public static int[] sumscore(int arr[][]){ //求和
int i,j;
int[] sum=new int[5];
int[] max=maxscore(arr);
int[] min=minscore(arr);
for(i=0;i<5;i++){
for(j=0;j<10;j++) {
sum[i]+=arr[i][j];
}
sum[i]-=(max[i]+min[i]);
}
return sum;
}
public static float[] ave(int sum[]) { //平均
int i;
float[] ave=new float[5];
for(i=0;i<sum.length;i++) {
ave[i]=(float) (sum[i]/3.0);
}
return ave;
}
}
程序设计思路:
1.首先对二维数组初始化,即每位选手成绩。
2.求最大最小值时首先定义一个一位数组,使其等于每行第一个数依次比较大小,找到最大的或最小的存入数组。
3.求和取平均时先把每位选手所有成绩相加,再减去最大值最小值,取平均值(注意变量float)。
问题:
1.注意定义变量
2.数组输出的格式不对
3.JAVA中二维数组的使用
原因:
平均值是小数应定义成浮点型
数组输出时应是max[i]
使用数组时先为改为分配空间,再为低维分配空间。
解决方法:
调用数组时要注意声名是什么类型的 ,以及不要忘了中括号。