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()生成)。
- 通過演算法找到該二維陣列中最大的5個數,要求從大到小輸出該值及其位置。(如果有相同的元素,排在前面的為大)
- 查詢該矩陣的鞍點,如果有,輸出它所在的位置以及該值;如果沒有,輸出不存在。
目前的想法:
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("該二維陣列無鞍點");
}
}