目录
项目一和数组
一、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.衡量一个功能代码的优劣
>正确性
>可读性
>健壮性
>高效率与低存储:时间复杂度、空间复杂度(衡量算法的好坏)