复习一天有点忘了的知识:
结构化编程
结构化程式设计(英语:Structured programming)是1960年代开始发展起来的一种编程典范。它采用子程序、程式码区块、for循环以及while循环等结构来取代传统的goto。
指导思想
自顶向下、逐步求精、模块化
编程过程
流程图是流经一个系统的信息流、观点流或部件流的图形代表。在企业中,流程图主要用来说明某一过程。这种过程既可以是生产线上的工艺流程,也可以是完成一项任务必需的管理过程。
常见的绘制工具有Visio、PowerDesigner等。
1、圆角矩形表示“开始”与“结束”。
2、矩形表示行动方案、普通工作环节用
3、菱形表示问题判断或判定(审核/审批/评审)环节
4、用平行四边形表示输入输出
5、箭头代表工作流方向
推荐工具:ProcessOn 支持流程图、思维导图、原型图、UML、网络拓扑图、组织结构图等
结构化编程的推论
任何复杂的问题都可以三种基本算法结构来描述:顺序、选择、循环。因此用计算机语句描述的程序也包含三种基本结构
条件分支语句
-
if(条件判断语句){代码A;} 当条件成立时执行代码A,如果条件不成立则不执行代码A,而是直接执行if的下一句
-
if(条件){代码块1;}else{代码块2;} 当条件成立时执行代码块1,如果条件不成立则执行代码块2。没有一种情况是同时执行代码块1和2
-
if(条件1){代码块1;}else if(条件2){代码块2;}…else{代码块n;} 当条件1成立时执行代码块1,如果条件1不成立继续判断条件2,如果条件2成立则执行代码块2,依次类推。没有一种情况是同时执行代码块1和2
-
说明:允许多个if之间进行相互嵌套
需求:要求输入学生性别,如果false则显示女
Scanner sc = new Scanner(System.in);
boolean bb = sc.nextBoolean();
if (bb == false) { //判真一般用法为if(bb){} 判假 if(!bb){}
System.out.println("性别为女");
}
要求输入学生成绩(假设成绩都是整数),如果>60显示及格,否则显示不及格
Scanner sc = new Scanner(System.in);
int score = sc.nextInt();
if (score >= 60) {
System.out.println("成绩及格");
} else {
System.out.println("成绩不及格");
}
要求输入学生成绩(假设成绩都是整数),如果>=85显示优秀,如果>=70显示良好,如果>=60显示及格,否则显示不及格
Scanner sc = new Scanner(System.in);
int score = sc.nextInt();
if (score >= 85){
//这里的顺序不能调整,因为条件成立后则立即执行代码块,执行结束则自动跳出if,不会继续判断
System.out.println("成绩优秀");
} else if(score>=70) {
System.out.println("成绩良好");
} else if(score>=60){
System.out.println("成绩及格");
} else {
System.out.println("成绩不及格");
}
修改代码
if (score > 70) {
System.out.println("良好");
} else if (score > 85) {
//这里的代码永远不会有执行机会。因为这里的if条件实际上是一个复合条件,if(score<=70 && score>85){}
System.out.println("优秀");
} else if (score > 60) { //score<=70 && score<=85 && score>60
System.out.println("及格");
} else {
System.out.println("不及格");
}
开关分支语言switch
语法:
switch(表达式){
case 值1: 判断表达式的值是否在值1,如果相等则执行代码块1 代码块1; break; 执行完成后,如果没有break,则自动执行后续语句,但是不进行判定。如果有break则立即中断switch的执行,跳到switch块的下一局继续执行 多个case语句: ... ... default:如果所有的case都不能成立,则执行代码块n 代码块n; break;
}
语法点:
-
表达式的计算结果可以是整型【不允许long类型】,可以是char,同时允许是字串类型[String]
-
也可以是枚举类型
-
case值类型必须和switch条件类型相同或者能隐式转换为switch表达式类型
-
case值必须唯一,不能与其它的重复
-
default的位置没有特殊要求,但是一定是所有的case值不相等时才会执行。但是为了增强可读性,所以一般建议写在所有的case之后
需求:输入月份,显示对应的本月的天数
System.out.println("请输入月份:");
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
switch (m) {
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) || year % 400 == 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: //default写在switch内部的任何位置上实际都不会影响执行逻辑,但是不建
议,因为会影响可读性
System.out.println("月份错误!");
break;
}
}
三目运算符
三目条件运算符(?:)规则是完全一致的,使用的形式是: x ? y:z;
需求:要求输入两个整数,输出最大的整数
使用if判断的实现方式:
public class Test1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个整数:");
int num1 = sc.nextInt();
System.out.println("请输入第二个整数:");
int num2 = sc.nextInt();
int max = num1;
if (max < num2)
max = num2;
System.out.println("两个整数("+num1+","+num2+")中最大的值为:"+max);
sc.close();
}
}
使用三目运算符实现
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个整数:");
int num1 = sc.nextInt();
System.out.println("请输入第二个整数:");
int num2 = sc.nextInt();
/*
* if(num1>num2) max=num1;
* else max=num2;
*/
int max = num1 > num2 ? num1 : num2;
System.out.println("两个整数("+num1+","+num2+")中最大的值为:"+max);
sc.close();
-
要求表达式1必须返回值为boolean类型
-
要求表达式2和表达式3的返回值类型一致, System.out.println(m>n?123:“abc”); 正确
Object max = num1 > num2 ? num1 : "num2";
题目:
int k=100;
int m=99;
int res=k>100?m++:++m;
System.out.println(res);
//100 k>100不成立,则直接执行++m,而和表达式2:m++无关,不会执行
System.out.println(m); //100
循环结构
循环就是重复做某一件事情。在Java程序中,循环控制即在某一情况下,控制程序重复执行某一条或多
条语句,直到遇到终止条件为止
循环语句也称迭代语句,在Java语言中存在的while、for和do-while循环语句
while循环
while是Java中最基本的循环语句,满足条件才执行循环体,如果不满足条件则不执行。所以有可能循环体一次都不执行。
语法:
while(条件){循环体;} 当条件成立时反复执行循环体,每执行一次判断一次条件。
int res=0;//累加器,用于存放每次循环体的执行结果
int k=1;//控制循环次数
while(k<101){
res=res+k;
k++;
}
System.out.println("1+2+3+...+100="+res);
int res = 0;// 累加器,用于存放每次循环体的执行结果
int k = 0;// 控制循环次数
while (k++ < 100)
res += k;
System.out.println("1+2+3+...+100=" + res);
int res = 0;// 累加器,用于存放每次循环体的执行结果
int k = 1;// 控制循环次数
while(true){//这个写法一般用于没有很明确的次数控制时
res+=k;
if(++k>100)
break; //当满足条件则跳出while循环体
}
System.out.println("1+2+3+...+100="+res);
没有很明确的次数控制
需求:要求输入一个合法的年龄值【和业务需求相关】
int age=0;
while(true){
System.out.println("请输入学生年龄:");
age=sc.nextInt();
if(age>=18 && age<=24)
break;
else
System.out.println("您输入的是"+age+",这是一个不合法的年龄");
}
需求:计算所有100以内奇数的和
int res=0; //累加器
int k=0; //循环控制变量
while(++k<101){
if(k%2==1)
res+=k;
}
System.out.println("1+3+5+...+99="+res);
break和continue的用法
int res=0;
int k=0;
while(true){
if(++k>100){
break; //跳出循环体,执行循环体后的语句
}
if(k%2==0){
//如果是偶数不进行累加操作,而是从新开始后续的循环,continue之后的语句不执行,从头开始下次循环
continue; //终止本次循环,立即进入下次循环
} else{
res+=k; //res=res+k
}
System.out.print(k+"+");
}
System.out.println("="+res);
break和continue的区别:
-
break是立即终止循环,进入循环结构的后续代码继续执行,循环体执行结束
-
continue是终止本次循环,进入下次循环,循环并没有执行结束
do/while循环
语法:
do{循环体;}while(条件);
先执行循环体,然后进行条件判断,如果条件为true,则执行下次循环;如果条件为false则终止循环。
- 不同于while循环的点:do/while循环至少执行循环体一次,而while循环有可能一次都不执行。
int res=0;
int k=1;
do {
res+=k++; //res=res+k;k++;
} while (k < 101);
System.out.println(res);
for循环
语法:for(表达式1;表达式2;表达式3){循环体;}
-
执行表达式1
-
执行表达式2,一般表达式2是一个条件,如果条件为true则执行循环体;如果条件为false则终止循环
-
执行循环体
-
执行表达式3
-
执行第2步骤
for循环一般用于可以明确循环次数的场景中;while循环一般用于不能预先确定循环执行次数的场景中;do/while循环一般用于不能预先确定循环执行次数,同时要求循环体至少执行一次的场景中
int res=0;
for(int i=1;i<=100;i++){
res+=i;
}
System.out.println(res);
自定义步长值
int res=0;
for(int i=1;i<101;i=i+2) { //2就是步长值
res+=i;
}
System.out.println("1+3+5+7+...+99="+res);
省略表达式的写法
int k=1;
for(;k<101;k++) res+=k;
int k=1;
for(;k<101;) res+=k++;
int k=1;
for(;;) {
res+=k++;
if(k>100) break;
}
练习题
1、计算输入数据的阶乘值
System.out.println("请输入整数:");
Scanner sc=new Scanner(System.in);
int kk=sc.nextInt();
int res=1;
for(int k=1;k<=kk;k++){
res*=k;//res=res*k
}
System.out.println(kk+"!="+res);
2、互换两个数的值(不允许使用中间变量)
-
建立临时变量
-
加减运算交换
-
位运算方法
//第一个数num1=10 第二个数为num2=6
num1=num1+num2; //num1=16 num2=6
num2=num1-num2; //num2=10 mum1=16
num1=num1-num2; //num1=6 num2=10
String的操作
基础操作,后续在面向对象章节细讲
String 类的构造方法很多。可以通过初始化一个字符串,或者字符数组,或者字节数组等等来创建一个String 对象
常见方法
-
length() 获取字符个数 强调:是方法不是属性
-
substring(int)/(int,int) 求指定范围的字符串子串
-
charAt(int index):char
-
indexOf(int ch) 和 indexOf(int ch, int fromIndex) 方法
-
equals(String):boolean比较两个字符串的内容是否相等
-
trim()
考试常见方法:intern() 方法
String s1="ab"+"c";
String s2="abc";
System.out.println(s1==s2); //true
字符串常量拼接,在方法区的常量池中完成
String s0="ab";
String s1=s0+"c";
String s2="abc";
System.out.println(s1==s2); //false
String类型的拼接是通过StringBuilder类中的append方法实现的,然后返回toString的结果。是在堆中的新对象
字符串转数字
使用Scanner读取键盘录入数据
- next():String 当光标扫描到第一个分隔符(默认是空格)停止扫描,会创建一个String类的对象,里面存储的就是扫描的内容(不包含空格分隔符)返回创建的String对象的引用给n
Scanner cin=new Scanner(System.in);
while (true) {
String n = cin.next();
if("exit".equals(n))
break;
System.out.println(n + 'A');
}
cin.close();
-
nextLine():读取输入,包括单词之间的空格和除回车以外的所有符号(即。它读到行尾)。读取输入后,nextLine()将光标定位在下一行。所以它和next()的区别就是它没有分隔符,直接扫描全部的键盘输入内容,并创建对象进行将其引用返回
-
目标类型名.parse类型(String)
-
Integer.parsetInt(String):int
-
Double.parsetDouble(String):double
-
数字转字符串
“”+任意类型数据
字符串新方法
-
String.repeat(int)
根据 int 参数的值重复 String -
String.lines()
拆分由其行终止符在其上调用的 String ,并返回由这些行终止符划分的 -
Strings Stream
具体使用以后再说 -
String.strip()
、String.stripLeading()
和String.stripTrailing()
去除字符串的空格 -
String.isBlank()
判断String是否为空或仅包含空格字符
具体实现原理
在JDK1.8以前采用char[]实现,现在采用byte[]的方式实现。可以减少字符串占用的内存,同时减少垃圾回收次数。
实际开发中单字节的字符使用频率远高于双字节的。在JDK8+版本中Java会根据字符串内容自动设置为相应的编码,要么 Latin-1要么UTF16,中文是两个字节,纯英文是一个字节。
不使用UTF-8编码字符集是因为UTF-8是变长编码的,有1、2、3、4字节的不同情况,所以对于String随机访问操作很不方便
UTF-16也是变长编码,是使用2或者4个字节存储字符。对于Unicode编码在0-FFFF之间的字符使用两个字节存储,而10000-10FFFF之间的字符使用4个字节。但是Java中一个char就是2个字节,同时String的各种操作都是以Java字符为单位的,所以UTF-16在Java中可以看作一个定长的编码