java学习笔记(3)

目录

项目一和数组

一、break和continue的补充

continue语句

return语句

二、练习

(1)题目:输出100以内的质数;

(2)找到1000以内的所有完数;

三、项目一:家庭收支记账软件

四、数组

(1)数组的概述

(2)一维数组

(3)二维数组

五、补充


项目一和数组

一、break和continue的补充

continue语句

>continue只能使用在循环结构中;

>continue语句用于跳过其所在循环语句的一次执行,继续下一次循环;

>continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是那一层循环

continue语句用法举例:

public class ContinueTest{
    public static void main(String arg[]){
       for(int i=0;i<100;i++){
            if(i%10==0)
                  continue;
            System.out.println(i);
       }
    }

}


return语句

>return语句并非专门用于结束循环的,它的功能是结束一个方法;当一个方法执行到一个return语句时,这个方法将被结束。

>与break和continue语句不同的是,return直接结束整个方法,不管这个return处于多少层循环之内。

二、练习

(1)题目:输出100以内的质数;

普通代码:

public class TestProject {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        for (int i = 2; i <= 100; i++) {  //遍历100以内的自然数
            boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值
            for (int j = 2; j < i; j++) {
                if (i % j == 0)//i被j除尽
                    isFlag = false;
            }
            if (isFlag == true)//判断标识
                System.out.println(i);
        }

    }
}

改进代码1:(使用Math.sqrt()和break)

public class TestProject {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值
        for (int i = 2; i <= 100; i++) {  //遍历100以内的自然数
            for (int j = 2; j < =Math.sqrt(i); j++) {//优化2:对本身是质数的自然数是有效的
                if (i % j == 0){//i被j除尽
                    isFlag = false;
                    break;//优化1:只对本身非质数的自然数是有效的
                }
            }
            if (isFlag == true){//判断标识
                System.out.println(i);
               }
                  isFlag=true;
        }
    }
}

改进代码2:(使用标签和continue)

public class TestProject {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
       label: for (int i = 2; i <= 100; i++) {  //遍历100以内的自然数
            for (int j = 2; j < =Math.sqrt(i); j++) {//优化2:对本身是质数的自然数是有效的
                if (i % j == 0){//i被j除尽
                   continue label;
                }
            }
        }
    }

(2)找到1000以内的所有完数;

完数:一个数如果恰好等于它的因子之和。(6=1+2+3)

代码:

int factor = 0;
        for (int i = 1; i <= 1000; i++) {
            for (int j = 1; j <= i / 2; j++) {
                if (i % j == 0) {
                    factor += j;
                }
            }
            if (i == factor) {
                System.out.println(i);
            }
            factor = 0;
        }

三、项目一:家庭收支记账软件

目标:

需求说明:

Utility类(功能类)

import java.util.Scanner;

public class Utility {
    private static Scanner input=new Scanner(System. in);
    //用于界面菜单的选择。
    public static char readMenuSelection(){
        char c;
        for( ; ; ){
            String str = readKeyBoard(1);
            c=str.charAt(0);
            if(c!='1'&&c!='2'&&c!='3'&&c!='4'){
                System.out.print("选择错误,请重新输入:");
            }else break;
        }
        return c;
    }
    //用于收入和支出金额的输入
    public static int readNumber(){
        int n;
        for(; ; ){
            String str=readKeyBoard(4);
            try{
                n=Integer.parseInt(str);
                break;
            }catch (NumberFormatException e){
                System.out.print("数字输入错误,请重新输入:");
            }
        }
        return n;
    }
    //用于收入和支出说明的输入
    public static String readString(){
        String str=readKeyBoard(8);
        return str;
    }
    //用于确认选择的输入
    public static char readConfirmSelection(){
        char c;
        for(; ; ){
            String str=readKeyBoard(1).toUpperCase();
            c=str.charAt(0);
            if(c=='Y'||c=='N'){
                break;
            }else{
                System.out.print("选择错误,请重新输入:");
            }
        }
        return c;
    }
private static String readKeyBoard(int limit){
        String line="";
        while(input.hasNext()){
            line=input.nextLine();
            if(line.length()<1||line.length()>limit){
                System.out.print("输入长度(不大于"+limit+")错误,请重新输入:");
                continue;
            }
            else break;
         }
        return line;
}
}

 FamilyAccount类

public class FamilyAccount {
    public static void main(String[] args) {
        boolean isFlag = true;
        //用于记录用户的收入和支出情况
        String details = "收支\t\t账户金额\t\t收支金额\t\t\t说       明\n";
        int balance = 10000;
        while (isFlag) {
            System.out.println("------------------------家庭收支记账软件------------------------");
            System.out.println("                        1.收支明细");
            System.out.println("                        2.登记收入");
            System.out.println("                        3.登记支出");
            System.out.println("                        4.退出\n");
            System.out.print("                        请选择<1—4>:");
            //获取用户的选择
            char selection = Utility.readMenuSelection();
            switch (selection) {
                case '1':
                    //System.out.println("1.收支明细");
                    System.out.println("------------------------当前收支明细记录------------------------");
                    System.out.println(details);
                    System.out.println("-------------------------------------------------------------");
                    break;
                case '2':
                    //System.out.println("2.登记收入");
                    System.out.print("本次收入金额:");
                    int addmoney = Utility.readNumber();
                    System.out.print("本次收入说明:");
                    String addinfo = Utility.readString();
                    //处理balance
                    balance += addmoney;
                    //处理details
                    details += ("收入\t\t" + balance + "\t\t" + "+" + addmoney + "\t\t\t\t" + addinfo + "\n");
                    System.out.println("---------------------------登记完成---------------------------\n");
                    break;
                case '3':
                    //System.out.println("3.登记支出");
                    System.out.print("本次支出金额:");
                    int minusmoney = Utility.readNumber();
                    System.out.print("本次支出说明:");
                    String minusinfo = Utility.readString();
                    //处理balance
                    if (balance >= minusmoney) {
                        balance -= minusmoney;
                        //处理details
                        details += ("支出\t\t" + balance + "\t\t" + "-" + minusmoney + "\t\t\t\t" + minusinfo + "\n");
                    } else {
                        System.out.println("支出超过账户额度,支付失败");
                    }
                    System.out.println("---------------------------登记完成---------------------------\n");
                    break;
                case '4':
                    //System.out.println("4.退   出");
                    System.out.print("是否退出(Y/N):");
                    char isExit = Utility.readConfirmSelection();
                    if (isExit == 'Y') {
                        isFlag = false;
                    }
                    //break;
            }
        }
    }
}

