Java第一次作业:规范化输出、二维数组排序问题

2. (15分)某省居民电价分三个“阶梯”:月用电量50度以内的,电价为0.538元/度;用电量在51度至200度之间的,电价为0.568元/度,用电量超过200度的,电价为0.638元/度。编写程序,用户从键盘输入用电量,程序输出用户应缴纳的电费。

(输入输出接口,循环)(格式化输出)

package textone;
import java.util.*;
import java.text.DecimalFormat;
public class text2 {
	public static void main(String args[]) {
		double n,sum;
		Scanner reader=new Scanner(System.in);
		System.out.println("请输入你所使用的电量,若想终止程序,请输入任意负数");
		n=reader.nextFloat();
		DecimalFormat df2 = new DecimalFormat("####.00"); 
		while(n>=0) {
			if(n<=50) {
				sum=0.538*n;
				System.out.print("你的电费是 "+df2.format(sum));
			}
			else if(n>50&&n<=200) {
				sum=0.538*50+0.568*(n-50);
				System.out.print("你的电费是 "+df2.format(sum));
			}
			else {
				sum=0.538*50+0.568*150+0.638*(n-200);
				System.out.print("你的电费是 "+df2.format(sum));
			}
			System.out.println();
			System.out.println("请输入你所使用的电量,若想终止程序,请输入任意负数");
			n=reader.nextFloat();
		}
		reader.close();
	}
}

通过

import java.text.DecimalFormat;

     DecimalFormat df2 = new DEcimalFormat ( "####.00" ) ;

     double sum = 897654.15615;

     System.out.print(df2.format (sum));

可输出 897654.16

3. (15分)提示用户输入整数M(5以上的整数),生成一个M*M的二维浮点型随机数组(数组元素的值是0~1之间的随机值,提示:使用Math.random()生成)。

  1. 通过算法找到该二维数组中最大的5个数,要求从大到小输出该值及其位置。(如果有相同的元素,排在前面的为大)
  2. 查找该矩阵的鞍点,如果有,输出它所在的位置以及该值;如果没有,输出不存在。

目前的想法:

package textone;
import java.util.Scanner;
class p{
	double num;
	int x,y;
}
public class text2 {
	public static void main(String args[]) {
		System.out.println("请输入一个大于5的整数");
		int M;
		Scanner reader=new Scanner(System.in);
		M=reader.nextInt();
		reader.close();
		double[][] a=new double[M][M];
		for(int i=0;i<M;i++)
			for(int j=0;j<M;j++) {
				a[i][j]=Math.random();
				}
		p[] b=new p[5];
		for(int i=0;i<5;i++){//???
			b[i]=new p();
		}
		
		for(int n=0;n<5;n++) {
			b[n].num=0.0;
			for(int i=0;i<M;i++) {
			for(int j=0;j<M;j++) {
				if(a[i][j]>b[n].num){
					b[n].num=a[i][j];
					b[n].x=i;
					b[n].y=j;
				}
			}
			
			}
		}
		}
}

Java没有结构体,但是可以用类来实现结构体的功能:https://blog.csdn.net/qq_32426313/article/details/78524328

//转
import java.util.Arrays;
 
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.Scanner;
import java.util.Stack;
class p{
	int x,y;
}
public class Main1 {
	static Scanner in=new Scanner(System.in); 
    
	public static  void main(String[] args) {
		int n=in.nextInt();
		p a=new p();
		a.x=10;
		p[] b=new p[100];
		for(int i=0;i<100;i++){//一定要加入这一句
			b[i]=new p();
		}
		for(int i=0;i<n;i++){
			b[i].x=1;
			b[i].y=2;
		}
		for(int i=0;i<n;i++){
			System.out.println(b[i].x+b[i].y);
		}
	}
}
 
 
 
	
 

定义了一个结构体数组来储存数据和元素,但是在查找最大值这一点上有些伤脑筋。在询问过三金哥之后,了解到sort()函数,将二维数组当成一维数组进行处理。

java中二维数组转化成一维数组的方法:

double[] a2=new double[M*M];
		int k=0;
		for(int i=0;i<M;i++)
			for(int j=0;j<M;j++) {
				a2[k++]=a[i][j];
			}

