0
点赞
收藏
分享

微信扫一扫

Java基础学习(一)

12a597c01003 2022-03-14 阅读 57

@Java基础学习


1、f(n)=1+1/2+1/3+…+1/n
代码如下(示例):
在这里插入图片描述

  2f小数点后两位(四舍五入)

f(n) = 1-1/2+1/3-1/4+…+1/n
代码如下(示例):

public class Hello {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		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;) 
		{
			sum += sign*1.0/i;  //i++;sign = -sign;
			sign = -sign;
//			if(i % 2 == 0)
//			{
//				sum += 1.0/i;
//			}
//			else 
//			{
//				sum -= 1.0/i;
//			}
		}
		System.out.println(sum);		
		System.out.printf("%.2f",sum);		
	}

2.数组

1.用户输入的数字的平均数,并输出所有大于平均数的数?

代码如下(示例):

Scanner in = new Scanner(System.in);
		int x ;
		double sum=0;
		int[] numbers = new int[100]; //定义数组
		int cnt = 0;
		x = in.nextInt();
		while( x != -1)
		{
			numbers [cnt] = x; //对数组赋值
			sum += x;
			cnt++;
			x = in.nextInt();
		}
		double average = sum/cnt;
		System.out.println("average:"+average);
		for(int i=0 ; i<=cnt ; i++)
		{
			if( numbers[i]>average )
			{
				System.out.print(numbers[i]+" ");
			}
		}	

结果:
在这里插入图片描述
2.数组是一种容器(放东西的东西),特点是:其中所有的元素具有相同的数据类型;一旦创建,不能改变大小。
定义数组变量:
<类型> [ ] <名字> = new <类型> [元素个数]
int [ ] grades = new int [100] ; // gardes[ ];
● 元素个数必须是整数
● 元素个数必须给出
● 元素个数可以是变量
int [ ] a = new int [10] // a[0]开始到a[9]
动态数组
代码如下(示例):

Scanner in = new Scanner(System.in);
	double sum=0;
	int cnt = in.nextInt();
	if(cnt > 0)
	{
		int[] numbers = new int[cnt]; //定义动态数组
		for(int i = 0; i<cnt ; i++)
			{
			    numbers [i] = in.nextInt(); 
				sum += numbers [i];
			}
			double average = sum/cnt;
			System.out.println("average:"+average);
			for(int i=0 ; i<cnt ; i++)
			{
				if( numbers[i]>average )
				{
					System.out.print(numbers[i]+" ");
				}
			}	
		}
for(int i=0 ; i<cnt ; i++) **当i=cnt时,数组会越界**

