首页 » Java » 黑马程序员——Java基础(二)运算符,控制语句

黑马程序员——Java基础(二)运算符,控制语句

2015-10-03 13:10:02阅读(2292)

<pre name="code" class="html">------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">Java培训</a>、期待与您交流! ----------

运算符

运算符就是把变量或者常量进行连接的符号。一般是参与运算的符号。

算术运算符:+,-,++,--,/,*,%

整数相除,结果只能是整数。

如果想要小数,那么参与运算的数必须有小数类型(f)。

%运算,运算结果的符号跟左边一致,负数可以参与运算。

++使用的时候,分单独使用和参与运算使用。

加法是从左到右的顺序执行。(正号,加法运算,字符串连接符)

字符串和数字相加的情况,当数字在前是先进行数字的相加,数字在后面时是连接符。

Eg

int x = 4;

int y = (x++) +++x)+ x*10);

4 6 6070

每次遇到参与运算的++时,就直接先把x的值输出到当前位置,再计算x++

s.o.p(x++);//先输出x的值,在++

int a = 10;

int b = a++;//++的优先级高于=,但是为什么b=10?

在底层包含了三个步骤:

Aint temp = a;//产生了一个临时变量,先存储下a原来的值。

Ba++;//然后a自增。

Cint b = temp;//把临时的值附给b

注意:当++在后面参与运算的时候,会产生一个临时变量参与运算。

赋值运算符:=,+=,-=,*=,/=,%=

注意:

short s = 5;

s = s + 2;//报错。

s +=2;//正确。+=这个赋值运算符其实隐含了强制类型转换功能。

//s =(short)(s + 2);

比较运算符:==,!=,>,<,<=,>=,

比较运算符的结果都是boolean型,要么true,要么false

逻辑运算符:&,&&,|,||,^,!


位运算符:<<,>>,>>>,&,|,^,~

位运算直接对二进制进行运算。

注意:&符号两边是布尔类型的数时是逻辑运算符。

向左或向右移动就是把数据增大或者缩小2的多少倍。(算术左移和逻辑左移)(如果限定在int范围内的话,如果左移32位,还是原来的数。)

位运算能够提高些效率。

char的范围:

00000000 00000000

11111111 11111111

100000000 00000000 -1

2^16-1

面试题:

1,以最高的效率计算2*8:2<<3

2,交换两个数的值。

A:开发用的,采用第三方变量temp。

B:使用^,一个数^另一个数两次还是这个数。

A = A^B

B = A^B;//A^B^B=A

A = A^B;//A^B^A=B

n=n+m;

m=n-m;//n

n=n-m;//m

如果n和m的值非常大时,容易超出类型范围

3,获取60的十六进制

Int num = 60;

Int n1=num & 15=12;//获取60的最低4位,

int temp = 60>>4;//获取下一组4位

int n2=temp & 15=3;//对temp的值获取最低4位

System.out.println((char)(n1-10+'A'));

//注意这里如果是负数的话用>>>

三元运算符:(条件表达式)?表达式1:表达式2

如果使用三元运算符对有强制类型转换的表达式进行判断时,会出现类型转换不了的问题。

如:

n1>9?(char) (n1-10+’A’):n2;//这时如果满足表达式1,则输出为int型。因为(char)(n1-10+'A')计算完是char类型,但是它又跟n2等值在做运算,所以类型又提升成int型了。

语句

if(a >5)

int x = 5;//报错缺少分号,

因为int x =5;在计算中会被认为是:int x;x=5;两条语句。

作业:

考试成绩分等级。

90-100A等。

80-89B等。

70-79C等。

60-69D等。

60以下E等。

请根据给定成绩,输出对应的等级。

键盘录入:

Amain后面的String[] args接受参数。

BBufferedReader IO流里面。

CScanner JDK5以后键盘录入数据的方式。

使用Scanner的步骤:

A:导包:

import java.util.Scanner;

B:创建对象:

Scanner sc = newScanner(System.in);

System.in:是标准的输入流,对应着键盘的录入。

C:调用方法获取int类型的数据

int number = sc.nextInt();

if语句和三元运算符的关系:(没有关系)

在某些条件下,条件语句可以被三元运算符替换。

如果条件语句中是输出语句,则不能被替换。因为运算符连接的必须是结果。

switch中能够传的值有byte,short,int,char类型,JDK5以后可以有枚举,JDK7以后有String类型。

switch注意事项:

