第三周学习笔记

导语:

  • if语句可以判断条件是否满足,满足时才做相应的动作,而循环语句可以在满足条件时,不断地重复执行一些动作。
  • 重复执行的语句(循环语句)可以多次执行其他语句,它检查一个逻辑条件是否满足,只在满足的时候执行它的循环体。
  • while语句是一个循环语句,它会首先判断一个条件是否满足,如果条件满足,则执行后面紧跟着的语句或语句括号,然后再次判断条件是否满足,如果条件满足则再次执行,直到条件不满足为止。后面紧跟的语句或语句括号,就是循环体。
  • do-while循环和while循环很像,唯一的区别是我们在循环体执行结束的时候才来判断条件。也就是说,无论如何,循环都会执行至少一遍,然后再来判断条件。与while循环相同的是,条件满足时执行循环,条件不满足时结束循环。

3.1  循环

接着第二周自动售票机的案例,现在为了实现售票机持续工作,就将实现售票功能的代码段放入循环结构,这样便可以实现自动售票机的机制。

实现循环代码

   import java.util.Scanner;public class Hello {public static void main(String[] args) {//           初始化Scanner in = new Scanner(System.in);int balance =0;//最开始的余额为0//            读入投币金额while(true) {System.out.print("请投币:");int amount=in.nextInt();balance = balance+amount;//每次钱投进来if(balance>=10) {//            打印车票System.out.println("*************");System.out.println("*Java城际铁路专线*");System.out.println("*  无指定座位票       *");System.out.println("*  票价:10元         *");System.out.println("****************");//         计算并打印找零System.out.println("找零:"+(balance-10));balance=0;//清零}}}}

代码解释:引入的变量balance是为了第一次投入钱不够,第二次进行复投用来相加的,在if判断语句中用balance代替amount,从而避免首次投入钱币不够再投钱币程序不运行的情况出现。同时在一次循环功能执行结束后,也就是找零功能完成后,对balance余额进行清零工作,这样可以避免进入下一次循环的影响。


案例:数数字

程序要读入一个正整数,然后输出这个整数的位数。如:

输入:352

输出:3

代码实现:

 import java.util.Scanner;public class Main{public static void main(String[] args) {//           初始化Scanner in = new Scanner(System.in);int number=in.nextInt();//读进来一个数int count=0;//计数器while(number>0){number=number/10;count=count+1;}System.out.println("位数为:"+count);}}

运行结果:

352

位数为:3

解释代码:

在解释代码之前,先说一说这道题的解法。

计算机如何来计数呢?有一个很大的数,那么我们从右往左对它进行取余计算,如352,首先令352/

while(number>0),如果number>0条件成立,那么就进行{}内的代码,本来应该使用if语句的,但因为我们想让这个{}内的计算一直做下去,直到number<=0为止,因此我们应当使用while循环结构。

WHILE循环

1.定义:将“while”翻译成“当”,一个while循环即:当条件满足,重复执行循环体内的语句。

2.区分:if条件语句进行一次,使用while条件满足情况下可以一直进行,直至不再满足条件。

举例:

    if(x>0) {x=x/10;n=n+1;}
    while(x>0) {x=x/10;n=n+1;}

说明:在大括号{}里面的内容叫做循环体;在圆括号()里的叫做条件。

注意:

在循环体内要有改变条件的机会,否则while将会变成死循环一直做下去。

②执行while循环前,首先判断条件是否满足,所以存在循环一次也没被执行的情况。

③条件成立是循环继续的前提。


方法:

人脑模拟计算机(使用“变量表格”,纸上一步一步写下代码运行结果)

调试(在程序适当的地方插入输出来显示变量的内容)

Debug(加断点)


调试举例(数数字的代码)

 import java.util.Scanner;public class Main{public static void main(String[] args) {
//          初始化Scanner in = new Scanner(System.in);int number=in.nextInt();//读进来一个数int count=0;//计数器while(number>0){number=number/10;count=count+1;System.out.println("number="+number+";count="+count);}System.out.println("位数为:"+count);}

运行结果:

352

number=35;count=1

number=3;count=2

number=0;count=3

位数为:3

另外,当我们的程序完成后,通常需要“验证”,测试程序常使用边界数据,如有效范围两端的数据、特殊的倍数等等。(个位数;10;0;负数)

因此,可以进行验证,验证0时,我们发现该程序不承认0是一位数,原因是我们的while(number>0)条件要求不满足,=0而不大于0,所以运行结果显示为0,而不是1,做while循环的条件不满足,所以无法进入循环体内,也就没有count=count+1;的步骤了,因此循环直接跳过,马上输出。

DO-WHILE循环

定义:先执行一轮循环体,再执行while圆括号内的条件语句进行判断,条件满足继续执行,不满足就结束循环执行下一行语句。

使用DO-WHILE循环解决上述输入0的位数问题

 import java.util.Scanner;public class Main{public static void main(String[] args) {
//          初始化Scanner in = new Scanner(System.in);int number=in.nextInt();//读进来一个数int count=0;//计数器do{number=number/10;count=count+1;System.out.println("number="+number+";count="+count);}while(number>0);System.out.println("位数为:"+count);}}

运行结果:

0

number=0;count=1

位数为:1

注意:使用do-while语句,在while语句结束后要加上“;”——(易错点)


计数循环

针对计数循环,通常我们要考虑三个问题:

1.这个循环需要执行多少次?

2.循环停下来的时候,有没有输出最后的0?

3.循环结束以后,count的值是多少?

注意:在计数循环的循环体内,语句的执行先后顺序很重要,关系到最终运行结果。

处理计数循环问题的小套路:(以小推大)

如果要模拟运行一个很大次数的循环,可以模拟较少的循环次数,然后推导出很大次数的循环。

举例:100-0 计数

while (count>=0){System.out.println(count);count = count -1;} System.out.println("发射!");

运行结果:(中间数字以省略号代替)

100

99

98

……

3

2

1

0

发射!

执行了100-0+1=101轮(计算方法:第一个数-最后一个数再+1

可以发现这样计数不方便。

因此,我们不妨使用上述提到的“小套路”(以小推大


要求的是100-0,不妨缩小到10-0,最后结果进行放大就可以了。

代码实现:

int count = 10;while (count>=0){System.out.println(count);count = count -1;} System.out.println("循环结束后count值为:"+count);System.out.println("发射!");

运行结果:

10

9

8

7

6

5

4

3

2

1

0

循环结束后count值为:-1

发射!

∵10-0计数一共进行11次循环

∴以此类推:100-0计数进行101次循环

-------------------------------------------

计数循环的三个问题

①这个循环需要执行多少次?

②循环停下来的时候,有没有输出最后的0?

③循环结束以后,count的值是多少?

-------------------------------------------

如果把while做的计数循环改成do-while了,那三个问题的答案还一样么?

 int count = 10;do {System.out.println(count);count = count -1;} while (count>0);System.out.println("循环结束后count值为:"+count);System.out.println("发射!");

运行结果:

10

9

8

7

6

5

4

3

2

1

循环结束后count值为:0

发射!

三个问题:

1.循环执行10次(计算:10-1+1=10)

2.没有输出最后得的0

3.count的值是0


算平均数

要求:让用户输入一系列的正整数,最后输入-1表示输入结束,然后程序计算出这些数字的平均数,输出输入的数字的个数和平均数。

思路:变量->算法->流程图->程序


拿到任何问题,要去想两个东西:

1.数据有哪些?(在本程序里,有哪些数据要输入,输入的数据要去记录下来或者是表达出来)

2.做计算(计算的步骤:第一步怎么算,第二步怎么算,最后怎么得到结果)

上述两个步骤做完以后,就能有变量,程序也有了基本逻辑(也就是算法)。


变量

1.一个记录读到的整数的变量

2.平均数要怎么算?

(只需要每读到一个数,将它加到一个累加的变量内,到全部数据读完,再拿它去除读到的数的个数就可以了)

3.一个变量记录累加的结果,一个变量记录读到的数的个数

本程序一共用到三个变量:

一个表示读进来数的变量;一个表达累加的总和的变量;一个表达读进来数的个数的变量


算法

1.初始化变量sum和count为0;

2.读入number;

3.如果number不为-1,将number加入sum,并将count+1,回到步骤2;

4.如果number为-1,计算并打印sum/count(注意转换成浮点型计算)。


代码实现(while循环):

     Scanner in=new Scanner(System.in);int number;int sum=0;int count=0;number=in.nextInt();while(number!=-1){sum=sum+number;count=count+1;number=in.nextInt();}if(count>0){System.out.println("平均数为:"+(double)sum/count);}

运行结果:

1

2

3

4

5

6

7

-1

平均数为:4.0


代码实现(do-while循环):

     Scanner in=new Scanner(System.in);int number;int sum=0;int count=0;do {number=in.nextInt();if(number!=-1){sum=sum+number;count=count+1;}}while(number!=-1);if(count>0){System.out.println("平均数为:"+(double)sum/count);}

运行结果:

1

2

3

4

5

6

7

-1

平均数为:4.0

对比:

do-while循环的时候,要做两次判断number!=-1;

while循环的时候,要读两次number代码段为:number=in.nextInt();


猜数游戏

让计算机来想一个数,让用户来猜,用户每输入一个数,就告诉它是大了还是小了,直到用户猜中为止,最后还要告诉用户它猜了多少次。


分析:

1.因为需要不断重复让用户猜,所以需要用到循环

2.在实际写出程序之前,我们可以先用文字描述程序的思路

3.核心重点是循环的条件(人们往往会考虑循环终止的条件)


思路:

循环的条件是:a和number不相等

1.计算机随机分配一个数,记在变量number里;

2.一个负责记次数的变量count初始化为0;

3.让用户输入一个数字a;

4.count递增(加一);

5.判断a和number的大小关系,若a大输出“大”,a小则输出“小”;

6.如果a和number是不相等的(无论大或小),程序转回第3步;

7.否则,程序输出“猜中”和次数,最后结束程序。


代码运行结果(错误示范分析)

30

值偏大

20

值偏大

1

恭喜你猜对了!一共猜了 3次。

上述结果试了多次都是1,这说明Math.random()*100+1并没有起作用,随后仔细检查发现是遗漏了圆括号。

错误代码

int number=(int)Math.random()*100+1;//随机数默认[0-1)-->[0-100)-->[0-100]

改正代码

int number=(int)(Math.random()*100+1);//随机数默认[0-1)-->[0-100)-->[0-100]

代码实现:(正确代码)

     Scanner in=new Scanner(System.in);int number=(int)(Math.random()*100+1);//随机数默认[0-1)-->[0-100)-->[0-100]int a;int count=0;do {a=in.nextInt();count=count+1;if(a>number){System.out.println("值偏大");}if(a<number){System.out.println("值偏小");}  }while(a!=number);System.out.println("恭喜你猜对了!"+"一共猜了 "+count+"次。");

运行结果:

30

值偏大

1

值偏小

20

值偏小

22

值偏小

25

值偏大

23

恭喜你猜对了!一共猜了 6次。


整数分解

一个整数是由至多位数字组成的,如何分解出整数的各个位上的数字,然后加以计算

(对一个整数做10%的操作,就得到它的个位数;(如352%10=2)

对一个整数做/10的操作,就去掉了它的个位数;(如352/10=35)

然后再对步骤2的结果做%10,就得到原来数的十位数了(如35%10=5)

……以此类推。)

(如352%10=2----2

352/10=35

35%10=5----5

35/10=3

3%10=3----3

3/10=0)

因此,如果我想要352逆序输出,应该怎么做呢?有两种方案。

方案1:拿到1位输出1位,最后加一行空行代码输出

代码实现:

     Scanner in=new Scanner(System.in);int number=in.nextInt();int digit;do{digit=number%10;System.out.print(digit);number=number/10;}while(number>0);System.out.println();

运行结果 1:(一般来说不会出现问题)

352

253

但是,运行结果 2:

700

007

很明显007,并不是我们最终想要得到的数,我们想要得到7。

因此引出方案二。


方案2:引入变量result,通过result=result*10+digit,最后输出result

(得到253,二百五十三)

代码实现:

     Scanner in=new Scanner(System.in);int number=in.nextInt();int digit;int result=0;do{digit=number%10;result=result*10+digit;number=number/10;}while(number>0);System.out.println();System.out.println(result);

运行结果 1:

352

253

运行结果 2:

700

7


第三周小测验:

1.以下哪种运算能从变量x中取得它的个位数?(B)

A.x/10

B.x%10

C.x*10

D.x=10

2.while循环的条件满足的时候循环继续,而do-while的条件满足的时候循环就结束了(B)

A.√

B.×

3.以下代码片段执行结束后,变量i的值是多少?

int i = 1;

do {

i = i+5;

} while (i<17);

答案:21


第三周编程题

1奇偶个数(5分)

题目内容:

你的程序要读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据。程序输出读到的数据中的奇数和偶数的个数。

输入格式:

一系列正整数,整数的范围是(0,100000)。如果输入-1则表示输入结束。

输出格式:

两个整数,第一个整数表示读入数据中的奇数的个数,第二个整数表示读入数据中的偶数的个数。两个整数之间以空格分隔。

输入样例:

9 3 4 2 5 7 -1

输出样例:

4 2

时间限制:500ms内存限制:32000kb

代码实现:

 import java.util.Scanner;public class Main{public static void main(String[] args) {
//          初始化Scanner in=new Scanner(System.in);int number;int even=0;//偶数int odd=0;//奇数do{number=in.nextInt();//输入数据if(number%2==0){even=even+1;//偶数个数+1(或者写成even++;)}else if(number%2!=0){odd=odd+1;//奇数个数+1(或写成odd++;)}}while(number!=-1);//number为正整数作为循环条件System.out.println(odd-1+" "+even);}}

运行结果:

9

3

4

2

5

7

-1

4 2

2数字特征值(5分)

题目内容:

对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值。对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推。这个整数在第n位上的数字记作x,如果x和n的奇偶性相同,则记下一个1,否则记下一个0。按照整数的顺序把对应位的表示奇偶性的0和1都记录下来,就形成了一个二进制数字。比如,对于342315,这个二进制数字就是001101。

这里的计算可以用下面的表格来表示:

数字 3 4 2 3 1 5
数位 6 5 4 3 2 1
数字奇偶
数位奇偶
奇偶一致 0 0 1 1 0 1
二进制位值 32 16 8 4 2 1

按照二进制位值将1的位的位值加起来就得到了结果13。

你的程序要读入一个非负整数,整数的范围是[0,100000],然后按照上述算法计算出表示奇偶性的那个二进制数字,输出它对应的十进制值。

提示:将整数从右向左分解,数位每次加1,而二进制值每次乘2。

输入格式:

一个非负整数,整数的范围是[0,1000000]。

输出格式:

一个整数,表示计算结果。

输入样例:

342315

输出样例:

13

时间限制:500ms内存限制:32000kb

代码实现:

 import java.util.Scanner;public class Main{public static void main(String[] args) {
//          初始化Scanner in=new Scanner(System.in);int number,result,digit;int a=1;int b=0;int count=1;//编号number=in.nextInt();do{digit=number%10;if(digit%2==count%2){result=1;//奇偶性相同}else{result=0;//奇偶性不同}b=result*a+b;a=a*2;count=count+1;//或写成count++;number=number/10;}while(number>0);System.out.println(b);}}

运行结果:

342315

13

END:

希望我的学习笔记能够帮助到您!

赠君一句:“宝剑锋从磨砺出,梅花香自苦寒来!”

愿你我共勉!加油!

浙大翁凯老师Java课堂学习记录(第三周)相关推荐

  1. C语言有简单基础的入手指南(MOOC课程 浙大 翁凯老师主讲)听课笔记 the basic knowledge of C

    欢迎各位小白来了解C语言相关知识 下面的是我在MOOC课程中做的笔记 由简单到复杂,建议收藏后慢慢看,这里有很多不常用但很实用的东西 //else if的另一种表述switch-case switch ...

  2. Java基础学习记录(三)

    System: 描述系统一些信息. 获取系统属性信息:Properties getProperties 因为Properties是Hashtable子类,也就是Map集合的一个子类对象. 那么可以通过 ...

  3. c++基础入门(根据浙大翁恺老师视频整理)

    把以前的笔记搬上来一下 根据浙大翁恺老师视频整理 https://www.bilibili.com/video/BV1yQ4y1A7ts?p=2 01第一个c++程序 02什么是对象 通过操作访问数据 ...

  4. Java设计模式学习记录-解释器模式

    前言 这次介绍另一个行为模式,解释器模式,都说解释器模式用的少,其实只是我们在日常的开发中用的少,但是一些开源框架中还是能见到它的影子,例如:spring的spEL表达式在解析时就用到了解释器模式,以 ...

  5. 【机器学习】<刘建平Pinard老师博客学习记录>线性回归原理

    目录 一.线性回归的模型函数和损失函数: 二.线性回归的算法: 1.梯度下降法: 2.最小二乘法: 三.线性回归的推广:多项式回归 四.线性回归的推广:广义线性回归 五.线性回归的正则化: 一.线性回 ...

  6. 【机器学习】<刘建平Pinard老师博客学习记录>Scikit-learnPandas(NumpyMatplotlib)学习线性回归

    目录 一.数据获取&问题定义: 1.数据获取: 2.问题定义: 二.整理数据: 三.使用Pandas读取数据: 1.导入依赖库: 2.使用Pandas读取函数: 四.数据准备: 1.查看数据: ...

  7. Java NIO 学习笔记(三)----Selector

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  8. Java命令学习系列(三)——Jmap

    转载自 Java命令学习系列(三)--Jmap jmap是JDK自带的工具软件,主要用于打印指定Java进程(或核心文件.远程调试服务器)的共享对象内存映射或堆内存细节.可以使用jmap生成Heap ...

  9. 【C语言进阶深度学习记录】三十八 C/C++语言中的函数声明与函数定义

    文章目录 1 函数的声明和定义 1.1 代码分析 2 总结 1 函数的声明和定义 声明的意义在于告诉编译器程序单元的存在.只是告诉编译器它存在但是不在声明这里定义,有可能在当前文件中的其他地方或者其他 ...

  10. 【C语言进阶深度学习记录】三十五 程序中的堆、栈以及静态存储区(数据区)

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 在我之前学习底层的知识的时候,也写过相关的内容.可以对比的学习:[软 ...

最新文章

  1. html滑动直播,HTML5 canvas实现的静态循环滚动播放弹幕
  2. .Net 操作MSMQ
  3. Think in AngularJS:对比jQuery和AngularJS的不同思维模式
  4. Django no such table: django_session错误解决办法
  5. Rabbitmq工作笔记009---access to vhost ‘/‘ refused for user 权限问题
  6. ubuntu16.04下安装openssh-server报依赖错误的解决方法
  7. jabc spring
  8. Linux的网络基础
  9. 单片机入门 - 模电、数电与单片机
  10. 创意字体设计中主题类别有哪些呢?
  11. 简介计算机桌面功能,desktopcal电脑桌面日历功能介绍
  12. vm虚拟机无法访问共享文件夹
  13. mysql 未找到 WinSxS_win7的winsxs文件清理方法
  14. SpringBoot的幕后推手,java互联网架构师系统vip课程
  15. 下一代CDN如何与智能AI及物联网打通?
  16. Android5.1--PowerManagerService电源管理
  17. Titanic 泰坦尼克号预测-Tensorflow 方法-【Kaggle 比赛】
  18. kubectl命令使用滚动更新和回滚
  19. 迪文工控触摸屏使用modbus功能
  20. ps保存psd后图层全没了_PS画图后保存PSD格式,然后就打不开了

热门文章

  1. Kindle3 字典安装
  2. 汉诺塔移动次数递归算法c语言,谁知道C语言汉诺塔递归算法及其详细注释?
  3. java mina框架实例_MINA框架简介和一个简单的例子
  4. 远程服务器时Ubuntu报错:qt.qpa.xcb: could not connect to display
  5. web测试,APP测试和小程序测试特点
  6. python——algorithms模块
  7. MAVEN setting.xml配置文件详解
  8. 荣耀 android 5.0 root,华为EMUI5.0 可用的ROOT工具,我是作者!!!!——精华帖
  9. html 设置字体加粗,css如何设置字体加粗样式?
  10. 如何将gif动图分解成png格式?动图分解器如何使用?