浙大翁凯老师Java课堂学习记录(第二周)
计算机的智能是建筑在规则的基础上的,在遇到情况的时候,根据事先制定的规则做出判断,是计算机最基本的能力。
能做判断的基础,是能对数据做比较,比较就是关于两个数据是否相等、谁大谁小的结论,这需要用到关系运算:对两个数据之间的关系的计算。
Java提供了六个关系运算符:
== 相等
!= 不相等
> 大于
>= 大于或等于
< 小于
<= 小于或等于
注意其中有两个字符的运算符:==、>=和<=的两个字符必须紧紧连在一起,中间不能插入空格。
关系运算的结果是一个逻辑值。
逻辑值只有两种可能的值:true(真,表示成立)或false(假,表示不成立)。
当两个值的关系符合关系运算符的预期时,关系运算的结果为true,否则为false。
2.1 比较
案例:自动售票机工作机制
工作原理:
用户:选择线路 & 投入纸币
自动售票机:打印车票 & 返回找零或者是告知用户余额不足
即:计算机读取用户的两个输入,进行计算判断,输出结果。
首先对该案例进行简化分析:
如果规定当前自动售票机只贩卖一种票价的票,应该怎么实现上述工作机制的程序呢?
代码 1(含成功和失败两种结果)
import java.util.Scanner;public class Hello {public static void main(String[] args) {// 初始化Scanner in = new Scanner(System.in);// 读入投币金额System.out.print("请投币:");int amount=in.nextInt();// 打印车票System.out.println("*************");System.out.println("*Java城际铁路专线*");System.out.println("* 无指定座位票 *");System.out.println("* 票价:10元 *");System.out.println("****************");// 计算并打印找零System.out.println("找零:"+(amount-10));}}
运行结果 1(输入>=10元的数值)
请投币:10**************Java城际铁路专线** 无指定座位票 ** 票价:10元 *****************找零:0
运行结果 2(输入<10元的数值)
请投币:5**************Java城际铁路专线** 无指定座位票 ** 票价:10元 *****************找零:-5
根据上述代码运行结果 2,我们发现当用户输入的数值<10的时候,找零变成了负数,同时在工作机制上,此时也是出票的,这并不符合常理。因此这个程序还需要写入一个判断的功能代码。
改进代码:(增加判断功能代码)
import java.util.Scanner;public class Hello {public static void main(String[] args) {// 初始化Scanner in = new Scanner(System.in);// 读入投币金额System.out.print("请投币:");int amount=in.nextInt();System.out.println(amount);System.out.println(amount>=10);//进行输入值的与10的大小判断// 打印车票System.out.println("*************");System.out.println("*Java城际铁路专线*");System.out.println("* 无指定座位票 *");System.out.println("* 票价:10元 *");System.out.println("****************");// 计算并打印找零System.out.println("找零:"+(amount-10));}}
运行结果 1(输入>10的数,判断为真true)
请投币:1515true**************Java城际铁路专线** 无指定座位票 ** 票价:10元 *****************找零:5
运行结果 2(输入<10的数,判断为假false)
请投币:33false**************Java城际铁路专线** 无指定座位票 ** 票价:10元 *****************找零:-7
关系优先级问题
所有的算术优先级均高于关系优先级。
举例:7>=3+2 在这个式子里面,优先做3+2,然后才做>= 。
==和!=的优先级比其他的低,同级的连续关系运算从左到右计算。
注意:true和false不能比较大小!!
判断两个浮点数(double)大小关系:
错误代码演示:
import java.util.Scanner;public class Hello {public static void main(String[] args) {double a=1.0;double b=0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1;System.out.println(a==b);System.out.println("a="+a+";"+"b="+b);}}
运行结果:
falsea=1.0;b=0.9999999999999999
在数学上,1等于10个0.1相加,这个在计算机程序中却不是这样的。因为是浮点数,而这段代码也体现了第一周中所讲浮点数计算结果精度不如整数计算精度。
因此,引入改进方案,使用a和b的差的绝对值是否小于一个比较小的数1*10的-6次方。
公式:Math.abs(f1-f2)<0.00001
改进代码:
import java.util.Scanner;public class Hello {public static void main(String[] args) {double a=1.0;double b=0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1;System.out.println(a==b);System.out.println("a="+a+";"+"b="+b);System.out.println(Math.abs(a-b)<1e-6);}}
运行结果:
falsea=1.0;b=0.9999999999999999true
根据上述运行结果,通过使用绝对值的方法后1等于10个0.1了,为true。
2.2 判断
接着上面自动售票机的案例,我们要实现如果输入票价大于10,那么就出票,否则不出票。
代码:
import java.util.Scanner;public class Hello {public static void main(String[] args) {// 初始化Scanner in = new Scanner(System.in);// 读入投币金额System.out.print("请投币:");int amount=in.nextInt();System.out.println(amount);System.out.println(amount>=10);//进行输入值的与10的大小判断if(amount>10) {// 打印车票System.out.println("*************");System.out.println("*Java城际铁路专线*");System.out.println("* 无指定座位票 *");System.out.println("* 票价:10元 *");System.out.println("****************");// 计算并打印找零System.out.println("找零:"+(amount-10));}}}
运行结果 1(输入值>10,出票并找零)
请投币:9090true**************Java城际铁路专线** 无指定座位票 ** 票价:10元 *****************找零:80
运行结果 2(输入值<10,返回false不出票不找零)
请投币:44false
学会使用Debug调试,在eclipse的左上角切换debug模式和Java模式。
使用判断语句进行相关代码操练
代码 1:(与常量作比较进行语句判断输出结果)
import java.util.Scanner;public class Age {public static void main(String[] args) {final int MINOR=35;System.out.print("请输入你的年龄:");Scanner in=new Scanner(System.in);int age=in.nextInt();System.out.print("你的年龄是:"+age);if(age<MINOR){System.out.println("年轻是美好的!");}System.out.println("年龄决定了你的精神世界,好好努力吧!");}}
运行结果 1(年龄小于设定值)
请输入你的年龄:19你的年龄是:19年轻是美好的!年龄决定了你的精神世界,好好努力吧!
运行结果 2(年龄大于设定值,不满足if语句运行条件)
请输入你的年龄:55你的年龄是:55年龄决定了你的精神世界,好好努力吧!
根据上述两种运行结果,可以明显看出if语句的妙处:
不满足if语句运行条件的就不执行if内的程序。
代码 2:(比较两个数的大小)
首先下面这段代码报错了,原因:比较x和y的大小if判断语句中只体现了对x为较大一方的看法,而没有顾及y的角度,至此导致程序报错,无法进行。
import java.util.Scanner;public class Age {public static void main(String[] args) {Scanner in=new Scanner(System.in);int x=in.nextInt();int y=in.nextInt();int max;if(x>y)max=x;System.out.println(max);}}
因此,我们要对上述代码进行改进。
改进代码 1(使用两个if判断语句)
import java.util.Scanner;public class Age {public static void main(String[] args) {Scanner in=new Scanner(System.in);int x=in.nextInt();int y=in.nextInt();int max;if(x>y) {max=x;System.out.println(max);}if(y>x){max=y;System.out.println(max);}}}
运行结果:
2(输入x的值)15(输入y的值)15(程序输出的值)
改进代码 2(最优解决,使用if else语句)
import java.util.Scanner;public class Age {public static void main(String[] args) {Scanner in=new Scanner(System.in);int x=in.nextInt();int y=in.nextInt();int max;if(x>y) max=x;elsemax=y;System.out.println(max);}}
运行结果:
3(输入x的值)77(输入y的值)77(程序输出的值)
2.3 分支
根据上一版块比较两个数的大小,现在延伸到比较三个数的大小。
有x,y,z三个变量,怎么进行比较呢?
方法:可以两两先比较,比较出来大的一方再与第三个变量进行比较。
因此代码书写如下:(采用“嵌套”思想)
import java.util.Scanner;public class Age {public static void main(String[] args) {Scanner in=new Scanner(System.in);int x=in.nextInt();int y=in.nextInt();int z=in.nextInt();int max;if(x>y) max=x;{if(x>z)max=x;elsemax=z;}if(y>x) max=y;{if(y>z)max=y;elsemax=z;}System.out.println(max);}}
运行结果:
66 3 99(输入三个数)99(输出)
举例代码:(分段函数的表示,使用级联的if,else if,else)
import java.util.Scanner;public class Age {public static void main(String[] args) {Scanner in=new Scanner(System.in);int x=in.nextInt();int f;if(x<0) {f=-1;}else if(x==0) {f=0;}else {f=2*x;} System.out.println(f);}}
代码解释:
当x<0时,f(x)=-1;
当x=0时,f(x)=0;
当x>0时,f(x)=2*x
运行结果:
36
使用switch-case代替多级联的if-else if 语句
格式:
switch(控制表达式){
case 常量:语句……
case 常量:语句……
default:语句……
}
解释:
①控制表达式只能是整数型的结果
②常量可以是常数,也可为常数计算的表达式
③根据表达式结果,寻找匹配的case,并执行case后面的语句直到break为止
④如果所有case都不匹配,就执行default后面的语句;若没有default,就什么都不做
代码演示:
import java.util.Scanner;public class Age {public static void main(String[] args) {Scanner in=new Scanner(System.in);int type=in.nextInt();switch(type){case 1:case 2:System.out.println("你好");break;case 3:System.out.println("晚上好");case 4:System.out.println("再见");default:System.out.println("你说啥呢?我听不懂!");break;}}}
运行结果:
3晚上好再见你说啥呢?我听不懂!
解释:运行switch-case,遇到break才终止程序,否则继续执行到结束。
**第二周编程作业**(2题)
1 时间换算(5分)
题目内容:
UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8。现在,你的程序要读入一个整数,表示BJT的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果分小于10分,需要保留十位上的0。如1124表示11点24分,而905表示9点5分,36表示0点36分,7表示0点7分。
有效的输入范围是0到2359,即你的程序不可能从测试服务器读到0到2359以外的输入数据。
你的程序要输出这个时间对应的UTC时间,输出的格式和输入的相同,即输出一个整数,表示UTC的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果分小于10分,需要保留十位上的0。
提醒:要小心跨日的换算。
输入格式:
一个整数,表示BJT的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果小时不是0而且分小于10分,需要保留十位上的0。
输出格式:
一个整数,表示UTC的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果小时不是0而且分小于10分,需要保留十位上的0。
输入样例:
933
输出样例:
133
代码:
import java.util.Scanner;public class Main {public static void main(String[] args) {// TODO 自动生成的方法存根Scanner in=new Scanner(System.in);int BJT;int UTC;BJT=in.nextInt();if(BJT>=0 && BJT<=2359) //数据范围{if(BJT%100<=60) //分钟范围{if(BJT/100>=8) {UTC=(BJT/100-8)*100+BJT%100;System.out.println(UTC);}else {//跨日计算UTC=(24-8+BJT/100)*100+BJT%100;System.out.println(UTC);}}else{System.out.println("分钟位(十位和个位)超出时间范围!");}}else{System.out.println("数据错误!有效的输入范围是0到2359!");}in.close();}}
2 信号报告(5分)
题目内容:
无线电台的RS制信号报告是由三两个部分组成的:
R(Readability) 信号可辨度即清晰度.
S(Strength) 信号强度即大小.
其中R位于报告第一位,共分5级,用1—5数字表示.
1---Unreadable
2---Barely readable, occasional words distinguishable
3---Readable with considerable difficulty
4---Readable with practically no difficulty
5---Perfectly readable
报告第二位是S,共分九个级别,用1—9中的一位数字表示
1---Faint signals, barely perceptible
2---Very weak signals
3---Weak signals
4---Fair signals
5---Fairly good signals
6---Good signals
7---Moderately strong signals
8---Strong signals
9---Extremely strong signals
现在,你的程序要读入一个信号报告的数字,然后输出对应的含义。如读到59,则输出:
Extremely strong signals, perfectly readable.
输入格式:
一个整数,信号报告。整数的十位部分表示可辨度,个位部分表示强度。输入的整数范围是[11,59]内有效的数字,这个范围外的数字不可能出现在测试数据中。
输出格式:
一句话,表示这个信号报告的意义。按照题目中的文字,先输出表示强度的文字,跟上逗号和空格,然后是表示可辨度的文字,跟上句号。注意可辨度的句子的第一个字母是小写的。注意这里的标点符号都是英文的。
输入样例:
33
输出样例:
Weak signals, readable with considerable difficulty.
时间限制:500ms 内存限制:32000kb
代码:
import java.util.Scanner;public class Main{public static void main(String[] args) {// 初始化Scanner in = new Scanner(System.in);int RS = in.nextInt();while (RS >= 11 && RS <= 59) {int r = RS % 10;int s = RS / 10;switch (r){case 1:System.out.print("Faint signals, barely perceptible");break;case 2:System.out.print("Very weak signals");break;case 3:System.out.print("Weak signals");break;case 4:System.out.print("Fair signals");break;case 5:System.out.print("Fairly good signals");break;case 6:System.out.print("Good signals");break;case 7:System.out.print("Moderately strong signals");break;case 8:System.out.print("Strong signals");break;case 9:System.out.print("Extremely strong signals");break;}switch (s) {case 1:System.out.print(", unreadable.");break;case 2:System.out.print(", barely readable, occasional words distinguishable.");break;case 3:System.out.print(", readable with considerable difficulty.");break;case 4:System.out.print(", readable with practically no difficulty.");break;case 5:System.out.print(", perfectly readable.");break;}break;}in.close();}}
浙大翁凯老师Java课堂学习记录(第二周)相关推荐
- C语言有简单基础的入手指南(MOOC课程 浙大 翁凯老师主讲)听课笔记 the basic knowledge of C
欢迎各位小白来了解C语言相关知识 下面的是我在MOOC课程中做的笔记 由简单到复杂,建议收藏后慢慢看,这里有很多不常用但很实用的东西 //else if的另一种表述switch-case switch ...
- CTF-2022-暑期学习记录-第二周
文章目录 基础知识 1文件上传 1.1基础文件上传 1.2截断绕过 1.2.1 00截断 1.2.2 转换字符集造成截断 1.3 文件后缀黑名单校验绕过 1.3.1 上传文件重命名 1.3.2 上传文 ...
- 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.查看数据: ...
- 《SysML精粹》学习记录--第二章
<SysML精粹>学习记录 第二章:系统建模语言概览 SysML介绍 SysML与UML SysML图概览 SysML通用图 小结 第二章:系统建模语言概览 SysML介绍 SysML ...
- 认真学习前端第二周学习笔记(浮动,定位,精灵图,布局)
文章目录 前言 一.关于浮动 二.关于定位 三.关于精灵图 四.关于布局 总结 前言 提示:这是我在专业培训机构学习的第二周,感觉学习进度好像有一点点慢,不过也还好,能让我们更好的消化消化,今天也是先 ...
- 中国大学Mooc浙大翁恺老师《零基础学Java语言》编程作业
感谢中国大学Mooc平台给我学习的机会,感谢翁恺老师深入浅出的讲解. 写此文为纪念我从无到有的学习和成长.便于以后回顾. 另外: 此答案仅供参考,用于启发没有思路的同学.切勿照搬,自欺欺人. 提交作业 ...
- 中国大学Mooc浙大翁恺老师《零基础学Java语言》编程作业(续)(5~ 7)
感谢中国大学Mooc平台给我学习的机会,感谢翁恺老师深入浅出的讲解. 写此文为纪念我从无到有的学习和成长.便于以后回顾. 此答案仅供参考. 提交作业时需把 public class Homework_ ...
最新文章
- Windows域信任关系建立全攻略
- 初等数论--整除--线性组合与最大公因数之间的关系
- ITK:减去两个图像
- leetcode 621. 任务调度器(贪心算法)
- ajax登录验证的原理,ajax用户登录验证-get和post提交方式,与工作原理—2018-8-15...
- Struts2、SpringMVC、Servlet(Jsp)性能对比 测试 。 Servlet的性能应该是最好的,可以做为参考基准,其它测试都要向它看齐,参照...
- linuxoracle查看用户权限_实现Oracle授予用户权限的一个实例
- sql server 日志清理语句
- CentOS 6.2 虚拟机 mail邮件信息: crash:[abrt] full crash report
- 马云:腾讯是阿里的成长伴侣;华为 2 万 CNBG 员工“投奔”余承东;18 岁学生索赔苹果 10 亿美元 | 极客头条...
- php 队列 api,GitHub - shirakun/think-queue: ThinkPHP 队列支持
- ASP.NET MVC 5 学习教程:数据迁移之添加字段
- 统计学习方法学习笔记一
- LabVIEW使用 NI Package Manager(NIPM)修复软件
- 工控变成用c语言还是plc,浅析工控机与PLC的区别
- java mail 20m附件,发送邮件时附件大小不能超过20M,否则无法发送
- Dracena:实时数字孪生平台
- 两个表格合并怎么做?
- C#通过类的继承来实现判断任意一个三角形并求出它们的周长及面积(等腰三角形,等边三角形,直角三角形,等腰直角三角形)
- 伦敦 quant_伦敦统一用户组8
热门文章
- 基于JAVA医疗器械销售电子商城计算机毕业设计源码+系统+mysql数据库+lw文档+部署
- 学习周刊-2021年第19周
- 使用WinDbg分析Dump文件(蓝屏示例)
- html设置抽奖概率,js设置概率随机数(可用于抽奖,砍价的逻辑应用)
- 【NetApp】NetApp存储设备的CPU使用率分析
- android 获取手机的MAC地址
- jiacu的css,css 加粗(css font
- RBAC 模型是什么?
- matlab仿真PID,使用simulink笔记,暨入门教程
- 一款可以由电脑投屏到手机的软件deskreen[粉丝少于1000的电脑直播]