注:本系列为个人学习笔记,存在知识点欠缺或知识逻辑不连贯,见谅。
一、循环语句初识
-
什么是循环?循环是程序中重复执行,直到满足指定条件才停止的一段代码。
-
在编程学习过程中,循环结构部分可以说是思维转换的过程(将人的思维转换成人的思维),在接下来的编程学习中,循环结构非常常用,一定要精通学习。
二、循环结构的三种结构
-
for循环:最有效、最灵活的循环结构,一般用于解决已知循环次数的问题。
-
for(表达式1;表达式2;表达式3){循环语句}
-
三个表达式的作用:
-
表达式1:给循环变量赋初值;
-
表达式2:给出循环条件,结果为布尔值,为true执行,false退出;
-
表达式3:给出循环变量的变化规律,通常为递增或递减。
-
-
循环结构的执行顺序:表达式1-->表达式2-->循环语句-->表达式3。
-
例:
for(int i=0;i<5;i++) { System.out.print("*"); }
-
-
while循环
-
while(布尔表达式){循环语句}
-
一般用于解决未知次数的循环,当布尔表达式成真时执行循环语句。
-
例:
-
public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int n =scanner.nextInt(); int sum = 1; //0乘以任何数字都是0 int index=2; while( index <= n ) { sum*=index;//*= sum=sum*n; index++; } System.out.println(sum); }
-
-
do-while循环
-
和while循环类似,唯一不同点就是,do-while循环至少循环一次,先循环一次再验证。
-
例:
-
public static void main(String[] args) { int n=1234; int temp=n; int index=0; do { //!结束条件=执行条件 temp=temp/10; index++; }while(temp!=0); //index一共几位数 System.out.print(index); int t=index;//t当前要求的位数 for(int i=0;i<index;i++) {//index次 //几位数 有几位 就取几次 int n1=1; for(int j=0;j<t;j++) { n1=n1*10; } int n2=1; for(int j=0;j<t-1;j++) { n2=n2*10; } int x= n % n1/n2;//^异或 System.out.print(x+" "); t--; } }
-
三、双重循环(多重循环)
-
本质上就是初始循环结构的嵌套使用,常用情景:二维数组遍历。
-
例:
for(int j=0;j<5;j++) { for(int i=0;i<5;i++) { System.out.print("*"); } System.out.println(); }
-
-
转换字符:
-
break:执行break操作,跳出当前所在的循环,到外层继续执行;
-
continue:执行continue操作,跳出本次循环,到下一次继续执行,直到执行完毕,到外层继续执行;
-
return:执行return操作,直接返回函数,所有该函数体内的代码(包括循环体)都不会再执行。
-
例:
-
public static void main(String[] args) { boolean flag=false; for (int i = 0; i < 5; i++) { //? 1 for (int j = 0;j < 4;j++) { System.out.print("*"); //? 2 if(i==2 && j == 1) { flag=true; break; } } if(flag) { break; } System.out.println(); //? 3 } }
-
四、数组
-
一维数组:
-
数组是相同类型数据的有序集合,数组中的数据称之为数组元素,每个元素可通过他们的下标来访问他们,下标从0开始。
-
数组的声明:
-
dataType[ ] arrayRefVar = new dataType[ arraySize];
-
获取数组的长度:arrays.length。
-
数组的四个基本特点:
-
其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
-
其元素必须是相同类型,不允许出现混合类型。
-
数组中的元素可以是任何数据类型,包括基本类型和引用类型。
-
数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。
-
-
数组三种初始化
-
静态初始化:
-
int[] a = {1,2,3}; Man[ ] mans = {new Man(1,1),new Man(2,2)};
-
动态初始化:
-
int[] a = new int[2]; a[0]=1; a[1]=2;
-
数组的默认初始化:数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。
-
-
注:数组在声明之后,会将第一个数组元素存放在内存栈中(引用数组对象的变量),用于引用在堆里面的数组主体,且数组在内存中占据一段连续不变的空间,当数组下标超出声明时定义的length-1,就会报数组越界的错误(ArraylndexOutOfBoundsException:数组下标越界异常!)。
-
-
多维数组:多维数组可以看作是数组的数组,拿二维数组来说,二维数组中的每一个元素就是一个以为数组。
-
二维数组:
-
int a[][] = new int[2][5];
-
例:
-
int n = 0; Scanner scanner=new Scanner(System.in); n=scanner.nextInt(); int[][] arr=new int[n][]; for(int i=0;i<arr.length;i++) { arr[i]=new int[i+1]; for(int j=0;j<arr[i].length;j++) { if(j==0||i==j) { arr[i][j]=1; }else { arr[i][j]=arr[i-1][j]+arr[i-1][j-1]; } System.out.print(arr[i][j]+"\t"); } System.out.println(); }
-
五、函数/方法(过程)
-
有返回值叫函数,方法(过程)没有返回值——基本上没多大关系,三个名称可以指向同一种东西。
-
用于实现某个特定功能的、可被调用执行并能返回值的程序代码段。函数=函数声明+函数体;
-
函数声明:定义函数名、形式参数及返回值;
-
public static int cal(int a,int b,int c,int d) { return a/b+c%d; }
-
函数体:由执行操作的语句序列组成;
-
函数调用必须指定函数名和实际参数,函数执行后返回结果值。
-
注:Java语言没有全局函数,函数声明在类中,称之为成员函数,分静态方法和实例方法两种。
-
例:
-
public static void f1(int a,int b) { //形参=实参 System.out.println(4); } public static void main(String[] args) { f1(2,3); }
-
-
函数中变量的作用范围(作用域)
-
函数中声明的变量仅在当前函数中有用,且传入的参数也只在当前函数中有用。
-
-
Java中的方法重载:
-
同一个类中,函数名相同,返回类型相同,但参数列表不同。
-
六、递归方法
-
定义:递归是数学中一种重要的概念定义方式,即用一个概念本身直接或间接地定义自己。
-
递归的两个基本要素:
-
边界条件:至少有一个初始条件是非递归的;
-
递推通式:由已知的函数值逐步递推计算出未知函数值。
-
-
例:
-
public static void main(String[] args) { System.out.print("输入阶乘n的值:"); int sum = factorial(new Scanner(System.in).nextInt()); System.out.println(sum); } public static int factorial(int num){ if (num == 1){ return 1; }else { return num * factorial(num - 1); } }