编译环境:Notepad++.
1.解答第三课留下的课后题
1>.打印九九乘法表:
//multiplicationTable 乘法表
public class Java练习{
public static void multiplicationTable(){
for(int i=1;i<10;i++)
{
for(int j=1;j<=i;j++)
{
System.out.printf("%d*%d=%-2d ",j,i,i*j);
}
System.out.println();
}
}
public static void main(String[] args){
multiplicationTable();
}
}
运行结果:
2>.(递归、迭代求阶乘)利用公式:e = 1/0! + 1/1! + 1/2! + 1/3! + 1/4! + …,计算自然对数的底 e ,n计算多少项,return返回值:
//factorial 阶乘
public class Java练习{
//1.递归方法求阶乘
/* public static long factorial(int n){
if(n==0||n==1)
{
return 1;
}else{
return n*factorial(n-1);
}
} */
//2.迭代方法求阶乘(0!=1)
public static long factorial2(int n){
int r=1;
for(int i=1;i<=n;i++){//i必须从1开始,若从0开始,则第一个数的阶乘无法计算,导致后面的也无法计算
r*=i;
}
return r;
}
public static double program(int n){
double e=0;
for(int i=0;i<n;i++)
{
//e+=(1.0/factorial(i));
e+=(1.0/factorial2(i));//r在这个函数中未定义,所以要调用函数
}
return e;
}
public static void main(String[] args){
System.out.printf("e=%f%n",program(5)); //想算几项就把5换成几
}
}
运行结果:
3>.利用公式: Pi / 4 = 1/1 - 1/3 + 1/5 - 1/7 + 1/9 - …计算 pi 的值, n 一共计算多少项,return返回值:
public class Java练习{
public static double jiSuanPi(int n){
double pi4=0;
for(int i=0;i<=n;i++)
{
int fenmu=i*2+1;
double dest=1.0/fenmu;
if(i%2==0) //i为偶数时为正
{
pi4+=dest;
}else{
pi4-=dest; //i为奇数时为负
}
}
return pi4*4;
}
public static void main(String[] args){
System.out.printf("pi=%f%n",jiSuanPi(5));//5的值可以改直到和3.14接近为止
}
}
运行结果:
4>. 10 进制转 16 进制,计算公式如下:例:1958 转 16 进制1958 % 16 == 6 ;1958 / 16 == 122 ; 122 % 16 == 10 也就是 A , 122 / 16 == 7 ;7 < 16 所以1958 的 16 进制 为 7A6:
//binaryConversion 进制转换
//reverse 反转
public class Java练习{
public static String reverse(String s) { //字符串转换
int length = s.length();
String r = "";
for (int i = length - 1; i >= 0; i--) {
r += s.charAt(i);
}
return r;
}
public static String binaryConversion(int n) { //进制转换
String r = "";
while (n > 16) { //while也是一种循环
int yushu = n % 16;
int shang = n / 16;
if (yushu > 9) {
char c = (char)((yushu - 10) + 'A');
r += c;
} else {
r += yushu;
}
n = shang;
}
if (n > 9) {
char c = (char)((n - 10) + 'A');
r += c;
} else {
r += n;
}
return reverse(r);
}
public static void main(String[] args) {
System.out.println(binaryConversion(300));
System.out.println(binaryConversion(1958));//括号里的值就是你要求的值
}
}
运行结果:
2.数组的定义
数组是引用数据类型,有内存分配问题。
1>数组动态初始化(声明并开辟数组空间):
通式: 数组类型[ ] 数组名称=new 数据类型[长度];
例:int[] a=new int[5];
2>.赋值方式:
①int[ ] a={1,2,3,4,5}; //只能在初始化的时候使用
②int[ ] a=new int[5]; //元素的值是0,因为是取int的默认值
③int[ ] a=new int[ ] {1,2,3,4,5};
④int[ ] a=null; /只定义了一个数组类型的引用变量,没有数组对象,a没有指向任何数组/
如果数组中的元素没有初始化,元素的值就是元素类型的默认值
3>.开辟空间后,可采用以下方式进行操作:
①数组的访问通过索引完成。即:“数组名称[索引]”,注意:数组索引从0开始,因此可以采⽤的索引范围就是0~长度-1;假设现在开辟了3个空间的数组,那么可以使⽤的索引是:0、1、2。如果访问超过索引访问,那么会产⽣"java.lang.ArrayIndexOutOfBoundsException"(下标越界)异常信息。例:int[] a=null;a[0]=100;NullPointerException;
②当数组采⽤动态初始化开辟空间之后,数组之中的每个元素都是该数据类型的默认值;{1,2,3,4,5,- - - };
③数组本身是⼀个有序的集合操作,所以对于数组的内容操作往往采⽤循环的模式完成。(数组是⼀个有限的集合,采⽤for循环)
④在Java中有⼀种动态取得数组⻓度的⽅法:.length;
4>.例:二分查找
//binarySearch 二分查找
public static int binarySearch(int[] a,int v){
----------
}
int[] a={1,2,3,4,5};
binarySearch(a,3);
binarySearch(new int[] {1,2,3,4,5};//匿名数组
可进行的一些操作:
①根据下标访问对应元素:a[index] 0<=index<a.length(index类型是int型)
②遇到的异常会有:NullPointerException / ArrayIndexOutOfBounds
③获取数组的长度:a.length
3.数组的使用
1>.例:int[ ] a=null;
int[ ] a={1,2,3,4,5};
int[ ] b=a; //b也指向a指向的数组对象
b[0]=10; //a[0]=?—>a[0]=10;
2>.变量有四种形式:
①java内存中有3个区域:栈,堆,方法区;
②形参和局部变量在栈内,对象的属性在堆内,静态属性在方法区内;
③变量是数组类型的引用,堆上实际存储对象
3>.①引用类型是个线索,用来找到堆中的真正数据<一定在堆区>;
②引用的方法调用,不管是基本数据类型还是引用数据类型,在java中都是值传递,形参的改变不影响实参;
例1:
public class HelloWorld3{
//我理解为相当于C的全局变量和局部变量同名(相等)时,优先使用局部变量
//形参的改变不会影响实参
public static void method(int[] a){
a=new int[] {11,12,13,14,15};
}
public static void main(String[] args){
int[] a={1,2,3,4,5};
int i=0;
method(a);
for(i=0;i<a.length;i++)
{
System.out.println(a[i]);
}
}
}
//结果:a[i]={1,2,3,4,5}
例2:
public class HelloWorld3{
public static void method(int[] a){
a[0]=10;
}
public static void main(String[] args){
int[] a={1,2,3,4,5};
int i=0;
method(a);
for(i=0;i<a.length;i++)
{
System.out.println(a[i]);
}
}
}
//结果:a[i]={10,2,3,4,5}
例3:
public class HelloWorld3{
public static void main(String[] args){ //引用的方法调用是值传递
int[] a={1,2,3,4,5};
int[] b=a;
int i=0;
b=new int[] {10,11};
for(i=0;i<a.length;i++)
{
System.out.println(a[i]);
}
}
}
//结果:a[i]={1,2,3,4,5}
4>.数组的遍历:
int[ ] a={1,2,3,4,5};
第①种形式:
for(int i=0;i<a.length;i++){
a[i] ;//进行a[i]相关的操作
}
第②种形式:
//foreach形式(老版本的java可能不支持)
for(int element:a){
element;
}
5>.使用包的语法:(先简单了解,重点后面课程再讲)
①import.java.util.Arrrays;
②加" Arrays."前缀;
6>.Java中垃圾回收(Garbage Collection)
什么是“垃圾”?
答:没有使用价值,没有引用指向的对象(数组)
7>.例题:
//交换下标为0和下标为3的数据
//swap 交换
public class HelloWorld3{
public static void swap(int[] a,int i,int j){
int t=a[i];
a[i]=a[j];
a[j]=t;
}
public static void main(String[] args){
int[] a={1,2,3,4,5};
int n=0;
swap(a,0,3);
for(n=0;n<a.length;n++)
{
System.out.println(a[n]);
}
}
}
//结果:a[n]={4,2,3,1,5}
//查找数组中的一个值,查找成功返回值的下标,查找失败返回-1
//binarySearch 二分查找(数组要排好序)
//import java.util.Arrays;
public class HelloWorld3{
public static int binarySearch(int[] a,int v){
int left=0;
int right=a.length;//左闭右开
//int right=a.length-1;//左闭右闭
while(left<right)
{
int mid=(left+right)/2;
if(v==a[mid])
{
return mid;//返回的是要查找数据的下标
}else if(v<a[mid])
{
right=mid;
//right=mid-1;//左闭右闭
}
else
{
left=mid+1;
}
}
return -1;
}
public static void main(String[] args){
int[] a={1,2,3,4,5,6,7,8,9};
System.out.println(binarySearch(a,3));
//System.out.println(Arrays.binarySearch(a,3));
}
}
//结果:2
//找出在数组中第一次出现的值,返回该值的下标
public class HelloWorld3{ //顺序查找(数组不用排序)
public static int searchFirst(int[] a,int v){
for(int i=0;i<a.length;i++){
if(a[i]==v){
return i;
}
}
return -1;
}
public static void main(String[] args){
int[] a={3,2,4,7,8,3,9,0};
System.out.println(searchFirst(a,3));
}
}
//结果:0
//用1填充整个数组
//fill 填充
public static void fill(int[] a,int v){
int i=0;
for(i=0;i<a.length;i++){
a[i]=v;
}
}
public static void main(String[] args){
int[] a={1,2,3,4,5,6};
int i=0;
fill(a,1);
for(i=0;i<a.length;i++)
{
System.out.println(a[i]);
}
}
}
//将一个数组中的值拷贝到另一个数组
import java.util.Arrays;
public class HelloWorld3{
public static int[] copyOf(int[] original, int newLength) {
int[] dest = new int[newLength];
int length = original.length <= newLength ? original.length : newLength;//三目运算符
for (int i = 0; i < length; i++) {
dest[i] = original[i];
}
return dest;
}
public static void main(String[] args) {
int[] a = { 1, 2, 3, 4, 5 };
copyOf(a, 10); //a是原数组,10是复制数组的长度
System.out.println(Arrays.toString(Arrays.copyOf(a, 10)));
int[] b = new int[10];
System.arraycopy(a, 0, b, 5, 5);
System.out.println(Arrays.toString(b));
}
}
//结果:[1, 2, 3, 4, 5, 0, 0, 0, 0, 0]
// [0, 0, 0, 0, 0, 1, 2, 3, 4, 5]