Java基础

一、前言

1.Linux:

1)开源的操作系统、免费

主要是服务器端操作系统,
java主要是服务器端开发,所以必须会Linux

2)Linux与Windows目录结构的区别:

2.1)文件系统不同:        Linux:目录  Windows:盘符
2.2)外部设备映射不同:        Linux:挂载点 Windows:盘符
2.3)安全级别不同:        Linux:高 Windows:低

3)Linux常用命令:

3.1)pwd:显示当前工作目录
3.2)ls:查看当前工作目录的内容
3.3)cd:改变当前工作目录
3.4)绝对路径:相对于根目录的位置,以/开头       cd /a/b 
3.5) 相对路径:相对于当前目录的位置    cd a/b
3.6)  cd ..:返回上一级目录

2.java开发环境:

1)java编译运行过程:

    .java源文件,经过编译,生成.class字节码文件      JVM加载.class并运行.class    --------跨平台,一次编程到处使用

2)JVM:java虚拟机

  2.1)JVM:java虚拟机        加载.class并运行.class
  2.2) JRE:java运行环境            除了包含JVM以外还包含运行java程序所必须的环境        JRE=JVM+java系统类库
  2.3)  JDK:java开发工具包        除了包含JRE以外还包含开发java程序所必须的命令工具 	 JDK=JRE+编译、运行等工具
  2.4)  运行java程序的最小环境是JRE
  2.5)  开发java程序的最小环境是JDK

3)配置环境变量:

3.1)JAVA_HOME:指向jdk的安装目录
3.2)CLASSPATH:表示类的搜索路径, 一般简写为.
3.3)PATH:指向jdk下的bin目录      javac,java...都在bin目录下  

二、变量的演示

1.前言

1.变量:存数的,代词,指代所存的那个数
  1)声明:
      int a;
      int b,c,d;
  2)初始化:第一次赋值
      int a=250;
      int b;
      b=250;
  3)使用:
    3.1)必须与数据类型匹配
        int a=25.678; //错
    3.2)用之前必须声明并初始化
        System.out.println(m); //错
	int m;
	System.out.println(m); //错
    3.3)对变量的使用就是对它所存的数的使用
        int a=5;
	int b=a+10; //取出a的值5,加10后赋值给b
	a=a+100; //在a本身基础之上增100
  4)命名:
    4.1)只能包含字母、数字、_和$符
        不能以数字开头
    4.2)严格区分大小写
    4.3)不能使用关键字
    4.4)可以中文命名,但不建议
        建议"见名知意"和"驼峰命名法"

2.变量的演示

//变量的演示
public class VarDemo {
	public static void main(String[] args) {		
		
		//1.变量的声明
		int a; //声明一个整型变量,名为a
		int b,c,d; //声明三个整型变量,名为b,c,d

		//2.变量的初始化:第一次赋值
		int a=250; //声明整型变量a并赋值为250
		int b; //声明整型变量b
		b=250; //给变量b赋值为250
		
		//3.变量的使用:
		//  1)变量的使用必须与数据类型匹配
		//  2)变量在使用之前必须声明并且初始化
		//  3)对变量的操作就是对那个数的操作
		//int a=25.678; //编译错误,数据类型不匹配
		
		//System.out.println(c); //编译错误,c未声明
		//int b;
		//System.out.println(b); //编译错误,b未初始化
		
		int c=5;
		int d=c+10; //取出c的值5,加10后,赋值给d
		System.out.println(d); //输出d的值15
		
		int e=10;
		e=e+100; //取出e的值10,加100后,赋值给e
		         //在本身基础之上增100
		System.out.println(e); //输出e的值110

		
	/*
		   4)变量的命名:
				4.1)只能包含字母、数字、_和$符
					不能以数字开头
				4.2)严格区分大小写
				4.3)不能使用关键字
				4.4)可以中文命名,但不建议
					建议"见名知意"和"驼峰命名法"
		*/
		int a1,a_2,a_$5y;
		//int a*b; //编译错误,不能包含*号
		//int 1a; //编译错误,不能以数字开头
		//int class; //编译错误,不能使用关键字
		//Int a; //编译错误,严格区分大小写
		int 年龄; //正确,但不建议
		int age; //建议"见名知意"
		int score,myScore,myJavaScore; //驼峰命名法

		/*
		 * 补充:
		 * 1.变量的作用域/范围:
		 *     从变量的声明开始,到包含它最近的大括号结束
		 * 2.变量的重名问题:
		 *     变量作用域重叠时,变量不能同名
		 */
		
		int a=5;
		if(a>2){
			//int a=55; //编译错误,作用域重叠时不能同名
			int b=8;
		}else{
			int b=88;
		}
		
		
		
		int a=5;
		if(a>2){
			int b=8;
			System.out.println(a);
			System.out.println(b);
		}
		System.out.println(a);
		//System.out.println(b); //编译错误,b超出作用范围了
		
		
	}
}

3.变量的演示

三、数据类型的演示

1.前言

2.基本数据类型
  1)int:整型,4个字节,-21个多亿到21个多亿
    1.1)整数直接量默认为int型
    1.2)两个整数相除,结果还是整数,小数位无条件舍弃
    1.3)整数运算时超出范围,为溢出,是需要避免的
  2)long:长整型,8个字节,很大很大
    2.1)长整型直接量在数字后加l或L
    2.2)运算时有可能超范围,建议第一个数字后加L
    2.3)System.currentTimeMillis()可以获取
        自1970.1.1零时到此时此刻的毫秒数
  3)double:浮点型,8个字节
    3.1)小数直接量默认为double型
    3.2)double运算时会有舍入误差,精确运算场合不可使用
  4)char:字符型,2个字节
    4.1)采用Unicode编码格式,每个字符都有一个对应的码
        实质上存的是码(int),表现形式是字符(char)
    4.2)字符需放在单引号中,有且仅有一个
    4.3)特殊符号需转义(\)
  5)boolean:布尔型,1个字节
    5.1)只能取值为true和false
