Java学习的第三天
今天的学习目标是Java的基本控制结构
1.算法的流程主要包括顺序,分支,循环三种控制结构,Java中的控制语句有以下几类
- 分支结构:if-else;switch
- 循环结构:while;do-while;for
- 与循环转移(跳出循环有关的跳转语句):break;continue,return。
- 异常信息有关的语句:try-catch-finally,throw
2.顺序结构:自上而下,一条语句执行完之后,下一条语句。通常形况下都是这样执行的。system.out.println()这样的语句。
3.分支结构:更具条件(表达式)来判断是否成立,如果成立执行某一条语句,否则执行另一条语句。
- if-else语句:例题:通过键盘输入学生的成绩,并且判断输入的成绩是否在有效的范围内,如果有效,则输出,无效,则输出数据无效。if与else这种情况就导致只有两种情况,非黑即白。
public class IfElse {
public static void main(String[] args) {
System.out.println("请输入合适的数字:");
Scanner scanner=new Scanner(System.in);
int score = scanner.nextInt();
if (score>0&&score<=100){
System.out.println("得分:"+score);
}else {
System.out.println("数据无效");
}
scanner.close();
}
}
结果是:
请输入合适的数字:
30
得分:30
请输入合适的数字:
600
数据无效
- 多分支if-else语句:例题:键盘输入学生的成绩,可以判断出学生的成绩的等级。
public class StudentGrade {
public static void main(String[] args) {
System.out.println("请输入学生的得分0~100:");
Scanner scanner=new Scanner(System.in);
int score= scanner.nextInt();
if (score<60){
System.out.println("需要好好学习了,这次不及格");
}else if (score>=60&&score<70){
System.out.println("刚刚及格线,下次加油");
}else if (score>=70&&score<80){
System.out.println("继续努力,向着80前进");
}else if (score>=80&&score<90){
System.out.println("很不错的成绩,但是还不够完美");
}else {
System.out.println("牛逼!");
}
scanner.close();
}
}
结果是:
请输入学生的得分0~100:
98
牛逼!
- switch语句:
1.switch语句中的每个case分支的动作都是以break语句作为结束的。这里的break语句是来终止switch语句的。(很重要)如果没有break语句,程序会继续执行下一个case分支中的动作,知道碰到一个break语句,或抵达了switch语句的结尾。
2.switch的语句中的控制表达式必须是char,int,short或byte类型的,还有枚举类型(在jdk1.7时,可以为字符串类型)。case后面的常量表达式的类型必须与控制表达式的而类型相同。
3.例题:(一般情况下switch语句会伴随着随机数的出现)编写程序,更具运行时生成的随机数,显示当前喝酒的人。
*随机函数:Math.random():产生一个[0,1)之间的随机数,此时的随机数是double类型的,大于等于0且小于1。所以Math.random()4+1的结果是0~5之间,但是不包括5,选择使用int强转,此时的整数就是包含:0,1,2,3,4
public class Drink {
public static void main(String[] args) {
System.out.println("摇色子,喝酒的人是:");
//生成一个0~4随机数(5个数)
int i=(int)(Math.random()*4+1);
switch (i){
case 0:
System.out.println("小明");
break;
case 1:
System.out.println("小红");
break;
case 2:
System.out.println("小刚");
break;
case 3:
System.out.println("张三");
break;
case 4:
System.out.println("李四");
break;
}
}
}
结果是:
摇色子,喝酒的人是:
小刚
随机的
4.switch语句中的default用法:当没有找到匹配的对象时,就会执行default的分支,这个时候,会注意default分支的位置,可以在前,可以在后,但是也会遇到break才会停下,一般情形况下,是在最后面。
4.循环结构:根据条件反复执行某些操作。
- while循环语句:在while循环语句中,**若表达式的值为ture,则会重复执行循环体语句。**通常情况用来执行,未知次数的循环(不了解循环多少次才能完成任务),比如:面试题体中出现的一直输入数字,知道遇到的不是数字,才会结束循环。(hasNextDouble()方法)例题:编写程序,计算1+2+3+4+…+100。
public class Test3 {
public static void main(String[] args) {
int sum=0;//声明一个变量,记录求和
int i=1;//声明一个基础数字,求和时1+2+.....
while (i<=100){
sum+=i;
i++;
}
System.out.println("1到100之间求和结果为:"+sum);
}
}
结果为:
1到100之间求和结果为:5050
- do-while语句:do-while语句与while语句的区别在于do-while的循环体至少被执行一次。相对于while语句而言,如果while(表达式)不满足要求,此时就不会执行循环体,但是对于do-while语句而言,会先执行一次循环体到循环体结束时,会去判断条件是否成立。例题:同上***(注意看while的条件所在位置,所以会至少被执行一次)***
do {
sum+=i;
i++;
}while (i<=100);
- for循环语句。一般情况下,for循环分为两种情况:1.普通的for循环.2for-each循环(用来遍历数组,序列等)。普通的for循环需要明确的循环次数(也可以通过一些方法获取)。
例题:使用for循环编写程序,计算整型数组中所有元素之和。【注意新名词数组】
public class TestFor {
public static void main(String[] args) {
int [] a={13,25,78,12};//题目所给的整形数组
int sum=0;//声明一个变量,记录元素之和
int count=0;//声明一个变量,用来记录数组里的每一个值
//a.length用来计算数组的长度,确定for的循环次数(通过方法来获取for循环的次数)
for (int i=0;i<a.length;i++){
count=a[i];
sum+=count;
}
System.out.println(sum);
}
}
结果为:
123
例题:使用for-each循环语句实现上面例题的功能。
结果是一样的,需要来分析一下,首先,执行foreach循环时,会依次从数组(容器)中取出一个元素保存在冒号前面声明的变量中(变量需要在这里声明,不能提前声明,注意观察代码中的count变量),冒号后面的变量则是需要遍历的容器(该问题是数组a)。
public class TestFor {
public static void main(String[] args) {
int [] a={13,25,78,12};//题目所给的整形数组
int sum=0;//声明一个变量,记录元素之和
//int count=0;//声明一个变量,用来记录数组里的每一个值
//a.length用来计算数组的长度,确定for的循环次数
/*for (int i=0;i<a.length;i++){
count=a[i];
sum+=count;
}*/
for (int count:a){
sum+=count;
}
System.out.println(sum);
}
}
- 循环的嵌套(多层循环),在经历学习Java的过程中,大多数都是双层for循环的嵌套。
例题:计算1!+2!+3!+…+10!(分析该题目,首先需要知道!代表什么,阶乘—3!=321)sub=sub*j;//当循环进行了一次后,sub的值会发生变化
public class DoubleFor {
public static void main(String[] args) {
int sum=0;//用来所有阶乘求和
//在for循环中,建议在表达式中声明变量,如:i;j...
for (int i=1;i<=10;i++){
//可以在for循环的第一层,获取到i的值为1到10
int sub=1;//用来求单个阶乘
for (int j=1;j<i;j++){
//注意这里j是小于i,而不是小于10
sub=sub*j;//当循环进行了一次后,sub的值会发生变化
}
sum+=sub;
}
System.out.println(sum);
}
}
结果是:
409114
5.控制循环结构(break,continue面试会经常遇到)
- 用使用break结束循环:break用于强制退出循环,且不执行循环中剩于的语句,break语句可以在while循环,do-while循环,for循环中使用。
例题:编写程序,从键盘输入一个数,判断该数是否为素数。
分析一下:素数:一个数只能被1和他的本身整除则该数为素数。判断一个数(假设为n)为素数,只需要看该数n能否被2~n-1的数整除,如果能,则不是素数,不能则为素数。
public class SuShu {
public static void main(String[] args) 3{
System.out.println("从键盘输入一个数字:");
Scanner scanner=new Scanner(System.in);
int element = scanner.nextInt();
boolean flag=true;
for (int i=2;i<element-1;i++){
if (element%i==0){
flag=false;
}
}
if(flag){
System.out.println("该数字是素数"+element);
}else {
System.out.println("该数字不是素数");
}
scanner.close();
}
}
结果为:
从键盘输入一个数字:
3
该数字是素数3
从键盘输入一个数字:
55
该数字不是素数
通过题目,来解释一下,boolean型参数很重要,如果说,在 if (element%i==0)这个地方,判断出该数字不是素数,就输出的话,比如:55,就回输出两次结果,因为55=5*11,当for循环到5的时候会输出一次,11的时候也会输出一次。所以引入boolean型参数,没有输出,只需要用来标注,当循环结束时,此时flag的值是false,再去判断,falg的值,如果是true,则为素数,因为此时默认值就是true,当该数字进入循环时,没有被改变,那么证明就是素数,只有非素数才会被更改falg的值。
- 使用continue结束本次循环:continue语句可以强迫程序跳转到循环的起始处,当程序运行到continue语句时,即会停止运行剩余的循环主体,而是回到循环的开始处继续运行。(换句话而言,遇到continue时,就是跳出本次循环,不去执行continue下面的语句,进入下一次循环)
例题:编写程序,输出1~100之间所有不能被3整除的数。
public class Test4 {
public static void main(String[] args) {
for (int i=1;i<=100;i++){
if (i%3==0){
continue;
}
System.out.println("1~100之间所有不能被3整除的数有:"+i);
}
}
}
结果太多就不全部显示
1~100之间所有不能被3整除的数有:1
1~100之间所有不能被3整除的数有:2
1~100之间所有不能被3整除的数有:4
1~100之间所有不能被3整除的数有:5
1~100之间所有不能被3整除的数有:7
1~100之间所有不能被3整除的数有:8
1~100之间所有不能被3整除的数有:10
通过题目,来解释一下:当从1开始去进行取模运算时(%),首先会在if语句中进行判断,遇到能被3整除数字时,会执行continue语句,此时跳出本次循环,进行下一次循环。例如:i=3时,此时满足if条件,执行continue,就不会向下去执行System.out.println(“1~100之间所有不能被3整除的数有:”+i)。