18/3/12 学习总结
(一)学习总结
1.在java中通过Scanner类完成控制台的输入,查阅JDK帮助文档,Scanner类实现基本数据输入的方法是什么?不能只用文字描述,一定要写代码,通过具体实例加以说明。
2.Random类和Math类的random()方法都能产生随机数,这两种方式有什么区别,各有什么特点呢?查阅JDK帮助文档,并举例加以说明。
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");
}
}
}
为了处理精度损失的问题,可以使用java.math.BigDecimal类,查阅JDK帮助文档或教材p378,对上述程序进行修改。
package 日常瞎写;
import java.util.;
import java.math.BigDecimal;
public class Xiaxie {
public static void main(String args[]) {
double b = 0.1;
double c = 0.1;
double sum=0;
sum=Math.round(Math.add(0.1,0.1,0.1),1);
System.out.println(sum);
if(sum==0.3){
System.out.println("等于0.3");
}else {
System.out.println("不等于0.3");
}
}
}
class Math{
public static double add(double a1,double a2,double a3){
BigDecimal x1=new BigDecimal(a1);
BigDecimal x2=new BigDecimal(a2);
BigDecimal x3=new BigDecimal(a3);
return x1.add(x2).add(x3).doubleValue();
}
public static double round(double d,int len){
BigDecimal x1=new BigDecimal(d);
BigDecimal x2=new BigDecimal(1);
return x1.divide(x2,len,BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
4.本次学习要点中其他需要总结的内容:因人而异,根据自己的学习情况,记录难掌握或难理解的内容,以及学有心得的内容。还存在哪些问题,也可以提出来,对于同学在博客中提出的问题,大家可以积极讨论,互帮互学。
作业:(一)
1.首先创建一个Scanner对象s,构造函数的初始值为System.in,再利用s.nextInt()来接收一个int型数据ival的值,用s.nextLine()来接收String类型的name,然后分别输出。
package 日常瞎写;
import java.util.;
public class Xiaxie {
public static void main(String[] args) {
int a;
Scanner input=new Scanner(System.in);
System.out.println("请输入个值a:");
a=Integer.parseInt(input.next());
/*Scanner input = new Scanner(System.in);
System.out.println("请输入a:");
a= input.nextInt();*/
System.out.print("a:"+a);
}
}
我尝试用两种方法输出/----/中也是方法之一,如果是一维数组二维数组加上循环就可以了。
2.Math.random()返回的只是从0到1之间的小数,如果要50到100,就先放大50倍,即0到50之间,这里还是小数,如果要整数,就强制转换int,然后再加上50即为50~100.
Random内Random rand=new Random();int a;a=rand.nextInt(100)+1;a是随便设定的,(100)+1给的是范围1-100内的随机数。
3.答案为不等于0.3,double是双精度类型 不是什么小数类型,在标称语言里,float和double都不是精确地值,float a=1可能存的数值是0.999999,java里有类可以解决此类问题。
4.我的c语言底子很差,感觉java写起来有些费劲,不过java便利的是引用类可以节省我们很大的功夫,比如sort排序,不用自己排序系统就自动的帮你了,java有很多类,以后我会用得着,不过现在我还没看
马上就要接触面对对象这个问题了,我决定这学期无论java语言有多困难,我也不会抄袭别人的程序,磕磕绊绊也好,停滞不前也好,我想要自己完成我的java结课设计。
(二)实验总结
实验内容:
1.看商品猜价格
2.万年历
3.评分系统
对完成实验内容过程中遇到的问题、解决方案以及程序的设计思路和思考等进行归纳总结。
格式如下:
程序设计思路:XXXXXXX
问题1:XXXXXXX
原因:XXXXXXX
解决方案:XXXXXXX
问题2:XXXXXXX
原因:XXXXXXX
解决方案:XXXXXXX
(二):
1代码:
import java.util.Random;
import java.util.Scanner;
import java.util.;//util类型的类统统可以用.表示
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);//Scanner是一个类,扫描从控制台输入的字符;简单来说是c语言中的scanf;
Scanner input=new Scanner(System.in);
Random rand=new Random();//创建一个随机对象rand,rand可以为任意字母
int x,a,b=0,c,answer=0,q=0;
String str=null;
q=rand.nextInt(100)+1;//给定商品的随机价格:q;
// System.out.println(q);
String an="y";//对do while循环的判断定义y;
do{
go:for(int i=0;i<=4;i++){
System.out.print("请输入一个价格");
a=Integer.parseInt(input.next());//Integer.parseint()就是把整形对象Integer转换成基本数据类型int(整数);
//input.next是接受键盘的数据,还是懵逼,总之是得到自己想要输入的数就对了
b++;
if(a>q){
System.out.println("too large");
}
else if(a<q){
System.out.println("too little");
}
else if(a==q){
System.out.println("恭喜您,答对了");
break go;
}
//break后加空格在加go;go:指向的位置为自己想要跳出的循环
}
System.out.println("您用光了所有机会");
System.out.println("您总共猜了"+(b)+"次");
System.out.println("是否继续,继续请输入y");
an=input.next();
}while("y".equals(an));
if(b>5)
{
answer=0;
}
else if(b>=0&&b<=5){
answer=100-20*b;
}
System.out.println("答案为:"+q);
System.out.println("您的分数为:"+answer);
}
}
我的设计思路是先给定一个100以内的随机数,然后用do-while循环判断是否猜对了价格,最后判断是否继续,这个没有太大的问题,就是总是写错大小写。
package 万年历;
import java.util.*;
public class Demo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int year, month, x,sum=0;
Scanner input = new Scanner(System.in);
System.out.println("请输入年:");
year = input.nextInt();
System.out.print("请输入月份:");
month = input.nextInt();
int day = 0;
int firstday = 0;
int days = 0;
if(isLeap(year)){
System.out.println(""+year+"是闰年");
}
else{
System.out.println(""+year+"不是闰年");
}
day=days(year,month);
System.out.println(year+"年"+month+"月有"+day+"天");
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 days=0;
if (month == 2) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
days = 29;
}
else {
days = 28;
}
}
else if (month == 4 || month == 6 || month == 9 || month == 11) {
days = 30;
}
else {
days = 31;
}
return days;
}
public static void printCalender(int year, int month) { // 计算某年某月之前距1900年1月1日的天数
int x,sum=0;
int day=0;
for (int i = 1900; i < year; i++) { // 计算1900年1月1日的天数
if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)) {
day = day + 366;
} else {
day = day + 365;
}
}
int beforedays = 0;
for (int i = 1; i < month; i++) {
if (i == 2) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
sum += 29;
}
else {
sum += 28;
}
}
else {
if (i == 4 || i == 6 || i == 9 || month == 11) {
sum += 30;
}
else {
sum += 31;
}
}
}
int days = 0;
if (month == 2) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
days = 29;
}
else {
days = 28;
}
}
else if (month == 4 || month == 6 || month == 9 || month == 11) {
days = 30;
}
else {
days = 31;
}
System.out.println("");
int temp =sum % 7;
/* 输出日历 */
System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
for (int i = 1; i < temp; i++) {
System.out.print("\t");
}
for(int i=1;i<=days;i++){
if(sum%7==0){
System.out.print(i+"\n");
}
else{
System.out.print(i+"\t");
}
sum+=1;
}
System.out.println("");
day=sum+day;
System.out.println(""+year+"年"+month+"月距1900年1月1日的天数为"+day+"天");
}
}
我打算按照c语言的发法来,所以调用函数以及日期都是按照c语言来的,判断的时候布尔函数让我很是头疼,因为不知道怎么调用,最后不得不百度。
问题一:布尔函数不知道怎么返回值,也不知道怎么用
原因:boolean的返回值只有true和flase
解决方法:我让返回值为true或者flase调用的时候用if语言直接用函数名,if为真,判断为闰年。
3.package 评分系统;
import java.util.Arrays;
import java.util.*;
class Demo3 {
public static void main(String[] args) {
int arr[][];
arr=new int[5][10];
Random rand=new Random();
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
arr[i][j] = new Random().nextInt(10)+1;
}
}
System.out.println("排序前:");
for(int i=0;i<arr.length;i++){
System.out.print("选手"+(i+1)+":\t");
for(int j=0;j<arr[i].length;j++){
System.out.print(arr[i][j]+"\t");
}
System.out.println("");
}
for (int[] is : arr) {
sort(is);
}
int paixu[]=new int[10];
int ave=0;
System.out.println("排序后:");
for(int i=0;i<arr.length;i++){
int sum=0;
System.out.print("选手"+(i+1)+":\t");
for(int j=0;j<arr[i].length;j++){
System.out.print(arr[i][j]+"\t");
sum=sum+arr[i][j];
}
ave=sum/arr[i].length;
System.out.print("平均值为:"+ave+"\t");
// paixu[i]=float (ave);
System.out.println("");
}
// System.out.println("sum="+sum);
System.out.println("去掉每位选手的最高分和最低分");
for(int i=0;i<arr.length;i++){
System.out.print("选手"+(i+1)+":\t");
for(int j=1;j<arr[i].length-1;j++){
System.out.print(arr[i][j]+"\t");
}
System.out.println("");
}
int x,y;
for (int i= 0; i < 5; i++) {
System.out.print("第" + (i + 1) + "行最大值:\t");
System.out.print(hasmax(arr[i], arr[i].length));
}
System.out.println();
for (int i= 0; i < 5; i++) {
System.out.print("第" + (i + 1) + "行最小值:\t");
System.out.print(hasmin(arr[i], arr[i].length));
}
System.out.println();
/* for (int i= 0; i < 5; i++) {
System.out.print(hasave(arr[i],arr[i].length));
}*/
}
private static void sort(int[] is) {
for (int i = 0; i < is.length - 1; i++) {
for (int j = i; j < is.length; j++) {
if (is[i] > is[j]) {
int tmp = is[i];
is[i] = is[j];
is[j] = tmp;
}
}
}
}
/* public static void max(int[][] arr2){
int arr[][]=new int[5][];
int a[]=new int[5];
System.out.println("asdada");
for(int i=0;i<arr.length;i++){
for(int j=1;j<arr[i].length-1;j++){
if(arr[i][j]>a[i]){
a[i]=arr[i][j];
}
}
System.out.print("a[i]:"+a[i]);
}
}
public static int min(int[] arr1){
int arr[][]=new int[5][];
int b=0;
for(int i=0;i<arr.length;i++){
for(int j=1;j<arr[i].length-1;j++){
if(arr[i][j]>b){
b=arr[i][j];
}
}
System.out.println("");
}
return b;
}*/
private static int hasmax(int a[], int n) {
int max = a[0];
for (int i = 1; i < n; i++)
if (max < a[i])
max = a[i];
return max;
}
private static int hasmin(int a[], int n) {
int min = a[0];
for (int i = 1; i < n; i++)
if (min >a[i])
min = a[i];
return min;
}
private static void hasave(int a[], int n){
int aver=a[0],sum=0;
float ave;
for(int i=1;i<n;i++){
sum=sum+a[i];
}
ave=sum/8;
System.out.println("aave="+ave);
}
}
我用for循环创建二位随机数组,然后排序之后,偷了个懒,输出直接跳过第一位和最后一位,然后进行输出
问题一:我一直在捉摸怎么判断长度然后换行
原因:java里可以直接在数组名后加.。
解决方法:我用arr.length或者arr[i].length判断长度换行
问题二:调用函数我用的二维数组
原因:不清楚返回值究竟是个数组还是个数
解决方法:我不知道能不能返回数组,我直接返回一个数在循环里面
(三)代码托管
码云提交历史截图
上传实验项目代码到码云,在码云项目中选择“统计-提交”,设置搜索时间段,搜索本周提交历史,并截图。