四、数组

(1)数组的概述

①数组(Array):数组是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过标号的方式对这些数据进行统一管理。

②数组相关概念

>数组名

>元素

>角标、下标、索引

>数组的长度:元素的个数

③数组的特点:

>数组是有序排列的;

>数组属于引用数据类型的表量。数组的元素既可以是基本数据类型,也可以是引用数据类型。

 >创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址。

>数组的长度一旦确定,就不能修改。

>可以直接通过下表(或索引)的方式调用指定位置的元素,速度很快。

④数组的分类

>按照维数:一维数组、二维数组、三维数组、......

>按照数组元素的类型:基本数据类型的数组、引用数据类型元素的数组(对象数组)

(2)一维数组

①一维数组的声明和初始化

//静态初始化:数组的初始化和数组元素的赋值操作同时进行。
int[] ids;//声明
ids = new int []{1000,1001,1002,1003};

//动态初始化:数组的初始化和数组元素的赋值操作分开进行。
String[] str = new String[5];

②如何调用数组的指定位置的元素

>t通过角标的方式调用。数组的角标(或索引)从0开始,到数组长度-1结束。

str[0]="张三";
str[1]="李四";
str[2]="王五";
str[3]="刘六";
str[4]="黄七";

 ③如何获取数组的长度

//属性length
System.out.println(str.length);

//5

④如何遍历数组

for(int i=0;i<str.length;i++)
{
System.out.println(str[i]);
}

//张三
//李四
//王五
//刘六
//黄七

⑤数组元素的默认初始化值

>整型数组元素:0

>浮点型数组元素:0.0

>字符型数组元素:0或者'\u0000',而非'0';

>Boolean型数组:false;

>引用数据类型数组:NULL;

//整型数组
int[] n = new int[4];
for(int i = 0;i<n.length;i++)
{
System.out.print(n[i]+" ");
}

//0 0 0 0

//浮点型数组
float[] f = new float[4];
for(int i = 0;i<f.length;i++)
{
System.out.print(str[i]+" ");
}

//0.0 0.0 0.0 0.0

//字符型数组
char[] c = new char[4];
for(int i = 0;i<c.length;i++)
{
System.out.print(c[i]+" ");
}

//0 0 0 0 

//布尔型数组
boolean[] b = new boolean[4];
for(int i = 0;i<b.length;i++)
{
System.out.print(b[i]+" ");
}

//false false false false

//引用数据类型数组
String[] s = new String[4];
System.out.print(s[i]+" ");

//null null null null

⑥数组的内存解析

 栈内存:存储基本数据类型的值和引用数据类型的引用(地址);存储局部变量;

堆内存:存储使用new关键字创建的对象和引用数据类型的具体属性值;存储成员变量;

方法区:存储方法和静态变量

(3)二维数组

①二维数组的声明和初始化

//静态初始化
int[] arr = new int[]{{1,2,3},{4,5},{6,7,8}};
//动态初始化1
String[][] arr2 = new String[3][2];
//动态初始化2
String[][] arr3 = new String[3][];

int[] arr4[] = new int[][]{{1,2,3},{4,5,9,10},{6,7,8}};
int[] arr5[] = {{1,2,3},{4,5},{6,7,8}};

②如何调用数组的指定位置的元素

System.out.println(arr1[0][1]);//2
System.out.println(arr2[1][1]);//null
arr3[1] = new String[4];
System.out.println(arr3[1][0]);

③获取数组的长度

System.out.println(arr4.length);//3
System.out.println(arr4[0].length);//3
System.out.println(arr4[1].length);//2

 ④如何遍历二维数组

 二维数组的使用:

规定:二维数组分为外层数组的元素,内层数组的元素

int[][] arr = new int[4][3];

外层元素:arr[0],arr[1]等

内层元素:arr[0][0],arr[1][2]等

for(int i = 0;i<arr4.length;i++)
{
for(int j=0;j<arr4[i].length;j++)
{
System.out.println(arr4[i][j]+" ");
}
System.out.println();
}

 ⑤数组元素的默认初始化值

>针对初始化方式一:比如int[][] arr = new int[4][3];

外层元素的初始化值为:地址值;

内层元素的初始化值为,与一维数组初始化情况相同;

>针对初始化方式二,比如int[][] arr = new int[4][];

外层元素的初始化值为:null;

内层元素的初始化值为:不能调用,否则报错。

⑥数组的内存解析

 

五、补充

1.衡量一个功能代码的优劣

>正确性

>可读性

>健壮性

>高效率与低存储:时间复杂度、空间复杂度(衡量算法的好坏)

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值