Java数组移位与统计练习

再java中首字母大写的即刻看作为类

Scanner这个类,不是我们在同一个包中创建的类,该类存储在Java JDK的类库中,所以我们需要告诉当前程序我们使用的是什么类,即通过alt+/方式引入该类
Scanner监听我们跟键盘有关的操作,监听内容来源是系统输入
Scanner监听我们跟键盘有关的操作,监听内容来源是系统输入

nextInt()方法用于从键盘接收整型数据,如果接收到的是非整型类型就会出现输入无法匹配异常报错

try{}catch{}异常捕获,将可能发生异常的代码放置到try的大括号中{}(代码块)
catch{}如果发生异常则在catch语句块中处理异常,如果没有发生异常,不执行catch中的任何内容
当使用try-catch及捕获异常的时候,即使程序发生异常,该程序依旧会往下执行

TODO利用自动生成标记,表明代码未完成TODO

println()使用空内容打印,将打印内容换行   +ln自带换行 所以不需要写转义字符\n

break用于switch语句中,终止switch语句
break用于循环时,跳出循环

continue用在循环中,跳出本次循环,继续执行下一次循环

如果一个引用数据类型 的值为null的话 此时调用它的属性或方法则会发生空指针异常,这是因为这些属性或方法指向了一个空的内存地址,无法的到任何有用的信息

需要定义的程序服务反复一直运行的话可以设置死循环(true){}

 

package com.dodoke.datamanger;

import java.util.Scanner;

public class DataManger {
	/**
	 * 从键盘接收数据,并审核数据,将数据添加到数组中去
	 * @return
	 */
	public int[] inserData(){
		//先定义一个长度为10的整型数组
		int[] arr = new int[10];//动态初始话长度为10的数组
		//要去新增数据-得到数据源,来自键盘 Scanner是jdk写的类 所以直接写会报错
		//Scanner这个类,不是我们在同一个包中创建的类,该类存储在Java JDK的类库中,所以我们需要告诉当前程序我们使用的是什么类,即通过alt+/方式引入该类
		//Scanner监听我们跟键盘有关的操作,监听内容来源是系统输入
		Scanner sc = new Scanner(System.in);//从外部进入程序的数据统称为输入型数据,只会找跟键盘有关的操作
		System.out.println("请暂时输入9个数据,保留最后一位数据以供添加新数据");
		//为了等下更好的插入数据,所以长度为10的数组只新增9个数据,为插入数据留一个空位
		for(int i = 0; i < arr.length - 1; i++){//而所接受的数据是10个 所以就添加循环重复10次接收数据
			System.out.println("请输入第" + (i + 1) + "个数据");//应为输入一次之后程序就停止了 
			//System.out.println(sc.next());//不断循环next()方法,可以不断接受数据
			//应为要将数据插入到整型数组中,所以需要保证接收到的数据为整型数据
			//nextInt()方法用于从键盘接收整型数据,如果接收到的是非整型类型就会出现输入无法匹配异常报错
			try {
				//异常捕获,将可能发生异常的代码放置到try的大括号中{}(代码块)
				//System.out.println(sc.nextInt());
				arr[i] = sc.nextInt();
			} catch(Exception e) {//Exception异常的父类  并给定义一个名称
				//如果发生异常则在catch语句块中处理异常,如果没有发生异常,不执行catch中的任何内容
				System.out.println("输入的数据类型有误,请重新添加!");
				//在使用nextInt方法发生异常时,程序监听键盘的输入会中断,需要我们将有问题的键盘监听重新链接起来,使用next()方法重新链接键盘
				sc.nextInt();
				//为了能够重新输入数据,所以需要针对循环做一次重新开始
				i--;
			}
		}
		//返回创建的数组,并新增元素的数组
		return arr;
	}
	// 利用自动生成标记,表明代码未完成TODO
	/**
	 * 从键盘接收数组,用于插入到数组指定位置处
	 * @param a 要插入数据的数组
	 * @param n 要插入的数据
	 * @param k 要插入到位置,从0开始,小于数组的长度,不在本方法中考虑k的范围
	 */
	public void insertAtArray(int[] a,int n,int k) {
		//为了避免数据覆盖,所以从最后一个数据开始移动
		for(int i = a.length - 1; i > k - 1; i--){
			a[i] = a[i - 1];//用前面一个元素的值覆盖后面一个元素的值
		}
		a[k - 1] = n;
	}
	
	
	/**
	 * 输出数组中能被3整除的数据
	 * @param a 数组名
	 */
	public void divThree(int[] a) {
		String str = "";//用空字符出串保存能被3整除的数据
		int count = 0;//设置变量保存能被3整除的数组元素的个数
		for(int n : a) {
			if(n % 3 == 0){
				str = str + n + " ";
				count++;
				}
		}
		if(count == 0){
			System.out.println("数组中没有能被3整除的元素!");
		} else {
			System.out.println("数组中能被3整除的有:" + str);
		}
	}
	
