浙大翁凯老师Java课堂学习记录(第三周)
第三周学习笔记
导语:
- 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课堂学习记录(第三周)相关推荐
- C语言有简单基础的入手指南(MOOC课程 浙大 翁凯老师主讲)听课笔记 the basic knowledge of C
欢迎各位小白来了解C语言相关知识 下面的是我在MOOC课程中做的笔记 由简单到复杂,建议收藏后慢慢看,这里有很多不常用但很实用的东西 //else if的另一种表述switch-case switch ...
- Java基础学习记录(三)
System: 描述系统一些信息. 获取系统属性信息:Properties getProperties 因为Properties是Hashtable子类,也就是Map集合的一个子类对象. 那么可以通过 ...
- c++基础入门(根据浙大翁恺老师视频整理)
把以前的笔记搬上来一下 根据浙大翁恺老师视频整理 https://www.bilibili.com/video/BV1yQ4y1A7ts?p=2 01第一个c++程序 02什么是对象 通过操作访问数据 ...
- Java设计模式学习记录-解释器模式
前言 这次介绍另一个行为模式,解释器模式,都说解释器模式用的少,其实只是我们在日常的开发中用的少,但是一些开源框架中还是能见到它的影子,例如:spring的spEL表达式在解析时就用到了解释器模式,以 ...
- 【机器学习】<刘建平Pinard老师博客学习记录>线性回归原理
目录 一.线性回归的模型函数和损失函数: 二.线性回归的算法: 1.梯度下降法: 2.最小二乘法: 三.线性回归的推广:多项式回归 四.线性回归的推广:广义线性回归 五.线性回归的正则化: 一.线性回 ...
- 【机器学习】<刘建平Pinard老师博客学习记录>Scikit-learnPandas(NumpyMatplotlib)学习线性回归
目录 一.数据获取&问题定义: 1.数据获取: 2.问题定义: 二.整理数据: 三.使用Pandas读取数据: 1.导入依赖库: 2.使用Pandas读取函数: 四.数据准备: 1.查看数据: ...
- Java NIO 学习笔记(三)----Selector
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java命令学习系列(三)——Jmap
转载自 Java命令学习系列(三)--Jmap jmap是JDK自带的工具软件,主要用于打印指定Java进程(或核心文件.远程调试服务器)的共享对象内存映射或堆内存细节.可以使用jmap生成Heap ...
- 【C语言进阶深度学习记录】三十八 C/C++语言中的函数声明与函数定义
文章目录 1 函数的声明和定义 1.1 代码分析 2 总结 1 函数的声明和定义 声明的意义在于告诉编译器程序单元的存在.只是告诉编译器它存在但是不在声明这里定义,有可能在当前文件中的其他地方或者其他 ...
- 【C语言进阶深度学习记录】三十五 程序中的堆、栈以及静态存储区(数据区)
学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 在我之前学习底层的知识的时候,也写过相关的内容.可以对比的学习:[软 ...
最新文章
- html滑动直播,HTML5 canvas实现的静态循环滚动播放弹幕
- .Net 操作MSMQ
- Think in AngularJS:对比jQuery和AngularJS的不同思维模式
- Django no such table: django_session错误解决办法
- Rabbitmq工作笔记009---access to vhost ‘/‘ refused for user 权限问题
- ubuntu16.04下安装openssh-server报依赖错误的解决方法
- jabc spring
- Linux的网络基础
- 单片机入门 - 模电、数电与单片机
- 创意字体设计中主题类别有哪些呢?
- 简介计算机桌面功能,desktopcal电脑桌面日历功能介绍
- vm虚拟机无法访问共享文件夹
- mysql 未找到 WinSxS_win7的winsxs文件清理方法
- SpringBoot的幕后推手,java互联网架构师系统vip课程
- 下一代CDN如何与智能AI及物联网打通?
- Android5.1--PowerManagerService电源管理
- Titanic 泰坦尼克号预测-Tensorflow 方法-【Kaggle 比赛】
- kubectl命令使用滚动更新和回滚
- 迪文工控触摸屏使用modbus功能
- ps保存psd后图层全没了_PS画图后保存PSD格式,然后就打不开了
热门文章
- Kindle3 字典安装
- 汉诺塔移动次数递归算法c语言,谁知道C语言汉诺塔递归算法及其详细注释?
- java mina框架实例_MINA框架简介和一个简单的例子
- 远程服务器时Ubuntu报错:qt.qpa.xcb: could not connect to display
- web测试,APP测试和小程序测试特点
- python——algorithms模块
- MAVEN setting.xml配置文件详解
- 荣耀 android 5.0 root,华为EMUI5.0 可用的ROOT工具,我是作者!!!!——精华帖
- html 设置字体加粗,css如何设置字体加粗样式?
- 如何将gif动图分解成png格式?动图分解器如何使用?