java入门 浙江大学版-bilibili(二)

#bilibilijava


*** 2018-11-5 23:00… bilibili 浙江大学 java入门 4-2 循环控制-2***
*** 2018-12-03 23:00… bilibili 浙江大学 java入门 7-1 ***

-4 本地变量
定义在函数内部的变量都是本地变量

###7-1-5 块的含义

  • 块就以为着大括号

使用标号“OUT:” 在内层循环中添加break OUT,那么break的就是out的循环体,并不是内循环体。

println 按行输出
print 在同行输出
printf 使用浮点数输出

调试运行的时候:
step over 一步步来
step into 进入到函数中
step return

hanshu zhong

for(a=1;a<0;a++)
初始值;循环得以继续的条件;循环中所做的操作

4-2循环控制-3-逻辑运算

优先级: !非 > &&与 > || 或
因为 优先级:!age>20 :这里面的!优先级大于“>”

4-3循环计算-1

double 浮点数 也就是小数

习题1-公式计算f(n)=1+1/2+1/3+1/4+…

package bilibilijava;
import java.util.Scanner;
//f(n)=1+1/2+1/3+1/4+...
public class Main {
public static void main(String[] args) {
	Scanner in = new Scanner(System.in);
	int n = in.nextInt();
	double sum = 0.0;
	for (int i =1 ;i<=n;i++)
	{
		sum += 1.0/i;//浮点数所以要用小数点0.0,1.0
	}
	System.out.println(sum);
	System.out.printf("%.2f",sum);
}
}

output
100
5.187377517639621
5.19

习题2-公式计算f(n)=1-1/2+1/3-1/4+…

//f(n)=1-1/2+1/3-1/4+...
public class Main {
public static void main(String[] args) {
	Scanner in = new Scanner(System.in);
	int n = in.nextInt();
	double sum = 0.0;
	//int sign = 1; //可以使用 sign=-sign
	for (int i =1 ;i<=n;i++)//i++是该循环每次循环会用的表达式
	{
		if (i%2==0)//偶数
			sum -= 1.0/i;//浮点数所以要用小数点0.0,1.0
		else
			sum += 1.0/i;
	}
	System.out.println(sum);
	System.out.printf("%.2f",sum);
}
}

习题3-求最大公约数

方法1:for循环

//求最大公约数,输入ab两个数,求最大公约数
//输入: 12 18
//输出:6
//方法1
public class Main {
public static void main(String[] args) {
	Scanner in = new Scanner(System.in);
	int a = in.nextInt();
	int b = in.nextInt();
	int rns=1;//表达结果,也就是最大公约数
	for(int i = 2; i<=a && i<=b;i++)//&&并且
		if(a%i ==0 && b%i == 0)
			rns=i;
	System.out.println(a+"和"+b+"的最大公约数是"+rns);
}
}

方法2:辗转相除法

//方法2 欧几里德法和辗转相除法
//(1)如果b=0,计算结束,a就是最大公约数---可以用while
//(2)否则,计算a/b的余数,让a=b,b=r
//(3)回到第一步
//a   b   r(余数)
//12  18  12
//18  12  6
//12  6   0
//6   0   end

public class Main {
public static void main(String[] args) {
	Scanner in = new Scanner(System.in);
	int a = in.nextInt();
	int b = in.nextInt();
	int oa=a;//保留初始值数值
	int ob=b;
	System.out.println("a"+"---"+"b"+"---"+"r");
	while(b!=0)
	{
		int r = a%b;
		System.out.println(a+"---"+b+"---"+r);
		a=b;
		b=r;
	}
	System.out.println(oa+"和"+ob+"的最大公约数是"+ a);
}
}

5-1数组

数组就是容器,都是相同类型的,创建数组之后,没有办法在之后对大小进行改变。

<类型>[]<名字> = new <类型>[元素个数]
int[] grades = new int[100];
double[] averages = new double[20];
或以下方式
i=100
int[] grades = new int[i];

grades相当于数组的管理者

  • 元素个数必须是整数,元素个数必须给出,元素个数可以是变量
  • 编号从0开始,a[0],可以读与写

数组名字.length,一般写在for循环的第二分号中,这是有可扩展性的循环代码。

习题4-投票统计

投票统计
写一个程序,输入数量不确定的【0,9】范围内的整数,统计每一种数字出现的次数,输入-1表示结束