	/**
	 * 按个数,显示数组中元素的内容
	 * @param a 数组
	 * @param length 显示数组元素的个数
	 */
	public void showData(int[] a, int length) {
		for(int i = 0; i < length; i++){
			System.out.print(a[i] + " ");//print把ln去掉让数组元素显示在一行以内
		}
		System.out.println();//使用空内容打印,将打印内容换行   +ln自带换行 所以不需要写转义字符\n
	}
	
	/*public static void main(String[] args) {
		DataManger dm = new DataManger();
		int[] arr = dm.inserData();
		dm.showData(arr,arr.length);
		Scanner  sc = new Scanner(System.in);//暂不处理非整数输入的问题
		System.out.println("请输入要插入的数据:");
		int n = sc.nextInt();
		System.out.println("请输入要插入的位置:");
		int k = sc.nextInt();
		while(true){//设置死循环
			if(k < 1 || k >= arr.length){
				System.out.println("插入位置错误,请重新输入大于0,小于等于" + arr.length + "的数值!");
				System.out.println("请输入要插入的位置:");
				k = sc.nextInt();
			}else {
				break;//跳出本次死循环
			}
		}
		dm.insertAtArray(arr,n,k);
		dm.showData(arr,arr.length);
		dm.divThree(arr);
	}*/
	
	/**
	 * 主方法流程提示信息
	 */
	public void notice(){
		System.out.println("*******************************************");
		System.out.println("			1--插入数据");
		System.out.println("			2--显示所有数据");
		System.out.println("			3--在指定位置处插入数据");
		System.out.println("			4--查询被3整除的数据");
		System.out.println("			0--退出程序");
		System.out.println("*******************************************");
	}
	
