NEFU-2023-Java实验一
创始人
2024-06-02 04:57:23

作者的话

大底包含了JAVA硬性规定的作业代码,并非最优解,仅供参考并会持续更新。勿要无脑copy,对自己负责。如果代码有误或者优化建议,直接相应博客下方评论或者qq找我如果对代码有理解不了的或者疑惑可以询问我,但是请确保你已经自己思考过或者查过搜索引擎(如果我原模原样搜到了资料的话我会锤你的hh)。一些语法和库的资料查询网站受个人风格影响,部分题目解题方式可能没按照教学要求,如有必要请自己按教学要求做一遍。如果可以的话,麻烦借鉴完以后给我博客来个三连啥的,这可能对我以后找工作或者其他博客的推广什么的有些帮助,感谢

题目一

1. (程序题)

输入华氏温度f,计算并输出相应的摄氏温度c。c=5*(f-50)/9+10。

输入、输出数据说明:输入数据可以是整数也可以是小数;输出数据的结果保留两位小数。

输入:

17.2

输出:

The temprature is -8.22.

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner input = new Scanner(System.in);double f = input.nextDouble();double c = 5 * (f - 50) / 9 + 10;System.out.printf("The temperature is %.2f.", c);}
}

这时候肯定有同学对代码代码不够满意,这时我们对代码进行优化以提高代码的健壮性和用户体验。

import java.util.InputMismatchException;
import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner input = new Scanner(System.in);double f = 0;try {f = input.nextDouble();} catch (InputMismatchException e) {System.out.println("Invalid input. Please enter a number.");return;}double c = 5 * (f - 50) / 9 + 10;System.out.printf("The temprature is​ %.2f.",c);}
}

在上述代码中,我们增加了一个try-catch语句块,用于捕获输入不合法的情况,catch语句块是Java中的异常处理机制。在try语句块中编写可能出现异常的代码,当程序执行到这段代码时,如果出现异常,就会跳转到catch语句块中,执行catch语句块中的代码。

在上述代码中,try语句块中执行了input.nextDouble()方法,如果用户输入的不是一个数值类型的数据(例如字符串、字母等),这个方法就会抛出InputMismatchException异常。在catch语句块中,我们使用了InputMismatchException作为异常类型,当捕获到该异常时,就会执行catch语句块中的代码。

题目二

从键盘中输入两个年份,输出这两个年份之间的所有的闰年年份,每行数据输出四个年份。

输入顺序:小年份 大年份

提示:能被4整除且能不被100整除的年份,或者能被400整除的年份为闰年。

数据输出格式:每个数据后面都有一个空格;每行数据输出四个年份。

如:输入:2020 2050

输出:

2020 2024 2028 2032 

2036 2040 2044 2048 

import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner input = new Scanner(System.in);int startYear = input.nextInt();int endYear = input.nextInt();int count = 0;for(int i = startYear; i <= endYear; i++){if(i % 4 == 0&& i % 100 != 0 || i % 400 == 0){System.out.printf("%d ",i);count++;if(count % 4 == 0){System.out.println();}}}}
}
​

这时候肯定有同学对代码代码不够满意,这时我们对代码进行优化以提高代码的健壮性和用户体验。

import java.util.Scanner;
public class Main{public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int startYear = scanner.nextInt();int endYear = scanner.nextInt();int count = 0;for (int i = startYear; i <= endYear; i++) {if (isLeapYear(i)) {System.out.printf("%d ",i);count++;if (count == 4) {System.out.println();count = 0;}}}if (count != 0) {System.out.println();}}public static boolean isLeapYear(int year) {return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;}
}

题目三

输入一个正整数n,再输入n个整数,将它们从大到小排序后输出。

输出格式:数据输出在一行,且每个数据后面有一个空格。

import java.util.Scanner;
public class Main{public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int []a = new int[n];for(int i = 0; i < n; i++){a[i] = scanner.nextInt();}for(int i = 0; i < n; i++){for(int j = i + 1; j < n; j++){if(a[i] < a[j]){int temp = a[i];a[i] = a[j];a[j] = temp;}}}for(int g:a){System.out.printf("%d ",g);}}
}
​

这时候肯定有同学对代码代码不够满意,这时我们对代码进行优化以提高代码的健壮性和用户体验。

import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();Integer[] numbers = new Integer[n];for (int i = 0; i < n; i++) {numbers[i] = scanner.nextInt();}Arrays.stream(numbers).sorted((a, b) -> b.compareTo(a)).forEach(num -> System.out.print(num + " "));}
}

使用了 Java 8 中的 Stream API,将 numbers 数组转换为一个 Stream,然后对其进行排序。这里使用了 Lambda 表达式 (a, b) -> b.compareTo(a),它定义了如何比较两个数字的大小关系。这里的意思是,将两个数字进行比较,如果第一个数字比第二个数字小,则返回一个负数,如果两个数字相等,则返回 0,如果第一个数字比第二个数字大,则返回一个正数。因此,通过这个 Lambda 表达式可以实现从大到小的排序。

最后,使用 forEach 方法将排序后的数字依次输出到控制台上。

题目四

求a+aa+aaa+aa…a

输入一个正整数repeat (0

输入2个正整数a和n, 求a+aa+aaa+aa…a(n个a)之和。所有测试数据的计算结果都没有超出long类型的表数范围。

输入输出例子如下,注意括号内是说明。

输入

2  (repeat=2)

2 3 (a=2, n=3)

8 5 (a=8, n=5)

输出

246   (2+22+222)

98760 (8+88+888+8888+88888)

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int repeat = sc.nextInt();for (int i = 0; i < repeat; i++) {int a = sc.nextInt();int n = sc.nextInt();long sum = 0;long base = 1; for (int j = 1; j <= n; j++) {sum += base * a;base = base * 10 + 1;}System.out.println(sum);}}
}
​

以输入为1 8 5为例解释核心代码,程序会执行一次循环,计算数字和。具体地,循环变量j从1递增到5,每次循环会计算一项数字和并将其加到sum中。具体来说,循环执行的过程如下:

第一次循环:

j = 1,base = 1,sum = 0
计算当前项数字和:base * a = 1 * 8 = 8
将当前项数字和加到sum中:sum = 0 + 8 = 8
计算下一项数字和的基数:base = base * 10 + 1 = 11

第二次循环:

j = 2,base = 11,sum = 8
计算当前项数字和:base * a = 11 * 8 = 88
将当前项数字和加到sum中:sum = 8 + 88 = 96
计算下一项数字和的基数:base = base * 10 + 1 = 111

第三次循环:

j = 3,base = 111,sum = 96
计算当前项数字和:base * a = 111 * 8 = 888
将当前项数字和加到sum中:sum = 96 + 888 = 984
计算下一项数字和的基数:base = base * 10 + 1 = 1111

第四次循环:

j = 4,base = 1111,sum = 984
计算当前项数字和:base * a = 1111 * 8 = 8888
将当前项数字和加到sum中:sum = 984 + 8888 = 9872
计算下一项数字和的基数:base = base * 10 + 1 = 11111

第五次循环:

j = 5,base = 11111,sum = 9872
计算当前项数字和:base * a = 11111 * 8 = 88888
将当前项数字和加到sum中:sum = 9872 + 88888 = 98760
计算下一项数字和的基数:base = base * 10 + 1 = 111111

循环结束后,程序会将sum的值输出,即待求和的数字8的前5项数字和为98760。

相关内容

热门资讯

苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...