本章目标
1)分支语句
if-else if-else
switch
2)循环语句
for
while
do while
一、if
1)最简单的if
if(判断条件){
条件为真执行的语句块
}
例子
@Test
public void test3(){
//在控制一行提示
System.out.println("请输入一个整型的学员成绩");
//接受键盘输入
Scanner sc=new Scanner(System.in);
//得到学生成绩
int score=sc.nextInt();
//输出学生成绩
System.out.println("您输入的是:"+score);
//定义一个变量,用于将来存储等级
char grade = 0 ;
//根据学员的分数转化成对应的等级
//如果分数>=85 那么他的等级为you
if(score>=85){
//执行语句todo
grade='优';
}
System.out.println("您此次考试的等级为"+grade);
//如果分数>=70 <85 良
//如果分数>60 <70 中
//如果分数=60 及格
//如果<60 不及格
}
带一个else的情况
if(条件满足){
执行满足时的语句块
}else{
如果不满足就执行这里的语句块
}
if(score>=85){
//执行语句todo
grade='优';
}else{//其他情况
grade='否';
}
更复杂一些的
if(score>=85){
//执行语句todo
grade='优';
}else if(score>=70){//如果分数>=70,良
grade='良';
}else if(score>60){//如果分数>60
grade='中';
}
System.out.println("您此次考试的等级为"+grade);
练习 :学生补全其他逻辑
//如果分数=60 及
//如果<60 差
课堂练习:闰年
@Test
public void test2(){
int year=2064;
if(year%400==0){//能被400整除的是闰年
System.out.println("是闰年");
}else if(year%4==0&&year%100!=0){//能被4整除,不能被100整除的是闰年
System.out.println("是闰年");
}else{//其他不是闰年
System.out.println("不是闰年");
}
}
二、switch 语句
@Test
public void test(){
//switch case default
switch表达式支持的类型char byte short int jdk1.7之后支持字符串
char c='e';
switch(c){
case 'a':
System.out.println("你选择了a");
break;
case 'b':
System.out.println("你选择了b");
break;
case 'c':
System.out.println("你选择了c");
break;
case 'd':
System.out.println("你选择了d");
break;
default:
System.out.println("哥们,你选错了");
break;
}
}
case语句块遇到break会跳出,如果第一个选项break没有写,会顺序向下执行,直到遇到break为止
switch语句特点:
表达式的值只可以接受int、byte、char、short 、String型,不接受其他类型的值
表达式的值接受String类型只在JDK7及以后版本有效
switch case中的值必须要与switch表达式的值具有相同的数据类型。而且case后跟的值必须是常量,不能跟变量。
不允许有重复的case取值
switch一旦碰到第一次case匹配,程序就会跳转到这个标签位置,开始顺序执行以后所有的程序代码,而不管后面的case条件是否匹配,直到碰到break关键字或者结束switch语句的大括号为止
case之间与default没有顺序。先判断所有的case,没有匹配的case执行default。因此一般将default放在case后面。
switch语句停止的条件是遇到了break关键字或者结束switch语句的大括号。
课堂练习:
如果月份month为1—12的一个月份,输出该月份的天数;如果数字不符合,输出“错误的月份”。
1、3、5、7、8、10、12月天数为31
2月天数为28
4、6、9、11月天数为30
使用switch语句完成需求
传统方式
@Test
public void test09()
{
System.out.println("yuefen:");
Scanner sc=new Scanner(System.in);
int i=sc.nextInt();
switch (i) {
case 1:
System.out.println("31");
break;
case 2 :
System.out.println("28");
break;
case 3 :
System.out.println("31");
break;
case 4 :
System.out.println("30");
break;
case 5 :
System.out.println("31");
break;
case 6 :
System.out.println("30");
break;
case 7 :
System.out.println("31");
break;
case 8 :
System.out.println("31");
break;
case 9 :
System.out.println("30");
break;
case 10 :
System.out.println("31");
break;
case 11 :
System.out.println("30");
break;
case 12 :
System.out.println("31");
break;
default:
System.out.println("错误的月份");
break;
}
}
简化方式:
@Test
public void test11()
{
System.out.println("yuefen:");
Scanner sc=new Scanner(System.in);
int i=sc.nextInt();
switch (i) {
case 1:
case 3:
case 5:
case 7 :
case 8 :
case 10 :
case 12 :
System.out.println("31");
break;
case 2 :
System.out.println("28");
break;
case 4 :
case 6 :
case 9 :
case 11 :
System.out.println("30");
break;
default:
System.out.println("错误的月份");
break;
}
}
String 类型(字符串)
String s="测试代码";
可以用+连接多个字符串
next nextLine区别:next()遇到空格即结束,nextLine() 可以接受一整行输入,中间可以有空格,直到你回车他才认为是结束
@Test
public void test3() {
// switch case default
// switch表达式支持的类型char byte short int jdk1.7之后支持字符串
System.out.println("请输入一个字符串");
//接受键盘输入
Scanner sc=new Scanner(System.in);
//获取键盘输入的值
String s=sc.next();
System.out.println(s);
}
@Test
public void test4() {
// switch case default
// switch表达式支持的类型char byte short int jdk1.7之后支持字符串
System.out.println("请输入一个字符串");
//接受键盘输入
Scanner sc=new Scanner(System.in);
//获取键盘输入的值
String s=sc.nextLine();
System.out.println(s);
}
作业:
第3章课后习题必做题1-9
生成随机数
int i=new Random().nextInt(10);
System.out.println(i);
@Test
public void randomTest(){
//0-9
System.out.println(new Random().nextInt(10));
//1+(0-10)
System.out.println(1+new Random().nextInt(10-1+1));
//10-20
//(数据类型)(最小值+Math.random()*(最大值-最小值+1))
System.out.println(10+new Random().nextInt(20-10+1));
}
循环语句
for
while
do while
while 语法:
while(条件表达式){
执行语句块;
}
简单例子:
@Test
public void test1(){
int i=0;
while(i<=3){
i++;
System.out.println(i);
}
}
学生练习:
输出1-100之间的偶数
第3章 39页的2题
@Test
public void test2(){
//计算1-100之间的和
//做一个计数器count
int count=0;
int i=1;
//循环1-100之间的数
//每循环到一个数,把他加到count里
while(i<=100){
//count=count+i;
count+=i;
i++;
}
System.out.println(count);
}
//1-100之间的数,打印数里含7或者可以被7整除的
@Test
public void test06(){
int i=1;
while(i<=100){
if(i%7==0||i%10==7||i/10%10==7){
System.out.println(i);
}
i++;
}
}
do...while
do{
执行语句块
}while(条件表达式);
两者区别:do...while无论如何都会执行一次。
代码如下:
@Test
public void liHanfeng(){
int i=3;
while(i<3){
System.out.println("i="+i);
}
}
@Test
public void wangJy(){
int i=3;
do{
System.out.println("i="+i);
}
while(i<3);
}
课堂练习:
用do...while 计算1-100之间的奇数和
作业:
第3章 31页的2道练习
第3章 39页的第3题
课后习题1-8
for循环
for(初始化循环变量;条件表达式;循环之后的操作 ){
do sth;
}
课堂演示:
用for循环打印1-100之间的整数
for(int i=1;i<=100;i++){
System.out.println(i);
}
学生练习:
1)用for循环打印1-100的奇数
2)用for循环改写从1到100的所有奇数相加的和
public static void main(String[] args) {
int sum = 0;
for(int i=1;i<=100;i++){
if(i%2!=0){
sum += i;
}
}
System.out.println(sum);
}
3)循环得到用户从控制台输入的5个整数,该整数为用户购买商品的价格,计算用户一共需要花费的总金额。
public static void main(String[] args) {
int sum = 0;
for(int i=0;i<5;i++){
System.out.println("请输入第"+(i+1)+"个商品价格:");
int x = new Scanner(System.in).nextInt();
sum += x;
}
System.out.println(sum);
}
4)随机产生一个10以内的正整数,用户循环输入三个整数,如果用户输入的整数包含随机数,输出“猜对了”;反之,输出“没猜到”。
例如:
随机数为4,用户输入数为:2,3,4。输出:猜对了
随机数为4,用户输入数为:1,2,3。输出:没猜到
@Test
public void forTest03(){
//首先生成一个10以内的整数
int shuiji=new Random().nextInt(10);
System.out.println("随机数"+shuiji);
//标识用户是否猜中
boolean chaizhong=false;
Scanner sc=new Scanner(System.in);
//循环三次
for(int i=1;i<=3;i++){
//提示用户猜
System.out.println("猜");
int chai=sc.nextInt();
if(shuiji==chai){
chaizhong=true;
}
}
//三次循环之后,判定时用户是否猜中
if(chaizhong){
System.out.println("猜对了");
}else{
System.out.println("没猜到");
}
}
上面的程序,考虑 如果第一次或第二次就猜对,还有没有必要执行下一次,如果没有必须,如何及时中断呢,用到了流程中断。
流程中断
break; 退出循环 假设100次,第55次时,调用了break,结束所有
continue; 跳过当前这次,继续下一次
课堂练习:
用break改造刚才的程序
1)随机产生一个10以内的正整数,用户循环输入三个整数,如果用户输入的整数包含随机数,输出“猜对了”;反之,输出“没猜到”。
例如:
随机数为4,用户输入数为:2,3,4。输出:猜对了
随机数为4,用户输入数为:1,2,3。输出:没猜到
@Test
public void forTest03(){
//首先生成一个10以内的整数
int shuiji=new Random().nextInt(10);
System.out.println("随机数"+shuiji);
//标识用户是否猜中
boolean chaizhong=false;
Scanner sc=new Scanner(System.in);
//循环三次
for(int i=1;i<=3;i++){
//提示用户猜
System.out.println("猜");
int chai=sc.nextInt();
if(shuiji==chai){
chaizhong=true;
//中止整个循环
break;
}
}
//三次循环之后,判定时用户是否猜中
if(chaizhong){
System.out.println("猜对了");
}else{
System.out.println("没猜到");
}
}
continue
//50个人循环做题,到编号为6的王振生处和25胡启昊就跳过
//跳过当次循环,进行下一次,continue;
@Test
public void conTest(){
for(int i=1;i<=50;i++){
//如果这个数是6或者25就跳过
if(i==6||i==25){
continue;
}else{
//否则打印 第*号的人开始做题
System.out.println("第"+i+"号学生做题");
}
}
}
//用continue 显示50以内的奇数
@Test
public void test2(){
for(int i=0;i<=50;i++){
//偶数,跳过当前这个,执行下一个
if(i%2==0){
continue;
}else{
System.out.println(i);
}
}
}
死循环
while(true){
}
do{
}while(true)
for循环
for(;;){
}
for(int i=0;;i++){
}
@Test
public void test3(){
for(int i=1;;i++){
System.out.println(i);
}
}
课堂练习:
//分别用for while计算从1-n之间的和,如果和大于5000时,打印此时的数值,停止
for:
public void test4(){
int count=0;
for(int i=1;;i++){
count+=i;
if(count>5000){
System.out.println(i);
break;
}
}
}
while1:
public void test5(){
int count=0;
int i=1;
while(true){
count+=i;
if(count>5000){
System.out.println(i);
break;
}else{
i++;
}
}
}
while2:
public void test6(){
int count=0;
int i=1;
boolean flag=true;
while(flag){
count+=i;
if(count>5000){
System.out.println(i);
flag=false;
}else{
i++;
}
}
}
循环嵌套
练习1)打印99表
@Test
public void doubleForTest(){
/* 1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9*/
//最外层的i循环是从1-9
//里层的循环j是从1---->i
for(int i=1;i<10;i++){
for(int j=1;j<=i;j++){
System.out.print(i+""+j+"="+ij+" ");
}
System.out.println();
}
}
课后习题:
选做题3 :求大于200的最小质数
@Test
public void homework13() {
for (int i = 200; i <= 300; i++) {
boolean f = true;
for (int j = 2; j < i; j++) {
if (i % j == 0) {
f = false;
break;
}
}
if (f) {
System.out.println(i);
break;
}
}
}
百元百鸡问题
/**
- 母鸡3元每只,公鸡4元每只,小鸡0.5元每只,如果花100元钱,想买100只鸡,有多少种可能?
*/
@Test
public void xhTest01(){
int count=0;
for(int i=0;i<=33;i++){
for(int j=0;j<=25;j++){
int m=100-i-j;
if((i3+j4+m*0.5)==100&&i+j+m==100){
System.out.println("母鸡数"+i);
System.out.println("公鸡数 "+j);
System.out.println("小鸡数"+m);
System.out.println("--------- ");
count++;
}
}
}
System.out.println("一共"+count+"种组合");
}
结果:
母鸡数6
公鸡数 10
小鸡数84
母鸡数13
公鸡数 5
小鸡数82
母鸡数20
公鸡数 0
小鸡数80
一共3种组合
练习2)一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
@Test
public void test2(){
//一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
double sum=100.00;
//原始高度
double h=100.00;
//循环9次
for(int i=0;i<9;i++){
//先折半
h=h/2;
//总高度
sum=sum+h*2;
}
System.out.println("经历多少米="+sum);
System.out.println("第10次反弹多高"+h/2);
}
经历多少米=299.609375
第10次反弹多高0.09765625
3.)打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各个位 的数字的立方和等于该数本身。
@Test
public void test3(){
//从100-999
for(int i=100;i<=999;i++){
//首先得到百十个位 345
int bai=i/100;
int shi=i/10%10;
int ge=i%10;
if(baibaibai+shishishi+gegege==i){
System.out.println(i);
}
}
}
答案:
153
370
371
407
4)int total =0;
for ( int i = 0;i < 4; i++ ){
if ( i == 1) continue;
if ( i == 2) break;
total += i;
}
则执行完该程序段后total的值为:( )。
A、0 B、1 C、3 D、6
作业:
1)continue label 学习
- 判断2064年是不是闰年。
闰年判断规则:
能被400整除的是闰年
能被100整除,不能被400整除的不是闰年
能被4整除,不能被100整除的是闰年
其他的不是闰年
课后作业第9题
@Test
public void homework09() {
/**
- 有一个不多于5位的正整数,求它是几位数,分别打印出每一位数字。(知识点:条件语句) [必做题]
*/
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个不多于5位的数");
int i = sc.nextInt();
// 如果这个数大于5位,直接就提示错误
if (i > 99999||i<=0) {
System.out.println("输入数值不合法");
} else {
// 解析万位上的数
int wan = i / 10000 % 10;
// 解析千位上的数
int qian = i / 1000 % 10;
// 解析百位上的数
int bai = i / 100 % 10;
// 解析十位上的数
int shi = i / 10 % 10;
// 解析个位上的数
int ge = i % 10;
if (wan > 0) {
System.out.println("5位数" + wan + "" + qian + "" + bai + "" + shi + "" + ge);
} else if (qian > 0) {
System.out.println("4位数" + qian + "" + bai + "" + shi + "" + ge);
} else if (bai > 0) {
System.out.println("3位数" + bai + "" + shi + "" + ge);
} else if (shi > 0) {
System.out.println("2位数" + shi + "" + ge);
} else if (ge > 0) {
System.out.println("1位数" + ge);
}
}
}
另外一种方法
@Test
public void test10(){
//5、有一个不多于5位的正整数,求它是几位数,分别打印出每一位数字。
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个5位以内的数");
int i=sc.nextInt();
int count=0;
while(i!=0){
int wei=i%10;//153-3 15-5 1-1
System.out.println("每位上的数"+wei);
i=i/10;//每次舍去一位 15 1
count++;//1 2 3
}
System.out.println("一共几位"+count);
}
@Test
public void test07(){
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个7位以内的数");
int i=sc.nextInt();
int j=i,k=i;//用两个临时变量把i暂存到他那儿
int sum=0;
int n=0;//记录一共执行了几次
//一共几位
while(i!=0){
i=i/10;//每次把上一次的结果除以10
n++;
}
System.out.println("一共几位:"+n);
System.out.println(j);
//每位上的数是多少,以及count次方
while(j!=0){
int wei=j%10;//每位上的数
System.out.println("每位上的数:"+wei);
j=j/10;
sum+=Math.pow(wei, n);
}
//和原数进行比较
if(k==sum){
System.out.println(k+"是自幂数");
}else{
System.out.println(k+"不是自幂数");
}
}
课后习题
第2题: 猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。
到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
@Test
public void homework02(){
/* 猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。
到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
第10天剩余桃数:1
第9天剩余桃数: x/2-1=1 x=(1+1)*2=4
第8天剩余桃数: x/2-1=4 x=(4+1)*2=10
第10天剩余桃数:1 sum=1
第9天剩余桃数:(1+1)2=4 sum=(sum+1)2=4
第8天剩余桃数:(4+1)2=10 sum=(sum+1)2=10
第7天剩余桃数:(10+1)*2=22
第6天剩余桃数:(22+1)*2=46
规律很明显,即每天剩余的桃数是第二天桃数加1的两倍
*/
//第10天时的桃子数
int sum=1;
//循环九次
for(int i=0;i<9;i++){
sum=(sum+1)*2;
}System.out.println(sum);}