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("该二维数组无鞍点");
}
}