搜到的其他方法:

package com.qiu.lin.he;
 
public class Ceshi {
    public static void main(String[] args) {
 
        int[][] m = { { 1, 23 }, { 2, 3, 4, 5 } };
        int[] n;
 
        int len = 0;
        // 计算一维数组长度
        for (int[] element : m) {
            len += element.length;
        }
        // 复制元素
        n = new int[len];
        int index = 0;
        for (int[] element : m) {
            for (int element2 : element) {
                n[index++] = element2;
            }
        }
        for (int i : n) {
            System.out.print(i + ",");//输出所有的数据
        }
 
    }
}

链接:https://zhidao.baidu.com/question/2010829516613213988.html

Java中sort函数使用方法:https://blog.csdn.net/qq_37405320/article/details/72862155

降序排列时一直出错,但是把 a2的定义由double转换为Double后即可,并且直接改为对二维数组 a 的排序也不会报错

解决此问题参考的链接:

https://blog.csdn.net/login_sonata/article/details/71001851

	double[][] a=new double[M][M];
		for(int i=0;i<M;i++)
			for(int j=0;j<M;j++) {
				a[i][j]=Math.random();
				}
		Double[] a2=new Double[M*M];
		int k=0;
		for(int i=0;i<M;i++)
			for(int j=0;j<M;j++) {
				a2[k++]=a[i][j];
			}
		Arrays.sort(a2,Collections.reverseOrder());//为何a的时候不报错

关于降序排列和sort排列参考的链接:https://blog.csdn.net/qq_40723205/article/details/79630702

https://blog.csdn.net/qq_36785612/article/details/79935552代码有问题,Double和double

https://blog.csdn.net/yzwty/article/details/56287943

https://blog.csdn.net/zhangpiu/article/details/50564064  c++的sort排序

https://blog.csdn.net/xx326664162/article/details/52227690

https://blog.csdn.net/qq_23179075/article/details/78753136

如何跳出两层for循环

for( int i=1 ; i<=4 ; i++ ){  
    int flag = 0;  
    for( int j=1 ; j<=4 ; j++ ){  
          
        if(~~~){  
            // 这个时候的break并不能直接跳出全部的循环
            flag=1;  
            break;  
        }  
    }  
    if(flag==1)  
        break;  // 这个才能彻底break出去  
}

历经千辛万苦,终于搞定

package textone;
import java.util.Scanner;
import java.util.Arrays;
import java.util.Collections;
class p{
	double num;
	int x,y;
}
public class text2 {
	public static void main(String args[]) {
		System.out.println("请输入一个大于5的整数");
		int M;
		Scanner reader=new Scanner(System.in);
		M=reader.nextInt();
		reader.close();
		double[][] a=new double[M][M];
		for(int i=0;i<M;i++)
			for(int j=0;j<M;j++) {
				a[i][j]=Math.random();
				}
		Double[] a2=new Double[M*M];
		int k=0;
		for(int i=0;i<M;i++)
			for(int j=0;j<M;j++) {
				a2[k++]=a[i][j];
			}
		Arrays.sort(a2,Collections.reverseOrder());//为何double定义a2会报错
		p[] b=new p[5];
		for(int i=0;i<5;i++){//???
			b[i]=new p();
		}
		for(int n=0;n<5;n++) {
			b[n].num=a2[n];
			//b[n].x=-1;
			//b[n].y=-1;
			}
		for(int n=0;n<5;n++) {
			double m=2.0;
			int p=-1;
			int q=-1;
			if(n>=1) {
				m=b[n-1].num;
				p=b[n-1].x;
				q=b[n-1].y;
				}
			for(int i=0;i<M;i++) {
				int flag=0;
				for(int j=0;j<M;j++) {
						//如果此时的b等于上一个,则需要跳过第一个,去找下一个,这样的话,m定义为结构体类型是否更好
					if(a[i][j]==b[n].num) {
						//误差范围,比较时不可能相等的?
						//判断此时的a是否和上一个b相同
						if(a[i][j]==m&&i==p&&j==q)
							continue;
						b[n].x=i;
						b[n].y=j;
						flag=1;
						//若在此处发现相等,则跳过找下一个
						break;
					}
				}
			if(flag==1)
				break;
			}
		}
		for(int n=0;n<5;n++) {
			System.out.println(b[n].num+" ( "+b[n].x+" , "+b[n].y+" ) ");
		}
		
		}
}

