今日目标:
数组
1.为什么使用数组?
1.什么是数组?:
一组类型相同的数据
为什么不能存放不同的数据类型?
每种数据类型在内存空间中占据的大小不同
2.为什么要用到数组?
业务所需,需要对多个同种数据类型的数据进行打包处理。
字符数组比较特殊,不能输出地址值,println会自动将字符转换为字符串输出
定义数组时会创建一个对象空间
int arr[] = new int[]{1,2,3};
int b[]=arr;
arr[1]=8;
System.out.println(b[1]);//8
方法里是形参,不会改变a的输出
public static void main(String[] args) {
int a=2;
fun(a);
System.out.println(a);//2
}
private static int fun(int a) {
a=10;
return a;
}
2.数组的使用步骤:
以上是基本使用步骤,有没有更简单的步骤?
1.边声明边赋值
private static void one() {
int arr1[];//定义
arr1=new int[7];//指定长度
int arr[]=new int[5];//定义加指定长度
arr[0]=1;// 赋值 1
arr[1]=2;
arr[2]=3;
arr[3]=4;
arr[4]=5;
int arr2[]=new int[]{1,2,3};//定义加指定长度加赋值
int arr3[]={2,4,5};//定义加指定长度加赋值 简写
/* for (int a:arr){
System.out.println(a);
}*/
}
foreach简化数组和集合的遍历
foreach的语句格式:
for(元素类型t 元素变量x : 遍历对象obj){
引用了x的java语句;
}
2.用户边输入边动态赋值:基本步骤
案例:输入5名学员的java成绩,并求出平均数。
public void test1() {
//定义并初始化一个数组
int arr[] = {2, 3, 1};
System.out.println("----1----排序前的一维数组");
for (int x : arr) {
System.out.println(x); //逐个输出数组元素的值
}
3.处理数据----增强型for
ForEach
数组赋值以后如何取出其中的每个数据呢?
案例:
打印数组中的每个数据?
普通for循环和增强for循环
4.栈内存和堆内存:
Int a=9;
都是用于存储数据的,栈:存储变量名,基本数据类型在常量池,不包括String
堆:存储引用数据类型:数组,集合,类(对象),接口
举例:
定义两个String,==比较
Next()Scanner中输入的String和定义的String不一样。
综合练习:
1.
private static void one() {
Scanner sc=new Scanner(System.in);
int a[]=new int[]{8,4,2,1,23,344,12};
int b=0;
System.out.print("数列的值分别为:");
for (int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
b+=a[i];
}
System.out.println("数列中所有数值的和为:"+b);
System.out.println("请输入一个数:");
int i1=sc.nextInt();
boolean a2=true;
for (int i=0;i<a.length;i++){
if (i1==a[i]){
System.out.println("数列中包含此数");
a2=false;
break;
}
}
if (a2){
System.out.println("数列中没有此数");
}
}
2.求最大最小值
打擂台原理
private static void two() {
Scanner sc=new Scanner(System.in);
int a[]=new int[]{8,4,2,1,23,344,12};
int max=a[0],min=a[0];
for (int i=1;i<a.length;i++){
max=max>a[i]?max:a[i];
min=min<a[i]?min:a[i];
}
System.out.println("最大值为:"+max);
System.out.println("最小值为:"+min);
}
3.排序,和插值
4.冒泡排序(明天讲)
学会调试程序
作业:
1.从键盘接受10个整数,求出其中的最大值和最小值。
private static void One() {
Scanner sc=new Scanner(System.in);
System.out.println("请输入你想要输入十个的数字(正整数):");
int a[]=new int[10];
int max;
int min;
for (int i=0;i<=(a.length-1);i++){
a[i]=sc.nextInt();
}
max=a[0];
min=a[0];
System.out.println("你输入的十个数分别为:");
for (int i=0;i<=a.length-1;i++){
max=max>a[i]?max:a[i];
min=min<a[i]?min:a[i];
System.out.print(a[i]+" ");
}
System.out.println();//换行
System.out.println("你输入的最大值为:"+max+" 最小值为:"+min);
}
2.输入10个数,保存在一个数组中,在数组中查找某个数字,给出是否找到信息,如果找到了输出该数在数组中所处的位置,如果找不到输出“找不到”
private static void Two() {
Scanner sc = new Scanner(System.in);
System.out.println("请输入你想要输入十个的数字(正整数):");
int a[] = new int[10];
for (int i = 0; i <= (a.length - 1); i++) {
a[i] = sc.nextInt();
}
System.out.println("请输入你要查找的数字(正整数):");
int b = sc.nextInt();
boolean c=true;
for (int i = 0; i < a.length - 1; i++) {
if (a[i] == b) {
System.out.println("找到了,在数组的中的第"+(i+1)+"位");
c=false;
break;
}
}
if(c){
System.out.println("找不到");
}
}
3.将一个数组中的元素逆序输出,即第一个元素和最后一个元素交换,第二个数与倒数第二元素交换……,例如:原数组为:9 2 5 7 8,逆序后的数组为:8 7 5 2 9
private static void three() {
int a[]=new int[]{8,4,2,1,23,344,12};
int b[]=new int[]{8,4,2,1,23,344,12,20};
for(int i=0;i<a.length/2;i++){
int c=a[i];
a[i]=a[a.length-1-i];
a[a.length-1-i]=c;
}
for(int i=0;i<b.length/2;i++){
int c=b[i];
b[i]=b[b.length-1-i];
b[b.length-1-i]=c;
}
System.out.println("交换后的数为:");
for (int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println("");
for (int i=0;i<b.length;i++){
System.out.print(b[i]+" ");
}
}
4.顾客从超市采购了10件商品,编写一个程序,用于接受每件商品的价格,计算应付的总金额。并分别打印出各个商品的价格以及应付的总金额的小票。
private static void four() {
String a[]={"鸡蛋","牛奶","饼干","矿泉水"
,"杯子","洗发精","沐浴露","牙刷","牙膏","鱼"};
Scanner sc=new Scanner(System.in);
double b[]=new double[10];
for (int i=0;i<a.length;i++){
System.out.print("请输入"+a[i]+"的价格:");
b[i]=sc.nextDouble();
}
double sum=0;
for (int i=0;i<a.length;i++){
System.out.println(a[i]+"的价格为:"+b[i]+"元");
sum=sum+b[i];
}
System.out.println("总金额为:"+sum+"元");
}
5.接收并输出某公司某月的考勤和扣款信息,假设公司有5个员工,每个员工的考勤项有上下班忘打卡、迟到、早退、旷工,其中上下班忘打卡扣款10元/次,迟到和早退扣款为20元/次,旷工100元/天,参考图如下(参考图中是以3个员工为例):
private static void five() {
int a[]=new int[5];//员工编号
int b[]=new int[5];//忘打卡
int c[]=new int[5];//迟到
int d[]=new int[5];//早退
int e[]=new int[5];//旷工
Scanner sc=new Scanner(System.in);
for (int i=0;i<1;i++){
System.out.println("请输入第"+(i+1)+"个员工编号:");
a[i]=sc.nextInt();
System.out.println("请输入第"+(i+1)+"个员工忘打卡次数:");
b[i]=sc.nextInt();
System.out.println("请输入第"+(i+1)+"个员工迟到次数:");
c[i]=sc.nextInt();
System.out.println("请输入第"+(i+1)+"个员工早退次数:");
d[i]=sc.nextInt();
System.out.println("请输入第"+(i+1)+"个员工旷工次数:");
e[i]=sc.nextInt();
}
System.out.println("************本月考勤信息***************");
for (int i=0;i<1;i++){
System.out.println("员工编号 忘打卡 迟到 早退 旷工 总罚款(单位元)");
System.out.println(a[i]+" "+b[i]*10+" "+c[i]*20+" "+d[i]*20+" "+e[i]*100+" "+
(b[i]*10+c[i]*20+d[i]*20+e[i]*100));
}
}
6.动态输入一组数,存到数组里面,利用四种循环打印出数组的所有元素。
private static void six() {
Scanner sc = new Scanner(System.in);
System.out.println("你想要输入几个数(正整数):");
int shu;
shu=sc.nextInt();
System.out.print("请输入这些数:");
int a[] = new int[shu];
for (int i = 0; i <= (a.length - 1); i++) {//给数组赋值
a[i] = sc.nextInt();
}
System.out.print("打印的结果为: ");
for (int i = 0; i <= (a.length - 1); i++) {
System.out.print(a[i]+" ");
}
System.out.println(" ");//换行
System.out.print("打印的结果为: ");
int a1=0;
while (a1<a.length){
System.out.print(a[a1]+" ");
a1++;
}
System.out.println(" ");//换行
System.out.print("打印的结果为: ");
int b1=0;
do{
System.out.print(a[b1]+" ");
b1++;
}while (b1<a.length);
System.out.println(" ");//换行
System.out.print("打印的结果为: ");
for (int c1:a){
System.out.print(c1+" ");
}
}
7.定义一个有序数列{1,5,20,30,80},要求用户输入一个数字,判断该数字应该插入到数组中的下标是?
private static void seven() {
int a[]=new int[]{1,5,20,30,80};
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数字:");
int b=sc.nextInt();
boolean c=true;
for (int i=0;i<a.length;i++){
if (a[i]>b){
System.out.println("这个数字应该插入的下标为:"+i);
c=false;
break;
}
}
if (c){
System.out.println("这个数字应该插入的下标为: 5");
}
}
8.定义一个长度为8的数组,要求前7个元素赋值,最后一个不赋值,从第5个元素开始,依次覆盖后面的元素,并输出最终结果。
private static void eight() {
Scanner sc = new Scanner(System.in);
int a[]=new int[8];
System.out.println("请输入七个数:");
for (int i=0;i<7;i++){
a[i]=sc.nextInt();
}
System.out.println("这八个数分别为:");
for (int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println();//换行
for (int i=a.length-2;i>=4;i--){
a[i+1]=a[i];
}
System.out.println("最终结果为:");
for (int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
9.定义一个有序数列,{1,5,20,30,80},要求用户输入一个数字,然后插到数组中,并保持升序,不能使用冒泡排序。
private static void nine() {
int a[]=new int[]{1,5,20,30,80,0};
System.out.println("这个数组为:");
for (int i = 0; i <a.length ; i++) {
System.out.print(a[i]+" ");
}
System.out.println();
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数字:");
int b=sc.nextInt();
int x=a.length-1;//x为插入的下标
for (int i=0;i<a.length;i++){
if (a[i]>b){
x=i;
break;
}
}
System.out.println("这个数字应该插入的下标为:"+x);
for (int i=a.length-1;i>x;i--){//替换插入之后的数
a[i]=a[i-1];
}
a[x]=b;//替换插入的数
System.out.println("插入后的数组为:");
for (int i = 0; i <a.length ; i++) {
System.out.print(a[i]+" ");
}
}
------------------------------今天不做------------------
1.使用冒泡排序对数组{13,18,99,56,44,67}进行升序和降序。
private static void job1() {
int a[]={13,18,99,56,44,67};
for(int i=0;i<a.length-1;i++){//升序
for (int j=0;j<a.length-1-i;j++){
if (a[j]>a[j+1]){
int b=a[j+1];
a[j+1]=a[j];
a[j]=b;
}
}
}
System.out.println("升序后的排列为:");
for (int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println();//换行
for(int i=0;i<a.length-1;i++){//降序
for (int j=0;j<a.length-1-i;j++){
if (a[j]<a[j+1]){
int b=a[j+1];
a[j+1]=a[j];
a[j]=b;
}
}
}
System.out.println("降序后的排列为:");
for (int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
2.利用冒泡排序实现数组长度为10的特定排序:1-5升序,6-10降序。
private static void job2() {
int a[]={5,4,3,2,1,6,7,-1,9,10};
System.out.println("数组原为:");
for (int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println();//换行
for(int i=0;i<4;i++){//升序
for (int j=0;j<4-i;j++){
if (a[j]>a[j+1]){
int b=a[j+1];
a[j+1]=a[j];
a[j]=b;
}
}
}
for(int i=0;i<5;i++){//降序
for (int j=5;j<a.length-1-i;j++){
if (a[j]<a[j+1]){
int b=a[j+1];
a[j+1]=a[j];
a[j]=b;
}
}
// System.out.println("第"+(i+1)+"个数为:"+a[i]);
}
System.out.println("1-5升序,6-10降序后的排列为:");
for (int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}