——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
本章内容包括:
运算符;
键盘录入;
流程控制语句;
运算符
(1)算术运算符
+的用法
a:加法 b:正号 c:字符串连接符
++和--的用法
放在操作数的前面:先自增或者自减,再参与操作
int a = 10;
int b = ++a; //a=11,b=11
放在操作数的后面:先参与操作,再自增或者自减
int a = 10;
int b = a++; //a=11,b=10
例题:
int x = 4;
int y = (x++)+(++x)+(x*10);
//4+6+60=70
(2)赋值运算符
扩展的赋值运算符(+=,-=,*=,/=,%=)的特点:隐含了自动强制转换。
short s = 1;
s = s + 1; 报错,此处需要强转
short s = 1;
s += 1; 不会报错 因为+=隐含了强转
(3)比较运算符
无论运算符两端简单还是复杂最终结果是boolean类型。
千万不要把==写成了=
(4)逻辑运算符
&,|,^(这三个,两边是布尔类型则是逻辑运算。两边是数值则是位运算),!,&&,||
逻辑运算符用于连接boolean类型的式子
结论
&:有false则false
|:有true则true
^:相同则false,不同则true。
!:非true则false,非false则true
&&:结果和&一样,只不过有短路效果。左边是false,右边不执行。
||:结果和|是一样的,只不过有短路效果。左边是true,右边不执行。
(5)位运算符
首先要把数据转成二进制 都用补码计算
3的二进制:11
00000000 00000000 00000000 00000011
4的二进制:100
00000000 00000000 00000000 00000100
例子都为正数,原码反码补码一样
&位与运算:有0则0
00000000 00000000 00000000 00000011
&00000000 00000000 00000000 00000100
---------------------------------------
00000000 00000000 00000000 00000000
结果为0
|位或运算:有1则1 结果为7
^位异或运算:相同则0,不同则1 结果为7
~按位取反运算:0变1,1变0 如 ~3=-4计算过程如下
00000000 00000000 00000000 00000011 (-3)
~得结果为11111111 11111111 11111111 11111100 (这个数是补码)
转换成原码为
100000000 00000000 00000000 00000100即-4
A:^的特殊用法
一个数据对另一个数据位异或两次,该数不变 如3^4^4结果为3
B:面试题
a:请实现两个变量的交换
**用位异或运算符
int a = 10;int b = 20;
a = a ^ b;
b = a ^ b;
a = a ^ b;最后输出为a=20,b=10
**第三种方法:b = (a+b) - (a=b);一句话搞定
b:请用最有效率的方式计算出2乘以8的结果
最有效率即用位移运算,因为电脑运算的时候都是转化为位移运算的。2<<3=8
(6)三元运算符
A:格式
比较表达式?表达式1:表达式2;
B:执行流程:
首先计算比较表达式的值,看是true还是false。
如果是true,表达式1就是结果。
如果是false,表达式2就是结果。
(7)位移运算符
<<左移,左边丢弃,右边补0
>>右移,最高位是什么就补什么
>>>无符号右移,都补0
3<<2=12 即3左移两位。简便方法(负数同理):结果为3*2^2=12,把<<左边的数据乘以2的移动次幂,同理,>>为除以
键盘录入
import java.util.Scanner; //导入包
Scanner sc = new Scanner(System.in); //创建对象
int x = sc.nextInt(); //获取输入的数字
流程控制语句
(1)顺序结构 从上往下,依次执行
(2)选择结构 按照不同的选择,执行不同的代码 if switch
(3)循环结构 做一些重复的代码 for,while,do...while
if语句
(1)注意事项
A:比较表达式无论简单还是复杂,结果是boolean类型
B:if语句控制的语句体如果是一条语句,是可以省略大括号的(不建议);如果是多条,不能省略。
C:一般来说,有左大括号,就没有分号,有分号,就没有左大括号。
D:else后面如果没有if,是不会出现比较表达式的。
E:三种if语句其实都是一个语句,只要有一个执行,其他的就不再执行。
(2)三元运算符和if语句第二种格式的关系
三元运算符能够实现的,if else都能实现,反之不成立。
如果if语句的else语句体是输出语句,就不可以。因为三元运算符是一个运算符,必须要有一个结果返回,不能是一个输出语句。
switch语句
(1)格式解释说明:
switch接收的参数:可以是byte,short,int,char
JDK5以后可以是枚举
JDK7以后可以是字符串
(2)注意事项:
A:case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的
B:break可以省略,但是结果可能不是我们想要的。会出现一个现象:case穿透。
C:default可以在任意位置。但是建议在最后。
D:switch语句的结束条件
a:遇到break就结束了
b:执行到末尾就结束了
(3)if语句和switch语句各自的场景
A:if
针对boolean类型的判断
针对一个范围的判断
针对几个常量的判断
B:switch
针对几个常量的判断
(4)case穿透案例
/**
* 穿透案例
* 两个case都不是2,则执行default,因为没有break所以执行完default会按顺序继续执行,直到遇见break或者全部执行完毕才结束
*/
int x = 2,y=3;
switch(x)
{
default:
y++;
case 3:
y++;
break;
case 4:
y++;
}
System.out.println("y="+y);//y=5
循环语句for,while,do…while
(1)for循环语句
注意事项
a:判断条件语句无论简单还是复杂,结果是boolean类型
b:有分号就没有左大括号,有左大括号就没有分号
(2)while循环
for和while的区别 (优先用for循环)
a:使用上的区别
for语句的那个控制条件变量,在循环结束后不能在使用了。而while的可以继续使用。
b:理解上的区别
for适合于一个范围的判断,while适合次数不明确的
(3)do...while循环
三种循环的区别
a:do...while循环至少执行一次循环体
b:for和while必须先判断条件是否是true,然后后才能决定是否执行循环体
(4)循环使用的注意事项(死循环)
A:最简单的死循环格式
B:优先使用for,其次while,最后考虑do while
控制跳转语句
(1)break:中断
B:作用
a:跳出单层循环
b:跳出多层循环,需要标签语句的配合
如: wc:for(……){
nc:for(……){
break wc;}}
则可跳出多层循环
(2)continue:继续
A:作用
跳出单层循环的一次,可以继续下一次
B:填空题
for(int x=1; x<=10; x++) {
if(x%3 == 0) {
//补齐代码
}
System.out.println("Java基础班");
}
让控制台输出2次:Java基础班 break
让控制台输出7次:Java基础班 continue
让控制台输出13次:Java基础班 sout
(3)return:返回
用于结束方法,一旦遇到return,程序就终止,不会再执行方法内后面的内容。
练习
1.求1-100偶数和 奇数和
int jishu=0;
int oushu=0;
int sum = 0;
for (int i = 1;i<=100;i++){
if(i % 2 == 0){
oushu +=i;
}else{
jishu+=i;
}
sum+=i;
}
System.out.println("偶数和"+oushu+" 奇数和"+jishu+" 总和"+sum);
2.求n的阶乘
//键盘输入n
Scanner sc = new Scanner(System.in);
//阶乘最后乘到1,创建1的大数对象
BigInteger num = BigInteger.valueOf(1);
//获取n,并在循环内用BigInteger的multiply方法求乘积
for (int i =sc.nextInt();i>0;i--){
num = num.multiply(BigInteger.valueOf(i));
}
System.out.println(num);
3.输出所有的水仙花数:135=1*1*1+3*3*3+5*5*5 即一个三位数,各个数字的立方和为其本身
方法1:遍历每一个三位数,先放入StringBuilder,然后charAt配合 “- “运算符获取三个数字
int a,b,c,sum ;
StringBuilder sb = new StringBuilder();
for (int i =100;i<1000;i++){
sb.append(i);
//48是0
a = sb.charAt(0)-48;
b = sb.charAt(1)-48;
c = sb.charAt(2)-48;
sum = a*a*a+b*b*b+c*c*c;
if(sum == i){
System.out.println(i);
}
sb.delete(0,sb.length());
}
方法2:用求余的方法获取三位数的每个数字
int a,b,c,count=0;
for(int i =100;i<1000;i++){
a = i % 10; //各位
b = i/10 %10; //十位
c = i/100 %10; //百位
if (i == a*a*a+b*b*b+c*c*c){
System.out.println("水仙花数为"+i);
count++;
}
}
System.out.println("水仙花数总共有"+count+"个");
4.厚度0.01m的无限大的纸 折叠多少次可以超过8848m?
double houdu=0.01;//定义厚度
int count1 = 0;//定义次数
//厚度小于8848就折叠. 折叠一次,厚度翻倍
while(houdu<8848){
houdu *= 2;
count1++;
}
System.out.println("折叠"+count1+"次");
5.打印图案
*
**
***
****
*****
//外层for循环控制行数
int hang = 5;
for(int i = 0;i<hang;i++){
//内层for循环控制列数
for (int y = 0;y<=i;y++){
System.out.print("*");
}
System.out.println();
}
6.打印底边长5个*的等腰三角形
方法:先打空格再打星
//q是行数,w是打空格的列数,e是打*的列数
int q,w,e;
for (q = 0;q < 3;q++){
//空格只有两列,第一列两个空格,第二列1个空格
for (w = 0 ;w<2-q;w++){
System.out.print(" ");
}
//每行打印完空格紧接着打印* 每行打印 5-2*该行空格数 个*
for (e = 0;e<5-2*w;e++){
System.out.print("*");
}
System.out.println();
}
7.输出九九乘法表
//外层for控制*号左边的数 即多少行
for(int i = 1;i<=9;i++){
//内层for控制*号右边的数 即多少列
for (int y = 1;y<=i;y++){
//把内外层拼接,并拼上相乘的结果,最后再加个制表符对齐
System.out.print(i+"*"+y+"="+i*y+"\t");
}
//每打完一行就换行
System.out.println();
}
8.小明每天存2.5 每到5的倍数就花6块,求过多久就存够100
double money=0;
int day = 0;
//这里指的是每天最终剩100需要多少天
while(money<100){
//每天的零花钱进账,先计算存
money +=2.5;
day++;
//5的倍数天的支出
if (day % 5 == 0){
money = money -6;
}
//达到条件 break
if (money >=100){
System.out.println(day+"天");
break;
}
}
9.