3.数据类型间的转换:
    数据类型从小到大依次为:
      byte-short-int-long-float-double
           char--
  1)两种类型:
    1.1)自动类型转换:从小类型到大类型
    1.2)强制类型转换:从大类型到小类型
          (要转换成的类型)变量
	  强转有可能溢出和精度丢失
  2)两点规则:
    2.1)整数直接量可以直接赋值给byte,short,char,
        但是不能超范围
    2.2)byte,short,char类型的变量参与运算时,
        先一律转换为int再运算

在这里插入图片描述

2.数据类型的演示

//数据类型的演示
public class DataTypeDemo {
	public static void main(String[] args) {		
		
		//1.int:整型,4个字节,-21个多亿到21个多亿
		int a=250; //250叫整数直接量,默认为int型
		//int b=10000000000; //编译错误,100亿默认为int型,但超出int范围了
		
		System.out.println(5/2); //2,两个整数相除,结果还是整数,小数位被舍弃了
		System.out.println(2/5); //0,小数位被舍弃了
		
		int c = 2147483647;
		c=c+1;
		System.out.println(c); //-2147483647,溢出了,是需要被避免的



		
		//2.long:长整型,8个字节,很大很大
		long a=250L; //250L叫长整型直接量
		//long b=10000000000; //编译错误,100亿为int型,但超范围了
		long c=10000000000L;
		
		//有可能超int范围时,将L写在第一个数字的后面
		long d = 1000000000*2*10L;
		System.out.println(d); //200亿
		long e = 1000000000*3*10L;
		System.out.println(e); //溢出了
		long f = 1000000000L*3*10;
		System.out.println(f); //300亿
		
		//获取自1970.1.1零时到此时此刻的毫秒数
		long g = System.currentTimeMillis();
		System.out.println(g);
		

		//3.double:浮点型,8个字节
		double a=25.678; //25.678为浮点型直接量,默认为double型
		float b=25.678F; //25.678F为float型直接量
		
		double c=3.0;
		double d=2.9;
		System.out.println(c-d); //0.10000000000000009,舍入误差


		//4.boolean:布尔型,1个字节,只能取值为true和false
		boolean b1 = true; //声明布尔型变量b1并赋值为true
		boolean b2 = false;
		//boolean b3 = 250; //编译错误,数据类型不匹配


		//5.char:字符型,2个字节  ‘0’码48(1-49)  ‘a’码97  ‘A’码65  eg:int n=‘2’+‘2’//50+50=100
		char c1 = '中';
		char c2 = 'a';
		char c3 = '1';
		char c4 = ' ';
		//char c5 = ''; //编译错误,必须有字符
		//char c6 = '男性'; //编译错误,只能有一个字符
		
		char c7 = 65;
		System.out.println(c7); //A
		
		char c8 = '\'';
		System.out.println(c8); //'
		
		System.out.println(2+2); //4
		System.out.println('2'+'2'); //100,'2'的码50加上'2'的码50,结果为100
		System.out.println(2+'2'); //52,2加上'2'的码50,结果为52

     

		/*数据类型的转换
		数据类型间的转换:
			数据类型从小到大依次为:
			  byte-short-int-long-float-double
				   char--
		  整数类型:
          整数类型变量用来表示整数的数据类型。整数类型又分为字节型(byte)、短整型(short)、整型(int)、长整型(long)这四种。

          浮点类型:
          浮点类型用来表示小数的数据类型。浮点类型分为float(单精度型)和double(双精度类型)这两种。
		  float(单精度型)一般在精度要求不高的时候使用。double(双精度类型)一般在数值精度高的时候使用。

          字符类型:
          字符类型的关键字是“char”。

          布尔类型:
          布尔类型是表示逻辑值的基本数据类型。boolean常量有“真”和“假”这两个状态。一般用true表示“真”、false表示“假”。它的定义方法是在变量名前加上类型关键字boolean。

		  1)两种类型:
			1.1)自动类型转换:从小类型到大类型
			1.2)强制类型转换:从大类型到小类型
				  (要转换成的类型)变量
			  强转有可能溢出和精度丢失
		  2)两点规则:
			2.1)整数直接量可以直接赋值给byte,short,char,
				但是不能超范围
			2.2)byte,short,char类型的变量参与运算时,
				先一律转换为int再运算

			仅以byte为例进行阐述,byte为一字节8位,最高位是符号位。
			最大值是01111111(补码),补码即原码: -n = ~n + 1  max+1=min 
			 最大值为:2^0+2^1+2^2+2^3+2^4+2^5+2^6=(1-2)2^7/(1-2)=2^7-1=127

			最小值是10000000(补码),首先计算反码(补码-1): 
			01111111 
			然后计算原码: 
			10000000 
			最大值为:-2^7=-128

        */
		int a=5;
		long b=a; //自动类型转换
		int c=(int)b; //强制类型转换
		
		long d=5; //自动类型转换
		double e=5; //自动类型转换
		float f=(float)5.678; //强制类型转换
		
		long g = 10000000000L;
		int h = (int)g;
		System.out.println(h); //溢出,强转有可能会溢出
		
		double i = 56.987456;
		int j = (int)i;
		System.out.println(j); //56,强转有可能会精度丢失
		
		//多种类型参与运算时,系统自动向较大的类型转换
		int k=5/2;
		System.out.println(k); //2
		double l=5/2;
		System.out.println(l); //2.0,5/2的结果为int型的2,自动类型转
		double m=5/2.0;
		System.out.println(m); //2.5,5.0/2的结果为double型,所以能保留小数位
		
		//两点规则:
		//1)整数直接量可以直接赋值给byte,short,char,
		//  但不能超范围
		//2)byte,short,char型变量参与运算时,
		//  先一律转换为int再运算
		short b1 = 5;
		short b2 = 6;
		short b3 = (short)(b1+b2);
		System.out.println(b3);
		
		
	}
}