//投票统计
//写一个程序,输入数量不确定的【0,9】范围内的整数,统计每一种数字出现的次数,输入-1表示结束
public class Main {
public static void main(String[] args) {
	Scanner in = new Scanner(System.in);
	int x;
	int[] nums = new int[10];//创建数组,其中长度10,每个位置分别表示每个数字的个数,默认数组中每个元素是零
	x = in.nextInt();
	while(x!=-1)
	{
		if(x>=0&&x<=9)//判断x在有效范围内
			nums[x]++;
		x = in.nextInt();//再次读取
	}
	for(int i = 0;i<nums.length;i++)//遍历数组,输出
		System.out.println(i+":"+nums[i]);
}
}

5-2数组计算

//数组-可扩展的代码
public class Main {
public static void main(String[] args) {
	Scanner in = new Scanner(System.in);
	int[] scores = {12,23,23,12,34,56,67,21};
	System.out.println(scores.length);
	for(int i=0;i<scores.length;i++)
	{
		System.out.print(scores[i]+" ");
	}
}
}

数组的管理者a,b。并不是数组的所有者,数组更新不受管理者影响

//数组-a b 同为数组的管理者,如果数组更新,那么遍历输出也更新,只是管理者不是所有者。
public class Main {
public static void main(String[] args) {
	Scanner in = new Scanner(System.in);
	int[] a={1,2,3,4,5};
	int[] b = a;
	for (int i=0;i<b.length;i++)
	{
	     b[i]++;
	}
	for (int i=0;i<a.length;i++)
	{
	System.out.print(a[i]);//23456
	}
	}
}

数组-ab同为管理者,但是如果数组中数值相同,并不是同一数组的管理者那么也为false

//数组-ab同为管理者,但是如果数组中数值相同,并不是同一数组的管理者那么也为false
public class Main {
public static void main(String[] args) {
	Scanner in = new Scanner(System.in);
	int[] a={1,2,3,4,5};
	int[] b = a;
	System.out.println("[b=a]:"+(a==b));//true
	int[] b1 = {1,2,3,4,5};
	System.out.println("[b1=a]:"+(a==b1));//false
}
}

数组拷贝方式

//数组拷贝
public class Main {
public static void main(String[] args) {
	Scanner in = new Scanner(System.in);
	int[] a={1,2,3,4,5};
	int[] b = new int[a.length];
	for(int i=0;i<b.length;i++)
	{
		b[i]=a[i];			
	}
	for(int i=0;i<b.length;i++)
	{
		System.out.print(b[i]);
	}
	}
}

数组判断相等方式

//数组判断里面的值是否相等,并不是管理者相等
public class Main {
public static void main(String[] args) {
	Scanner in = new Scanner(System.in);
	int[] a={1,2,3,4,5};
	int[] b = {1,2,3,4,5} ;
	boolean isEqu = true;
	//判断两数组是否相等
	for(int i=0;i<b.length;i++)
	{
		if(b[i]!=a[i])
		{
			isEqu = false;
			break;
		}
	}
		System.out.print(isEqu);//true
	}
}

寻找数组中某数x在data数组中的位置(效率不高)

//寻找数组中某数的位置
public class Main {
public static void main(String[] args) {
	Scanner in = new Scanner(System.in);
	int x = in.nextInt();
	int[] data={1,2,3,4,5,8,9,10};
	int loc = -1;
	for(int i=0;i<data.length;i++)
	{
		if(x==data[i])
		{
			loc=i;
			break;
		}
	}
	if(loc>-1)
	{
		System.out.print(x+"的位置是第"+(loc+1)+"个");
	}
	else
	{
		System.out.print("数组中没有"+x);
	}
	}
}

3
3的位置是第3个

for-each 循环–遍历数组

比较适合该数组中有或没有这个数,而不是该数在哪个位置。
for(int k:data)
对于数组data中的每一个元素,循环每一轮,把它拿出来作为一个k
也就是第一轮k=data[0],第二轮k=data[1]

5-2数组计算3

寻找前50个素数–优化解法

思路:首先先来一个50长度的空数组,然后将第一个数2放入进去,从3开始循环,运用索引指针从1开始,添加素数。
cnt表示这里面有多少个素数,也表示下一个应该写到哪里去

