1. 程式人生 > >Java第一次作業:規範化輸出、二維陣列排序問題

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("該二維陣列無鞍點");

		}
}