整理之后:

package textone;
import java.util.Scanner;
import java.util.Arrays;
import java.util.Collections;
class p{
	double num;
	int x,y;
}//用类来实现结构体的功能,用于储存元素及其在二维数组中的位置
public class text2 {
	public static void main(String args[]) {
		System.out.println("请输入一个大于5的整数");
		int M;
		Scanner reader=new Scanner(System.in);
		M=reader.nextInt();
		reader.close();
		double[][] a=new double[M][M];
		for(int i=0;i<M;i++) {
			for(int j=0;j<M;j++) {
				a[i][j]=Math.random();
				System.out.print(a[i][j]+" ");
				}
			System.out.println();
		}/*产生一个[0,1)之间的随机数  Math.random():
				返回指定范围的随机数(m-n之间)的公式:
				Math.random()*(n-m)+m;或者 Math.random()*(n+1-m)+m*/
		//将二维数组压成一维数组,并使用sort()函数降序排列
		Double[] a2=new Double[M*M];
		int k=0;
		for(int i=0;i<M;i++)
			for(int j=0;j<M;j++) {
				a2[k++]=a[i][j];
			}
		Arrays.sort(a2,Collections.reverseOrder());//用double定义a2会报错,Double和double的区别?
		p[] b=new p[5];
		for(int i=0;i<5;i++){//???
			b[i]=new p();
		}
		for(int n=0;n<5;n++) 
			b[n].num=a2[n];
		for(int n=0;n<5;n++) {
			double m=2.0;
			int p=-1;
			int q=-1;
			if(n>=1) {
				m=b[n-1].num;
				p=b[n-1].x;
				q=b[n-1].y;
				}//记录前一个元素,如果发现元素相同,则跳过并查找下一个位置
			for(int i=0;i<M;i++) {
				int flag=0;
				for(int j=0;j<M;j++) {
					if(a[i][j]==b[n].num) {
						if(a[i][j]==m&&i==p&&j==q)
							continue;//若在此处发现与上一个元素相等,则跳过找下一个位置
						b[n].x=i;
						b[n].y=j;
						flag=1;
						break;
					}
				}
			if(flag==1)
				break;//跳出两层 for()循环
			}
		}
		System.out.println("最大的前5个元素及其坐标为");
		for(int n=0;n<5;n++) {
			System.out.println(b[n].num+" ( "+b[n].x+" , "+b[n].y+" ) ");
		}
		
		}
}

定义int数组检验重复元素的判断

package textone;
import java.util.Arrays;
import java.util.Collections;
class p{
	int num;
	int x,y;
}
public class text2 {
	public static void main(String args[]) {
		int M=3;
		int[][] a={{1,2,3},{4,4,4},{5,6,5}};
		
		Integer[] a2=new Integer[M*M];
		int k=0;
		for(int i=0;i<M;i++)
			for(int j=0;j<M;j++) {
				a2[k++]=a[i][j];
			}
		Arrays.sort(a2,Collections.reverseOrder());
		p[] b=new p[5];
		for(int i=0;i<5;i++){
			b[i]=new p();
		}
		for(int n=0;n<5;n++) 
			b[n].num=a2[n];
		for(int n=0;n<5;n++) {
			int m=2;
			int p=-1;
			int q=-1;
			if(n>=1) {
				m=b[n-1].num;
				p=b[n-1].x;
				q=b[n-1].y;
				}
			for(int i=0;i<M;i++) {
				int flag=0;
				for(int j=0;j<M;j++) {
					if(a[i][j]==b[n].num) {
						if(a[i][j]==m&&i==p&&j==q)
							continue;
						b[n].x=i;
						b[n].y=j;
						flag=1;
						break;
					}
				}
			if(flag==1)
				break;
			}
		}
		for(int n=0;n<5;n++) {
			System.out.println(b[n].num+" ( "+b[n].x+" , "+b[n].y+" ) ");
		}
		
		}
}