四、Scanner的演示

1.前言

4.Scanner的用法
  1)在package下:
      import java.util.Scanner;
  2)在main大括号中:
      Scanner scan = new Scanner(System.in);
  3)在第2步之下:
      System.out.println("请输入年龄:");
      int age = scan.nextInt();

2.Scanner的演示

//Scanner的演示
public class ScannerDemo {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in); //2.
		System.out.println("请输入年龄:");
		int age = scan.nextInt(); //3.接收用户输入的数据
		System.out.println("请输入单价:");
		double price = scan.nextDouble();
		
		System.out.println(age);
		System.out.println(price);
	}
}

五、运算符的演示

1.前言

1.运算符:
  1)算术运算符:+,-,*,/,%,++,--
    1.1)%:取模/取余,余数为0即为整除
    1.2)++/--:自增1/自减1,可在变量前也可在变量后
        1.2.1)单独使用时,在前在后无差别
        1.2.2)被使用时,在前在后有差别
                 a++的值为a的值
                 ++a的值为a+1的值
  2)关系运算符:
    2.1)>(大于),<(小于)
	>=(大于或等于),<=(小于或等于)
	==(等于),!=(不等于)
    2.2)关系运算的结果为boolean型
	关系成立则为true,关系不成立则为false
  3)逻辑运算符:
    3.1)&&:短路与(并且),两边都为真则为真,见false则false
	   第一个数为false,则短路(第二个数不走了)
	||:短路或(或者),有一边为真则为真,见true则true
	   第一个数为true,则短路(第二个数不走了)
	! :逻辑非(取反),非真则假,非假则真
    3.2)逻辑运算是建立在关系运算基础之上的
	逻辑运算的结果也是boolean型
  4)赋值运算符:
    4.1)简单赋值运算:=
    4.2)扩展赋值运算:+=,-=,*=,/=,%=
  5)字符串拼接运算符:
    5.1)+:
	5.1.1)若两边都是数字,则做加法运算
	5.1.2)若有一边为字符串,则做字符串连接
  6)三目/条件运算符:
    6.1)语法:
          boolean ? 数1 : 数2
    6.2)执行过程:
          计算boolean的值:
            若为true,则整个的结果为数1
            若为false,则整个的结果为数2

2. 运算符的演示

//运算符的演示
public class OperDemo {
	public static void main(String[] args) {
		
		
		/*
		 * 1.算术运算符:+,-,*,/,%,++,--
		 *   1)%:取模/取余,余数为0即为整除
		 *   2)++/--:自增1/自减1,可在变量前也可在变量后
		 *     2.1)单独使用时,在前在后无差别
		 *     2.2)被使用时,在前在后有差别:(值就近原则)
		 *           a++的值为a的值
		 *           ++a的值为a+1的值
		 */
		
        System.out.println(5%2); //1,商2余1
		System.out.println(8%2); //0,商4余0,整除
		System.out.println(2%8); //2,商0余2
		System.out.println(8.4567%2); //0.4567


		int a=5,b=5;
		a++; //相当于a=a+1
		++b; //相当于b=b+1
		System.out.println(a); //6
		System.out.println(b); //6

		int a=5,b=5;
		int c=a++;
		int d=++b;
		System.out.println(a); //6
		System.out.println(b); //6
		System.out.println(c); //5
		System.out.println(d); //6

		int a=5,b=5;
		System.out.println(a++); //5
		System.out.println(a);   //6
		System.out.println(++b); //6
		System.out.println(b);   //6

		/*
		 * 2.关系运算符:
		 *   1)>(大于),<(小于)
		 *     >=(大于或等于),<=(小于或等于)
		 *     ==(等于),!=(不等于)
		 *   2)关系运算的结果为boolean型
		 *     关系成立则为true,关系不成立则为false
		 */
		
		int a=5,b=10,c=5;
		boolean b1=a>b;
		System.out.println(b1);   //false
		System.out.println(c<b);  //true
		System.out.println(a>=c); //true
		System.out.println(c<=b); //true
		System.out.println(a==c); //true
		System.out.println(a!=c); //false

        
		/*
		 * 3.逻辑运算符:
		 *   1)&&:短路与(并且),两边都为真则为真,见false则false
		 *        第一个数为false,则短路(第二个数不走了)
		 *     ||:短路或(或者),有一边为真则为真,见true则true
		 *        第一个数为true,则短路(第二个数不走了)
		 *     ! :逻辑非(取反),非真则假,非假则真
		 *   2)逻辑运算是建立在关系运算基础之上的
		 *     逻辑运算的结果也是boolean型
		 */
		
		int a=5,b=10,c=5;
		
		boolean b4=a<b || c++>2;
		System.out.println(b4); //true
		System.out.println(c);  //5,发生短路了  
		
		
		boolean b3=a>b && c++>2;
		System.out.println(b3); //false
		System.out.println(c);  //5,发生短路了
		
		
		boolean b2=!(a>b);
		System.out.println(b2);     //!false=true
		System.out.println(!(c<b)); //!true=false
		
		System.out.println(a>b || c<b);  //false||true=true
		System.out.println(a==c || b<c); //true||false=true
		System.out.println(a!=c || a>b); //false||false=false
		System.out.println(a==c || a<b); //true||true=true
		
		boolean b1 = a>b && c<b; 
		System.out.println(b1);          //false&&true=false
		System.out.println(a==c && b<c); //true&&false=false
		System.out.println(a!=c && a>b); //false&&false=false
		System.out.println(a==c && a<b); //true&&true=true
		
		
		/*
		 * 4.赋值运算:
		 *   1)简单赋值运算:=
		 *   2)扩展赋值运算:+=,-=,*=,/=,%=
		 */
		
		int a=5;
		a+=10; //相当于a=a+10
		System.out.println(a); //15
		a*=2; //相当于a=a*2;
		System.out.println(a); //30
		

		/*
		 * 5.字符串连接运算:
		 *   1)+:
		 *     1.1)若两边都是数字,则做加法运算
		 *     1.2)若有一边为字符串,则做字符串连接
		 */
		
		int age=37;
		System.out.println("age="); //age=,字符串原样输出
		System.out.println(age);   //37
		System.out.println("age="+age); //age=37
		System.out.println("我的年龄是:"+age); //我的年龄是:37
		System.out.println("我今年"+age+"岁了"); //我今年37岁了
		
		System.out.println(10+20+""+30); //"3030"
		System.out.println(10+20+30+""); //"60"
		System.out.println(""+10+20+30); //"102030"
		
		
		
		/*
		 * 6.三目/条件运算:
		 *   1)语法:
		 *       boolean ? 数1 : 数2
		 *   2)执行过程:
		 *       计算boolean的值:
		 *         若为true,则整个的结果为数1
		 *         若为false,则整个的结果为数2
		 */
		int a=55,b=8;
		int max=a>b?a:b;
		System.out.println("max="+max);	//55	
		
	}
}