//寻找前50个素数--优化解法
//思路:首先先来一个50长度的空数组,然后将第一个数2放入进去,从3开始循环,运用索引指针从1开始,添加素数。
public class Main {
public static void main(String[] args) {
	Scanner in = new Scanner(System.in);
    int[] primes = new int[50];
    primes[0]=2;
    int cnt=1; //cnt表示这里面有多少个素数,也表示下一个应该写到哪里去
    MAIN_LOP:
    for(int x=3;cnt<50;x++)//从3往后找素数
    {
    	for(int i=0;i<cnt;i++)//遍历已知数组中的素数
    	{
    		if(x%primes[i]==0)
    		{
    			continue MAIN_LOP;//不用往下进行,从头从第一个for循环开始进行x++
    		}
    	}
    	primes[cnt++]=x;
    }
    for(int k:primes)
    {
    	System.out.print(k+" ");
    }
	}
}

寻找100以内的素数–优化解法2

寻找100以内的素数–优化解法2
//思路:构造n以内的素数表
//(1)令x为2
//(2)将2x 3x 4x直到ax<n的所有数都标记为非素数
//(3)令x为下一个没有被标记为非素数的数,重复2;直到所有数都尝试了完毕

//寻找100以内的素数--优化解法2
//思路:构造n以内的素数表
//(1)令x为2
//(2)将2x 3x 4x直到ax<n的所有数都标记为非素数
//(3)令x为下一个没有被标记为非素数的数,重复2;直到所有数都尝试了完毕
public class Main {
public static void main(String[] args) {
	Scanner in = new Scanner(System.in);
    boolean[] isPrime = new boolean[100];//默认全部都是false,求一百以内的
//    for(boolean k:isPrime)
//    {
//        System.out.print(k+" ");
//    }
    for(int i=0;i<isPrime.length;i++)//先全都改成true
    {
    	isPrime[i]=true;
    }
    System.out.println(" ");//换行
    for(int i=2;i<isPrime.length;i++)//
    {
    	if(isPrime[i])//true的时候
    	{
    		for(int k=2;i*k<isPrime.length;k++)//倍数k
    		{
    			isPrime[i*k]=false;//如果有倍数的关系,那么改成false
    		}
    			
    	}
    }
    for(int i=0;i<isPrime.length;i++)//遍历现在的数组,查找到所有的true,也就是所有的素数。
    {
    	if(isPrime[i])
    	{
    		System.out.print(i+" ");
    	}
    }

//    for(boolean k:isPrime)
//    {
//        System.out.print(k+" ");
//    }
}
}

5-2数组计算4

  • 二维数组的遍历 一定是两层循环

int[][] a ={
{1,2,3,4},
{1,2,3},
};

  • 注意:
  • 1.每行一个{},逗号分隔
  • 2.最后的逗号可以存在可以不存在
  • 3.如果省略,表示补零

tic-tac-toe游戏-九宫格棋子 输赢

//九宫格棋子 输赢
//规则: 三行 三列 三对角线 三反对角线 如果全是X(1)或者O(0),那么胜出

//九宫格棋子  输赢
//规则: 三行 三列 三对角线 三反对角线 如果全是X(1)或者O(0),那么胜出
public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		//定义表格size
		final int SIZE=3;
		int[][] board = new int[SIZE][SIZE];
		boolean getResult = false;//默认是false
		int numOfX=0;//X和O的个数
		int numOfO=0;
		
		//读入矩阵
		for(int i=0;i<board.length;i++)//表示行
		{
			for(int j=0;j<board[i].length;j++)//表明列,第i行的几列
			{
				board[i][j]=in.nextInt();
				
			}
		}
		//扫描矩阵
		for(int i=0;i<board.length;i++)//表示行
		{
			System.out.println("");
			for(int j=0;j<board[i].length;j++)//表明列,第i行的几列
			{
				System.out.print(board[i][j]+" ");
				
			}
		}
		//检查行
		CH_RAW:
		for(int i=0;i<board.length;i++)//表示行
		{
			for(int j=0;j<board[i].length;j++)
			{
				if(board[i][j]==1)//嵌套在i行的大循环中
				{
					numOfX ++;
				}
				else
				{
					numOfO ++;
				}
				if(numOfX==3||numOfO==3)
				{
					getResult=true;
					break CH_RAW;//非常有必要!!
				}
			}
			
		}
		
		//检查列
		if(!getResult)
		{
			numOfX=0;
			numOfO=0;
			for(int i=0;i<board.length;i++)//表示行
			{
				for(int j=0;j<board[i].length;j++)
				{
					if(board[j][i]==1)//嵌套在j列大循环中
					{
						numOfX ++;
					}
					else
					{
						numOfO ++;
					}
					if(numOfX==3||numOfO==3)
					{
						getResult=true;
						break;
					}
				}
				
			}
		}
		
		//检查对角线
		if(!getResult)
		{
			
			numOfX=0;
			numOfO=0;
			for(int i=0;i<SIZE;i++)
			{
				if(board[i][i]==1)
				{
					numOfO++;
				}
				else
				{
					numOfO++;
				}
			}
			if(numOfX==3||numOfO==3)
			{
				getResult=true;
			}
			
		}

		
