结构化编程
结构化程式设计(英语:Structured programming)是1960年代开始发展起来的一种编程典范。它采用子程序、程式码区块、for循环以及while循环等结构来取代传统的goto。
应用代码一般是由三种结构组成:顺序结构、选择结构、循环结构
指导思想
自顶向下、逐步求精、模块化
编程过程
流程图是流经一个系统的信息流、观点流或部件流的图形代表。在企业中,流程图主要用来说明某一过程。这种过程既可以是生产线上的工艺流程,也可以是完成一项任务必需的管理过程。常见的绘制工具有Visio、PowerDesigner等。
- 圆角矩形表示“开始”与“结束”。
- 矩形表示行动方案、普通工作环节用
- 菱形表示问题判断或判定(审核/审批/评审)环节
- 用平行四边形表示输入输出
- 箭头代表工作流方向
结构化编程的推论
任何复杂的问题都可以三种基本算法结构来描述:顺序、选择、循环。因此用计算机语句描述的程序也包含三种基本结构。
临时变量的生命周期(补充)
public class Test{
public static void main(String[] args){
long mm=0;
{
System.out.println(mm);//语法正确,因为mm的范围包括了这个小范围
System.out.println(kk);//语法错误,java要求变量必须是先定义后使用,先赋初值后使用
//语法正确
int kk=100;
System.out.println(kk);//可以输出
}
System.out.println(mm);//语法正确,mm就是在这个范围内有效
System.out.println(kk);//语法错误,因为kk只在上一个{}范围中有效
}
}
条件分支语句
Java语言提供了两种判断语句:if语句和switch语句。这两种语句用于实现判断,当符合某些条件时执行某段代码,否则将不执行
语法: 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则显示女
boolean sex=true;
Scanner sc=new Scanner(System.in);
sex=sc.nextBoolean();
if(sex){ //这里是一个简化写法,实际上就是true==sex
System.out.println("男");
}else //如果代码块中只有一条语句时,{}可写可不写
System.out.println("女");
要求输入学生成绩(假设成绩都是整数),如果>85显示优秀,如果>70显示良好,如果>60显示及格,否则显示不及格
int score=0;//要求临时变量必须先定义后使用,必须先赋初值后使用
Scanner sc=new Scanner(System.in);
score=sc.nextInt();
if(score>85)
System.out.println("优秀");
else{ //如果代码块多于一行,则{}不能省略,否则语法报错
if(score>60){
if(score>70)
System.out.println("良好");
else
System.out.println("及格");
}else{
System.out.println("不及格");
}
}
这种写法不建议使用,因为覆盖测试测试太麻烦,review代码非常困难
int score=0;//要求临时变量必须先定义后使用,必须先赋初值后使用
Scanner sc=new Scanner(System.in);
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("不及格
开关分支语言switch
语法:
witch(表达式){
case 值1: 判断表达式的值是否在值1,如果相等则执行代码块1
代码块1; break; 执行完成后,如果没有break,则自动执行后续语句,但是不进行判定。如果有break则立即中断switch的执行,跳到switch块的下一局继续执行
多个case语句:
... ...
default:
如果所有的case都不能成立,则执行代码块n
代码块n; break;
}
语法点:
-
表达式的计算结果可以是整型【不允许long类型】,可以是char,同时允许是字串类型[String]
-
default的位置没有特殊要求,但是一定是所有的case值不相等时才会执行。但是为了增强可读性,所以一般建议写在所有的case之后
需求:输入月份,显示对应的本月的天数
public class Test1 {
public static void main(String[] args) {
int res = 0;
System.out.println("请输入月份:");
Scanner sc = new Scanner(System.in);
int month = sc.nextInt();
System.out.println("请输入年份:");
int year = sc.nextInt();
switch (month) {
case 2:
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
res = 29;
else
res = 28;
break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
res = 31;
break;
case 4: //注意,这里的比对只执行成功一次,比对成功则不会再次进行比对,即使遇到case语句。一旦开始执行语句块,则一定要有break语句,否则会一直执行下去,直到switch结束或者遇到第一个break
case 6:
case 9:
case 11:
res = 30;
break;
default:
res = -1;
break;
}
if (res > 0)
System.out.println(year + "年" + month + "月有" + res + "天!");
else
System.out.println("输入的年月不合法!");
}
}
第二种写法
public class Test2 {
public static void main(String[] args) {
F1 ff = F1.AA;
switch (ff) {//允许使用枚举类型,进行比对时实际上是比较枚举的序号
case BB:
break;
default:
break;
}
char cc = 'a';//允许是字符类型,不是字符串类型;比较是字符值的unicode编码值
switch (cc) {
case 'b':
break;
default:
break;
}
String key = "abc";
switch (key) {// 从JDK1.8开始,在switch中可以使用字符串类型,比对时实际上是比较字符串类型的hash值[考点]
case "abc":
break;
default:
break;
}
long key1 = 100;
switch (key1) {// switch中的表达式可以使用整型,但是不能是long类型
case 100:
break;
default:
break;
}
}
}
enum F1 {
AA, BB;
}
要求输入学生成绩(假设成绩都是整数),如果>=80显示优秀,如果>=70显示良好,如果>=60显示及格,否则显示不及格
public class Test3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int score=sc.nextInt();
int key = score / 10;
String res=null;
switch (key) {
case 10:
case 9:
case 8:
res="优秀";
break;
case 7:
res="良好";
break;
case 6:
res="及格";
break;
default:
res="不及格";
break;
}
System.out.println("学生成绩为:"+score+"评级为:"+res);
}
}