六、分支结构

1.前言

2.分支结构:
  1)if结构:1条路
  2)if...else结构:2条路
  3)if...else if结构:多条路
  4)switch...case结构:多条路
    优点:效率高、结构清晰
    缺点:整数、相等
    break:跳出switch

2.分支结构的演示

//分支结构的演示
public class IfDemo {
	public static void main(String[] args) {
		int num = 4;
		switch(num){ //byte,short,char,int
		case 1: 
			System.out.println(111);
			break;
		case 2: //以此为入口
			System.out.println(222);
			break; //跳出switch
		case 3:
			System.out.println(333);
			break;
		default: //所有case都没配上时执行
			System.out.println(666);
		}
		
	    int num = 5;
		if(num%2==0){
			System.out.println(num+"是偶数");
		}else{
			System.out.println(num+"是奇数");
		}
		System.out.println("over");
		
		
		
		int num = 5;
		if(num%2==0){
			System.out.println(num+"是偶数");
		}
		System.out.println("over");
		
		
	}
}

3.其它

3.1判断一个整数是否是奇数

public boolean isOdd(int i)
方法一:
public boolean isOdd(int i) {
 if (i % 2 == 1) {
 return true;
 } else {
 return false;
 }
}
方法二:
public boolean isOdd(int i) {
 return i % 2 == 1 || i % 2 == -1;
}

并且在提示之后优化成这样:
public boolean isOdd(int i) {
 return i % 2 != 0;
}
方法三:奇数和偶数转换成二进制有什么区别?”“奇数最后一位是1,偶数最后一位是0。”
public boolean isOdd(int i) {
 return (i & 1) == 1;
}
& 与运算 :见0则0   0 & 0 = 0     0 & 1 = 0    1 & 0 = 0    1 & 1 = 1
案例:(常用来截取数据) 如下运算的逻辑意义:将n的后8位截取下来
  n = 00100100 10100100 00111101 11010110(n = 0x24a43dd6)
  m = 00000000 00000000 00000000 11111111(m = 0xff)
&---------------------------------------- 
  i = 00000000 00000000 00000000 11010110(i = n & m; // i = 0xd6)

3.2闰年的判断

import java.util.Scanner;
//闰年的判断  1.能被4整除,但不能被100整除。2.能被400整除。
public class LeapYear {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		System.out.println("请输入年份:");
		int year = scan.nextInt();
		
		//判断一个年份是否是闰年
		boolean flag = (year%4==0 && year%100!=0) 
				       || 
				       year%400==0;
		
		String str = flag ? year+"是闰年" : year+"不是闰年";
		System.out.println(str);
	}
}

3.3成绩等级判断

//成绩等级判断
public class ScoreLevel {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		System.out.println("请输入成绩:");
		int score = scan.nextInt();
		
		if(score<0 || score>100){
			System.out.println("成绩不合法");
		}else if(score>=90){
			System.out.println("A-优秀");
		}else if(score>=80){
			System.out.println("B-良好");
		}else if(score>=60){
			System.out.println("C-中等");
		}else{
			System.out.println("D-不及格");
		}		
	}
}

3.4年龄判断程序

import java.util.Scanner;
//年龄判断程序
public class Age {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		System.out.println("请输入年龄:");
		int age = scan.nextInt();
		
		//输出age是否在18到50之间
		System.out.println(age>=18 && age<=50);
	}
}

3.5收银柜台程序

import java.util.Scanner;
//收银柜台程序
public class Cashier {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		System.out.println("请输入单价:");
		double unitPrice = scan.nextDouble();
		System.out.println("请输入数量:");
		double amount = scan.nextDouble();
		System.out.println("请输入金额:");
		double money = scan.nextDouble();
		
		//计算总价(单价*数量)
		double totalPrice=unitPrice*amount;
		if(totalPrice>=500){ //满500
			totalPrice*=0.8; //打8折
		}
		
		if(money>=totalPrice){ //够
			double change=money-totalPrice; //计算找零(金额-总价)
			System.out.println("总价:"+totalPrice+",找零:"+change);
		}else{ //不够
			System.out.println("ERROR!您给的钱不够!");
		}
		
		
	}
}

3.6命令解析程序

import java.util.Scanner;
//命令解析程序
public class CommandBySwitch {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		System.out.println
		("请选择功能:1.显示全部记录 2.查询登录记录 0.退出");
		int command = scan.nextInt();
		switch(command){
		case 1:
			System.out.println("显示全部记录");
			break;
		case 2:
			System.out.println("查询登录记录");
			break;
		case 0:
			System.out.println("欢迎使用");
			break;
		default:
			System.out.println("输入错误");
		}
		
	}
}

3.7其它