//		检查反对角线
		if(!getResult)
		{
			
			numOfX=0;
			numOfO=0;
			for(int i=0;i<SIZE;i++)
			{
				if(board[i][SIZE-i-1]==1)
				{
					numOfX++;
				}
				else
				{
					numOfO++;
				}
			}
			if(numOfX==3||numOfO==3)
			{
				getResult=true;
			}
		}

// 判断谁赢
		System.out.println("");
		if(getResult)
		{
			if(numOfX==SIZE)
			{
				System.out.println("X WIN");
			}
			else
			{
				System.out.println("O WIN");
			}
		}
		else
		{
			System.out.println("无人获胜");
		}
	}
	
}

output:

input:
1
1
1
1
1
0
0
0
0
output:
1 1 1
1 1 0
0 0 0
X WIN

  • 请注意 一定要加 break 外层循环,不然该矩阵判定O获胜。

6-1 字符类型-1

char 数字 字母 或者 汉字都可以

6-1-1字符计算

c=‘A’
如果c++,那么是‘B’
c=‘汉’
如果c++,那么是’汊’(这个是unicode的字符列表中汉的下一个字)

6-1-2 大小写换算

‘A’----65(int)
‘a’----97(int)
a’-‘A’=32
‘A’-‘B’=-1
‘a’-‘b’=-1
‘汉’-‘A’=27656

综上所述:
a>A
B>A
‘汉’>A

6-1 字符类型-2

  • 逃逸字符:用来表达无法印出来的控制字符或特殊字符,由一个反斜杠‘\’开头,后面跟上另一个字符,这两个字符合起来组合成一个字符。
操作含义
\b回退一格
\t到下一个表格位
\n换行
\r回车
"双引号
单引号
\\反斜杠本身

【反斜杠b】–回退一格
abc/bd—abd
abc/b—abc
并不是删除,而是下一个字符取代最后一个位置。

【反斜杠t】–制作表格按列输出
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);

	System.out.println("abc\t123\t356");
	System.out.println("a\t23\t56");
}
}

output(对齐输出)
abc 123 356
a 23 56

【反斜杠n】–换行
【反斜杠r】–回车

6-1 字符类型-3

  • 包裹类型可以用包裹类型定义变量,定义范围。
  • 比如整数类型Interger:4个字节相当于32bit ,可以表示所有的整数,最大值范围:【0 ~ 2^32-1】,用Integer.MAX_VALUE来表示。
基础类型包裹类型
booleanBoolean
charCharacter
intInteger
doubleDouble

包裹类型-Character

表示方法:Character.isDigit(‘a’)—false

运用函数判断这个字符是不是
isDigit数字
isLetter字母
isLetterOrDigit字母或数字
isLowerCase小写字母
isUpperCase大写字母
isWhitespace一种空格
toLowerCase转换成小写
toUpperCase转换成大写

6-2 字符串-1

字符串表示要用双引号

  • String s;
  • String 是一个类,包裹类型的第一个字符也是大写的,String的变量是对象的管理者,并非所有者。就像数组变量是管理者而不是所有者一样。
    > String s = new String(“a string”);
    表示:三步走—>创建了一个String的对象,用“a string”初始化这个对象,创建管理这个对象的变量s
    > String s = ‘hello’
    表示:编译器帮你创建一个String类的对象交给s来管理

6-2-1字符串连接

可以用加号进行字符串连接,如果加号两边分别是str 和数字,那么也可以进行连接
“hello”+“world”—>“helloworld”
"I am "+18—>“I am 18”
1+2+“age”—>“3age”
“age”+1+2—>“age12”

运算符“+”从左向右进行,所以结果不同。

	String s = new String("age");
	int a = 1;
	int b = 2;
	System.out.println(s+a+b);//age12
	System.out.println(a+b+s);//3age

6-2-2字符串的管理者

  • (1)比较是否同一个东西,使用==

      String s = in.next();//input:bye
      System.out.println(s);
      System.out.println(s=="bye");
    

