目录
1. 笔记
1.1 顺序结构
1. 顺序结构 程序是按照顺序执行的(从上往下) ① 输出 输出语句,从上往下依次执行 ② 输入(在实际工作中没有用处) 用途:为了一些练习使用 功能:在命令窗口输入一些数据,被程序获取! 知识点范围:属于面向对象 关注点:实现步骤 步骤: a. 准备一个输入的工具 java.util.Scanner input=new java.util.Scanner(System.in); b. 准备输入入口 nextInt() 整型数据输入的入口 nextDouble() 浮点型数据的输入入口 next() 字符串数据的输入入口 只能取空格前面的内容 nextLine() 字符串数据的输入入口 读取一行,空格也算 建议使用next(),输入的数据不要有空格 注意事项: java.util.InputMismatchException 输入的数据和类型不匹配
1.2 分支结构和选择结构
1. 分支结构和选择结构 ★ 分支结构: ① 单分支 举例:手动输入小明的java成绩,如果成绩高于90,奖励假发一顶 语法:if(条件){代码块} 原理:如果条件成立,则执行代码块,如果条件不成立则不执行代码块 特性: a. 当if后大括号中只有一行代码的时候,大括号可以省略的 这行代码不能是变量的声明(做完练习后在解释) b. if是可以嵌套的,if的大括号就可以写main方法大括号中的任意代码 补充: 变量的作用域:是在当前大括号 ② 双分支 举例:手动输入小明的java成绩,如果成绩高于90,奖励假发一顶 否则在敲2万行代码 语法:if(条件){代码块1}else{代码块2} 原理:条件成立执行代码块1,条件不成立执行代码块2 特性: a. if和else后的大括号中只有一行代码的时候,大括号可以省略的 这行代码不能是变量的声明(做完练习后在解释) b. 大括号是可以嵌套的 ③ 多分支 举例:手动输入小明的java成绩,如果成绩满分,奖励植发一次 如果成绩高于90,奖励假发一顶, 如果成绩高于80,奖励洗头膏一袋, 如果成绩大于60,奖励洗面奶一瓶, 否则在敲2万行代码 语法:if(条件1){代码块1} else if(条件2){代码块2} else if(条件3){代码块3} ... 【else{代码块n}】 原理:判断条件1是否成立,如果成立,执行代码块1,多分支结束 如果条件1不成立,就会判断条件2,如果成立的,执行代码块2,多分支结束 如果条件2不成立,就会判断条件3,如果成立的,执行代码块3,多分支结束 ... 如果所有的条件都不成立,则执行代码块n(存在else的情况下) 选择结构 语法:switch(变量名){ case 值1: 代码块1; 【break;】 case 值2: 代码块2; 【break;】 case 值3: 代码块3; 【break;】 ... 【default: 代码块n; break;】 } 原理:判断变量的值和值1是否相等 ,如果相等,则执行代码块1, 执行完之后,开始寻找break(才是结束switch的标识) 如果不相等,则判断变量和值2是否相等,如果相等,则执行代码块2, 执行完之后,开始寻找break(才是结束switch的标识) 如果不相等,则判断变量和值3是否相等,如果相等,则执行代码块3, 执行完之后,开始寻找break(才是结束switch的标识) 变量如果和所有值都不一样,则执行default中的代码块n 注意: a. case后的值不能相同 b. case的穿透 c. switch结束,要么执行完毕,要么遇到break d. switch都支持什么数据类型 byte short int char String(JDK1.7新增) 枚举(后面会讲到)
1.3 循环结构
1. 循环结构 为什么要有循环结构呢? 打印534次,好好学习天天向上!争取得到富婆练习方式! 作用:提高复用性,提高扩展性和维护性! 1.1 while 语法:while(循环条件){代码块} 原理:循环条件成立,则执行代码块,执行完代码块,会再次回到循环条件判断的位置 如果依然成立,则再次执行代码块,直到循环条件不成立为止(循环结构结束) 控制循环次数: ① 循环因子 ② 循环条件 ③ 循环因子值的改变 案例: int i=0;//程序员的习惯,0认为是第一个数据 while(i<5){ System.out.println("好好学习天天向上!争取得到植发奖励!"+i); i++; } 建议常用手段:i++就放在循环的最末尾! 1.2 for 语法:for(循环因子的声明;循环条件;循环因子值的改变){代码块} 优势:将while循环的控制循环次数的三个要素,总结到一个地方去了(小括号内) 确定循环次数的情况下,使用for循环 不确定循环次数的情况下,使用while循环 1.3 do-while 语法:do{代码块}while(循环条件); 原理:执行代码块,然后判断循环条件,如果条件成立,则继续执行代码块 如果条件不成立,则循环结束 特点:do-while至少执行一次 使用场景:不确定循环次数的情况(登录注册) 1.4 其他循环 foreach 增强for循环(后期学) 递归 循环的一种(讲完方法学)
1.4 跳转结构
1. 跳转结构 1.1 break ① switch内 用于结束当前switch ② 用在循环内(while,for,do-while,foreach) 用于结束当前循环 1.2 continue ① 用在循环内(while,for,do-while,foreach) 用于结束本次循环,直接进入下一次循环
2. 练习
第1题:成绩及格
需求:从键盘输入一个分数,如果60分(含)以上,就打印合格,如果60分以下,就打印不合格
public class TestExer01{
public static void main(String[] args){
java.util.Scanner input = new java.util.Scanner(System.in);
System.out.print("请输入成绩:");
int score = input.nextInt();
if(score >= 60){
System.out.println("合格");
}else{
System.out.println("不合格");
}
}
}
public class TestExer01{
public static void main(String[] args){
java.util.Scanner input = new java.util.Scanner(System.in);
System.out.print("请输入成绩:");
int score = input.nextInt();
System.out.println(score >= 60 ? "合格" : "不合格");
}
}
第2题:三个数排序
需求:由键盘输入三个整数分别存入变量num1、num2、num3,对它们进行排序(使用 if-else if-else),并且从小到大输出。
public class TestExer3{
public static void main(String[] args){
//1、键盘输入三个整数
java.util.Scanner input = new java.util.Scanner(System.in);
System.out.print("请输入num1:");
int num1 = input.nextInt();
System.out.print("请输入num2:");
int num2 = input.nextInt();
System.out.print("请输入num3:");
int num3 = input.nextInt();
//2、判断
/*
三个数排序,6种情况
num1 <= num2 <= num3
num1 <= num3 <= num2
num2 <= num1 <= num3
num2 <= num3 <= num1
num3 <= num2 <= num1
num3 <= num1 <= num2
*/
if(num1<=num2 && num2<=num3){
System.out.println(num1 + "<=" + num2 + "<=" + num3);
}else if(num1<=num3 && num3<=num2){
System.out.println(num1 + "<=" + num3 + "<=" + num2);
}else if(num2<=num1 && num1<=num3){
System.out.println(num2 + "<=" + num1 + "<=" + num3);
}else if(num2<=num3 && num3<=num1){
System.out.println(num2 + "<=" + num3 + "<=" + num1);
}else if(num3<=num2 && num2<=num1){
System.out.println(num3 + "<=" + num2 + "<=" + num1);
}else{
System.out.println(num3 + "<=" + num1 + "<=" + num2);
}
}
}
public class TestExer3{
public static void main(String[] args){
//1、键盘输入三个整数
java.util.Scanner input = new java.util.Scanner(System.in);
System.out.print("请输入num1:");
int num1 = input.nextInt();
System.out.print("请输入num2:");
int num2 = input.nextInt();
System.out.print("请输入num3:");
int num3 = input.nextInt();
//嵌套
if(num1 <= num2){
if(num2 <= num3){ //num1 <= num2 && num2 <= num3
System.out.println(num1 + "<=" + num2 + "<=" + num3);
}else{
if(num1 <= num3){ //num1<=num2 && num3<num2 && num1<=num3
System.out.println(num1 + "<=" + num3 + "<=" + num2);
}else{
//num1<=num2 && num3<num2 && num3<num1
System.out.println(num3 + "<=" + num1 + "<=" + num2);
}
}
}else{
if(num3 >= num1){//num1 > num2 && num3 >= num1 //num3 >= num1 > num2
System.out.println(num2 + "<=" + num1 + "<=" + num3);
}else{
if(num2 <= num3){//num1 > num2 && num1 > num3 && num2 <= num3
System.out.println(num2 + "<=" + num3 + "<=" + num1);
}else{
//num1 > num2 && num1 > num3 && num3<num2
System.out.println(num3 + "<=" + num2 + "<=" + num1);
}
}
}
}
}
第3题:押豹子
需求:赌数游戏:随机产生3个1-6的整数,如果三个数相等,那么称为“豹子”,如果三个数之和大于9,称为“大”,如果三个数之和小于等于9,称为“小”,用户从键盘输入押的是“豹子”、“大”、“小”,并判断是否猜对了
提示:随机数 Math.random()产生 [0,1)范围内的小数
public class TestExer7{
public static void main(String[] args){
//1、随机产生3个1-6的整数
int a = (int)(Math.random()*6 + 1);
int b = (int)(Math.random()*6 + 1);
int c = (int)(Math.random()*6 + 1);
//2、判断随机产生的数的结果是什么
String result;
if(a == b && b == c){
result = "豹子";
}else if(a + b + c > 9){
result = "大";
}else{
result = "小";
}
//3、用户从键盘输入押的是“豹子”、“大”、“小”
java.util.Scanner input = new java.util.Scanner(System.in);
System.out.print("请押宝(豹子、大、小):");
String ya = input.next();
//4、判断用户的输入是否猜对了
//比较ya与result是否相同
//if(result==ya){
if(result.equals(ya)){
System.out.println("猜对了");
}else{
System.out.println("猜错了");
}
System.out.println("本期号码:");
System.out.println("a="+a);
System.out.println("b="+b);
System.out.println("c="+c);
}
}
public class TestExer7_2{
public static void main(String[] args){
//1、随机产生3个1-6的整数
int a = (int)(Math.random()*6 + 1);
int b = (int)(Math.random()*6 + 1);
int c = (int)(Math.random()*6 + 1);
//2、判断随机产生的数的结果是什么
int result;
if(a == b && b == c){
result = 1;//假设豹子为1
}else if(a + b + c > 9){
result = 2;//假设大为2
}else{
result = 3;//假设小为3
}
//3、用户从键盘输入押的是“豹子”、“大”、“小”
java.util.Scanner input = new java.util.Scanner(System.in);
System.out.println("1、豹子");
System.out.println("2、大");
System.out.println("3、小");
System.out.print("请选择:");
int ya = input.nextInt();
//4、判断用户的输入是否猜对了
//比较ya与result是否相同
if(result==ya){
System.out.println("猜对了");
}else{
System.out.println("猜错了");
}
System.out.println("本期号码是:" + a + "," + b + "," + c);
}
}
第4题:月份季节
需求:
根据用于指定月份,打印该月份所属的季节。
3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12, 1, 2 冬季
public class TestExer9{
public static void main(String[] args){
//1、输入月份
java.util.Scanner input = new java.util.Scanner(System.in);
System.out.print("请输入月份:");
int month = input.nextInt();
switch(month){
case 3:
case 4:
case 5:
System.out.println("春季");
break;
case 6:
case 7:
case 8:
System.out.println("夏季");
break;
case 9:
case 10:
case 11:
System.out.println("秋季");
break;
case 12:
case 1:
case 2:
System.out.println("冬季");
break;
default:
System.out.println("输入有误!");
}
}
}
第5题:这一天是当年的第几天
需求:从键盘分别输入年、月、日,判断这一天是当年的第几天 。先不考虑非法值输入
注:判断一年是否是闰年的标准:
1)可以被4整除,但不可被100整除
2)可以被400整除
public class TestExer11{
public static void main(String[] args){
//1、从键盘分别输入年、月、日
java.util.Scanner input = new java.util.Scanner(System.in);
System.out.print("年:");
int year = input.nextInt();
System.out.print("月:");
int month = input.nextInt();
System.out.print("日:");
int day = input.nextInt();
//判断这一天是当年的第几天==>从1月1日开始,累加到xx月xx日这一天
//(1)[1,month-1]个月满月天数
//(2)第month个月的day天
//(3)单独考虑2月份是否是29天(依据是看year是否是闰年)
//2、声明一个变量days,用来存储总天数,直接初始化为day,这样就不用再加day天了
int days = day;
//3、累加[1,month-1]个月满月天数
switch(month){
case 12:
//累加的1-11月
days += 30;//这个30是代表11月份的满月天数
//这里没有break,继续往下走
case 11:
//累加的1-10月
days += 31;//这个31是代表10月的满月天数
//这里没有break,继续往下走
case 10:
days += 30;//9月
case 9:
days += 31;//8月
case 8:
days += 31;//7月
case 7:
days += 30;//6月
case 6:
days += 31;//5月
case 5:
days += 30;//4月
case 4:
days += 31;//3月
case 3:
days += 28;//2月
//4、在这里考虑是否可能是29天
if(year%4==0 && year%100!=0 || year%400==0){
days++;//多加1天
}
case 2:
days += 31;//1月
}
//5、输出结果
System.out.println(year + "年" + month + "月" + day + "日是这一年的第" + days + "天");
}
}
第6题:累加和
需求:求1-100的和
public static void main(String[] args){
int sum = 0;//别忘了初始值
//求1-100的累加和
for(int i=1; i<=100; i++){
sum += i;
}
//显示最终结果
System.out.println("1-100的和是:" + sum);
}
public static void main(String[] args) {
int i=1;
int sum = 0;
while(i<=100){
sum +=i;
i++;
}
System.out.println("1-100的和为:"+sum);
}
第7题:猜数
需求:随机生成一个100以内的数,猜数字游戏
从键盘输入数,如果大了提示,大了,如果小了,提示小了,如果对了,就不再猜了,并统计一共猜了多少次
提示:随机数
(1)Math.random()
double num = Math.random();// [0,1)的小数
(2)java.util.Random rand = new java.util.Random();
int num= rand.nextInt(100);//[0,100)的整数
public static void main(String[] args){
//随机生成一个100以内的整数,[0,100)
int randNum = (int)(Math.random()*100);
//从键盘输入数,如果大了提示,大了,如果小了,提示小了,如果对了,就不再猜了,
java.util.Scanner input = new java.util.Scanner(System.in);
int num;//挪到do{}上面,提升作用域
int count = 0;//统计次数
do{
System.out.print("猜数(范围[0,100):");
num = input.nextInt();
count++;//输入一次,就代表猜一次
if(num > randNum){
System.out.println("大了");
}else if(num<randNum){
System.out.println("小了");
}
}while(num!=randNum);//条件成立,重复执行循环体语句
System.out.println("一共猜了:" + count + "次");
}
public static void main(String[] args){
//随机生成一个100以内的整数,[0,100)
java.util.Random rand = new java.util.Random();
int randNum = rand.nextInt(100);
//从键盘输入数,如果大了提示,大了,如果小了,提示小了,如果对了,就不再猜了,
java.util.Scanner input = new java.util.Scanner(System.in);
int num;//挪到do{}上面,提升作用域
int count = 0;//统计次数
do{
System.out.print("猜数(范围[0,100):");
num = input.nextInt();
count++;//输入一次,就代表猜一次
if(num > randNum){
System.out.println("大了");
}else if(num<randNum){
System.out.println("小了");
}
}while(num!=randNum);//条件成立,重复执行循环体语句
System.out.println("一共猜了:" + count + "次");
}
第8题:水仙花数
需求:
输出所有的水仙花数,所谓水仙花数是指一个3位数,其各个位上数字立方和等于其本身。
例如: 153 = 1*1*1 + 5*5*5 + 3*3*3
/*
* 练习:打印所有的水仙花数
*
* 分析:
* 什么是水仙花数呢?
* 所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身。
* 举例:153就是一个水仙花数。
* 153 = 1*1*1 + 5*5*5 + 3*3*3
*
* 1.三位数其实就告诉了我们水仙花数的范围
* 100-999
* 2.如何获取一个数据的每一个位上的数呢?
* 举例:我有一个数据153,请问如何获取到个位,十位,百位
* 个位:153%10 = 3;
* 十位:153/10%10 = 5;
* 百位:153/10/10%10 = 1;
* 千位:...
* 万位:...
* 3.让每个位上的立方和相加,并和该数据进行比较,如果相等,就说明该数据是水仙花数,在控制台输出
*/
public class ForTest04 {
public static void main(String[] args) {
//通过循环获取到每一个三位数
for(int x=100; x<1000; x++) {
//获取个位,十位,百位
int ge = x%10;
int shi = x/10%10;
int bai = x/10/10%10;
//让每个位上的立方和相加,并和该数据进行比较,如果相等,就说明该数据是水仙花数,在控制台输出
if((ge*ge*ge+shi*shi*shi+bai*bai*bai) == x) {
System.out.println(x);
}
}
}
}
打印所有水仙花数的个数?
/*
* 练习:打印所有的水仙花数共有多少个
*
* 分析:
* 1.定义统计变量,初始化值是0
* 2.获取三位数,用for循环实现
* 3.获取三位数的个位,十位,百位
* 4.判断这个三位数是否是水仙花数,如果是,统计变量++
* 5.输出统计结果就可以了
*/
public class ForTest5 {
public static void main(String[] args) {
//定义统计变量,初始化值是0
int count = 0;
//获取三位数,用for循环实现
for(int x=100; x<1000; x++) {
//获取三位数的个位,十位,百位
int ge = x%10;
int shi = x/10%10;
int bai = x/10/10%10;
//判断这个三位数是否是水仙花数,如果是,统计变量++
if((ge*ge*ge+shi*shi*shi+bai*bai*bai) == x) {
count++;
}
}
//输出统计结果就可以了
System.out.println("水仙花数共有:"+count+"个");
}
}
第9题:完数
需求:
一个数如果恰好等于它的因子之和,这个数称为"完数"。(因子:除去这个数本身的约数)
例如6=1+2+3.编程 找出1000以内的所有完数
public static void main(String[] args){
//找出1000以内的所有完数
for(int i=1; i<1000; i++){
//判断i是否是完数,如果是就打印i
/*
完数?
一个数如果恰好等于它的因子之和
例如:6的因子:1,2,3
1,2,3,6是6的约数,能够把6给整除了
因子:除了6本身以外的约数
例如:18的因子:1,2,3,6,9 不是完数
如何判断i是否是完数?
(1)先找出i的所有的因子,并且累加它的所有的因子
(2)判断因子之和与i是否相等,如果相等就是完数
*/
//(1)先找出i的所有的因子,并且累加它的所有的因子
int iSum = 0;
for(int j=1; j<i; j++){
//如果j能够把i整除了,j就是i的因子
if(i%j==0){
iSum += j;
}
}
//(2)判断因子之和与i是否相等,如果相等就是完数
if(i == iSum){
System.out.println(i);
}
}
}
第10题:九九乘法表
public static void main(String[] args) {
for(int i =1;i<=9;i++){
for(int j=1;j<=i;j++){
System.out.print(j+"*"+i+"="+(i*j) + "\t");
}
System.out.println();
}
}
public static void main(String[] args) {
for(int i=1; i<=9; i++){
/*
每一行有三件事情:(1)打印n个\t(2)打印m个式子(3)换行
*/
//(1)打印n个\t
/*
当i=1,第1行,8个\t,j=1,2,3,4,5,6,7,8 j<=8 j<=9-i
当i=2,第2行,7个\t,j=1,2,3,4,5,6,7 j<=7
当i=3,第3行,6个\t,j=1,2,3,4,5,6
。。。
当i=8,第8行,1个\t,j=1,
当i=9,第9行,0个\t,j=1,j<=0不满足一次也不执行 j<=9-i j<=9-9
*/
for(int j=1; j<=9-i; j++){
System.out.print("\t");
}
//(2)打印m个式子
/*
当i=1,第1行,1个式子, k=1 k<=i
当i=2,第2行,2个式子, k=1,2
..
当i=9,第9行,9个式子, k=1,2,3,4,5,6,7,8,9
*/
for(int k=1; k<=i; k++){
System.out.print(i + "*" + k + "=" + i*k + "\t");
}
//换行
System.out.println();
}
}
第11题:打印菱形
public static void main(String[] args){
//上半部分:正的等腰三角形
//5行
for(int i=1; i<=5; i++){
//(1)打印空格
/*
当i=1,打印4个空格,j=4,3,2,1 j>=i
当i=2,打印3个空格,j=4,3,2
当i=3,打印2个空格,j=4,3
当i=4,打印1个空格,j=4
当i=5,打印0个空格,j=4,让循环条件一次都不满足
*/
for(int j=4; j>=i; j--){
System.out.print(" ");
}
//(2)打印*
/*
当i=1,打印1个,j=1 j<=2*i-1
当i=2,打印3个,j=1,2,3,
当i=3,打印5个,j=1,2,3,4,5
当i=4,打印7个,j=1,2,3,4,5,6,7
当i=5,打印9个,j=1,2,3,4,5,6,7,8,9
*/
for(int j=1; j<=2*i-1; j++){
System.out.print("* ");
}
//(3)换行
System.out.println();
}
//下半部分:倒立的等腰三角形
//4行
for(int i=1; i<=4; i++){
//(1)打印空格
/*
当i=1,1个空格,j=1 j<=i
当i=2,2个空格,j=1,2
当i=3,3个空格,j=1,2,3
当i=4,4个空格,j=1,2,3,4
*/
for(int j=1; j<=i; j++){
System.out.print(" ");
}
//(2)打印*
/*
当i=1,7个*,j=1,2,3,4,5,6,7 j<=9-2*i;
当i=2,5个*,j=1,2,3,4,5
当i=3,3个*,j=1,2,3
当i=4,1个*,j=1
*/
for(int j=1; j<=9-2*i; j++){
System.out.print("* ");
}
//(3)换行
System.out.println();
}
}
public static void main(String[] args){
//上半部分:正的等腰三角形
//5行
for(int i=1; i<=5; i++){
//(1)打印空格
/*
当i=1,打印4个空格,j=4,3,2,1 j>=i
当i=2,打印3个空格,j=4,3,2
当i=3,打印2个空格,j=4,3
当i=4,打印1个空格,j=4
当i=5,打印0个空格,j=4,让循环条件一次都不满足
*/
for(int j=4; j>=i; j--){
System.out.print(" ");
}
//(2)打印*
/*
当i=1,打印1个,j=1 j<=2*i-1
当i=2,打印3个,j=1,2,3,
当i=3,打印5个,j=1,2,3,4,5
当i=4,打印7个,j=1,2,3,4,5,6,7
当i=5,打印9个,j=1,2,3,4,5,6,7,8,9
*/
for(int j=1; j<=2*i-1; j++){
//不是全部打印*
if(j==1 || j==2*i-1){
System.out.print("* ");
}else{
System.out.print(" ");
}
}
//(3)换行
System.out.println();
}
//下半部分:倒立的等腰三角形
//4行
for(int i=1; i<=4; i++){
//(1)打印空格
/*
当i=1,1个空格,j=1 j<=i
当i=2,2个空格,j=1,2
当i=3,3个空格,j=1,2,3
当i=4,4个空格,j=1,2,3,4
*/
for(int j=1; j<=i; j++){
System.out.print(" ");
}
//(2)打印*
/*
当i=1,7个*,j=1,2,3,4,5,6,7 j<=9-2*i;
当i=2,5个*,j=1,2,3,4,5
当i=3,3个*,j=1,2,3
当i=4,1个*,j=1
*/
for(int j=1; j<=9-2*i; j++){
//不是全部打印*
if(j==1 || j==9-2*i){
System.out.print("* ");
}else{
System.out.print(" ");
}
}
//(3)换行
System.out.println();
}
}