public class Homework {
	public static void main(String[] args) {
        	
		//1.求两个数中的最大值
		int a=55,b=8;
		int max=a>b?a:b;
		System.out.println("max="+max);


			
		//2.两个数的排序
		int a=8,b=5;
		if(a>b){
			int t=a;
			a=b;
			b=t;
		}
		System.out.println("a="+a);
		System.out.println("b="+b);
		

		//3.三个数的排序
		int a=88,b=10,c=5;
		if(a>b){ //保证a<b
			int t=a;
			a=b;
			b=t;
		}
		if(a>c){ //保证a<c
			int t=a;
			a=c;
			c=t;
		}
		if(b>c){ //保证b<c
			int t=b;
			b=c;
			c=t;
		}
		System.out.println("a="+a);
		System.out.println("b="+b);
		System.out.println("c="+c);
		
			
		//4.判断一个年份是否是闰年
		int year = 2001;
		if(year%4==0 && year%100!=0 || year%400==0){
			System.out.println(year+"是闰年");
		}else{
			System.out.println(year+"不是闰年");
		}
		
		

		//5.根据年份和月份,算天数
		int year=2001; //年份
		int month=5; //月份
		int days=0; //天数
		
		switch(month){
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			days=31;
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			days=30;
			break;
		case 2:
			if(year%4==0 && year%100!=0 || year%400==0){
				days=29;
			}else{
				days=28;
			}
		}
		System.out.println("days="+days);	
		
		/*
		 * 补充:
		 * 1.变量的作用域/范围:
		 *     从变量的声明开始,到包含它最近的大括号结束
		 * 2.变量的重名问题:
		 *     变量作用域重叠时,变量不能同名
		 */
		
		int a=5;
		if(a>2){
			//int a=55; //编译错误,作用域重叠时不能同名
			int b=8;
		}else{
			int b=88;
		}
		
		
		
		int a=5;
		if(a>2){
			int b=8;
			System.out.println(a);
			System.out.println(b);
		}
		System.out.println(a);
		//System.out.println(b); //编译错误,b超出作用范围了	
	
	}
}
import java.util.Scanner;
//猜字符游戏
public class GuessingGame {
	//主方法
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		char[] chs = generate(); //生成随机字符数组
		System.out.println(chs); //作弊
		int count = 0; //猜错的次数
		while(true){ //自造死循环 //exit
			System.out.println("猜吧!");
			String str = scan.next().toUpperCase(); //接收用户输入的字符串,并转换为大写字母
			if(str.equals("EXIT")){ //判断输入的是否是EXIT
				System.out.println("下次再来吧!");
				break;
			}
			char[] input = str.trim().toCharArray(); //去掉字符串两边的空格,并将其转换为字符数组
			int[] result = check(chs,input); //对比随机字符数组与用户输入的字符数组
			if(result[0]==chs.length){ //位置对个数为5表明猜对了
				int score = 100*chs.length-10*count; //每个字符100分,猜错一次扣10分
				System.out.println("恭喜你猜对了,得分为:"+score);
				break;
			}else{ //猜错了
				count++; //猜错次数增1
				System.out.println("字符对个数:"+result[1]+",位置对个数:"+result[0]);
			}
		}
	}
	
	//生成随机字符数组
	public static char[] generate(){
		char[] chs = new char[5]; //随机字符数组
		char[] letters = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
				'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
				'W', 'X', 'Y', 'Z' }; //随机生成的字符的范围
		boolean[] flags = new boolean[letters.length]; //开关数组,默认值为false,表示字符未存过
		for(int i=0;i<chs.length;i++){ //遍历随机字符数组
			int index;
			do{
				index = (int)(Math.random()*letters.length); //生成随机字符数组下标
			}while(flags[index]==true); //当index下标对应的开关为true时,表示字符已存过,则重新生成index下标
			                            //当index下标对应的开头为false时,循环结束,false表示未存过,则可以继续存储
			chs[i] = letters[index]; //基于下标去letters中获取对应的字符,而后赋值给chs中的每一个元素
			flags[index]=true; //将下标对应的开头改为true,表明字符已存过
		}
		return chs;
	}
	
	//对比:随机字符数组与用户输入的字符数组
	public static int[] check(char[] chs,char[] input){
		int[] result = new int[2]; //result[0]为位置对个数,result[1]为字符对个数
		for(int i=0;i<chs.length;i++){ //遍历随机字符数组
			for(int j=0;j<input.length;j++){ //遍历用户输入的字符数组
				if(chs[i]==input[j]){ //字符对
					result[1]++; //字符对个数增1
					if(i==j){ //位置对
						result[0]++; //位置对个数增1
					}
					break;
				}
			}
		}
		return result;
	}
}

七、循环演示

1. 前言

1.循环:反复执行一段相同或相似的代码
2.循环的三要素:
  1)循环变量的初始化
  2)循环的条件(以循环变量为基础)
  3)循环变量的改变(向着循环的结束变)
  循环变量:在循环过程中所改变的那个量
3.循环结构:
  3.1)while:先判断后执行,有可能一次都不执行
  3.2)do...while:先执行一次再判断,至少执行一次
                 第1要素与第3要素相同时
  3.3)for:应用率最高
4.break:跳出循环
  continue:跳过循环体中剩余语句而进入下一次循环

1.三种循环更佳适用情况:
  1)while:"当..."循环
  2)do..while:"直到..."循环
              第1要素与第3要素相同时首选
  3)for:固定次数循环,应用率最高
2.嵌套循环:
  1)循环中套循环,多行多列时使用,
    外层控制行,内层控制列
  2)执行过程:外层走一次,内层走所有次
  3)建议:嵌套层次越少越好
    能用一层就不用两层,能用两层就不用三层
    若需求必须通过三层以上来解决,说明设计有问题
  4)break只能跳出一层循环

2.while的演示