output
bye
false

  • (2)比较内容是否相同,使用s.equals

      String s = in.next();//input:bye
      System.out.println(s);
      System.out.println(s.equals("bye"));
    

output
bye
true

-(3)当两个变量管理同一个字符串,才说明这是两个相同的字符串,如果只是两个字符串的内容相同,不同的管理者之间是不同的,并不能称为相等。

运用函数s1含义
s1.compareTo(s2)比较两字符串大小,结果大于零表示s1大,小于零表示s2大,等于零表示两者相等
compareToIgnoreCase不区分大小写地来比较大小
length()获得String的长度
charAt(index)访问String里的字符
s.substring(n)得到从n位置到末尾的全部内容
s.substring(b,e)得到从b位置到e位置之前的内容

6-2-3遍历String字符串

public class Main {
public static void main(String[] args) {
	Scanner in = new Scanner(System.in);
	String s1 = "abc";
	for(int i=0;i<s1.length();i++)
		System.out.println(s1.charAt(i));
}
}

output
a
b
c

注意字符串是不可以做for-each循环的

6-2-4 输出子串substring

函数含义
s.substring(n)得到从n位置到末尾的全部内容
s.substring(b,e)得到从b位置到e位置之前的内容
	String s1 = "abcde汉字";
	System.out.println(s1.substring(2));//cde汉字(2,3,4)
	System.out.println(s1.substring(0,2));//ab(0,1)

6-2-5 寻找字符

函数含义
s.indexOf©得到c字符所在的位置(index),-1表示不存在
s.indexOf(c,n)从n号位置开始寻找c字符
s.indexOf(t)找到字符串t所在的位置
从右边开始查找s.lastIndexOf©
s.lastIndexOf(c,n)
s.lastIndexOf(t)

使用方法,以及如何找到第二个4的位置:

	String s1 = "0123X456345汉字";
	System.out.println(s1.indexOf("X45"));//字符串要用双引号//4
	System.out.println(s1.indexOf('4'));//5
	//如果需要找到第二个4
	int loc = s1.indexOf('4');//5
	System.out.println(s1.indexOf('4',loc+1));//9

6-2-6 字符串其他操作

函数含义
s.startWith(t)检查是否是字符串开头的,可以有空格
s.endsWith(t)结尾的,可以有空格
s.trim删除字符串前后的空格
s.replace(c1,c2)替换,c2字符串取代c1
s.toLowerCase()全部小写
s.toUpperCase()全部大写
	String s1 = "  0123X456345abc汉字     ";
	System.out.println(s1.startsWith(s1));
	//true,可以前面是空格
	System.out.println(s1.endsWith(s1));
	//true
	System.out.println(s1.trim());
	//删除空格0123X456345abc汉字
	System.out.println(s1.replace('4','Z'));
	//  0123XZ563Z5abc汉字
	System.out.println(s1.toLowerCase());
	//  0123x456345abc汉字
	System.out.println(s1.toUpperCase());
	//  0123X456345ABC汉字
	System.out.println(s1);
	//字符串本身不会被修改   0123X456345abc汉字    

注意
所有的字符串都是不可变得,对他们的操作的结果都是制造出新的字符串出来

6-2-7 swith-cas中使用字符串

switch(s){
case"this":…break;
case"that":…break;
}

6-2-8 Math类

数学含义
abs绝对值abs(-12)—>12
pow幂次pow(2,3)—>8.0
random随机数random()—>一个0到1之间的随机数
round四舍五入10.5—>11

7-1函数定义与运用

求和,求出1到10,20到30,35到45的三个和(同时)

//求和,求出1到10,20到30,35到45的三个和
public class Main {
public static void Sum(int a,int b) 
{
	int sum=0;
	for(int i=a;i<=b;i++)
	{
		sum=sum+i;
	}
	System.out.println(a+"到"+b+"的和是"+sum);
}
public static void main(String[] args) {
	Scanner in = new Scanner(System.in);
	Sum(1,10);
	Sum(20,30);
	Sum(30,45);

7-1-1 没有范围值的return

使用关键字void,函数中不要用return。

7-1-2 函数参数中的类型匹配

范围由大到小: char–int–double
或者是使用强制转换。

注意 java语言在调用函数时,永远只能传值给函数。

7-1-3 传值,形参,实参

( 参数)形参:函数中设置的参数
(值)实参:主函数中实际调用的参数

7-1-4 本地变量

定义在函数内部的变量都是本地变量

7-1-5 块的含义

  • 块就以为着大括号
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值