Java第四课:
1.1 回顾
1.1.1 Java中的数据类型:
基本类型(8种 ,每个类型字节数 (byte)129)和引用类型(类String 接口 注解 数组 枚举 等)
基本数据类型来讲,通常说存储在内存的栈中;
String算不算引用类型?
1.1.2 类型的转换:
前提是类型一定要兼容:
隐式转换(自动) double d=12;
显式转换(强制)int n =(int)12.34;
基本类型和引用类型之间的转换:
字符串“123” 整数123 Integer.parseInt(字符串的对象名);
package test;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
// 此时需要将str1和str2先转换为 数字格式
// int ->Integer
/*
* Integer n1 = Integer.valueOf(str1); int n2 = Integer.parseInt(str1);
*/
String str1="123";
String str2="123";
int n1 = Integer.parseInt(str1);
int n2 = Integer.parseInt(str2);
System.out.println(n1 + n2);
int n3 = 123;
String str3 = n3 + "";
}
}
246
1.1.3 运算符:
算术(+ - 。。。 % ++ –) 关系(> < >= <= ==) 逻辑(&& || ! & | ) 位(<< >>) 条件(? : ;) 赋值(= + =。。。)
1.1.4 分支结构 :
If(if -else) /if-else if /if -if
Switch-case: break
1.1.5 If和Switch的区别:
- 区间(某个范围)的判断优先选择多重if;等值可以使用if或者switch-case;
- Switch-case中的常量判断有类型规定: byte/char/short/int/enum/String(jdk1.7)
enum Sex{
男,女;
}
package test;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Sex sex = Sex.男;
switch (sex) {
case 男:
System.out.println("男");
break;
default:
break;
}
}
}
1.1.6 循环结构:
基本的for循环:
for(表达式1;表达式2;表达式3)
{
//循环体
}
package test;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
for (int i = 0, j = 4; i < 5; i++, j--) {
System.out.println(i + "+" + j + "=" + (i + j)); // 20?
}
}
}
1.2 控制循环的关键字:
break: 跳出循环结构 ;向外跳出一层;
continue:终止本次循环,尝试进行下一次循环;
package test;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
for (int i = 1; i <= 100; i++) {
System.out.println("请问你吃了吗?(yes/no)");
Scanner input = new Scanner(System.in);
String ans = input.next();
// 如果输入的是yes 循环结束
if (ans.equals("yes")) {
break;
} else {
// 否则,我们让他吃
System.out.println("吃饭很重要,来给你一份 台湾卤肉饭~");
}
}
System.out.println("over ~ 嗝");
}
}
package test;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
for (int i = 1; i <= 100; i++) {
System.out.println("请问你吃了吗?(yes/no)");
Scanner input = new Scanner(System.in);
String ans = input.next();
// 如果输入的是yes 循环结束
if (ans.equals("yes")) {
// break;
continue;
}
System.out.println("循环体内的代码");
}
System.out.println("over ~ 嗝");
}
}
1.3 其他循环结构:
我们学过for循环了,我发现,循环中大概有几个重要的组成部分
1.3.1 While循环
先判断条件,如果条件为真,执行循环体,如果为假,跳过循环;
1.3.2 Do-while循环
package test;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
System.out.println("***********while**先判断条件*********");
int i = 1;
while (i > 1) {
i++;
System.out.println("i" + i);
}
System.out.println("***********do-while**先执行一次再说*******");
int j = 1;
do {
j++;
System.out.println("j" + j); //2
} while (j > 1);//死循环
}
}
1.4.3 Foreach循环:
1.5 嵌套循环:
1.5.1 基本结构:
在一层循环中,还包含了另外一层的循环,这种结构称为嵌套循环;
1.5.2 九九乘法表:
package test;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
// 外循环控制的是行的打印 ,9次(9行)
for (int i = 1; i <= 9; i++) {
// 内循环 控制的是每行打印的次数(表达式的个数 1*1 = 1),i 次
for (int j = 1; j <= i; j++) {
System.out.print(j + "*" + i + "=" + (j * i) + " ");
}
// 换行
System.out.println();
}
}
}
1.5.3 嵌套循环的小练习:
- 公元前五世纪,我国古代数学家张丘建在《算经》一书中提出了“百鸡问题”:鸡翁一 值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
package test;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
// 公鸡 [0~20]
for (int i = 0; i <= 20; i++) {
// 母鸡 [0~33]
for (int j = 0; j <= 33; j++) {
// 小鸡 [0~100] 100-公鸡个数-母鸡
int k = 100 - i - j;
// 百钱(100块)
if (15 * i + 9 * j + k == 300) {
System.out.println("公鸡 :" + i + "母鸡 :" + j + ", 小鸡:" + k);
}
}
}
}
}
公鸡 :0母鸡 :25, 小鸡:75
公鸡 :4母鸡 :18, 小鸡:78
公鸡 :8母鸡 :11, 小鸡:81
公鸡 :12母鸡 :4, 小鸡:84
2.1!+2!+3!+….+7!的结果是多少?
1.6 程序的调试(重要):
尽快找到程序中的错误,使得程序运行结果与预期相符
设置断点;单步执行(F5 F6 F7 F8) ,过程中要去观察程序执行过程(观察其中的变量变化);修复问题;
1.7 循环练习题目:
题目:打印出所有(100~999)的 “水仙花数 “,所谓 “水仙花数 “是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 “水仙花数 “,因为153=1的三次方+5的三次方+3的三次方。
见昨天的课后作业讲解
1.7.1 DEBUG题目(小球):
一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?(DEBUG)
package test;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
// 公鸡 [0~20]
// 定义一个变量保存的是每次落地后弹起的高度
double height = 100;// 初始高度为100
int i = 1;// 循环变量
// 计算小球经过的总的路径;
double sum = 100;// 第一次落地时的高度值
while (i <= 10) {
// 每次落地弹起的高度为原来的一半
height = height / 2;
// System.out.println("第" + i + "次落地,弹起的高度为" + height + " m");
if (i < 10) {
sum = sum + height * 2;
System.out.println("第" + (i + 1) + "次落地时的经过的路程长度和 :" + sum);
}
i++;// 循环变量要++
}
System.out.println("经过的路程长度为 :" + sum);
}
}
1.7.2 猴子吃桃问题:
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个 ;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。 请使用for和while分别处理;
分析: 一共吃了九天;倒着推理;
第10天早上开始: 没吃, 1
第9天早上: 没吃, (1+1)*2=>4
第8天早上开始: 没吃, (4+1)*2 =>10
…
第1天早上,摘了,还没吃 (?+1)*2 =>
以上的分析可以得到:
1. 循环执行几次;
2. 计算桃子个数的表达式 (?+1)*2
package test;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
// 以上的分析可以得到:
// 1. 循环执行几次; 9 ,从9天开始(第10天没吃到),到第一天结束
// 2. 计算桃子个数的表达式 (?+1)*2
// day表示的是天
// 计算桃子总和 sum
int sum = 1;
for (int day = 9; day >= 1; day--) {
sum = (sum + 1) * 2;
System.out.println("第" + day + "天,没吃,一共有" + sum + "个桃子");
}
// 循环结束
System.out.println("sum :" + sum);
}
}
// 改成while循环
System.out.println("***************while循环***************");
int sum0 = 1;
int day = 9;
while (day >= 1) {
sum0 = (sum0 + 1) * 2;
System.out.println("第" + day + "天,没吃,一共有" + sum0 + "个桃子");
day--;
}
// 循环结束
System.out.println("sum0 :" + sum0);
1.8 数组:
1.8.1 数组定义和遍历代码:
package test;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
// 类型 [] 数组名 = new 类型[长度];
// 默认值 int类型0
System.out.println("******arr01******");
int[] arr01 = new int[5];
for (int i = 0; i < arr01.length; i++) {
System.out.println(arr01[i]);
}
// new 出来,直接赋值 不指定长度
int[] arr02 = new int[] { 11, 2, 3, 4, 5 };
System.out.println("******arr032----***foreach(for)***");
// 数据类型 变量名: 数组名(集合)
for (int i : arr02) {
System.out.println(i);
}
// 不需要new关键字 直接使用{}赋值
int[] arr03 = { 1, 2, 3, 4, 5 };
System.out.println("******arr03******");
// 访问数组元素 下标(索引) 0 到数组长度-1结束了 数组名[下标]
// 会和循环结合在一起使用
// arr03.length 表示的数组的长度
for (int i = 0; i < arr03.length; i++) {
System.out.println(arr03[i]);
}
}
}
1.8.2 数组的存储:
1.8.3 二维数组:
- 从控制台接收5个学生的java成绩,求和和平均分;
package test;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
// 成绩
double[] score = new double[5];
// 控制台输入
Scanner input = new Scanner(System.in);
/// 使用循环来处理输入
// score.length 数组的长度
// 累加求和
double sum = 0;
for (int i = 0; i < score.length; i++) {
System.out.println("请输入第" + (i + 1) + "个学生的java成绩");
// 接收
score[i] = input.nextDouble();
// 累加
sum += score[i];
}
System.out.println("总成绩为 :" + sum + ",平均成绩为: " + sum / score.length);
}
}
- 从控制台接收5个学生的java成绩,求最高分和最低分;
1.9 总结:
- 循环结构: while do-while foreach(遍历数组或者集合) 嵌套循环
- 数组(定义 声明 定义 赋值 访问 +循环)
- 程序调试: debug F5 F6 F7 ….