//while的演示
public class WhileDemo {
	public static void main(String[] args) {
		
		int num=1; //1
		while(num<=9){ //2
			System.out.println(num+"*9="+num*9);
			num++; //3
		}
		System.out.println("over");
		
		
		int count=0;     //1.循环变量的初始化
		while(count<10){ //2.循环的条件
			System.out.println("行动是成功的阶梯");
			count++;     //3.循环变量的改变
		}
		System.out.println("over");
		
		/*
		 * 执行过程:
		 * count=0 true 输出
		 * count=1 true 输出
		 * count=2 true 输出
		 * count=3 true 输出
		 * count=4 true 输出
		 * count=5 true 输出
		 * count=6 true 输出
		 * count=7 true 输出
		 * count=8 true 输出
		 * count=9 true 输出
		 * count=10 false while循环结束
		 * 输出over
		 */
	}
}

3.for循环的演示

//for循环的演示
public class ForDemo {
	public static void main(String[] args) {
		int sum=0; 
		for(int num=1;num<=100;num++){
			if(num%10!=3){
				sum+=num;
			}
		}
		System.out.println("sum="+sum);
		
		
		
		int sum=0; 
		for(int num=1;num<=100;num++){
			if(num%10==3){ //3,13,23,33...
				continue; //跳过剩余语句而进入下一次循环(去到num++)
			}
			sum+=num;
		}
		System.out.println("sum="+sum);
		
		/*
		 * num=1 sum=1
		 * num=2 sum=1+2
		 * num=3
		 * num=4 sum=1+2+4
		 */
		
		
		
		
		/** 死循环*/
		
		for(;;){ //死循环
			System.out.println("我要学习");
		}
		
		
		
		//求1到100的累加和 1+2+3+...+99+100=?
		int sum=0; //和
		for(int num=1;num<=100;num++){
			sum+=num; //在本身基础之上操作
		}
		System.out.println("sum="+sum);
		
		/*
		 * 执行过程:
		 * sum=0
		 * num=1 sum=1
		 * num=2 sum=1+2
		 * num=3 sum=1+2+3
		 * num=4 sum=1+2+3+4
		 * ...
		 * num=100 sum=1+2+3+4+...+100
		 * num=101 false for循环结束
		 */	
		
		
		
		for(int count=0;count<10;count++){
			System.out.println("行动是成功的阶梯");
		}
		System.out.println("over");
		
		/*
		 * 执行过程:
		 * count=0 true 输出
		 * count=1 true 输出
		 * count=2 true 输出
		 * ....
		 * count=9 true 输出
		 * count=10 false for循环结束
		 * 输出over
		 */
		
	}
}

4.随机加法运算器

//随机加法运算器
public class Addition {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);

		int score=0; //得分
		for(int i=1;i<=10;i++){ //10次
			int a = (int)(Math.random()*100); //加数
			int b = (int)(Math.random()*100); //加数
			int result=a+b; //存答案
			System.out.println("("+i+")"+a+"+"+b+"=?"); //1.出题
			
			System.out.println("算吧!");
			int answer = scan.nextInt(); //2.答题
			
			if(answer==-1){
				break;
			}
			if(answer==result){ //3.判题
				System.out.println("答对了");
				score+=10; //答对一题加10分
			}else{
				System.out.println("答错了");
			}
			
		}
		System.out.println("得分:"+score);
	}
}

5.猜数字游戏

import java.util.Scanner;
//猜数字游戏
public class Guessing {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int num=(int)(Math.random()*1000+1); //生成1到1000之内的随机数
		System.out.println(num);
		
		int guess;
		do{
			System.out.println("猜吧!");
			guess = scan.nextInt(); //1,3
			if(guess==0){
				break;
			}
			if(guess>num){
				System.out.println("太大了");
			}else if(guess<num){
				System.out.println("太小了");
			}
		}while(guess!=num); //2
		if(guess==num){
			System.out.println("恭喜你,猜对了!");
		}else{
			System.out.println("下次再来吧!");
		}
		
		/*
		System.out.println("猜吧!");
		int guess = scan.nextInt(); //1.
		while(guess!=num){ //2.
			if(guess==0){
				break;
			}
			if(guess>num){
				System.out.println("太大了");
			}else{
				System.out.println("太小了");
			}
			System.out.println("猜吧!");
			guess = scan.nextInt(); //3.
		}
		if(guess==num){
			System.out.println("恭喜你,猜对了!");
		}else{
			System.out.println("下次再来吧!");
		}
		*/
	}
}

6.其它案例

public class Homework {
	public static void main(String[] args) {
		/*  1/1+1/2+1/3+...+1/n=?  */
		int n=15;
		double sum = 0; //和
		for(int i=1;i<=n;i++){ //n次
			sum=sum+1.0/i;
		}
		System.out.println("sum="+sum);
		
		/*9+99+999+...+9999999999=?*/
		long sum = 0; //和
		long num = 0; //加数
		for(int i=1;i<=10;i++){ //10次
			num=num*10+9;
			sum=sum+num;
		}
		System.out.println("sum="+sum);		
		
		/*
		 * sum=0 num=0
		 * i=1 num=9     sum=9
		 * i=2 num=99    sum=9+99
		 * i=3 num=999   sum=9+99+999
		 * i=4 num=9999  sum=9+99+999+9999
		 */
		
		
		/*     
		 *     num=0      num=num  *10+9
		 * i=1 num=9      num=0    *10+9
		 * i=2 num=99     num=9    *10+9
		 * i=3 num=999    num=99   *10+9
		 * i=4 num=9999   num=999  *10+9
		 * i=5 num=99999  num=9999 *10+9
		 */
	}
}
import java.util.Scanner;

