一维数组以及经典应用
1.为什么需要数组
太多的数据,使用循环和变量做法太过于繁琐,不利于数据处理。
有没有一个方法储存全部三十个变量?有,使用数组存储变量。
数组是一个变量,存储相同数据类型的一组数据
声明一个变量就是在内存空间划出一块合适的空间。
声明一个数组就是在内存空间划出一串连续的空间。
数组的基本要素
1.标识符(数组的名字)
2.数组元素
数组中的元素类型必须是同一数据类型。
3.元素下标:从0开始,最大到数组长度-1.
如果要找上图70,则通过数组名+[下标],scores[0]来找到对应元素。
4.元素类型
长度:就是数组里一共有多少个元素。长度:4就是此数组里面有4个元素。数组长度固定不变,避免数组越界。
2.如何使用数组
使用数组四步走
1.声明数组:告诉计算机数据类型是什么
语法:数据类型 数组名[];
数据类型[] 数组名;
声明数组时不规定数组长度
2.分配空间:告诉计算机分配几个连续的空间(声明数组长度)
声明数组并分配空间
//数组长度在java中表现
数组名字.length
数据类型[] 数组名 new 数据类型[大小];
数组元素根据类型不同,有不同的初始值。int的初始值为0,String的初始值为null,double的初始值为0.0。
数组赋值
3.赋值:向分配的格子里放数据,下标从0开始。
方法1.边声明边赋值
int[]scores ={89,79,76};
int[]scores = new int[]{89,79,76};
不能指定数组长度!
如果数值不多可以用此方法赋值数组。
方法2:动态的从键盘中录入信息并赋值
Scanner input = new Scanner (System.in);
int[]scores=new int[30];
for(int i = 0;i<30;i++){
scores[i]=input.nextInt();
}
处理数据
4.处理数据
计算30人的平均分,使用数组实现
import java.util.*;
//计算30人的平均分用数组实现
//数组长度:数组名字.length
public class Test0801 {
public static void main(String[] args) {
//声明数组,分配空间
double[] scores = new double[10];
Scanner input = new Scanner(System.in);
//记录总分
double sum =0;
for(int i = 0;i<scores.length;i++) {
System.out.print("请输入第"+(i+1)+"个同学的成绩:");
//为数组中的三十个格子赋值
scores[i] = input.nextDouble();
//数组每次赋值sum就+=赋值
sum+= scores[i];
}
//计算平均分
double avg = sum/scores.length;
System.out.println("班级学院的平均分是"+avg);
}
}
👆传统的写法
新型写法:增强型for,foreach。
for(int score : scores){
sum +=score;
}
相当于将scores中的每一个值依次拿出来放到int类型的变量score中,括号内的作用是一个迭代的作用,然后进行sum+=score中输出的值。
scores相当于一个购物车,score相当于商品,此式子相当于把购物车中的东西每个都拿出来扫码获得价格加到总价sum中。
先执行scores,再执行int score,最后执行sum+=score;。
import java.util.Scanner;
//计算30人的平均分用数组实现
//数组长度:数组名字.length
//使用增强型的for计算总分数
public class Test0802 {
public static void main(String[] args) {
//声明数组,分配空间
double[] scores = new double[10];
Scanner input = new Scanner(System.in);
//记录总分
double sum =0;
for(int i = 0;i<scores.length;i++) {
System.out.print("请输入第"+(i+1)+"个同学的成绩:");
//为数组中的三十个格子赋值
scores[i] = input.nextDouble();
}
//求和:适用于一个个全拿出来的时候
for(double score:scores) {
sum+=score;
}
//计算平均分
double avg = sum/scores.length;
System.out.println("班级学院的平均分是"+avg);
}
}
数组与内存
栈内存与堆内存:隶属于java虚拟机的一块内存空间
1.栈内存:存放数组变量
2.堆内存:存放数组变量中的值
常见错误
错误:没有声明长度
错误:编译出错,数组越界
错误:编译出错,创建数组并赋值的方式必须在一条语句中完成。
综合练习
/*
* 有一个数列:8,4,2,1,23,344,12
* 1.循环输出数列的值
* 2.求数列中所有数值的和
* 3.猜数游戏:从键盘中人所以输入一个数据,判断数列中是否包含此数
*/
import java.util.*;
public class Test0803 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int sum = 0;
// 声明数组,分配空间,数组赋值,数组名称:scores
int[] scores = { 8, 4, 2, 1, 23, 344, 12 };
// 输出每个值
for (int i = 0; i < 7; i++) {
System.out.print(scores[i] + "\t");
}
// 数列中所有数值的和
for (int score : scores) {
sum += score;
}
// 输出总和
System.out.println("\n数列中所有数值的和为:" + sum);
System.out.print("请输入一个数");
int shu = input.nextInt();
// 使用循环来逐个判断输入数字是否等于数组内的数
//设置一个标识flag,记录是否正确。
boolean flag =false;
for (int i = 0; i < 7; i++) {
//猜对了就不需要继续进行了,输入的shu等于scores[i]的值时进入选择结构
if (shu == scores[i]) {
//猜对了flag变为true和之前不同
flag =true;
break;
}
}
//当猜对时flag变为true,如果没有猜对则还是原来的false。
if(flag) {
System.out.print("猜对了有这个数");
}else {
System.out.print("没猜对没有这个数");
}
}
}
求最大值
import java.util.*;
public class Test0804 {
public static void main(String[] args) {
//获取五名同学的考试成绩,输出最高分数。
Scanner input = new Scanner(System.in);
//声明数组名称,长度,类型
double[]scores =new double[5];
//使用循环给数组中赋值
for(int i=0;i<scores.length;i++) {
System.out.println("请输入第"+(i+1)+"位同学的成绩");
scores[i]=input.nextDouble();
}
double max=0;
//使用擂台原则:使用if选择,循环中数组中每有一个值大于max就进入选择结构把值赋给max,这样数组中最大的那个值就为max。
for(int i=0;i<scores.length;i++) {
if(scores[i]>max) {
max = scores[i];
}
}
System.out.println("最高分是"+max);
}
擂台原则👇
插入数值
分析:
1.将成绩保存在数组中
2.通过比较找到插入位置
3.该位置元素往后移一位
4.插入新成绩
import java.util.*;
public class Test0805 {
public static void main(String[] args) {
int[] scores = new int [6];
//给数组中每个赋值
scores[0]=99;
scores[1]=85;
scores[2]=82;
scores[3]=63;
scores[4]=60;
Scanner input = new Scanner(System.in);
System.out.print("请输入要插入的数值:");
int num = input.nextInt();
//将num插入到scores数组中的第index位置中
//将index假设默认插入最后面的位置,这样可以避免输入负数时无法进入下面循环无法给index赋值。
int index =scores.length-1;
//将用户插入的数据和数组中的5个数一次进行比较,直到遇到第一个比他小的值为止
//第一个比他小的数值所在的位置就是这个数值要插入的位置index
//找到第一个比他小的数值就直接break跳出
for(int i =0;i<scores.length;i++) {
if(num>scores[i]) {
index = i;
break;
}
}
//将原来位置的数值一次往后移动,流出空位置,插入新值。
//要从后往前依次移动数值
//本质上就是将前面的值赋值给后面的值
//一直到排到i大于要插入地方的index位置。
for(int i = scores.length-1;i>index;i--){
scores[i] = scores[i-1];
}
//声明输出插入的成绩下标
scores[index]=num;
System.out.println("插入成绩的下标是:"+index);
System.out.println("插入的成绩排在:"+(index+1)+"位");
System.out.print("插入后的新数组元素如下:");
for(int score:scores) {
System.out.print(score+" ");
}
}
}