一、顺序结构
代码从主函数开始逐行向下运行,也是一种宏观的代码运行结构
class Demo {
public static void main(String[] args) {
int a = 3 ;
int b = 5 ;
int sum ;
sum = a + b;
System.out.println("sum="+sum);
}
}
当代码在dos命令行中写入java Demo 回车之后,首先会启动JVM,JVM就会去加载当前Demo这个class文件,并执行其中的main方法。当程序执行main方法的时候会从第一行开始往下执行,直到整个代码全部执行完成。在此过程中程序按照书写的顺序,不会
跳过任何一行代码。像这样的执行流程就是常见的顺序执行结构。
二、选择结构(if/switch)
(f是Java种的关键字,当程序在执行过程遇到if关键字,JVM就知道此处需要进行判断,根据判断结果需要处理相应的代码)
1.if语句
基本格式:格式说明:if关键字后面是一对小括号,小括号后面是没有分号的,小括号中的表达式
运算完的结果必须是boolean类型的值
if(条件表达式){
当条件为true时执行的代码;
}else{
当条件为false时执行的代码;
}
单if形式:
if(条件表达式){
当条件为true时执行的代码;
}
嵌套if-else形式:
对于嵌套if而言尽量不要层次太深,太深的话逻辑容易乱,一般会考虑下面这个if-else-if形式
if(条件1){
条件1为true时执行的代码;
if(条件2){
条件2为true时执行的代码;
}else{
条件2为false时执行的代码;
}
}else{
条件1为false时执行的代码;
}
if-else-if形式:
if(条件1){
}else if(条件2){
}else if(条件3){
}else{
}
2.switch语句(一般在多选情况下用)
程序执行时,遇到switch关键字,首先会计算表达式的值,然后根据计算的值和case后面的值做比较,当case后面的值和switch表达式的值相同时,就执行case身后的所有语句,若case身后没有和switch表达式匹配的值,程序就会执行default后面的语句
switch(变量){ //switch所要求的变量的数据类型:byte short int char String 枚举
case 值1:
执行语句1;
break;
case 值2:
执行语句2;
break;
case 值3:
执行语句3;
break;
........
deafult:
执行语句n;
break;
}
if语句与switchyu语句的区别:if它既可以对一个单一的值进行判断,也可以对一个区间的值进行判断;switch只能判断单一的值
三、循环结构 (主要解决重复性执行的代码)
for循环:已知重复次数的循环
for循环格式
for(初始化表达式(1);循环条件表达式(2);循环后的操作表达式(3)){
执行语句;(4)
}
for执行顺序:1-2-3-4-2-3-4-2-3-4-2-3-4-2不满足为止跳出循环,继续往下执行。
while循环:不知重复次数但是已知结束条件的循环
while循环格式:
1.循环的初始化
while(2.循环的继续条件){
3.循环体
4.循环的步长
}
while(true){
1.循环初始化
2.循环的继续条件
3.循环体
4.循环的步长
}
注意:这么写while循环的话,逻辑上比较顺畅的,但是有危险,在于本身是死循环,需要在合适的时候用break关键字跳出循环
/*
死循环:循环一直不出来 CPU在一直执行循环体
for(;;){
System.out.println("for死循环");
}
while(true){ //此处必须写条件表达式
System.out.println("while死循环");
}
*/
while执行顺序:当程序遇到while关键字时,JVM首先会运算while后面的条件表达式,当条件表达式为true时,就会执行while后面大括号中的语句,当把大括号中的所有语句执行完之后,会又回到while的条件表达式处再次判断,若还为true,就继续执行大括号中的语句,若为false就跳过大括号中的所有语句,继续往下执行。
以上不是一个严格意思上的分类,无论是for还是while,在Java当中都是可以互换的!
循环的四要素:
1.循环初始化(指的就是循环从什么时候开始执行)
2.循环继续条件(什么情况循环继续执行/反过来说,循环何时结束)
3.循环体(就是我们需要被多次循环执行的代码块)
4.循环的周期,步长,间距(当前循环和下一次循环之间的变更)
举个栗子:
public class Test{
public static void main(String[] args){
for(int = 1;i <= 5;i++){
System.out.println("*");
}
}
}
public class Test{
public static void main(String[] args){
int i = 1;
while(i<6){
i=i+1;
System.out.println("*");
}
}
}
结果都是:
*
*
*
*
*
四、代码练习题
import java.util.Scanner;
public class Demo03_01{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.print("请输入三个数:");
double a = scanner.nextDouble();
double b = scanner.nextDouble();
double c = scanner.nextDouble();
double delt = b * b - 4 * a * c;
if(delt>0){
double r1 = (-b + Math.sqrt(delt)) / (2 * a);
double r2 = (-b - Math.sqrt(delt)) / (2 * a);
System.out.printf("r1 = %.2f,r2 = %.2f",r1,r2);
}else if(delt==0){
double r = -b / (2 * a);
System.out.printf("r = %.2f",r);
}else{
System.out.println("无实数解!");
}
}
}
import java.util.Scanner;
public class Demo03_03{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.print("输入今天是周几:");
int today = scanner.nextInt();
System.out.print("输入未来的几天:");
int future = scanner.nextInt();
int futureday = (today+future)%7;
String todaystr ="";
String futuredaystr ="";
if(today== 0){
todaystr="周日";
}else if(today== 1){
todaystr="周一";
}else if(today== 2){
todaystr="周二";
}else if(today== 3){
todaystr="周三";
}else if(today== 4){
todaystr="周四";
}else if(today== 5){
todaystr="周五";
}else if(today== 6){
todaystr="周六";
}
if(futureday== 0){
futuredaystr="周日";
}else if(futureday== 1){
futuredaystr="周一";
}else if(futureday== 2){
futuredaystr="周二";
}else if(futureday== 3){
futuredaystr="周三";
}else if(futureday== 4){
futuredaystr="周四";
}else if(futureday== 5){
futuredaystr="周五";
}else if(futureday== 6){
futuredaystr="周六";
}
System.out.println("今天是"+todaystr+",未来的"+future+"天后是"+futuredaystr);
}
}
/*
123
3 123%10
2 123/10%10
1 123/10/10
321==123?
3*100+2*10+1
(3*10+2)*10+1
(((0*10)+3)*10+2)*10+1
*/
import java.util.Scanner;
public class Demo03_04{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.print("请用户输入一个三位数:");
int num = scanner.nextInt();
int temp = num;
int sum = 0;
sum = (sum * 10) + num % 10 ;
num/=10;
sum = (sum * 10) + num % 10 ;
num/=10;
sum = (sum * 10) + num % 10 ;
num/=10;
if(sum == temp){
System.out.println("是回文");
}else{
System.out.println("不是回文");
}
}
}
import java.util.*;
class Demo03_06{
public static void main(String[] args){
//1.
Scanner scanner=new Scanner(System.in);
System.out.print("请输入 剪刀0 石头1 布2:");
int usr=scanner.nextInt();
//2.
Random random=new Random();
int com=random.nextInt(3);
//3.
String usrStr="";
String comStr="";
switch(usr){
case 0: //if usr==0
usrStr="剪刀";
break;
case 1:// if usr==1
usrStr="石头";
break;
case 2:// if usr==2
usrStr="布";
break;
}
switch(com){
case 0:
comStr="剪刀";
break;
case 1:
comStr="石头";
break;
case 2:
comStr="布";
break;
}
//3.
if(usr==com){
System.out.printf("用户是%s,电脑是%s,平局",usrStr,comStr);
}else if(usr==0&&com==2 || usr==1&&com==0 || usr==2&&com==1){
System.out.printf("用户是%s,电脑是%s,用户赢",usrStr,comStr);
}else{
System.out.printf("用户是%s,电脑是%s,用户输",usrStr,comStr);
}
}
}
import java.util.Scanner;
class Demo03_07{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
//1.先输入年份
System.out.print("请输入年份:");
int year=scanner.nextInt();
//2.输入月份 1月 2月分别用13 14代替 同时year-1
System.out.print("请输入月份:");
int month=scanner.nextInt();
//3.输入日期
System.out.print("请输入日期:");
int day=scanner.nextInt();
//4.对特殊的1月和2月做处理
if(month==1||month==2){
month+=12;
year-=1;
}
//5.套公式
int h=(day+26*(month+1)/10+year%100+year%100/4+year/100/4+5*year/100)%7;
switch(h){
case 0:
System.out.println("是周六");
break;
case 1:
System.out.println("是周日");
break;
case 2:
System.out.println("是周一");
break;
case 3:
System.out.println("是周二");
break;
case 4:
System.out.println("是周三");
break;
case 5:
System.out.println("是周四");
break;
case 6:
System.out.println("是周五");
break;
}
}
}
import java.util.Scanner;
class Demo03_09{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
//1.提示用户输入一个点的坐标
System.out.print("请输入一个坐标:");
double x=scanner.nextDouble();
double y=scanner.nextDouble();
//2.先大致判断一下坐标的范围
//3.再精确的判断坐标的范围
if(x>=0&&x<=200&&y<=-0.5*x+100){
System.out.println("点再三角形内");
}else{
System.out.println("点再三角形外");
}
}
}
import java.util.Scanner;
class Demo03_10{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
//1.先输入大矩形的中心,宽和高
System.out.print("请输入第1个矩形的信息:");
double x1=scanner.nextDouble();
double y1=scanner.nextDouble();
double w1=scanner.nextDouble();
double h1=scanner.nextDouble();
//2.再输入小矩形的中心,宽和高
System.out.print("请输入第2个矩形的信息:");
double x2=scanner.nextDouble();
double y2=scanner.nextDouble();
double w2=scanner.nextDouble();
double h2=scanner.nextDouble();
double inXMin=x1-(w1-w2)/2;
double inXMax=x1+(w1-w2)/2;
double inYMin=y1-(h1-h2)/2;
double inYMax=y1+(h1-h2)/2;
double outXMin=x1-(w1+w2)/2;
double outXMax=x1+(w1+w2)/2;
double outYMin=y1-(h1+h2)/2;
double outYMax=y1+(h1+h2)/2;
if(x2>=inXMin&&x2<=inXMax&&y2>=inYMin&&y2<=inYMax){
System.out.println("小矩形在大矩形里面!");
}else if(x2<=outXMin||x2>=outXMax||y2<=outYMin||y2>=outYMax){
System.out.println("小矩形在大矩形外面!");
}else{
System.out.println("小矩形和大矩形相交!");
}
}
}
遇到与以上两个题类似的问题时,一般先找极限条件。
像三角形那道题,首先看到坐标系会想到用线性规划来做,先把三角形的斜边当做直线写出一个方程(y=-0.5x+100),极限横坐标就是(x1=0,x2=200)所以可以确定x的定义域(0<= x <=200),从而得出若(y<=-0.5x+100)则在三角形内。
对于矩形这道题比较复杂,放在平面上看不太好考虑,所以选择放在数轴上,极限条件就是某一个直角边刚好重合。从而根据四个小矩形确定出来一个大矩形(此矩形是在极限条件下确定出来的,它一旦变化就会改变小矩形与大矩形的位置关系,所以根据边中点的坐标来做条件表达式)如下图所示:
这里开始接触到循环(注意break要放到合适的位置,如果出现死循环可以按Ctrl+c结束循环)
import java.util.Scanner;
/*
输入一个数字
再判断数字是否为0
如果为0则退出
不是则继续
*/
class Demo03_11{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
double sum=0; //总和
int positives=0; //正数的个数
int negatives=0; //负数的个数
System.out.print("请输入若干数字:");
while(true){//不管三七二十一 先进来再说
int num=scanner.nextInt();
if(num!=0){
sum+=num;
if(num>0){
positives++;
}else{
negatives++;
}
}else{
break; //跳出当前循环
}
}
if(positives+negatives==0){
System.out.println("没有其他数字的输入,除了0");
}else{
System.out.println("正数的个数"+positives);
System.out.println("负数的个数"+negatives);
System.out.println("总和"+sum);
System.out.println("平均值"+sum/(positives+negatives));
}
}
}
import java.util.Scanner;
class Demo03_12{
/*
21 42
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16~21
3 7
*/
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
//1.输入两个数字
System.out.print("请输入两个数字:");
int n1=scanner.nextInt();
int n2=scanner.nextInt();
int gcd=1;
for(int i=n1<n2?n1:n2;i>=1;i--){
if(n1%i==0&&n2%i==0){
gcd=i;
break;
}
}
System.out.println(gcd);
}
}
/*
120 2~120 ->2
60 2~60 ->2
30 2~30 ->2
15 2~15 ->3
5 2~5 ->5
1
*/
import java.util.Scanner;
class Demo03_13{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("请输入一个数字:");
int num=scanner.nextInt();
while(true){
for(int i=2;i<=num;i++){
if(num%i==0){
System.out.print(i+" ");
num=num/i;
break;
}
}
if(num==1){
break;
}
}
}
}
打印金字塔图案的题(3.14、3.16)(一般都利用绝对值来做)
/*
4 3 2 1 2 3 4
-3 -2 -2 0 1 2 3
第4行 x∈[-3,3] y=|x|+1
第5行 x∈[-4,4] y=|x|+1
*/
import java.util.Scanner;
class Demo03_14{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("请输入行数:");
int line=scanner.nextInt();
for(int i=1;i<=line;i++){
for(int k=1;k<=(line-i);k++){
if(line<10){
System.out.print(" ");
}else{
System.out.print(" ");
}
}
for(int x=-(i-1);x<=i-1;x++){
if(line<10){
System.out.printf("%-2d",Math.abs(x)+1);
}else{
System.out.printf("%-3d",Math.abs(x)+1);
}
}
System.out.println();
}
}
}
class Demo03_15{
public static void main(String[] args){
for(int i=1;i<=6;i++){
for(int j=1;j<=i;j++){
System.out.print(j+" ");
}
System.out.println();
}
System.out.println("==========");
for(int i=1;i<=6;i++){
for(int j=1;j<=7-i;j++){
System.out.print(j+" ");
}
System.out.println();
}
System.out.println("==========");
for(int i=1;i<=6;i++){
for(int k=1;k<=6-i;k++){
System.out.print(" ");
}
for(int j=i;j>=1;j--){
System.out.print(j+" ");
}
System.out.println();
}
System.out.println("==========");
for(int i=1;i<=6;i++){
for(int k=1;k<=i-1;k++){
System.out.print(" ");
}
for(int j=1;j<=7-i;j++){
System.out.print(j+" ");
}
System.out.println();
}
}
}
/*
第4行
1 2 4 8 4 2 1
0 1 2 3 2 1 0
x -3 -2 -1 0 1 2 3
第5行
1 2 4 8 16 8 4 2 1
0 1 2 3 4 3 2 1 0
x -4-3-2-1 0 1 2 3 4
*/
class Demo03_16{
public static void main(String[] args){
for(int i=1;i<=8;i++){
for(int k=1;k<=8-i;k++){
System.out.print(" ");
}
for(int x=-(i-1);x<=i-1;x++){
System.out.printf("%4d",(int)Math.pow(2,i-1-Math.abs(x)));
}
System.out.println();
}
}
}
/*
对于打印一些对称性的三角形图案或者是类似的问题
尽量向绝对值考虑
*/