	/**
	 * 在主方法中实现程序流程的控制,专注于业务逻辑的实现
	 * 将主要功能封装为一个个的方法发,在主方法中调用这些方法
	 * @param args
	 */
	public static void main(String[] args){
		DataManger dm = new DataManger();
		//要根据用户的输入为用户提供服务
		Scanner sc = new Scanner(System.in);
		//将接收用户输入的变量提取出来,延长它再内存中的使用寿命
		int input;
		//提前先准备好数组
		//如果一个引用数据类型 的值为null的话 此时调用它的属性或方法则会发生空指针异常,这是因为这些属性或方法指向了一个空的内存地址,无法的到任何有用的信息
		int[] a = null;//null代表设为空  这个a不指向任何的堆内存空间,没有方法调用属性调用内存内的信息
		//如果不定义为null的话再之后的使用中时会出错的 
		int n = 0, k = 0;//n表示要插入的数据,k表示要插入的位置
		//为了多次提示和不间断的提供服务需要设置一个循环,这个循环控制着服务程序一直运转,并可由用户停用服务
		while(true){//设置死循环  让服务一直运行
			//循环提示信息
			dm.notice();
			//进行用户操作的提示
			System.out.println("请输入对应的数组选择所需的功能,进行操作:");
			try{
				input = sc.nextInt();
			} catch(Exception e){//当使用try-catch及捕获异常的时候,即使程序发生异常,该程序依旧会往下执行
				//再java中首字母大写的即刻看作为类
				System.out.println("输入的数据格式有误,不能为非数字!");
				sc.next();//为了是键盘接受数据重新链接上调用next放啊
				//需要使程序发生错误时避免继续执行
				continue;//使用cintinue跳出此次循环这样再后面的调用中就不出现报错
				//避免再没有赋值的情况下对后面的input赋值的判断
			}
			//变量input定义在循环当中 java的循环里的垃圾回收机制 会再每一次循环使用结束后回收掉循环内创建的变量
			//这种垃圾回收机制很不建议使用
			//int input = sc.nextInt();
			
			//根据用户的输入提供相应的服务,即判断iput的值
			//针对0做单独判断,因为只能执行一次
			if(input == 0){//接收的时用户输入的的值,来进行判断  所以我们不能自己赋值  因为如果赋值的话就会对之后的判断产生影响
				System.out.println("退出程序!");
				break;//退出程序
			}
			//判断input其他的输入
			switch(input){
				case 1:{
					//System.out.println("插入数据");
					//插入数据,并接收新创建的数组
					a = dm.inserData();
					//显示数据
					System.out.println("数组元素为:");
					dm.showData(a, a.length);
					break;//这里的break只作用于switch语句
				}
				case 2:{
					//显示数据,需要先判断数组是否已经进行赋值,如果数组赋值显示数组,如果数组没有赋值就提示 再次进行赋值
					if(a != null){
						System.out.println("数组元素为:");
						dm.showData(a, a.length);
					} else {
						System.out.println("还未在数组中插入数据,请添加数据后重新显示");
					}
					break;
				}
				case 3:{
					//再指定位置处插入数据
					if(a != null){
						System.out.println("请输入要插入的数据");
						try {
							n = sc.nextInt();
							System.out.println("请输入要插入数据的位置:");
							k = sc.nextInt();
						} catch(Exception e){
							System.out.println("输入的格式有误,不能有非数字");
							sc.next();
							break;
						}
						dm.insertAtArray(a, n, k);
						System.out.println("新增数据后,数组元素为:");
						dm.showData(a, a.length);
					} else {
						System.out.println("还未再数组中插入数据,请重新选择操作!");
					}
					break;
				}
				case 4:{
					//查询能被3整除的数据
					if(a != null){
						dm.divThree(a);
					}else{
						System.out.println("还未在数组中插入数据,请重新选择操作!");
					}
					break;
				}
				default:{
					System.out.println("输入的数字有误,请输入对应的数字进行相关操作");
				}
			}
		}
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

package my_two_porject;
import java.util.InputMismatchException;
import java.util.Scanner;
/**
 * Java数组位移与统计
 * (1)插入数据 insertData
 * (2)显示所有数据 showData
 * (3)在指定位置处插入数据 insertAtArray
 * (4)查询能被3整除的数据 divThree
 */
public class DateManger {
	/**
	 * 将接收到的数据进行审核并新增到数组中去
	 */
	public int[] insertData() {
		//首先定义好一个长度为10的数组
		int[] a = new int[10];
		//因为Scanner类是在Java JDK的类库中保存的类 所以使用的时候需要进行导入
		//暂时记住这个写法 Scanner用于监听跟键盘操作相关的内容
		@SuppressWarnings("resource")
		Scanner sc = new Scanner(System.in);
		//为插入数据提前做准备 长度为10的数组 只能暂时先接收9个数据
		for (int i = 0; i < a.length - 1; i++) {
			System.out.println("请输入第" + (i + 1) + "个数据");
			//nextInt方法用于从键盘接收整型数据
			try {
				//将可能会发生异常的语句放置到try代码块中
				a[i] = sc.nextInt();
			} catch(InputMismatchException e) {
				//通过catch语句捕获可能会发生的异常(即输入非数字的时候)执行catch代码块中的内容
				System.out.println("提示:输入的数据类型有误!不能是非数字!");
				//将有问题的键盘监听重新连接起来 使用next()继续去接收数据
				sc.next();
				//为了重新输入数据 所以针对以循环做一次重新开始
				i--;
			}
		}
		return a;
	}
	
	/**
	 * 显示数组中元素的内容
	 */
	public void showData(int[] a, int length) {
		//将数组内容循环打印输出
		for (int i = 0; i < length; i++) {
			System.out.print(a[i] + " ");
		}
		//最后一个数据输出结束时需要换行
		System.out.println();
	}
	
	/**
	 * 从键盘接收一个数据 插入到数组的指定位置
	 * @param a 要插入数组的数组
	 * @param n 要插入的数据
	 * @param k 要插入的位置
	 */
	public void insertAtArray(int[] a, int n, int k) {
		//注意从最后一个数据开始移动,避免数据覆盖
		//如果数据溢出 只要将倒数第二个数据覆盖最后一个即可 
		for (int i = a.length - 1; i > k - 1; i--) {
			a[i] = a[i - 1];
		}
		//在第k个位置插入值 需要将索引值为k-1的数据覆盖
		a[k - 1] = n;
	}
	

    /**
	 * 输出数组中能被3整除的元素
	 * 
	 */
	public void divThree(int[] a) {
		String str = "";//用于保存能被三整除的数据
		int count = 0;
		for (int n : a) {
			if (n % 3 == 0) {
				str = str + n + "   ";
				count++;
			}
		}
		if (count == 0) {
			System.out.println("数组中没有能被3整除的元素!");
		} else {
			System.out.println("数组中能被3整除的元素为:" + str);
		}
	}
	
	
	/**
	 * 提示信息
	 */
	public void notice() {
		System.out.println("********************************************");
		System.out.println("                1--插入数据");
		System.out.println("                2--显示所有数据");
		System.out.println("                3--在指定位置处插入数据");
		System.out.println("                4--查询能被3整除的数据");
		System.out.println("                0--退出");
		System.out.println("********************************************");
	}
	
	/**
	 * 主方法的实现
	 */
	public static void main(String[] args) {
		DateManger dm = new DateManger();
		// int[] a = dm.insertData();
		// * dm.showData(a, 8);//输出全部数据
		// 将接收数据语句提取出来
		Scanner sc = new Scanner(System.in);
		// 将输入数据提取出来
		int input;
		int[] a = null;//先定义数组为一个空数组
		int n=0,k=0;//n表示要插入的数据,k表示插入位置
		// 1 首先实现循环输入5个指示数字
		while (true) {
			// 循环提示
			dm.notice();
			// 进行提示
			System.out.println("请输入对应的数字进行操作:");
			// 接收键盘操作数据
			try{
				input = sc.nextInt();
			}catch(InputMismatchException e){
				System.out.println("输入的数据格式有误,不能有非数字!");
				sc.next();
				continue;
			}
			// 针对0单独处理,退出程序(退出循环)
			if (input == 0) {
				System.out.println("退出程序!");
				break;
			}
			// 通过switch语句根据操作数进行操作的选择
			switch (input) {
				case 1:{
					//插入数据,并接收得到的数据
					a = dm.insertData();
					//显示数据
					System.out.println("数组元素为:");
					dm.showData(a, a.length-1);
					break;
				}
				case 2: {//显示数据
					//需要判断数组是否已经赋值
					if(a != null) {
						System.out.println("数组元素为:");
						if(a[a.length-1]==0){
							//如果数组的最后一个元素为0,说明还没有拆入数据,因此不显示最后一个元素
							dm.showData(a, a.length-1);
						}else{
							dm.showData(a, a.length);
						}
					} else {
						System.out.println("还未在数组中插入数据,请重新选择操作!");
					}
					break;
				}
				//在指定位置处插入数据
				case 3: {
					if(a!=null){
						System.out.println("请输入要插入的数据:");
						try{
							n=sc.nextInt();
							System.out.println("请输入要插入数据的位置:");
							k=sc.nextInt();
						}catch(InputMismatchException e){
							System.out.println("输入的数据格式有误,不能有非数字!");
							sc.next();
							break;
						}
						dm.insertAtArray(a, n, k);
						dm.showData(a, a.length);
					}else{
						System.out.println("还未在数组中插入数据,请重新选择操作!");
					}
					break;
				}
				//查询数组中能被3整除的元素
				case 4: {
					//查询数组中能被3整除的元素
					if(a!=null){
						dm.divThree(a);
					}else{
						System.out.println("还未在数组中插入数据,请重新选择操作!");
					}
					break;
				}
				//输入的菜单选项不合法
				default: {
					System.out.println("输入无效!");
				}
			}
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值