鞍点:

自己的代码:

package textone;
import java.util.Scanner;
import java.util.Arrays;

public class text2 {
	public static void main(String args[]) {
		System.out.println("请输入一个大于5的整数");
		int M;
		Scanner reader=new Scanner(System.in);
		M=reader.nextInt();
		reader.close();
		double[][] a=new double[M][M];
		double[] b=new double[M];
		double[] c=new double[M];
		for(int i=0;i<M;i++) {
			for(int j=0;j<M;j++) {
				a[i][j]=Math.random();
				System.out.print(a[i][j]+" ");
				}
			System.out.println();
		}
		double num = 0;
		int x=0,y=0;
		int flag=0;
		for(int i=0;i<M;i++) {
			for(int j=0;j<M;j++) {
				for(int p=0;p<M;p++)
					b[p]=a[i][p];
				for(int q=0;q<M;q++)
					c[q]=a[q][j];
				Arrays.sort(b);
				Arrays.sort(c);
				if(a[i][j]==b[M-1]&&a[i][j]==c[0]) {
					num=a[i][j];
					x=i;
					y=j;
					flag=1;
					break;
				}
			}
		if(flag==1)
			break;
		}
		if(flag==1) 
			System.out.println("该二维数组的鞍点是 "+num+" 其坐标为 ( "+x+" , "+y+" )" );
		else
			System.out.println("该二维数组无鞍点");
		
	}
}

整合1:

package textone;
import java.util.Scanner;
import java.util.Arrays;
import java.util.Collections;
class p{
	double num;
	int x,y;
}//用类来实现结构体的功能,用于储存元素及其在二维数组中的位置
public class text2 {
	public static void main(String args[]) {
		System.out.println("请输入一个大于5的整数");
		int M;
		Scanner reader=new Scanner(System.in);
		M=reader.nextInt();
		reader.close();
		double[][] a=new double[M][M];
		for(int i=0;i<M;i++) {
			for(int j=0;j<M;j++) {
				a[i][j]=Math.random();
				System.out.print(a[i][j]+" ");
				}
			System.out.println();
		}/*产生一个[0,1)之间的随机数  Math.random():
				返回指定范围的随机数(m-n之间)的公式:
				Math.random()*(n-m)+m;或者 Math.random()*(n+1-m)+m*/
		//第一问:最大的五个元素
		//将二维数组压成一维数组,并使用sort()函数降序排列
		Double[] a2=new Double[M*M];
		int k=0;
		for(int i=0;i<M;i++)
			for(int j=0;j<M;j++) {
				a2[k++]=a[i][j];
			}
		Arrays.sort(a2,Collections.reverseOrder());//用double定义a2会报错,Double和double的区别?
		p[] b=new p[5];
		for(int i=0;i<5;i++){//???
			b[i]=new p();
		}
		for(int n=0;n<5;n++) 
			b[n].num=a2[n];
		for(int n=0;n<5;n++) {
			double m=2.0;
			int p=-1;
			int q=-1;
			if(n>=1) {
				m=b[n-1].num;
				p=b[n-1].x;
				q=b[n-1].y;
				}//记录前一个元素,如果发现元素相同,则跳过并查找下一个位置
			for(int i=0;i<M;i++) {
				int flag=0;
				for(int j=0;j<M;j++) {
					if(a[i][j]==b[n].num) {
						if(a[i][j]==m&&i==p&&j==q)
							continue;//若在此处发现与上一个元素相等,则跳过找下一个位置
						b[n].x=i;
						b[n].y=j;
						flag=1;
						break;
					}
				}
			if(flag==1)
				break;//跳出两层 for()循环
			}
		}
		System.out.println("最大的前5个元素及其坐标为");
		for(int n=0;n<5;n++) {
			System.out.println(b[n].num+" ( "+b[n].x+" , "+b[n].y+" ) ");
		}
		//第二问:鞍点
		double rowmax=1;
		int row=1,col=1;
		int bool=1;
		for(int i=0;i<M;i++) {
			rowmax=a[i][0];
			for(int j=0;j<M;j++) {
				if (rowmax<a[i][j]) {
					rowmax=a[i][j];
					row=i;
					col=j;
				}//找出行最大值
			}
			for(int m=0;m<M;m++) {
				if(rowmax>a[m][col])
					bool=0;
			}//与整列其他元素比较,如果是最小值,则bool值不变仍为 1
			
		}
		if(bool==1) 
			System.out.println("该二维数组的鞍点是 "+rowmax+" 其坐标为 ( "+row+" , "+col+" )" );
		else
			System.out.println("该二维数组无鞍点");
			
		}
}