public class GuessingGame {
	public static void main(String[] args) {
		// 表示玩家猜测的次数
		int count = 0;
		// 用于保存判断的结果
		int[] result = new int[2];
		Scanner scanner = new Scanner(System.in);
		System.out.println("GuessingGame>欢迎尝试猜字母游戏!");
		// 表示猜测的字符串
		char[] chs = generate();
		System.out.println(chs);
		System.out.println("GuessingGame>游戏开始,请输入你所猜的5个字母序列:(exit——退出)");
		while (true) {
			String inputStr = scanner.next().trim().toUpperCase();
			if ("EXIT".equals(inputStr)) {
				System.out.println("GuessingGame>谢谢你的尝试,再见!");
				break;
			}

			char[] input = inputStr.toCharArray();
			result = check(chs, input);
			if (result[0] == chs.length) {// 完全猜对的情况
				int score = 100 * chs.length - count * 10;
				System.out.println("GuessingGame>恭喜你猜对了!你的得分是:" + score);
				break;
			} else {
				count++;
				System.out.println("GuessingGame>你猜对" + result[1] + "个字符,其中"
						+ result[0] + "个字符的位置正确!(总次数=" + count + ",exit——退出)");
			}
		}
		scanner.close();
	}

	/**
	 * 随机生成需要猜测的字母序列
	 * 
	 * @return 存储随机字符的数组
	 */
	public static char[] generate() {
		
		char[] letters = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
				'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
				'W', 'X', 'Y', 'Z' };
		boolean[] flags = new boolean[letters.length];
		char[] chs = new char[5];
		for (int i = 0; i < chs.length; i++) {
			int index;
			do {
				index = (int) (Math.random() * (letters.length));
			} while (flags[index]);// 判断生成的字符是否重复
			chs[i] = letters[index];
			flags[index] = true;
		}
		return chs;
	}

	/**
	 * 比较玩家输入的字母序列和程序所生成的字母序列,逐一比较字符及其位置,并记载比较结果
	 * 
	 * @param chs
	 *            程序生成的字符序列
	 * @param input
	 *            玩家输入的字符序列
	 * @return 存储比较的结果。返回值int数组 的长度为2,其中,索引为0的位置
	 *         用于存放完全猜对的字母个数(字符和位置均正确),索引为1的位置用于存放猜对的字母个数(字符正确,但是位置不正确)。
	 */
	public static int[] check(char[] chs, char[] input) {
		int[] result = new int[2];
		for (int i = 0; i < input.length; i++) {
			for (int j = 0; j < chs.length; j++) {
				if (input[i] == chs[j]) {// 判断字符是否正确
					result[1]++;
					if (i == j) {// 判断位置是否正确
						result[0]++;
					}
					break;
				}
			}
		}
		return result;
	}
}
//九九乘法表:正三角形乘法口诀 从左到右写
/*
  1*1=1
  1*2=2  2*2=4
    *    *
    *    *           *****
  1*9=9  2*9=18                    9*9=81
*/

public class NstFor {
	public static void main(String[] args) {
		for(int num=1;num<=9;num++){ //控制行
			for(int i=1;i<=num;i++){ //控制列
				System.out.print(i+"*"+num+"="+i*num+"\t");
			}
			System.out.println(); //换行
		}
		/*
		 * 执行过程:
		 * num=3
		 *   i=1 1*3=3
		 *   i=2 2*3=6
		 *   i=3 3*3=9
		 *   i=4  换行
		 * num=2
		 *   i=1 1*2=2
		 *   i=2 2*2=4
		 *   i=3  换行
		 * num=1
		 *   i=1 1*1=1
		 *   i=2  换行
		 */
		
	}
}

八、数组演示

1.前言

3.程序=算法+数据结构
  1)算法:解决问题的流程/步骤(顺序、分支、循环)
    数据结构:将数据按照某种特定的结构来保存
             数怎么存
  2)设计良好的数据结构会导致好的算法
4.数组:
  1)相同数据类型元素的集合
  2)数组是一种数据类型(引用类型)
  3)数组的定义:
      int[] arr = new int[10];
  4)数组的初始化:
      int[] arr = new int[3];       //0,0,0
      int[] arr = {1,4,7};          //1,4,7
      int[] arr = new int[]{1,4,7}; //1,4,7
      int[] arr;
      arr = {1,4,7}; //编译错误
      arr = new int[]{1,4,7}; //正确
	  int[] arr = new int[]{}://创建一个int类型的数组,名字为arr但是里面没有任何东西,所以长度为0
  5)数组的访问
    5.1)通过数组名.length获取数组的长度
        int[] arr = new int[3];
        System.out.println(arr.length); //3
    5.2)通过下标/索引来访问数组中的元素
        下标从0开始,最大到数组.length-1
	int[] arr = new int[3];
        arr[0] = 100; //给arr中的第1个元素赋值为100
        arr[1] = 200;
	arr[2] = 300;
	arr[3] = 400; //异常(数组下标越界)
        System.out.println(arr[arr.length-1]); //输出数组中的最后一个元素
	arr[arr.length-1] = 800;
  6)数组的遍历:
      int[] arr = new int[3];
      for(int i=0;i<arr.length;i++){
        arr[i] = 100;
      }
      for(int i=0;i<arr.length;i++){
        System.out.println(arr[i]);
      }
      for(int i=arr.length-1;i>=0;i--){
        System.out.println(arr[i]);
      }
  7)数组的复制:
      System.arraycopy(a,1,a1,0,4);
      int[] a1 = Arrays.copyOf(a,6);
      a = Arrays.copyOf(a,a.length+1);
  8)数组的排序:
      Arrays.sort(arr); //arr升序排
      冒泡排序

2.数组演示