Adefault可以省略,但是一般不省略,除非你非常明确。default一般用于处理非正常情况。

B:放在最后面的defaultbreak是可以省略的。

放在case语句中的break是可以省略的,但是可能结果有问题,所以一般不省略。

Cdefault可以不放到最后。但是一般都放在最后面。

Dswitch语句遇到break或者执行到switch语句的末尾。

Eg

int x = 4;

switch(x)

{

default:

S.o.p(d);

case 1:

s.o.p(a);

case 2:

s.o.p(b);

case 3:

s.o.p(c);

}

结果是dab,开始顺序匹配,发现没有匹配的,就执行default,输出d,发现没有break,会出现case穿透,直接进入case1,输出a,依次输出bc

正常情况下,default在最后执行。

应用场景:

如果是对范围做判断,用if语句。如果对几个固定值做判断用switch


循环语句:

循环语句:

循环体:要做的事。

初始化条件:从哪里开始。

判断条件:在什么情况下结束。

控制条件:控制台初始化条件的变化。

for循环:

eg:

for(sop(a);sop(b);sop(d))

sop(c);

//报错,因为sop(b)没有办法判断真假。

写程序定义变量的注意问题:

什么时候定义变量:有变化的内容的时候。

定义范围:首先在小范围定义,如果不行,大范围。

如果先在大范围内定义了,不能再在这个范围内的小范围内重复定义。

变量在那个{}内定义的,就在这个{}有效。

while循环:

如果用while(true);//死循环。相当于while(true){}

whilefor的区别:

变量仅仅只做控制作用,用for,因为for结束,变量结束(从内存中消失),效率更高。而while用到的控制变量还在内存中。

什么时候用forwhile

如果是控制范围,最好用for。如果范围不明确用while。比如,我吃小蜜橘,但是不数有几个,直到吃完。

do{}while()循环:

不关怎样都会执行一次。

转意字符

\t等。用"\t"'\t'都可以,和字符串连接使用时用""

break:结束当前循环。

continue:结束本次循环。

注意:他们一般在循环中的判断使用,直接在判断中用会出错。

在一个完整的操作中,一般位于最后。不然直接报其后的语句是废语句。

break可以用在switch中。

带标号的结束:

首先定义一个标号,使用break或者continue结束到此标号即可。如:标号:for(){break:标号;}

结束循环的方法有三种:breakreturnexit

breakcontinue单独存在时,下面可以有任何语句,因为执行不到。报错!!


例子1:


/*
*根据键盘录入的分数,求这个分数属于哪个等级。
*/
import java.util.Scanner;
class TestDemo3 
{
	public static void main(String[] args)
	{
		//创建键盘录入对象
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入分数(1~100之间的整数):");
		//必须输入整形,不然报错
		int sorce = sc.nextInt();
		
		String level;

		if(sorce>=90 && sorce <=100)
		{
			level = "A等";
		}
		else if(sorce>=80 && sorce<90)
		{
			level = "B等";
			
		}
		else if(sorce>=70 && sorce <80)
		{
			level = "C等";
		}
		else if(sorce>=60 && sorce <70)
		{
			level = "D等";
		}
		else if(sorce>=0 && sorce<60){
			level = "E等";
		}
		else
		{
			level = "输入有错";
		}

		System.out.println(sorce+"----"+level);
	}
}

例子2:
/*
需求:
键盘录入月份,程序输出x月份是x季节
*/
import java.util.Scanner;
class TestDemo4 
{
	public static void main(String[] args) 
	{
		Scanner sc = new Scanner(System.in);

		System.out.print("请输入月份(整数1~12):");

		int mouth = sc.nextInt();

		String JiJie;

		if(mouth == 3 || mouth == 4 || mouth == 5)
		{
			JiJie = "春季";
		}
		else if(mouth == 6 || mouth == 7 || mouth == 8)
		{
			JiJie = "夏季";
		}
		else if(mouth == 9 || mouth == 10 || mouth == 11)
		{
			JiJie = "秋季";
		}
		else if(mouth == 12 || mouth == 1 || mouth == 2)
		{
			JiJie = "冬季";
		}
		else
		{
			JiJie = "输入有误";
		}

		System.out.println(mouth+"是"+JiJie);
	}
}

例子3:

/*
		需求:
			8848米的厚度,一张足够大的纸0.01米,折叠多少次可以成珠穆朗玛峰的高度?
		
		思路:
			1,循环次数不明确,用while。
			2,每次折叠,厚度是之前的2倍。所以每次乘以2.
			3,在while循环里面判断乘积是否大于等于8848
		*/
		float h = 0.01F;//纸的厚度
		int n = 0;//循环次数
		while(true)
		{
			if(h >= 8848)
			{
				System.out.println("折叠的次数为:"+n);
				break;
			}
			else
			{
				//统计次数
				n++;
				//厚度变化
				h *= 2;
			}
		}

例子4:

/*
		需求:用do while做1-100偶数之和
		思路:
			1,1~99偶数之和,用d作为计数器,sumD作为接收结果的变量
			2,偶数%2的值为0
			3,可以用do while
		*/
		/*
		老师思路:
			1,求1-100之和,通过for循环就可以搞定
			2,求偶数的和,先要判断是偶数。
				如何判断?d%2 = 0是偶数;是1则为奇数。
			
		*/
		int d = 1;
		int sumD = 0;
		do{
			if(d%2 == 0)
				sumD += d;
			d++;
		}while(d<100);

		System.out.println("1-99的偶数和是:"+sumD);

例子5:

/*
		需求:求100-999之间的水仙花数
		思路:
			1,水仙花数是指一个数的各个位的立方之和等于其本身。
			2,用for循环
			3,如何求各个位的数?
				153?
				个:153%10;
				十;(153/10)%10;
				百:(153/100)%10;
		*/
		for(int i=100;i<1000;i++)
		{
			//求个位
			int g = i%10;
			//求十位
			int s = (i/10)%10;
			//求百位
			int b = (i/100)%10;
			
			if((g*g*g+s*s*s+b*b*b) == i)
				System.out.println(i);
		}

例子6:

/*
		需求:正直角三角形
		思路:
			1,嵌套for循环
			2,y控制列数,y的值岁行的值而变
		*/

		for(int x=0;x<5;x++)
		{
			for(int y=0;y<x+1;y++)
			{
				System.out.print("*");
			}
			System.out.println();
		}

例子7

/*
		需求:打印倒直角三角形
		思路:
			1,列数随行数变化,随着行数增加列数减小
			2,设置一个变量控制行数,行数x<n,列数随着行数变化y=n-x
		*/
		int n = 5;
		for(int x=0;x<n;x++)
		{
			for(int y=0;y<n-x;y++)
			{
				System.out.print("*");
			}
			System.out.println();
		}

例子8:

/*
		需求:打印菱形
			*
		   * *
		  * * *
		 * * * *
		  * * *
		   * *
		    *
		思路:
			1,需要两个嵌套for循环。第一个打印正的三角形,第二个打印倒三角形。
			2,正三角:
				设正三角形的行数为m,(x从0开始)则第x行需要打印x+1个* ,第x行需要y=m-(x+1)个空格。

			3,倒三角:
				行数为(m-1),(x从0开始)第x行需要x+1个空格,第x行需要(m-1)-x个* 。
		*/
		int m = 8;
		for(int x=0;x<m;x++)
		{
			//先打印空格
			for(int z=0;z<m-(x+1);z++)
			{
				System.out.print(" ");
			}
			//打印*
			for(int y=0;y<x+1;y++)
			{
				System.out.print("* ");
			}
			System.out.println();
		}
		for(int x=0;x<m-1;x++)
		{
			//空格
			for(int z=0;z<x+1;z++)
			{
				System.out.print(" ");
			}
			//*
			for(int y=(m-1)-x;y>0;y--)
			{
				System.out.print("* ");
			}
			System.out.println();
		}

		System.out.println("---------------------------------");

		/*
			99乘法表很简单,但是注意用\t制表符。
		
			面试的概率很大。
		*/
		for(int x=1;x<10;x++)
		{
			for(int y=1;y<=x;y++)
			{
				System.out.print("x*y="+x*y+"\t");
			}
			System.out.println();
		}

例子9:

/*
		需求:输出一个正三角形
				*
			   ***
			  *****
			 *******
		思路:
			1,用v表示要打印的行数,x控制行,y控制列
			2,发现:行和列的关系:y=2*x-1;空格z和行数的关系是z=v-x
		*/
		
		int v = 8;
		for(int x=1;x<=v;x++)
		{
			//空格
			for(int z=0;z<v-x;z++)
			{
				System.out.print(" ");
			}
			for(int y=0;y<2*x-1;y++)
			{
				System.out.print("*");
			}

			System.out.println();
		}



版权声明:本文为博主原创文章,未经博主允许不得转载。

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