length:每个数组有一个内部成员length,会告诉你它的元素的数量 遍历数组时: ```c for(int i=0 ; i
   数组变量赋值
   ● 数组变量是数组的管理者而非数组本身
   ● 数组必须创建出来然后交给数组变量来管理
   ● 数组变量之间的赋值是管理权限的赋予
   ● 数组变量之间的比较是判断是否管理同一个数组
int[] a1 = {1,2,3,4,5};
int[] a2 = a1;
for( int i =0 ;i<a2.length; ++i)
	{
		a2[i]++;
	}	
for(int i =0 ;i<a1.length; ++i)
	{
		System.out.println(a1[i]);
	}

结果:
在这里插入图片描述

		int[] a = {1,2,3,4,5};
		int[] b = {1,2,3,4,5};
		System.out.println(a==b);//a管理a数组,b管理b数组,本质不一样。
false

复制数组
●必须遍历源数组将每个元素逐一拷贝给目的数组
代码如下(示例):

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]+" ");
		}
		System.out.println(a==b);
1 2 3 4 5 false

投票统计
代码如下(示例):

Scanner in = new Scanner(System.in);
		int x;
		int[] numbers = new int[10];
		for(int i =0 ;i<numbers.length;i++)
		{
			System.out.print(i+":"+numbers[i]+"   ");
		}
		x = in.nextInt();
		while( x != -1)
		{
			if(x>=0 && x<=9)
			{
				numbers[x] ++ ;
			}
			x = in.nextInt();
		}
		for(int i =0 ;i<numbers.length;i++)
		{
			System.out.print(i+":"+numbers[i]+"  ");
		}

搜索
●在一组给定的数据中,如何找出某个数据是否存在?
代码如下(示例):

		Scanner in = new Scanner(System.in);
		int[] data = {3,2,5,7,214,53,647,43};
		int x = in.nextInt();
		int loc = -1;
		for(int i =0; i<data.length; i++)
		{
			if(x== data[i])
			{
				loc =i;
				break;
			}
		}
		if(loc>-1)
		{
			System.out.println(x+"是第"+(loc+1)+"个");
		}
214
214是第5个

遍历数组

for(int i =0; i<data.length; i++)
		{
			if(x== data[i])
			{
				loc =i;
				break;
			}
		}

●通常都是使用for循环,让循环变量i从0到<数组的length,这样循环体内最大的i正好是数组最大的有效下标
●常见错误是:
●循环结束条件是<=数组长度,或;
●离开循环后,继续用i的值来做数组元素的下标!
for-each

for(<类型><变量>:<数组>){
}

代码如下(示例):

		Scanner in = new Scanner(System.in);
		int[] data = {3,2,5,7,214,53,647,43};
		int x = in.nextInt();
		boolean found = false;
		for( int k : data) //遍历data数组 k=3,k=2…
		{
			if( x==k )
			{
				found = true;
				break;
			}
		}
		if(found)
		{
			System.out.println(x+"在其中");
		}
		else
		{
			System.out.println(x+"不在其中");
		}

数组的例子:素数
判断是否能被已知的且<X的素数整除
●构造前50个素数的表
代码如下(示例):

		int[] primes = new int[50];
		primes[0] = 2;
		int cnt = 1; // ①primes数组当前存了一个数据,②下一次数组下标为1
		MAIN_LOOP:
		for( int x = 3; cnt < 50; x++) //从3开始依次增加 检查是否为素数
		{
			for( int i = 0; i<cnt; i++)
			{
				if( x % primes[i] == 0) //不是素数
				{
					continue MAIN_LOOP; //跳出当前循环,继续上一层循环
				}
			}
			primes[cnt++] = x; //是素数
		}
		for( int k : primes)
		{
			System.out.print(k+" ");
		}
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 

构造素数表
●欲构造n以内的素数表
1.令x为2
2.将2x、3x、4x直至ax<n的数标记为非素数
3.令x为下一个没有被标记为非素数的数,重复2;直到所有的数都已经尝试完毕
代码如下(示例):

		boolean[] isPrime = new boolean[100]; 
		for( int i=2; i<isPrime.length; i++) //isPrime默认为0,false
		{
			isPrime[i] = true;
		}
		
		for( int i=2; i<isPrime.length; i++)
		{
			if( isPrime[i])
			{
				for( int k=2; i*k<isPrime.length; k++) //素数的倍数都为false
				{
					isPrime[i*k] = false;
				}
			}
		}
		for( int i = 2; i<isPrime.length; i++)
		{
			if( isPrime[i])
			{
				System.out.print(i+" ");
			}
		}
		System.out.println();
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 

二维数组
● int[][] a = new int[3][5]
●通常理解为a是一个3行5列的矩阵
二位数组的遍历

		for( i=0; i<3; i++)
		{
			for( j=0; j<5; j++)
			{
				a[i][j] = i*j
			}
		}
	● a[i][j]是一个int
	● 表示第i行第j列上的单元
	● a[i,j]并不存在

二位数组的初始化

		int[][] a = {
				{1,2,3,4},
				{1,2,3},
		};
	● 编译器来数数
	● 每行一个{},逗号分隔
	● 最后的逗号可以存在,有古老的传统
	● 如果省略,表示补零

tic-tac-toe游戏
● 读入一个3×3的矩阵,矩阵中的数字为1表示该位置上有一个X,为0表示为O
●程序判断这个矩阵中是否有获胜的一方,输出表示获胜一方的字符X或O,或输出无人获胜
代码如下(示例):

		Scanner in = new Scanner(System.in);
		final int SIZE = 3;
		int[][] board = new int[SIZE][SIZE];
		boolean gotResult = false;
		int numOfx = 0;
		int numOfO = 0;
		
		//读入矩阵
		for( int i=0; i<board.length; i++) //i<SIZE
		{
			for( int j=0; j<board[i].length; j++)//j<SIZE
			{
				board[i][j] = in.nextInt();
			}
		}
		
		//检查行
		for( int i=0; i<SIZE; i++)
		{
			 numOfx = 0;
			 numOfO = 0;
			for( int j=0; j<SIZE; j++)
			{
				if( board[i][j] == 1) //X赢
				{
					numOfx ++; 
				}
				else 
				{
					numOfO ++;
				}
				
			}
			if(numOfO == SIZE || numOfx == SIZE )
			{
				gotResult = true;
				System.out.println("第"+(i+1)+"行赢");
				break;	
			}
				
		}
		
		//检查列
		for( int j=0; j<SIZE; j++)     
		{
			 numOfx = 0;
			 numOfO = 0;
			for( int i=0; i<SIZE; i++) 
			{
				if( board[i][j] == 1) //X赢
				{
					numOfx ++; 
				}
				else 
				{
					numOfO ++;
				}
			}	
			if(numOfO == SIZE || numOfx == SIZE)
			{
				gotResult = true;
				System.out.println("第"+(j+1)+"列赢");
				break;
			}
			
		}
		
		//检查对角线
		for( int i=0; i<SIZE; i++)
		{
			 numOfx = 0;
			 numOfO = 0;
			if(board[i][i] == 1)
			{
				numOfx ++; 
			}
			else 
			{
				numOfO ++;
			}
			if(numOfO == SIZE || numOfx == SIZE)
			{
				gotResult = true;
				System.out.println("对角线赢");
				break;
			}

		}
		
		//检查反对角线
		for( int i=0; i<SIZE; i++)
		{
			 numOfx = 0;
			 numOfO = 0;
			if(board[i][SIZE-i-1] == 1)
			{
				numOfx ++; 
			}
			else 
			{
				numOfO ++;
			}
			if(numOfO == SIZE || numOfx == SIZE)
			{
				gotResult = true;
				System.out.println("反对角线赢");
				break;
			}

		}
1 1 1 0 0 0 0 0 0
第1行赢
举报

相关推荐

0 条评论