import java.util.Arrays;
//数组的演示
public class ArrayDemo {
	public static void main(String[] args) {
	
		//1.数组的定义
		int[] arr = new int[10];	

		//2.数组的初始化
		int[] arr = new int[3]; //0,0,0
		int[] arr1 = {1,3,5};   //1,3,5
		int[] arr2 = new int[]{1,3,5}; //1,3,5
		int[] arr3;
		//arr3 = {1,3,5}; //编译错误,只能声明同时初始化
		arr3 = new int[]{1,3,5}; //正确
		int[] arr = new int[]{}://创建一个int类型的数组,名字为arr但是里面没有任何东西,所以长度为0
        
		//声明int型数组a,包含10个元素
		//每个元素都是int型,默认值为0
		int[] a = new int[10];
		//声明double型数组d,包含20个元素
		//每个元素都是double型,默认值为0.0
		double[] d = new double[20];
		//声明boolean型数组b,包含40个元素
		//每个元素都是boolean型,默认值为false
		boolean[] b = new boolean[40];

        
		//3.数组的访问
		int[] arr = new int[3];
		System.out.println(arr.length); //3
		arr[0] = 100; //给arr中第一个元素赋值为100
		arr[1] = 200;
		arr[2] = 300;
		//arr[3] = 400; //数组下标越界异常
		System.out.println(arr[arr.length-1]); //输出arr中最后一个元素的值

		//4.数组的遍历
		int[] arr = new int[10];
		for(int i=0;i<arr.length;i++){ //遍历arr数组
			arr[i] = (int)(Math.random()*100);
			System.out.println(arr[i]);
		}
		

		
		//5.数组的复制
		int[] a = {10,20,30,40,50};
		//数组的扩容(创建一个新的数组)
		a = Arrays.copyOf(a,a.length+1);
		for(int i=0;i<a.length;i++){
			System.out.println(a[i]);// 10,20,30,40,50 ,0
		}	
		
		
		int[] a = {10,20,30,40,50};
		//a:源数组
		//a1:目标数组
		//6:目标数组的长度
		int[] a1 = Arrays.copyOf(a,6);
		for(int i=0;i<a1.length;i++){
			System.out.println(a1[i]);// 10,20,30,40,50 ,0
		}
		
		
		
		int[] a = {10,20,30,40,50};
		int[] a1 = new int[6];
		//a:源数组
		//1:源数组的起始下标
		//a1:目标数组
		//0:目标数组的起始下标
		//4:要复制的元素的个数
		System.arraycopy(a,1,a1,0,4);
		for(int i=0;i<a1.length;i++){
			System.out.println(a1[i]);
		}
		
	  //6.数组的排序
		int[] arr = {23,45,4,27,5,87,9};
		for(int i=0;i<arr.length-1;i++){ //控制轮数
			for(int j=0;j<arr.length-1-i;j++){ //控制每轮比较的次数
				if(arr[j]>arr[j+1]){ //每一次都是和它的下一个元素比
					int t=arr[j]; //符合条件则交换
					arr[j]=arr[j+1];
					arr[j+1]=t;
				}
				//若前数大于后数则交换,保证前数小于后数--升序
				//若前数小于后数则交换,保证前数大于后数--降序
			}
		}
		for(int i=0;i<arr.length;i++){
			System.out.println(arr[i]);
		}
		
		
		int[] arr = {26,34,1,3,68};
		Arrays.sort(arr); //对arr升序排列
		for(int i=0;i<arr.length;i++){
			System.out.println(arr[i]);
		}
		
		
	}
}
import java.util.Arrays;
//求数组中的最大值
public class MaxOfArray {
	public static void main(String[] args) {
		int[] arr = new int[10];
		for(int i=0;i<arr.length;i++){
			arr[i] = (int)(Math.random()*100);
			System.out.println(arr[i]);
		}
		
		int max = arr[0]; //假设第1个元素为最大值
		for(int i=1;i<arr.length;i++){ //遍历剩余元素
			if(arr[i]>max){ //若剩余元素大于max
				max=arr[i]; //修改max的值为较大的数
			}
		}
		System.out.println("最大值为:"+max);
		
		//数组的扩容(创建新的数组并将源数组的数据复制进去)
		arr = Arrays.copyOf(arr,arr.length+1);
		//将最大值max赋值给arr中的最后一个元素
		arr[arr.length-1] = max;
		for(int i=0;i<arr.length;i++){
			System.out.println(arr[i]);
		}
       /**	   
			冒泡原理:
			1)四个数冒3轮
			2)每一轮都是从第1个元素开始比,
			  每一次都是和它的下一个元素比
			  若符合条件则交换
			3)冒出来的数就不带它玩了

				 arr.length-1-i
			i=0  比3次
			i=1  比2次
			i=2  比1次  

			int[] arr = {89,23,36,1}; //升序
			第一轮:
			  89和23比,换,23,89,36,1
			  89和36比,换,23,36,89,1
			  89和1比, 换,23,36,1,89-----89冒出来了
			第二轮:
			  23和36比,不换
			  36和1比, 换,23,1,36,89-----36冒出来了
			第三轮:
			  23和1比, 换,1,23,36,89-----23冒出来了
	   
	   */
	   int[] arr = {89,23,36,1};
       for(int i=0;i<arr.length-1;i++){ //控制轮
		  for(int j=0;j<arr.length-1-i;j++){ //控制每轮的次数
			if(arr[j]>arr[j+1]){ //每次和它下一个元素比
			  int t=arr[j];
			  arr[j]=arr[j+1];
			  arr[j+1]=t;
			}
		  }
		}


     
		
	}
}

import java.util.Arrays;
//作业讲解 Math.sqrt(num)返回x的平方根 
public class Homework {
	public static void main(String[] args) {
		int count = 0; //计数器
		for(int num=2;num<=100;num++){
			boolean flag = true; //1.假设是质数:质数定义为在大于1的自然数中,除了1和它本身以外不再被整除。
			for(int i=2;i<=Math.sqrt(num);i++){ //2/3/4/.../9/
				if(num%i==0){
					flag = false; //2.表示不是质数
					break;
				}
			}
			if(flag){ //3.判断得结论
				count++; //有一个质数则个数增1
				System.out.print(num+"\t");
				if(count%10==0){ //每10个换一行
					System.out.println();
				}
			}
		}
		
		
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值