这是自己写的家庭经济收入支出情况
改进后的: import java.util.Scanner;//未考虑界面是循环的 class MoneyDetails { public static void main(String[] args) { String details1 = "";//先要设置才有下面的details+= 这里只说了收入没有支出的+= int shouruj=0,zhichuj=0; String shourus="无",zhichus="无"; int money=10000;
while (true)//★
{
Scanner scan = new Scanner(System.in);
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): _");//不加ln
//char key = Utility.readMenuSelection();//★应该与System有点像
int key = scan.nextInt();
System.out.println();
switch (key)
{
case 2:
//case '2'://''重要
System.out.print("本次收入金额:");
shouruj = scan.nextInt();
System.out.print("本次收入说明:");
shourus = scan.next();
money=money+shouruj;
details1 += "收入 "+money+" "+shouruj+" "+shourus+"\n";//★正因为+=所以才有收入一条条出现
break;
case 3:
System.out.print("本次支出金额:");
zhichuj = scan.nextInt();
System.out.print("本次支出说明:");
zhichus = scan.next();
money=money-zhichuj;
break;
case 1:
System.out.println("----------------当前收支明细记录----------------");
System.out.println("收支 账户金额 收支金额 说 明");
System.out.println(details1);
System.out.println("支出 "+money+" "+zhichuj+" "+zhichus);
break;
case 4:
System.out.print("确认是否退出(Y/N):_");
String tui = scan.next();
if (tui.equals("y"))//注意这里是""因为是string
{
return;
}else{
continue;
}
default:
System.out.println("请重新输入");
break;
} }
}
}
未用Utility因为这是他自己写的,还是不用为好
break结束当前switch或者全部循环,当for中有switch时结束的时switch for进行下一次循环
包名小写
f11快捷运行,java项目最开头必须有 package 包名;
静态初始化:int[] ids = new int[]{1,2,3}
动态:int[] ids = new int[5] (未赋值) 通过记Scanner得方法记
但是通过 int[] a ={1,2}更加方便与c相似理解为一个数组a
int[] b=a b数组等于a数组但是 a和b共享所以b得变化就是
a得变化 (内存使用权共享)只对于引用数据类型有效 a.length是a数组得长度与python中得 len(a)不同
a.length可以理解为a的属性长度
通过ctrl shift / \ 四个键可以快速进行多行的注释
引用的时候和c是一样的
数组的未初始化是为 0 0.0 char的数组也是0 String 为 null想象前面三个都是0这种情况是null(空)的
main方法中的都是局部变量在栈中
堆heap:new出来的对象,数组(???)
int[] a = new int[]{1,2,3}
左边的在栈中其首地址为右边的堆中的首地址,左边的值也来自右边的堆中,如果左边不指向右边而指向其它的堆(或者左边消失例如main方法执行完毕),那么堆中的右边数据会被当成垃圾回收,
String str=""
str+=a[i]这样可以把a中每一个数字组成一串数字
快捷键:shift 加回车 不管在语句哪个位置都可以换行到下一行 ctrl+shift+回车是到上一行
package com.atguigu.contact; import java.util.Scanner;
public class HelloWorld { public static void main(String[] args) { int[] a =new int[5];
Scanner scan = new Scanner(System.in);
System.out.println("请输入人数:"); int i =scan.nextInt();
System.out.println("请输入成绩:");
for (int j =0;j<i;j++)
{
a[j] = scan.nextInt();//不熟悉
}
int max = a[0];
for (int j =1;j<i;j++)
{
if(max<a[j])
{
max=a[j];
}
}
System.out.println("最高分是:"+max);
for (int j =0;j<i;j++)
{
char ch;
if(a[j]>=max-10)
{
ch='A';
}else if(a[j]>=max-20)
{
ch='B';
}else if(a[j]>=max-30)
{
ch='C';
}else
{
ch='D';
}
System.out.println("student "+j+" score is "+a[j] grade is "+ch);//★ } }
}
这个是判断谁是最高分然后并且以最高分划分等级
int[][][ ]【】a=new int[2]【】这个可以也可以两个都写但前面哪个必须写
★数组在java中和c语言中的区别:www.cnblogs.com/tfxz/p/1262…
int[]【】 a = new int[3]【2】这时全部为0
.。。。。。。。。。[3]【】这时输出会报错,因为没有列要现有列才能付0
二维数组不能{1,2,3}要{{2},{3},{4}}才行
b[0] b[1]代表的是第一行第二行中的具体数据
二维数组还是.length b[0].length=2 ,二维数组列不一定要相同
[^]:
这是遍历
数组都是先得到堆中的地址,在得到堆中的值
队列与栈的区别队列有入口与出口 先入的先出
int[] x,y[]
★这里y时二维数组
冒泡排序 i<.length-1,j=i j<.length
★问题:为什么第二次用i 要重新int i??
int[] arr = new int[6];
for (int i = 0; i < arr.length; i++) {// [0,1) [0,30) [1,31)
arr[i] = (int) (Math.random() * 30) + 1;
for (int j = 0; j < i; j++) {
if (arr[i] == arr[j]) {
i--;//★这里是不满足条件直接排除
break;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.*out*.println(arr[i]);
}
}
}
这个是求1-30的6个随机数且不重复
回形数:行列相同 例如:123
894
765
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
array 1 = array 2 1和2地址相同所以 1和2变为和2一样的数组
真正的赋值是 int[] array1 = new int[array2.length]
再通过for循环将数据录入array1
快捷键
syso (m,n)m到n只需要table ctrl+x为剪切
这里是false因为地址不同 ==改为=异常发生
package com.atguigu.contact;
class ArraryTest { public static void main(String[] args) { int found=2; int[] a1 = new int[]{1,2,3,4,5}; int num = (int)((a1.length-1)/2);//2
while (a1[num]!=found) { if(a1[num]>found)//在后面 { num = (int) num/2; System.out.println("y"); break; }else if(a1[num]<found) { num=(int)(num+a1.length-1)/2; }
}
System.out.println("true");
}
}
这是二分法这个举个例子应该就可以推出来了。。。(然而这个有结构可以直接调用,熟悉就行,下次应该看是否应该掌握才决定是否写)
内部排序 用内存 外部排序 用磁盘(外部存储器因数据量太多)
快排:
冒泡是从一个方向到另一个方向 重复多次
快排是第一个数字不同 再取左右两个方向 向中间走 重复多次
冒泡的时间复杂度(平均)n² (n-1)*(n-i)
快排 nlog2 n 2 的x次方=n 解出x
上面记得有import java.util.Arrays(与Scanner一样)
★注意()里面没有int这些数据类型,Arrays.toString(a)要输出
负的就是未找到
NullPointeerException 空指针意味找的元素没有具体的值连null 0都不是
面向过程:强调的是函数的功能即做了些什么例如把冰箱打开,将大象放入冰箱,关闭冰箱
面向对象:是哪些对象具体做了哪些功能(不是特别懂两个的区别)
打个比方 过程就像大家一起做一件事没有分工 而对象就是每个人有自己的管理,工作的具体区域,流程化
我开车去丽江 我,车是类后面写功能即方法(一般为动作例如这里的开)
说白了类是宏观,方法是这个类的一些行为
类和对象是面向对象的核心概念
面向对象重点是类的设计 设计类就是设计类的成员
类的成员:1 属性:成员变量(全局变量,不在main中)想象游戏里的属性都有名字人有身高体重等属性 2行为:方法(函数)即定义功能 人有打球等行为
类的实例化(如何用之前的类)就是创建对象
package com.atguigu.contact; import java.util.Arrays; class Person { int age; int weight=60; public void sleep() { System.out.println("人可以睡觉"); } public void speak(String a)//这里和c一样 { System.out.println("人可以说"+a); }
} class PersonTest { public static void main(String[] args) { Person p = new Person(); //Scanner scan=new Scanner(System.in);两者都是创建对象其实Scanner和Person都是已经定义好了的函数现在只是调用 //创建一个p来当作新的Person来是试用(创建对象) p.age=19;//★主要是赋值和调用成员变量//对象.属性(行为)为调用对象 p.sleep(); p.speak("Chinese"); }
}