整合2:

package textone;
import java.util.Scanner;
import java.util.Arrays;
import java.util.Collections;
class p{
	double num;
	int x,y;
}//用类来实现结构体的功能,用于储存元素及其在二维数组中的位置
public class text2 {
	public static void main(String args[]) {
		System.out.println("请输入一个大于5的整数");
		int M;
		Scanner reader=new Scanner(System.in);
		M=reader.nextInt();
		reader.close();
		double[][] a=new double[M][M];
		for(int i=0;i<M;i++) {
			for(int j=0;j<M;j++) {
				a[i][j]=Math.random();
				System.out.print(a[i][j]+" ");
				}
			System.out.println();
		}/*产生一个[0,1)之间的随机数  Math.random():
				返回指定范围的随机数(m-n之间)的公式:
				Math.random()*(n-m)+m;或者 Math.random()*(n+1-m)+m*/
		//第一问:最大的五个元素
		//将二维数组压成一维数组,并使用sort()函数降序排列
		Double[] a2=new Double[M*M];
		int k=0;
		for(int i=0;i<M;i++)
			for(int j=0;j<M;j++) {
				a2[k++]=a[i][j];
			}
		Arrays.sort(a2,Collections.reverseOrder());//用double定义a2会报错,Double和double的区别:包装
		p[] b=new p[5];
		for(int i=0;i<5;i++){
			b[i]=new p();
		}
		for(int n=0;n<5;n++) 
			b[n].num=a2[n];
		for(int n=0;n<5;n++) {
			double m=2.0;
			int p=-1;
			int q=-1;
			if(n>=1) {
				m=b[n-1].num;
				p=b[n-1].x;
				q=b[n-1].y;
				}//记录前一个元素,如果发现元素相同,则跳过并查找下一个位置
			for(int i=0;i<M;i++) {
				int flag=0;
				for(int j=0;j<M;j++) {
					if(a[i][j]==b[n].num) {
						if(a[i][j]==m&&i==p&&j==q)
							continue;//若在此处发现与上一个元素相等,则跳过找下一个位置
						b[n].x=i;
						b[n].y=j;
						flag=1;
						break;
					}
				}
			if(flag==1)
				break;//跳出两层 for()循环
			}
		}
		System.out.println("最大的前5个元素及其坐标为");
		for(int n=0;n<5;n++) {
			System.out.println(b[n].num+" ( "+b[n].x+" , "+b[n].y+" ) ");
		}
		
		//第二问:鞍点
		double[] d=new double[M];
		double[] c=new double[M];//定义两个一维数组来存放某个元素对应的整行整列的元素
		double num = 0;
		int x=0,y=0;
		int flag=0;
		for(int i=0;i<M;i++) {
			for(int j=0;j<M;j++) {
				for(int p=0;p<M;p++)
					d[p]=a[i][p];//提出整行
				for(int q=0;q<M;q++)
					c[q]=a[q][j];//提出整列
				Arrays.sort(d);
				Arrays.sort(c);
				if(a[i][j]==d[M-1]&&a[i][j]==c[0]) {
					num=a[i][j];
					x=i;
					y=j;
					flag=1;
					break;
				}//将该元素与整行最大值和整列最小值进行比较
			}
		if(flag==1)
			break;
		}
		if(flag==1) 
			System.out.println("该二维数组的鞍点是 "+num+" 其坐标为 ( "+x+" , "+y+" )" );
		else
			System.out.println("该二维数组无鞍点");

		}
}

猜你喜欢

转载自blog.csdn.net/Perce_Issac/article/details/82725893