日常学习过程中的记录
收获
学习Java到现在是有很大收获的,但是呢这里还是要给大家讲解一下我在写代码过程中遇到的一些问题,此篇文章小白必看,因为博主也只是学习Java语言两周的小白,大家也可以在评论区分享一下自己的进程,博主真的是零基础学习Java的,目前两周的进展也欢迎大佬提点。
记录代码错误
今天写的代码本人本身还有点满意,但是没想到还有那么多的漏洞,学习本身就是一个不断思考进步的过程,希望大家看完可以给点意见,希望给小白们带来一些收获。
进入正文,上代码
package study_03关卡6debug; /* 朋友聚会的时候可能会玩一个游戏:逢七过。 规则是:从任意一个数字开始报数,当你要报的数字包含7或者是7的倍数时都要说:过。 为了帮助大家更好的玩这个游戏,这里我们直接在控制台打印出1-100之间的满足逢七必过规则的数据。 这样,大家将来在玩游戏的时候,就知道哪些数据要说:过。*/ public class 逢七过 { public static void main(String[] args) { for (int i = 1; i <101 ; i++) { if (i%7==0){ System.out.print(i+" "); } } } }
大家观察代码可以发现一个问题并没有实现一个输出包含7的这么一个功能,也就是说我们写代码的时候没有看清题目的需求,这个问题如果将来进入到产品开发以后是很致命的,希望自己以后不会在犯这种最基本的错误,也就是说希望大家写完代码可以自己在读一遍题意看一下自己的所有功能是否都实现了。接下来把这个代码修正。
修正后的结果如下
package study_03关卡6debug; /* 朋友聚会的时候可能会玩一个游戏:逢七过。 规则是:从任意一个数字开始报数,当你要报的数字包含7或者是7的倍数时都要说:过。 为了帮助大家更好的玩这个游戏,这里我们直接在控制台打印出1-100之间的满足逢七必过规则的数据。 这样,大家将来在玩游戏的时候,就知道哪些数据要说:过。*/ public class 逢七过 { public static void main(String[] args) { for (int i = 1; i <101 ; i++) { if (i%10==7){ System.out.print(i+" "); }else if(i/10==7){ System.out.print(i+" "); } if (i%7==0){ System.out.print(i+" "); } } } }
接下来再来看一段方法代码
public static boolean s(int arr[],int arr1[]){
if (arr.length!=arr1.length){
return false;
}
for (int k = 0; k <arr.length ; k++) {
if (arr[k] != arr1[k]) {
return false;
}
}
return true;
}
博主在写这行代码刚开始的时候没有意识到boolean类型的变量没有空值,习惯性写了return 0;当然是报错的。
还有就是最后面加的return后面返回的是true,因为前面限定了条件以后返回的都是false,也就是说满足了那些限定条件以后输出的都是true,那么我们就不需要在去加什么限定条件直接return ture即可,也就是让代码更简练一些。
接下来看这段代码
这是设计一个程序判断能否构成三角形。
那么博主经过简单的分析,迅速判断出来写这段代码的方法就是可以直接让两个最小的数相加是否大于最大的数即可。
然后写成了如下的程序,那么请大家观察一下如下的代码,看有没有问题
package study_03关卡6debug;
import java.util.Arrays;
import java.util.Scanner;
public class 三角形 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int arr[]=new int[3];
for (int i = 0; i < arr.length; i++) {
int number=sc.nextInt();
arr[i]=number;
}
Arrays.sort(arr);
if (arr[0]+arr[1]>arr[2]){
System.out.println("能构成");
}else{
System.out.println("不能");
}
}
}
观察完以后,很明显我的思路是没问题的,但是!要注意一点。如果你输入了负数会发现也可以进行判断,那么我们是明白的负数是无法构成三角形的,比较我们讨论的是不包含方向的,也就是说我们应该在设计一个程序让他输入负数以后进行报错然后重新输入。
然后还有一个问题,我们输入小数是不可以的,所以我们要写一个程序可以输入一个小数。
接下来我们去改变一下我们的代码。
package study_03关卡6debug; import java.util.Arrays; import java.util.Scanner; public class 三角形 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); float arr[]=new float[3]; for (int i = 0; i < arr.length; i++) { float number=sc.nextInt(); if(number>0){ arr[i]=number; }else { for (;;){ System.out.println("输入有误重新输入"); float number1=sc.nextInt(); if(number1>0){ arr[i]=number1; break; } } } } Arrays.sort(arr); if (arr[0]+arr[1]>arr[2]){ System.out.println("能构成"); }else{ System.out.println("不能"); } } }
这就是改进后的代码。那么经过了上述的问题,我们要学会去改变自己的思维去审视你的代码,你自己当然能知道你的代码可以赋什么值,但是你的用户并不知道,你的代码要给用户服务,那么你就应该去改变自己的逻辑,学会写完代码以后站在用户层面去思考问题,就好比打游戏卡bug,你要去尝试着自己去卡bug。才会更加完善你的代码,更加完善你的思路。
接下来还有最后一个列子。
8,题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高? (利用方法)
package study_03关卡6debug;
import java.util.Scanner;
public class 弹力球 {
public static void main(String[] args) {
high(100);
}
public static float high(float a) {
System.out.println("反弹几次");
Scanner sc = new Scanner(System.in);
int s = sc.nextInt();
float b = 100;
for (int i = 0; i < s; i++) {
a /= 2;
if (i == 0) {
b += a;
}
else{
b += 2*a;
b += a;
}
}
System.out.println("反弹" + a + "米高");
System.out.println("经过了" + b + "米");
return 0;
}
}
看完代码我们可以尝试把代码改简单一点,大家也可以试一下。
package study_03关卡6debug; import java.util.Scanner; public class 弹力球 { public static void main(String[] args) { high(100); } public static float high(float a) { System.out.println("反弹几次"); Scanner sc = new Scanner(System.in); int s = sc.nextInt(); float b = 100; for (int i = 0; i < s; i++) { a /= 2; b+=a*2; } b=b-a; System.out.println("反弹" + a + "米高"); System.out.println("经过了" + b + "米"); return 0; } }
大家可以看看我的代码还有改进空间没有。
接下来给小白们分享一个我觉得还比较有难度的题,大家自己尝试做一下以后在来看我的代码。
7,求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由用户控制。
package study_03关卡6debug; import java.util.Scanner; public class 几个数相加 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入您想要进行的几个数相加运算,输入正整数"); int number = sc.nextInt(); System.out.println("请输入要进行那个数的运算,请输入小于10的正整数"); int s = sc.nextInt(); int and = 0; int xx = s; //定义了一个主循环用了确保相加几次。可以保证输入number相加number次 for (int i = 0; i < number; i++) { int multiplication = 1; // 第一次循环用不到数组,所以设置数组长度为i。 int arr[] = new int[i]; //第二次循环运行的时候开始填入数据,这是为了达到效果得到乘以100,1000,10000等等 for (int j = 0; j < arr.length; j++) { arr[j] = 10; } //实现可以乘以100,1000,10000等的效果 for (int j = 1; j < i + 1; j++) { multiplication *= arr[j - 1]; } //实现数从s,变为ss。因为第二次循环做了运算s+s*10;以此类推,实现了题目要求的效果 if (multiplication == 1) { s += s * (multiplication) - s; } else { //这里用了新的变量是为了保证每一次加的是几千或者几百等,因为s一直在变,所以用xx变量等与s初始值,来实现一个不变的量 s += xx * (multiplication); } and+=s; System.out.println(s); } System.out.println(and); } }