指导思想:自顶向下、逐步求精、模块化
编程过程流程图:使用画图的方式来说明某个过程,常见的离线绘图工具:Visio或者PowerDesigner等;目前还有在线的绘图工具ProcessOn等
(1) 圆角矩形表示一个流程的开始或者结束点 (2) 矩形用于表示行动方案或者普通工作环节 (3) 菱形用于问题的分支判断或者审核、审批之类的判断环节 (4) 平行四边形来表示处理流程中输入输出 (5) 箭头线用于表示工作流的方向结构化编程的推论
任何复杂的问题都可以使用三中基本算法结构来描述:顺序、选择和循环
条件分支语句Java提供了两种判断语句if和switch,这两种语句用于实现条件判断,当复合某些条件时执行某段代码,否则不执行
if结构语法:
当条件成立时执行代码段,如果条件不成立则不执行,而是直接执行if后面的下一句
if(判断条件){
代码段
}
当条件成立时执行代码段1,如果条件不成立则执行代码段2
if(判断条件){
代码段1;
}else{
代码段2;
}
允许if/else结构进行嵌套
if(判断条件1){
代码段1;
}else if(条件2){//条件1不成立且条件2成立
代码段2;
}else if(条件n){
代码段n;
}else{
代码段n+1;
}
例题1:要求输入学生性别,如果false则显示女
Scanner sc= new Scanner(System.in);
boolean bb = sc.nextBoolean();//接受boolean类型的数
if(bb == false){//简化写法if(!=bb){}
System.out.println("性别为女.");//输入值不是false是没有输出
}
例题2:
(1) 输入学生成绩,假设成绩都是整数,如果>=60显示及格,否则不及格
Scanner sc = new Scanner(System.in);
int score = sc.nextInt();
if(score>=60){
System.out.println("及格");
}else{
System.out.println("不及格");
}
(2) 输入学生成绩,假设成绩都是整数,如果>85显示优秀,>=70显示良好,>=60显示及格否则不及格
Scanner sc = new Scanner(System.in);
int score = sc.nextInt();
if(score>=85){
System.out.println("优秀");
}else if(score>=70){
System.out.println("良好");
}else if(score>=60){
System.out.println("及格");
}else{
System.out.println("不及格");
}
//思考:这里的判断顺序能不能进行调整,例如先判断>=70再判断>=85?
//不能调整顺序,如果条件1成立则不会执行条件2的判定
开关分支语句
格式:
switch(表达式){
case 值1:计算表达式的值是否等于1,如果相等则执行代码块1.
代码块1;break;执行完毕后,如果没有break则继续向下执行,但是不做判断。如果有break语句则立即终止switch的执行,跳转到switch结构后的下句话开始执行。
case 值2:
代码块2;break;
......
default:
代码块n; break;
}
语法点:【考核点】
(1) 表达式的计算结果可以是整数(不允许long类型),可以是char,同时还允许是字符串类型(hashcode)
(2) default的位置实际上没有什么特殊要求,但是一定是所有的case值都不相等时才会执行。再具体开发中为了增强代码的可读性,一般建议写在所有case语句之后。
例题3:输入月份、显示对应的本月天数
System.out.println("请输入月份:");
Scanner sc = new Scanner(System.in);
int month = sc.nextInt();
switch(month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
System.out.println("本月31天");
break;
case 2:
System.out.println("请输入年份:");
int year = sc.nextInt();
if(year%4==0 && year%100 !=0){
System.out.println("本月29天");
}else{
System.out.println("本月28天");
}
break;
case 4:
case 6:
case 9:
case 11:
System.out.println("本月30天");
break;
default:
System.out.println("月份输入错误");
break;
}
循环结构
循环就是重复做某一件事情,在Java程序中间,循环控制就是在某一条件下,控制程序重复执行某一个代码段直到遇到循环终止条件为止
循环语句也称为迭代语句,在Java与语句中间存在while、for和do…while三中循环语句
while循环while循环是Java中最基本的循环语句,满足循环条件才执行循环体,如果不满足则不执行,所以有可能循环体执行多次,也有可能一次也不执行
例题4:计算1+2+3+4+…+100=5050
int res=0;//累加器用于存放每次循环体的执行结果
int k=1;//控制循环次序
while(k<=100){
res+=k++;//res=res+k; k++;
}
Syste.out.println("1+2+3+...+100="+res);
写法1:
int res=0; int k=0; while(k++<100)//由0开始比较 res+=k;//从1开始累加 System.out.println(res);
写法2:
int res=0;
int k=0;
while(++k<=100)
res+=k;
System.out.println(res);
写法3:
int res=0;
int k=1;
while(true){
res+=k;
if(++k>100){
break;
}
}
System.out.println(res);
break和continue的用法
例题5:计算100以内的奇数和
最直接思路:奇数相加,偶数跳过
int res=0;
int k=0;
while(true){
if(++k>100){
break;//终止程序 防止死循环
}
if(k%2==0)
continue;//终止本次循环,直接进入下次循环,不会执行后续语句,直接返回语句三
res+=k;
}
System.out.println(res);//输出结果
break是立即终止循环,进入循环结构的后续代码,循环体执行结束。
continue是终止本次循环,进入下一次循环,循环没有结束。
do/while循环先执行循环体,后执行判定条件,如果条件为true,则执行下一次循环。若条件为false则终止循环。
注意:循环至少执行一次。
do{
循环体;
}while(循环条件);
与while循环不同点:
while循环可能一次也不执行,而do/while至少执行一次。
int res=0;
int k=0;
do{
res +=k;
}while(++k>100);
System.out.println(res);
for循环
基本执行流程:1.执行表达式1 2.执行表达式2 ,一般表达式2是一个条件判断,如果值为真则执行循环体,否则终止循环体 3.执行完循环体后执行表达式3 4.再次执行表达式2判断是否执行循环体。
在整个循环的执行过程中表达式1执行且执行1次。
for(表达式1;表达式2;表达式3){
循环体;
}
例如:
int res=0;
for(int k=1;k<=100;k++){
res+=k;
}
System.out.println(res);
特殊写法:这里的表达式1、2、3都不是必须的
写法1:
int res=0;
int k=1;
for(;k<=100;k++){
res +=k;
}
System.out.println(res);
写法2:
int res=0;
int k=1;
for(;k<=100;){
res +=k++;
}
System.out.println(res);
写法3:
int res=0;
int k=1;
for(;;){
res +=k++;
if(k>100)
break;
}
System.out.println(res);
循环总结
实际上三种循环可以相互替代。
(1)for循环一般用于可以明确循环次数的场景 (2)while循环不能明确循环次数的场景 (3)do/while循环一般用于不能预先明确循环次数但是同时要求循环体至少执行一次的场景中数组Array
数组是一个容器,主要用于存储一组类型相同且连续的数据。(即下标是连续的)
数组中存储的每一个数据都叫做数组的元素
特点1.数组内容可变 2.数组长度是不可变的 3.数组有下标,下标从左往右从0开始数组的定义(声明)和赋值
1、静态初始化
int[] a= {10,20,30,40,50};
2、动态初始化
int[] b=new int[] {1,2,3,4,5};
int[] c;
c=new int[] {100,200,300};
3、只给定长度,不指定具体元素内容
注意:
(1) 允许先定义,后指定长度
(2) 不能在给定长度的时候在指定具体元素内容
(3) 在只给定长度时,数组元素为默认值
数组的操作整数类型-0
浮点数类型-0.0
字符类型-u0000
布尔类型-false
其他引用类型-如String -NULL(没有默认值)
1、数组的输出:
Array.toString(数组名称);
2、数组的长度
int len=arr.length
3、可以通过下标(偏移量)来访问或修改数组中的元素
//访问数组中的元素
String[] names={"张三","李四","王五","赵六","郭七"};//下标从左往右,从0开始
//通过下标获取元素(0--数组长度-1),超出该范围会出现'ArrayIndexOutOfBoundsException'错误
String name=names[0];
System.out.println("0位置的元素:"+name);//System.out.println("0位置的名字:"+name[0]);
//通过下标修改数组元素
names[2]="王麻子";
names[3]="老赵";//names[6]="大白";数组下标越界.
System.out.println(Arrays.toString(names));
4、数组的遍历:将数组中的元素逐个取出
//1.通过下标遍历 for(int i=0;i5、数组扩容(本质:创建一个新的数组,并把原数组的内容复制进来)
String[] students={"小花","小明","小李","小张","小王"}; String[] stus = new String[students.length+1]; System.out.println(Arrays.toString(stus)); for(int i=0;i例题1:将数组中元素内容倒置
[“小花”,“小明”,“小李”,“小张”,“小王”]
//1. public class Tset { public static void main(String[] args) { String[] students= {"小花","小明","小李","小张","小王"}; String[] stus=new String[students.length]; for(int i=students.length-1,y=0;i>=0;i--,y++) { stus[y]=students[i]; } System.out.println(Arrays.toString(stus)); } } //输出结果:[小王, 小张, 小李, 小明, 小花]例题2:定义一个数组,求出数组中的最大值
//[3,6,3,8,4,6,9] public static void main(String[] args) { int[] a= {3,6,3,8,4,6,9}; int max=a[0];//假设数组中第一个元素为最大值 for(int i=1;i二维数组max) { max=a[i]; } } System.out.println("最大值为:"+max); } } //输出结果为:最大值为:9 数组中的每个元素也是一个数组
1.静态初始化
int[][] arr01={{1,2,3,4},{2,3,4,5},{3,4,5,6}};每一行的元素个数可以不一样int[][] [] [] arr01={{1},{5,4},{6,3,7}};不能先定义,在赋值。
2.动态初始化
int[][] arr02=new int[][]{{1},{5,4},{6,3,7}};3.遍历输出二维数组
for(int i=0;i4.只给定长度
//规则二维数组 String[][] arr03=new String[3][4]; //不规则二维数组 String[][] arr04=new String[3][]; arr04[0]=new String[2]; arr04[1]=new String[3];



