网易云课堂Java应用基础:入门篇
第一章:用Eclipse来做计算
- 1.1第一个Java程序
- 1.2.1读输入
- 1.2.2变量
- 1.2.3赋值
- 1.3表达式
- 1.3.1浮点数
- 1.3.2运算符优先级
- 1.3.3类型转换
- 第一章编程题
第二章:判断
- 2.1.1比较
- 2.1.2关系运算
- 2.2判断语句
- 2.2.1做判断
- 2.2.2基本判断语句
- 2.2.3嵌套和级联的判断语句
- 2.2.4判断语句的常见问题
- 2.3多路分支
- 时间换算编程题
- 信号报告编程题
第三章:循环
- 3.1循环
- 数数字的例子
- while循环
- do_while循环
- 3.2 for循环
- for循环
- 复合赋值
- 3.3循环控制(含复合赋值、逻辑类型)
- 循环控制
- 多重循环
- 逻辑类型与逻辑运算
- 3.4循环应用
- 计数循环
- 算平均数
- 猜数游戏
- 整数分解
- 求和
- 最大公约数
- 第三章编程题
- 奇偶个数
- 数字特征值
- 素数和
第一章:用Eclipse来做计算
1.1第一个Java程序
1:FIle ==> New ==> Other ==> Java Project ==> Next
2:此时进入到页面:Create a Java Project;Project name:hello
package hello;public class Hello {public static void main(String[] args) {// TODO Auto-generated method stubSys //使用Alt+/,程序会自动跳出以这个开头的东西System.out.println("hello world");}
1.2.1:读输入
问题:初学者容易犯的错误,当这个程序有输入OR程序还没有结束,我们又去启动这个程序;启多个程序在跑耗费资源。
package hello;import java.util.Scanner;public class Hello {public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("hello world");// Scanner in = new Scanner(System.in);
// System.out.println("echo:" + in.nextLine());System.out.println("2+3="+ 5);System.out.println("2+3"+2+3); //运算优先级System.out.println("2+3"+(2+3)); // +号用来做字符串连接}}
注意:有两个快捷键:鼠标光标在第一行,shift+鼠标方向下键,你想要几行就可以选中几行;Ctrl + /,对当前代码行进行注释。
1.2.2变量
1、我们在执行加减法的时候,想要
public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("你好");Scanner in = new Scanner(System.in);System.out.println("100-23=" + (100-in.nextInt()));}输入:23,输出:77 100-23=77
输入:33,输出:67 100-23=67 //结果是对的,但是23是死的,怎么样让它显示上发生变化。
2、in.nextInt() 帮我们读入一个数,那我们仍然使用nextInt(),这不是我们想要的结果。
public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("你好");Scanner in = new Scanner(System.in);System.out.println("100-" + in.nextInt()+ "=" + (100-in.nextInt()));}
3、此时引入变量:
概念:<变量类型><变量名称>
int price;
int amount;
int price,amount;
- 变量需要一个名字,变量的名字是一种标识符,意思是它是用来识别这个和那个的不同的名字。
- 标识符的规则:标识符只能由数字、字母、下划线组成,数字不可以出现在第一个位置上,java的关键字不可以用作标识符。
public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("你好");int price; //定义一个变量,变量名price,变量名的类型是intScanner in = new Scanner(System.in);price = in.nextInt(); //把输入值用变量price尽心替换System.out.println("100-" + price+ "=" + (100-price)); //in.nextInt()相应进行替换}
程序改进:输入和输出参数都是变量,由我们自己指定,代码如下:
public static void main(String[] args) {// TODO Auto-generated method stub
System.out.println("你好");
int price;
int amount = 100;
Scanner in = new Scanner(System.in);
price = in.nextInt();
amount = in.nextInt();
System.out.println(price + "-" + amount + "=" + (price-amount) );
}
对于这个小demo,,那我们故意输入price,那它就会报错,类型不匹配。
你好
price
Exception in thread "main" java.util.InputMismatchExceptionat java.util.Scanner.throwFor(Unknown Source)at java.util.Scanner.next(Unknown Source)at java.util.Scanner.nextInt(Unknown Source)at java.util.Scanner.nextInt(Unknown Source)at hello.VariableTest.main(VariableTest.java:12)
在这个程序中,我们使用int amount = 100; 为其进行赋值;
由于100永远不变,使用final int amount = 100; 进行修饰,final修饰的是常量。
注意:常量不能再被赋值,如下图amount1;变量可以被再次赋值,如下图amount.
public static void main(String[] args) {// TODO Auto-generated method stub
System.out.println("你好");
int price;
final int amount = 100;
Scanner in = new Scanner(System.in);
price = in.nextInt();
System.out.println(amount + "-" + price + "=" + (amount-price) );
}
1.2.3赋值
变量名需要被初始化才可以使用:
int price = 10;
System.out.println(price);String name;
System.out.println(name); //系统提示变量一定要被初始化才能使用,the local variable name may not have been initialized.
表达式
1.3.1浮点数
1、需求1:英国人讲几尺几寸,把尺寸转换为米数;eg:5尺7寸,转换为米数是1.7018米。
package hello;import java.util.Scanner;public class TransformationTest {public static void main(String[] args) {// TODO Auto-generated method stubint foot;int inch;Scanner input = new Scanner(System.in);System.out.print("请输入几尺:"); foot = input.nextInt();System.out.print("请输入几寸:");inch = input.nextInt();System.out.println("foot=" + foot+",inch="+inch);System.out.println((foot+inch/12)*0.3048); //12 --> 12.0(浮点数)}
}输入值进行测试:
第一次:
请输入几尺:5
请输入几寸:0
foot=5,inch=0
1.524第二次:
请输入几尺:5
请输入几寸:1
foot=5,inch=1
1.524
思考:观察到寸上后实际没有发生转换;
原因:两个整数相除还是整数
System.out.println(10/3); 的值为3.
10和10.0在java中是两个不同的数。
修改的话仅仅只要把 12 ==> 12.0
System.out.println((foot+inch/12.0)*0.3048);
请输入几尺:5
请输入几寸:7
foot=5,inch=7
1.7018
引出概念:浮点数
概念:带小数点的数值.
- 当浮点数和整数放到一起进行运算时,java会将整数转换为浮点数,然后进行浮点数的运算。
- System.out.println((foot+inch/12)*0.3048);
- System.out.println((foot+inch/12.0)*0.3048);
也可以对inch进行重新定义:
从int inch; ==> double inch;
直接运行没问题,注意到inch = input.nextInt(); 意思是我们可以把一个输入的整数叫个inch,让他转换为double. int可以转换为double,double不能直接转换为int。
1、在计算机中,浮点运算是有误差的
输入:System.out.println(1.2-1.1);
输出:0.09999999999999987
注意:当我们需要精确计算的时候,使用整数
整数类型不能表达有小数部分的数,整数和整数的运算结果还是整数;计算机里会有纯粹的整数,是因为整数运算比较快,而且占地方小
1.3.2运算符优先级
第一章编程题
写一个将华氏温度转换成摄氏温度的程序,转换的公式是:
°F = (9/5)*°C + 32
其中C表示摄氏温度,F表示华氏温度。
程序的输入是一个整数,表示华氏温度。输出对应的摄氏温度,也是一个整数。
package hello;import java.util.Scanner;public class TemperatureConversion {public static void main(String[] args) {// TODO Auto-generated method stubScanner input = new Scanner(System.in);System.out.print("请输入华氏度:");int x = input.nextInt();System.out.println((int)(x-32)*5/9);
// System.out.println((int)((x-32)/(9/5.0)));}}
2.1.1作比较
自动售票机的工作流程:
package hello;import java.util.Scanner;public class ChangeApp {public static void main(String[] args) {// TODO Auto-generated method stub
// 1、初始化Scanner in = new Scanner(System.in);// 2、输入投币金额System.out.println("请投币:");double amount = in.nextInt();// 3、打印车票System.out.println("********");System.out.println("**java车票**");System.out.println("***无座***");System.out.println("********");// 4、计算并打印找零System.out.println(amount - 10);}}
在2输入投币金额中增加两行,算是用作判断.double amount = in.nextInt();System.out.println(amount);System.out.println(amount>=10);
2.1.2关系运算
1、计算两个值之间的关系,所以叫做关系运算符:
运算符 | 意义 |
---|---|
== | 相等 |
!= | 不相等 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
所有的关系运算符的优先级比算术运算符的低,但是比赋值运算高。
2、判断是否相等==和!=的优先级比其它的低,而连续的关系运算符是从左到右的。
- 5>4 == 6>5 左边5>4为true,右边6>5为true;所以返回值是true.
- 6>5>4 6>5的结果是true,true和4做比较是没有结果的.
- abtrue 对a,b赋值,判断是否相等,再去和true做判断
- ab6 a,b再怎么判断都是true,false是布尔类型,无法和数值做比较
- a==b>false true和false是不能比较大小的
- (a == b) > false X是不对的
3、浮点数相加是有误差的:
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:"+a +" b:"+ b); System.out.println(1.0 == (0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1));}输出:a:1.0 b:0.9999999999999999false
那么10个0.1相加和1.0的差距是多少呢???
System.out.println(Math.abs(a-b));
输出:1.1102230246251565E-16
2.2判断语句
2.2.1做判断
还是打印车票小程序:写一个if判断语句,输入金额>=10时才执行,其余时候不执行;
输入:15,输出:5;
输入:5,不继续执行.
if(amount >=10) {
// 打印车票System.out.println("********");System.out.println("**java车票**");System.out.println("***无座***");System.out.println("********");// 计算并打印找零System.out.println("找零" + (amount - 10));}
2.2.2判断语句
满足条件:age < MINOR,就会输出(年轻是美好的);不满足 age < MINOR这个条件时,就会输出(年龄决定了你的精神世界)。
if (height < max){growth = 10;
} else{growth = MAX - height;
}
2.2.3嵌套和级联的判断语句
package Judge;import java.util.Scanner;public class JudgeTest {public static void main(String[] args) {Scanner in = new Scanner(System.in);System.out.print("请输入x:"); int x = in.nextInt();System.out.print("请输入y:");int y = in.nextInt();System.out.print("请输入z:");int z = in.nextInt();int max;if (x > y) {if(x > z) {max = x;}else {max = z;}}else {if (y>z) {max = y;}else {max = z;}}System.out.println(max);}}
请输入x:80 请输入x:50 请输入x:40
请输入y:40 请输入y:60 请输入y:60
请输入z:20 请输入z:40 请输入z:80
80 60 80
流程图如下:
嵌套的判断:
- 当if的条件满足或者不满足的时候要执行的语句也可以是一条if或if-else语句,这就是嵌套的if语句.
1、if( code == READY)if ( count < 20 )System.out.println("一切正常\n");
elseSystem.out.println("继续等待")//这个else回合第二个if相匹配,不管else的缩进在哪,它是和最近的if匹配。
2、修改程序:
if( code == READY){if ( count < 20 )System.out.println("一切正常\n");}
elseSystem.out.println("继续等待")
//加上一对大括号后,else就会和第一个if匹配。
Tips:在if或else后面总是用{},即使只有一条语句的时候
有效避免别人对你代码的误解。
分段函数使用if来实现:
if ( x > 0) {f = -1;
} else if (x == 0) {f =0;
} else {f = 2 * x;
}
引出概念:级联的if-else if,语法如下:
if ( exp1 )
step1
else if( exp2 )step2;
elsestep3;
级联概念的两种写法:
第一种:
int f;
if (x < 0 ) {f = -1;
} else if ( x == 0 ) {f = 0;
} else {f = 2 * x;
}
System.out.println(f);
第二种写法:
if ( x < 0 ) {System.out.println(-1);
} else if ( x == 0 ) {System.out.println(0);
} else {System.out.println( 2 * x );
}
**总结:**我们肯定青睐于第一种写法,叫做单一出口,这个程序只有一个地方做输出;而不是像2中到处去输出;那比如我们要对(f + 1.0);在1中直接改变变量值,而在2中需要所有值都加1.0.
2.2.2判断语句的常见问题
忘了大括号
eg: if ( age > 60)
salary = salary * 1.2;
System.out.println(salary) 无论age是否大于60,都会执行下面的话,解决:在if后加上{},永远在if 和 else后加上大括号.if后面的分号
eg:
`package Judge;
import java.util.Scanner;
public class TestHasIfOrNot {
public static void main(String[] args) {// TODO Auto-generated method stubfinal int MINOR = 35;System.out.print("请输入你的年龄:");Scanner in = new Scanner(System.in);int age = in.nextInt(); System.out.println("你的年龄是:" + age); if (age < MINOR); { System.out.println("年轻是美好的.");} System.out.println("年龄决定了你的精神世界,好好珍惜");
}
}`
if条件后有无分号; 有分号意味着直接结束;本来就可以在代码中写一对大括号{},此时测试写else,会报错,提示没有if与之匹配。
错误的使用==和=
eg:if (age = MINOR)
Type mismatch: cannot convert from int to boolean(类型不匹配,=的表达式是赋值,整数;==是判断,true或者false)代码风格
1)在if和else之后必须加上大括号形成语句块
2)大括号内的语句缩进一个tab的位置
2.3多路分支
switch-case:
举例:
switch (控制表达式) { 控制表达式只能是整数型的结果
case 常量:语句 常量可以是常数,也可以是常数计算的表达式...
case 常量:语句 根据表达式的结果,寻找匹配的case,并执行case后面的语句,一直到break为止....
default: 如果所有的case都不匹配,那么就执行default后面的语句;如果没有default,那么就什么都不做语句....
}
break:
- switch语句可以看作是一种基于计算的跳转,计算控制表达式的值后,程序会跳转到相匹配的case(分支标号)处。分支标号只是说明switch内部位置的路标,在执行完成分支中的最后一条语句后,如果后面没有break,就会顺序执行到下面的case里去,直到遇到一个break,或者switch结束为止。
案例:
package Judge;import java.util.Scanner;public class SwitchApp {public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);System.out.print("请输入:");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;}}}
输入:1 输出:你好
输入:2 输出:你好 因为此时有break
输入:3 输出:晚上好 再见 …
输入:4 输出:再见 …
输入:除上述情况外的任意数字,都直接输出的是…
尝试用:switch-case完成如下:
f(x) = -1; x < 0
0; x = 0
2x; x > 0
第二章编程题:时间换算
题目内容:
UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8。现在,你的程序要读入一个整数,表示BJT的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果小时不是0而且分小于10分,需要保留十位上的0。如1124表示11点24分,而905表示9点5分,36表示0点36分,7表示0点7分。
有效的输入范围是[0,2359],并且十位不会大于5。即你的程序不可能从测试服务器读到0到2359以外或是分钟数大于59的输入数据。
你的程序要输出这个时间对应的UTC时间,输出的格式和输入的相同,即输出一个整数,表示UTC的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果小时不是0而且分小于10分,需要保留十位上的0。
提醒:要小心跨日的换算。
输入格式:
一个整数,表示BJT的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果小时不是0而且分小于10分,需要保留十位上的0。
输出格式:
一个整数,表示UTC的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果小时不是0而且分小于10分,需要保留十位上的0。
输入样例:
933
输出样例:
133
package Judge;import java.util.Scanner;public class PiecewiseFunction {public static void main(String[] args) {Scanner in = new Scanner(System.in);System.out.print("请输入北京时间:");int time = in.nextInt();//分理出小时、分钟int utc = 0;int hours = time/100;int minutes = time%100;if (minutes <= 59) {if (hours == 8) {utc = minutes;}if (hours < 8) {utc = (hours-8+24)*100+minutes;}if (hours > 8) {utc = (hours-8)*100+minutes;}System.out.println(utc);}else {System.out.println("边界值溢出");}}}
第二章编程题:信号报告
题目内容:无线电台的RS制信号报告是由三两个部分组成的:R(Readability) 信号可辨度即清晰度.S(Strength) 信号强度即大小.其中R位于报告第一位,共分5级,用1—5数字表示.UnreadableBarely readable, occasional words distinguishableReadable with considerable difficultyReadable with practically no difficultyPerfectly readable报告第二位是S,共分九个级别,用1—9中的一位数字表示Faint signals, barely perceptibleVery weak signalsWeak signalsFair signalsFairly good signalsGood signalsModerately strong signalsStrong signalsExtremely strong signals现在,你的程序要读入一个信号报告的数字,然后输出对应的含义。如读到59,则输出:Extremely strong signals, perfectly readable.输入格式:一个整数,信号报告。整数的十位部分表示可辨度,个位部分表示强度。输入的整数范围是[11,59],这个范围外的数字不可能出现在测试数据中。输出格式:一句话,表示这个信号报告的意义。按照题目中的文字,先输出表示强度的文字,跟上逗号和空格,然后是表示可辨度的文字,跟上句号。注意可辨度的句子的第一个字母是小写的。注意这里的标点符号都是英文的。注意逗号后面必须有一个空格。输入样例:33输出样例:Weak signals, readable with considerable difficulty.
Java代码案例:
package Judge;import java.util.Scanner;public class SignalReportApp {public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);System.out.print("请输入一个整数:");int number = in.nextInt();int a = number/10;int b = number%10;switch (a){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;}switch(b) {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;}}}
第三章:循环
3.1.1车票打印
一个相对完善的购买车票的程序如下所示:
package Judge;import java.util.Scanner;public class ChangeNoteApp {public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);//balance指的是顾客投的钱,初始值为0int balance = 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("***票价10元*********"); System.out.println("************"); System.out.println("找零是:" + (balance-10));balance = 0; //作用是当累计金额大于10块后进行一次找零;然后清零操作.}}}
}
数数字的例子
输入任意数字,输出这个数字的位数。
int字符最大支持2147483647,10位。
package Judge;import java.util.Scanner;public class CountNumber {public static void main(String[] args) {// TODO Auto-generated method stub//初始化Scanner in = new Scanner(System.in);System.out.print("请输入:");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 输出:3
输入:57780 输出:5
while循环
需求:
if ( x > 0 ){ while ( x > 0 ) {x = x/10; x = x / 10;n =n+1; n = n + 1;
} }
while循环:
- 如果我们把while循环翻译为“当”,那么一个while循环的意思就是:当条件满足是,不断地重复执行循环体内的语句。
- 循环执行之前判断是否继续循环,所以有可能循环一次也没有被执行。
- 条件成立时循环继续的条件。
人脑模拟计算机的运行,在纸上列出所有的变量,随着程序的进展不断重新计算变量的值
小结:
验证:测试程序时常使用边界数据,如有效范围两端的数据、特殊的倍数等等
- 个位数
- 10;
- 0;
- 负数;
do_while循环
概念:
在进入循环的时候不做检查,而是在执行完一轮循环体代码之后,再来检查循环的条件是否满足,如果满足则继续下一轮循环,不满足则结束循环
do {<循环体语句> } while (<循环条件>);
package Judge;import java.util.Scanner;public class do_whileLoop {public static void main(String[] args) {// TODO Auto-generated method stub//初始化Scanner in = new Scanner(System.in);System.out.print("请输入一个数字:");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);
}
}
区别:在于什么时候进行判断
for循环
for循环
需求:阶乘
n! = 1234…*n
写一个程序,让用户输入n,然后计算输出n!
变量:显然读用户的输入需要一个int的n,然后计算的结果需要用一个变量保存,可以是int的factor,在计算中需要有一个变量不断地从1递增到n,那可以是int的i.
测试:20!是负的,为什么?
我们是使用计算机的内存表达数据的,一个int类型我们在计算机中占据4个字节,int类型只能表达到[ -2的31次方-1,2的31次方-1]
package Judge;import java.util.Scanner;public class ForLoop {public static void main(String[] args) {Scanner in = new Scanner(System.in);System.out.print("请输入:");int n = in.nextInt();int factor = 1;for (int i =1; i <= n; i++) {factor = factor * i;System.out.println("factor= " + factor + " i= " + i);}System.out.println(factor);}}
小结:for循环像是一个计数循环:设定一个计数器,初始化它,然后在计数器到达某个值之前,重复执行循环体,而每执行一轮循环,计数值以一定步进进行调整,比如加1或者减1
for(i=0;i<5;i=i+1){System.out.println(i);
}
for ( 初始化;条件;单步动作 ) {
}
1、第一个部分是一个初始化,可以定义一个新的变量
2、第二个部分是循环维持的条件。这个条件是先校验的,与while循环一样,进入循环之前,首先要校验条件是否满足,条件满足才会执行循环;条件不满足就结束循环。
3、第三个部分是步进,即每轮执行了循环体之后,必须执行的表达式。通常我们在这里改变了循环变量,进行加或减的操作。
空循环如下所示:
for (i = 0 ; i < 10; i++); // ; 的意思是这个for循环什么操作都不做for(i = 0 ; i < 10; i++){}
复合赋值
a = a + 6 ==> a += 6
a = a - 6 ⇒ a -= 6a *= b + 6 ==> a = a * (b + 6)
a /= b * 6 ==> a = a / ( b * 6)
i++和++i的区别?
i = 6
a = i++ ==> a = 6 i = 7
a = ++i ⇒ a = 7 i = 7
3.3循环控制(含复合赋值、逻辑类型)
3.3.1循环控制
素数:概念:只能被1和自己整除的数,不包括1;
package Judge;
import java.util.Scanner;
public class PrimeNumber {public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);int isPrime = 1;System.out.print("请输入一个数:");int n = in.nextInt();for (int i = 2; i < n ; i++) {if (n % i == 0) {isPrime = 0;System.out.println(n + "不是一个素数,i = " + i);break;} }if (isPrime == 1){System.out.println(n + "是素数");}else{System.out.println(n + "不是素数");}}
}
break和continue的区别:
- break是跳出循环,不再继续这个循环
- continue是跳过循环这一轮剩下的语句进入下一轮
eg:1 2 3 4,4个同学在唱歌,2同学唱到一半觉得太难听,continue:3同学继续唱;3同学唱到一半还是太难听,于是break,也轮不到4同学继续了。
3.3.2多重循环
需求1:在判断素数的基础上输出100以内的素数??
package Judge;import java.util.Scanner;public class PrimeNumberin100 {public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);for (int n = 2;n < 50 ;n++){int isPrime = 1;for (int i = 2; i < n; i++){if (n % i == 0){isPrime = 0;break;}}if (isPrime == 1){System.out.print(n + " ");}else{
// System.out.println(n + "不是素数");}}}}
需求2:凑硬币:如何用1角、2角、5角的硬币凑出10元以下的金额
package Judge;import java.util.Scanner;public class Match10 {public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);System.out.print("请投入金额:");int amount = in.nextInt();for (int one = 0; one <= amount;++one){for(int five = 0;five <= amount/5; ++five){for(int ten = 0;ten <= amount/10; ++ten){for (int twenty = 0;twenty <= amount/20; ++twenty){if(one+five*5+ten*10+twenty*20 == amount) {System.out.println(one+"张1元," + five + "张5元,"+ten+"张10元,"+twenty+"张20元");}}}}}}}测试输入输出:
请投入金额:15
0张1元,1张5元,1张10元,0张20元
0张1元,3张5元,0张10元,0张20元
5张1元,0张5元,1张10元,0张20元
5张1元,2张5元,0张10元,0张20元
10张1元,1张5元,0张10元,0张20元
15张1元,0张5元,0张10元,0张20元
4重循环,需求变更:我们输入一个金额,程序会给很多种方案; ==> 输入金额只输出一种结果。
在for循环中接力:
public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);System.out.print("请投入金额:");int amount = in.nextInt();int isExit = 0;for (int one = 0; one <= amount;++one){for(int five = 0;five <= amount/5; ++five){for(int ten = 0;ten <= amount/10; ++ten){for (int twenty = 0;twenty <= amount/20; ++twenty){if(one+five*5+ten*10+twenty*20 == amount) {System.out.println(one+"张1元," + five + "张5元,"+ten+"张10元,"+twenty+"张20元");isExit = 1;break;}} if (isExit == 1) break;}if (isExit == 1) break;}if (isExit == 1) break;}}
上面的每一层循环后加一行太过愚蠢,直接使用OUT和break OUT;去做匹配。
修改代码如下,注意修改的地方细致区别。
public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);System.out.print("请投入金额:");int amount = in.nextInt();OUT:for (int one = 0; one <= amount;++one){for(int five = 0;five <= amount/5; ++five){for(int ten = 0;ten <= amount/10; ++ten){for (int twenty = 0;twenty <= amount/20; ++twenty){if(one+five*5+ten*10+twenty*20 == amount) {System.out.println(one+"张1元," + five + "张5元,"+ten+"张10元,"+twenty+"张20元");break OUT;}} }}}}
Break和continue
- 在循环前可以放一个标号来表示循环:
- label:
- 带标号的break和continue对那个循环起作用
3.3.3逻辑类型与逻辑运算
在判断素数的程序中,使用了isPrime这个变量来达是否素数,我们只用到了isPrime的两个值0、1,可以直接修改。
public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);Boolean isPrime = true; //原先:int isPrime = 0;System.out.print("请输入一个数:");int n = in.nextInt(); for (int i = 2; i < n ; i++) {if (n % i == 0) {isPrime = false; //原先isPrime = 0;System.out.println(n + "不是一个素数,i = " + i);break;} }if (isPrime) //原先isPrime == 1{System.out.println(n + "是素数");}else{System.out.println(n + "不是素数");}}
逻辑类型:
- 关系运算的结果是一个逻辑值,true或false。这个值可以保存在一个对应的逻辑类型的变量中,这样的变量类型是boolean.
- 布尔是为了纪念George Boole对逻辑计算的贡献
- boolean flag = true;
- boolean tooHign,tooSmall,tooRough;
- boolean done = false;
- 逻辑运算是对逻辑量进行的运算,只有逻辑量可以参与运算
运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
! | 逻辑非 | !a | 如果a是true结果就是false,如果a是false结果就是true |
&& | 逻辑与 | a && b | 如果a和b都是true,结果就是true,否则就是false |
“ | ” | 逻辑或 |
像4<x<6这样的式子,不是java能接受的式子,因为4<x的结果是一个逻辑值,逻辑值是不能和数值6做关系计算的。
==> x > 4 && x < 6
逻辑运算的优先级:
- !> && > ||
- 举例:!done&&(count > MAX)
- 注意:单目运算的优先级都很高
- 给出式子:if ( ! n > 0) {}
- 编译器会报错:The operator ! is undefined for the argument type(s) intThe operator
3.4循环应用
3.4.1计数循环
int count = 100;
while ( count >= 100 ) {count = count-1;System.out.println(count);
}
System.out.println("发射");
问题:这个循环执行多少次?
循环停下来的时候,有没有输出最后的0?
循环结束后,count的值是多少?
package Judge;import java.util.Scanner;public class PrimeNumber {public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);int count = 10;while (count>0) {System.out.println("发射");count = count - 1;} System.out.println(count);System.out.println("发射");}
}
小套路:如果要模拟一个很大次数的循环,可以用一个小的次数来做,再来进行推断。
使用。
作业:程序发生改变:
int count = 10;
do {System.out.println(count);count = count - 1;
}while (count > 0 );
SYstem.out.println("发射!");
3.4.2算平均数
- 让用户输入一系列的正整数,最后输入-1表示输入结束,然后程序计算出这些数字的平均数,输出输入的数字的个数和平均数
- 变量 --> 算法 --> 流程图 --> 程序
需求分析:
- 一个记录读到的整数的变量
- 平均数要怎么计算?
- 只需要每读到一个数,就把它加到一个累加的变量里,到全部数据读完,再拿它去除读到的数的个数就行
- 一个变量记录累加的结果。一个变量记录读到得数
算法实现:
- 初始化变量sum和count为0;
- 读入number;
- 如果number不是-1,则将number加入sum,并将count加1,回到2;
- 如果number是-1,则计算和打印出sum/count(注意换成浮点来计算)
do-while(实现)
代码中注释掉的部分是while循环
package Judge;import java.util.Scanner;public class PrimeNumber {public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);int number;int sum = 0;int count = 0;
// number = in.nextInt();
// while ( number != -1)
// {
// sum += number;
// count = count + 1;
// number = in.nextInt();
// }do {number = in.nextInt();if(number != -1){sum += number;count =count +1;}}while (number != -1);if (count > 0){System.out.println("平均数" + (double)sum/count);}}}
3.4.3猜数游戏
需求:
- 计算机随机想一个数,记在变量number中;
- 一个负责计次数的变量count初始化为0;
- 让用户输出一个数字a;
- count递增(加一);
- 判断a和number的大小关系,如果a大,就输出“大”,如果a小,就输出“小”;
- 如果a和number是不相等的(无论大还是小),程序转回第三步;
- 否则,程序输出“猜中”和次数,然后结束
package Judge;import java.util.Scanner;public class GuessNumber {public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);int number = (int)(Math.random()*100+1);int a;int count = 0;do {a = in.nextInt();count= count+ 1;if (a > number){System.out.print("偏大");}else if(a < number){System.out.print("偏小");}} while (a != number);System.out.println("恭喜你才对了" + count+ " 次");}}
3.4.4整数分解
体验while和do-while的区别:
package Judge;import java.util.Scanner;public class IntegerResolve {public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);int number;number = in.nextInt();int result = 0;do{int digit = number % 10;result = result*10+digit;System.out.println(digit);number = number / 10;}while (number > 0);System.out.println(result);}}
3.4.5求和
需求:
package Judge;import java.util.Scanner;public class IntegerResolve {public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);System.out.print("请输入一个数:");int n = in.nextInt();double sum = 0.0;for(int i = 1; i <= n; i++){sum += 1.0/i;}System.out.println(sum);System.out.printf("%.2f",sum);}}
需求变更:
思路:
1)加一个减一个 ==> 增加一个变量sign,sign = -sign;在循环中总是正负交替着.
package Judge;import java.util.Scanner;public class IntegerResolve {public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);System.out.print("请输入一个数:");int n = in.nextInt();double sum = 0.0;int sign = 1;for(int i = 1; i <= n; i++) // for(int i = 1; i <= n; i++,sign = -sign) 使用逗号的意思是,for循环执行i++的同时执行sign = -sign;{sum += sign*1.0/i;sign = -sign;}System.out.println(sum);System.out.printf("%.2f",sum);}}
2)加一个正的加一个负的 ==> i是奇数加法,i是偶数减法.
package Judge;import java.util.Scanner;public class IntegerResolve {public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);System.out.print("请输入一个数:");int n = in.nextInt();double sum = 0.0;int sign = 1;for(int i = 1; i <= n; i++){
// sum += sign*1.0/i;
// sign = -sign;if (i % 2 == 1){sum += 1.0/i;}else{sum -= 1.0/i;}}System.out.println(sum);System.out.printf("%.2f",sum);}}
3.4.6最大公约数
- 输入两个数 a 和 b,输出它们的最大公约数
- 输入:12 、18
- 输出:6
思路:
package Judge;import java.util.Scanner;public class IntegerResolve {public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);System.out.print("请输入a:");int a = in.nextInt();System.out.print("请输入b:");int b = in.nextInt();int gcd = 1;for (int i = 2; i <=a && i <=b;i++){if (a % i ==0 && i == 0){gcd = i;}}System.out.println(a + "和" + b + "最大公约数" + gcd);}}
缺点:计算次数多,计算时间拉长
引出概念:辗转相除法
- 如果b等于0,计算结束,a就是最大公约数
- 否则,计算a除以b的余数,让a等于b,而b等于那个余数;
- 回到第一步
a是12,b是18,第一次的r:12除18的余数=12.
b | r(表达余数) |
---|---|
18(把b的值赋给a) | 12(12%18的余数) |
12(把b的值赋给a) | 6(18%12) |
6 | 0 |
因为不知道有几步;所以适合用while循环
package Judge;import java.util.Scanner;public class IntegerResolve {public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);System.out.print("请输入a:");int a = in.nextInt();System.out.print("请输入b:");int b = in.nextInt();int oa = a;int ob = b;while ( b != 0){int r = a%b;System.out.println(a + "," + b + "," + r );a = b;b = r;}System.out.println(oa+"和"+ob+"最大公约数"+a);}}
编程题:奇偶个数
需求:
题目内容:
你的程序要读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据。程序输出读到的数据中的奇数和偶数的个数。
输入格式:
一系列正整数,整数的范围是(0,100000)。如果输入-1则表示输入结束。
输出格式:
两个整数,第一个整数表示读入数据中的奇数的个数,第二个整数表示读入数据中的偶数的个数。两个整数之间以空格分隔。
输入样例:
9 3 4 2 5 7 -1
输出样例:
4 2
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner can = new Scanner(System.in); int num = can.nextInt(); int count1 = 0, count2 = 0; while (num != -1) { if (num % 2 == 1) count1++; //记录奇数的个数 else count2++; //记录偶数的个数 num = can.nextInt(); } System.out.println(count1 + " " + count2); } }
编程题:数字特征值
提示:将整数从右向左分解,数位每次加1,而二进制值每次乘2。
输入格式:
一个非负整数,整数的范围是[0,1000000]。
输出格式:
一个整数,表示计算结果。
输入样例:
342315
输出样例:
13
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int number = in.nextInt(); int temp=number; int i,count=0; for(i=0;temp!=0;i++) temp/=10; if(number!=0) do { count*=2; if(((int)(number/(Math.pow(10, i-1))))%2==i%2) count+=1; number=(int) (number%(Math.pow(10, i-1))); i--; } while (i>0); System.out.println(count); }
}
编程题:素数之和
题目内容:
我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。
现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。
输入格式:
两个整数,第一个表示n,第二个表示m。
输出格式:
一个整数,表示第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。
输入样例:
2 4
输出样例:
15
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int m = in.nextInt(); int sum = 0; int count = 0; if (0 < n && n <= m && m <= 200) { for(int i =1;i<2000;i++){ if(isPrime(i)){ count++; if(count>=n){ sum = sum +i; } } if(count==m){ break; } } } else { return; } System.out.println(sum); } public static boolean isPrime(int n) { int i=0; if(n < 2) return false; if(n == 2) return true; for(i = 2; i*i <= n; i++) if(n%i == 0) return false; return true; }
}
网易云课堂Java应用基础:入门篇相关推荐
- 网易云课堂Java进阶学习笔记系列01 -- 第3周 对象容器
个人为了复习一下Java基础, 在网易云课堂上报了翁恺老师的Java语言程序设计进阶篇的课程, 主要看了其中的3. 对象容器, 6. 设计原则, 7. 抽象与接口, 8. 控制反转与MVC模式这几部分 ...
- 如何5分钟秒懂Java之基础入门篇 第一个hello word
本来其实想讲一下这个Java基础入门系列_JDK的安装,后来想想还是算了.毕竟这就是相当于一个给电脑装一个APP,类似这么个流程. 还想说一个这个JDK一个必须要知道的知识点,那就是JDK的bin目录 ...
- 网易云课堂Java入门视频课程
课程概述 本课程不提供教学服务.作业批改及证书发放. 程序设计是一门基础课程.对于计算机相关专业而言,程序设计是专业基础知识,是进一步学习其他专业知识的第一步阶梯:对于非计算机专业而言,程序设计的学习 ...
- 最新《网易云课堂Java入门课程》
课程概述 本课程不提供教学服务.作业批改及证书发放. 程序设计是一门基础课程.对于计算机相关专业而言,程序设计是专业基础知识,是进一步学习其他专业知识的第一步阶梯:对于非计算机专业而言,程序设计的学习 ...
- 网易云课堂Java进阶学习笔记系列03 -- 第7周 抽象与接口
第七周 抽象与接口 在第一周就有一个Shape类的例子.这个类有很多的子类,每个子类也都实现了父类的方法.实际上父类Shape只是一个抽象的概念而并没有实际的意义. 举例案例理解 如果请你画一个圆,你 ...
- 史上最强Tomcat8性能优化,网易云课堂java高级架构师
点击"Server Status",输入用户名.密码进行登录,tomcat/tomcat 登录之后可以看到服务器状态等信息,主要包括服务器信息,JVM,ajp和http信息 AJP ...
- 【Java编程进阶】Java语言基础入门篇
从今天开始,就要写Java编程进阶从入门到精通系列的文章啦!希望大家学习完都可以找到心仪的工作,在自己热爱的岗位上闪闪发光! 推荐学习专栏:Java 编程进阶之路[从入门到精通] 文章目录 一. 第一 ...
- mysql教程网易云课堂_网易云课堂《MySQL从入门到精通》2017
『课程目录』: 1.MySQL数据库的基础认识以及地位 2.MySQL的安装目录以及目录功能介绍 3.MySQL环境变量的配置及连接数据库 4.MySQL连接以及各数据库名词介绍 5.MySQL语句的 ...
- 【239天】网易云课堂计算机专业基础课程系列——计算机专业导论(4)
叨叨两句 不忘初心 一直以来,我脑中从来不缺好点子,而如今,我发现我除了不缺好点子,还不缺点子所需的行动力和表达能力,唯独缺的,就是时机了. 这个点子我就先留着了,未来时机成熟拿去创业. 第2讲:符号 ...
最新文章
- 【持续..】WEB前端面试知识梳理 - CSS部分
- Curl操作es实践
- Linux服务器集群系统(一)—— LVS(Linux Virtual Server)简介
- 四五月份:关键词是沟通、绘画和SQL
- Git 使用,命令说明
- html 的layer的属性,layer属性
- php中,多维数组是什么意思,在PHP中回显多维数组
- 日本定了一个小目标,在2030年让五分之一的汽车实现自动驾驶
- 数据结构笔记(参考王道考研系列)
- 【Flex】FLEX工程合并留意错误。
- python与排版设计_python 排版
- 英语句子成分后置定语语法归纳
- IBM SPSS Modeler Social Network Analysis 的介绍和日常应用
- ad中电容用什么封装_玩具中4.5V直流小电机上有个104的小电容,问这个小电容的作用是什么?...
- Java实现Zoho Mail 发送邮件,使用hutool工具类。
- 关于thinkphp写入缓存失败的原因
- 乐观锁和悲观锁区别以及使用场景
- 便携式打印机连接蓝牙方式
- python random.randint()函数介绍
- IOS 微信返回按钮事件控制弹层关闭还是返回上一页