Java基础1
whitch
- break,可以使用在switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构
- switch结构中的表达式,只能是如下的6种数据类型之一:
byte . short、char、int、枚举类型(JDK5.0新增)、String类型(JDK7.0新增) - case 之后只能声明常量。不能声明范围。
- break关键字是可选的。
- default也是可选的,位置随机但一般放后面
- 如某switch-case结构中的多个case的执行语句相同,则可以考虑进行合并
package com.xin.base;
import java.util.Scanner;
public class Day71300 {
//从键盘上输入2019年的"“month”和“day”,要求通过程序输出输入的日期为2019年的第几天。
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入月份");
int month = scanner.nextInt();
System.out.println("请输入月份的天数");
int day = scanner.nextInt();
scanner.close();
int sumDays=0;
switch (month) {//月份倒写,不写break,利用穿透,
case 12:
sumDays += 30;//写法要简单
case 11:
sumDays = sumDays+ 31;
case 10:
sumDays = sumDays+ 30;
case 9:
sumDays = sumDays+31;
case 8:
sumDays = sumDays+31;
case 7:
sumDays = sumDays+ 30;
case 6:
sumDays = sumDays+ 31;
case 5:
sumDays = sumDays+ 30;
case 4:
sumDays = sumDays+ 31;
case 3:
sumDays = sumDays+28;
case 2:
sumDays = sumDays+31 ;
case 1:
sumDays = sumDays+day;
break;
default:
System.out.println("输入错误");
}
System.out.println("总天数是"+sumDays);
}
}
输出1到100中所有的质数
package com.xin.base;
public class Day71301 {
public static void main(String[] args) {
//输出1到100中所有的质数
boolean isFlag=true;
for (int i = 2; i < 101; i++) {//遍历1-100
for (int j = 2; j <i; j++) {//对比所有被除数2-i//并不能用i/2,会直接跳出,也不能用=,这样质数也被包含在内
if (i%j==0){//i被j除尽,不是
isFlag=false;
}
}
if (isFlag){
System.out.println(i);
}
isFlag=true;
}
}
}
输出1到10000中所有的质数,优化
package com.xin.base;
public class Day71301 {
public static void main(String[] args) {
//输出1到100中所有的质数
boolean isFlag=true;
int count=0;
//获取当前时间距离1970-1-1 00:00:00的毫秒数
long start=System.currentTimeMillis();
for (int i = 2; i < 100000; i++) {//遍历1-100
for (int j = 2; j <=Math.sqrt(i); j++) {//优化2:对本身的质数的自然数有效8>>3
if (i%j==0){//i被j除尽,不是
isFlag=false;
break;//优化1:只对本身是非质数的自然数是有效的8>>5
}
}
if (isFlag){
//System.out.println(i);
count++;
}
isFlag=true;
}
//获取当前时间距离1970-1-1 00:00:00的毫秒数
long end=System.currentTimeMillis();
System.out.println("所花费的时间为"+(end-start));
System.out.println(count);
}
}
输出1到10000中所有的质数,优化lable
package com.xin.base;
public class Day71400 {
public static void main(String[] args) {
//输出1到100000中所有的质数
int count=0;
//获取当前时间距离1970-1-1 00:00:00的毫秒数
long start=System.currentTimeMillis();
lable:for (int i = 2; i < 100000; i++) {//遍历1-100
for (int j = 2; j <=Math.sqrt(i); j++) {//优化2:对本身的质数的自然数有效8>>3
if (i%j==0){//i被j除尽,不是
continue lable;
}
}
count++;
}
//获取当前时间距离1970-1-1 00:00:00的毫秒数
long end=System.currentTimeMillis();
System.out.println("所花费的时间为"+(end-start));
System.out.println(count);
}
}
家庭收支记账软件
package com.xin.base;
import java.util.Scanner;
public class Day71401 {
//家庭收支记账软件
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] IAE=new String[99];//收支
int[] money=new int[99];//账户金额
int[] IAEMoney=new int[99];//收支金额
String[] explain=new String[99];//说明
int sum=0;//存储次数
//基础数据放在循环前面,防止重置
lable:while (true){
System.out.println("-----------家庭收支记账软件-----------");
System.out.println("1.收支明细");
System.out.println("2.登记收入");
System.out.println("3.登记支出");
System.out.println("4.退出");
System.out.println("请选择【1-4】:");//每次循环都需要的放在循环中的上位
int select=scanner.nextInt();
switch (select) {
case 1://查看收支
System.out.println("----------当前收支明细记录----------");
System.out.println("收支 账户金额 收支金额 说明 ");
for (int i = 1; i <= sum; i++) {
System.out.println(IAE[i] + " " + money[i] + " " + IAEMoney[i] + " " + explain[i]);
}
break;
case 2://增加收入情况
sum++;
System.out.println("本次收入金额:");
IAE[sum] = "收入";
IAEMoney[sum] = scanner.nextInt();
money[sum] = money[sum - 1] + IAEMoney[sum];
System.out.println("本次收入说明:");
explain[sum] = scanner.next();
break;
case 3://增加支出情况
sum++;
System.out.println("本次支出金额:");
IAE[sum] = "支出";
IAEMoney[sum] = scanner.nextInt();
money[sum] = money[sum - 1] - IAEMoney[sum];
System.out.println("本次支出说明:");
explain[sum] = scanner.next();
break;
case 4://是否退出程序
System.out.println("是否选择退出(y,n)");
while (true) {
String quit = scanner.next();
if (quit.equals("y")) {
break lable;
} else if (quit.equals("n")) {
continue lable;
} else {
System.out.println("输入错误,请重新输入:");
continue;
}
}
default:
System.out.println("输入错误,请重输");
}
}
}
}
补充:衡量一个功能代码的优劣:
-
正确性
-
可读性
-
健壮性
-
高效率与低存储
数据结构:
1.数据与数据之间的逻辑关系:集合、一对一、一对多、多对多
2.数据的存储结构:
线性表:顺序表(比如:数组)、链表、栈、队列
树形结构:二叉树
图形结构
算法:
排序算法:
搜索算法:
使用二维数组打印一个1行杨辉三角。
【提示】
1.第一行有1个元素,第n行有n个元素
2.每一行的第一个元素和最后一个元素都是1
3.从第三行开始,对于非第一个元素和最后一个元素的元素。即:
yanghui[i][]=yanghui[i-1][j-1] + vanghui.[i-1][j];
package com.xin.base;
import java.util.Arrays;
public class Day71500 {
//杨辉三角000
public static void main(String[] args) {
int[][] a=new int[10][10];
for (int i = 0; i < 10; i++) {
a[i][0]=1;
for (int j = 1; j < 10; j++) {
if (i==j){
a[i][j]=1;
}else if (i>0){
a[i][j]=a[i-1][j-1]+a[i-1][j];
}else {
// continue;
}
}
}
for (int[] b:a) {
System.out.println(Arrays.toString(b));
}
}
}
标答
package com.xin.base;
public class Day71501 {
public static void main(String[] args) {
//1.声明并初始化二维数组
int[][] yanghui=new int[10][];
//2.给数组元素赋值,每列个数不一样
for (int i = 0; i < yanghui.length; i++) {
yanghui[i]=new int[i+1];//给1维数组新建数组
//2.1给首末元素赋值
yanghui[i][0]=1;
yanghui[i][i]=1;
//2.2给每行的非首末元素赋值
if (i>0){
for (int j = 1; j <yanghui[i].length-1; j++) {
yanghui[i][j]=yanghui[i-1][j-1]+yanghui[i-1][j];
}
}
}
//3.遍历二维数组
for (int i = 0; i < yanghui.length ; i++) {
for (int j = 0; j < yanghui[i].length; j++) {
System.out.print(yanghui[i][j]+" ");
}
System.out.println();
}
}
}
感悟
- 要有整体的逻辑框架
- 不必直接思考核心元素,先搭好框架
- 把必要的步骤写出来,逻辑分开,不要揉在一团
回形针
package com.xin.base;
import java.util.Scanner;
public class Day71503 {
/*
* 回形针填数的实现
* 回形针填数实现需要用到二维数组
*
*/
public static void main(String[] args) {
// 先确定要输入的回形针长度
Scanner scanner=new Scanner(System.in);
System.out.println("请输入回形针的长度");
int len =scanner.nextInt();
// 定义一个二维数组
int arr1[][]=new int [len][len];
int number=0;//回形针中要现实的数据
int maxx=len-1;//横向最大长度
int maxy=len-1;//纵向最大值
int minx=0;//横向最小值
int miny=0;//纵向最小值
while(minx<=maxx) {//判断条件为最小值循环自加后是否等于最大值,以此来作为构造回形针结束的依据
for(int m=minx;m<=maxx;m++) {//开始向右横向走
arr1[minx][m]=++number;//利用++运算符进行自加后赋值给数组
}
miny++;
for(int m=miny;m<=maxy;m++) {//再向下纵向走
arr1[m][maxy]=++number;
}
maxx--;
for(int x=maxx;x>=minx;x--) {//再向左横向走
arr1[maxy][x]=++number;
}
maxy--;
for(int m=maxy;m>=miny;m--) {//在向上纵向走,完成一次循环。
arr1[m][minx]=++number;
}
minx++;
}
// 遍历数组arr1
for(int i=0;i<arr1.length;i++) {
for(int j=0;j<arr1[i].length;j++) {
System.out.print(arr1[i][j]+"\t");
}
System.out.println();//打印完一行后换行
}
}
}
array1=array2
array1和array2地址值相同,都指向了堆空间的唯一的一个数组实体。
数组复制
string[] arr1 =new String[arr.length];
for(int i = 0;i <arr1 .length;i++){
arr1[i] = arr[i];
}
二分法查找:
前提:所要查找的数组必须有序。
package com.xin.base;
public class Day71504 {
public static void main(String[] args) {
int[] arr={-98,-34,2,34,54,66,79,105,210,333};
int dest=4;
int head=0;//初始的首索引
int end=arr.length-1;//初始的末索引
boolean isFlag=true;
while(head<=end){
int middle=(head+end)/2;
if (dest==arr[middle]){
System.out.println("找到了指定的元素,位置为:"+middle);
isFlag=false;
break;
}else if (arr[middle]>dest){
end=middle-1;
}else {
head=middle+1;
}
}
if (isFlag){
System.out.println("很遗憾,没有找到");
}
}
}
排序
- 冒泡排序
- 快速排序
排序思想:
1.从数列中挑出一个元素,称为"基准”( pivot) ,
2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准
值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数
列排序。
4.递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好
了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代( iteration)中,它至少会把一个元素摆到它最后的位置去。