Advertisement

达内Core Java练习题解答

  • 5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:RAR


简介:
首先,需要开发一个程序,用于对输入的年份进行判定,以确定其是否为闰年。闰年的判断标准如下: (1)如果该年份可以被4整除,但不能被100整除,那么它就属于闰年。 (2)此外,如果该年份能够被400整除,则它同样会被认定为闰年。 import java.util.Scanner; class Bissextile { public static void main(String[] arge) { System.out.print(请输入年份:); int year; // 定义输入的年份名字为“year” Scanner scanner = new Scanner(System.in); year = scanner.nextInt(); if (year < 0 || year > 3000) { System.out.println(年份有误,程序将退出!); System.exit(0); } if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) { System.out.println(year + 是闰年); } else { System.out.println(year + 不是闰年); } } } 2. 对于提供的百分制分数,系统将根据分数范围将其归类到相应的等级。具体而言,分数达到90分或更高将被评定为A级,80至89分之间则为B级,70至79分之间为C级,60至69分之间为D级,而低于60分的成绩将被判定为E级。 import java.util.Scanner; class Mark { public static void main(String[] args) { System.out.println(请输入一个分数); // 定义输入的分数为“mark”,且分数会有小数 double mark; Scanner scanner = new Scanner(System.in); mark = scanner.nextDouble(); // 进一步说明,这里读取的是用户输入的浮点数,用于存储学生的成绩。 } } 检查是否存在输入错误。 如果标记值小于零或大于100,则输出“输入有误!”并程序退出。 *用于确定分数等级的判断* 对于90分及以上,评定为A级;对于80到89分,评定为B级;对于70到79分,评定为C级;对于60到69分,评定为D级;对于60分以下,评定为E级。 如果标记值大于等于90,则输出“该分数等级为A”。 否则,如果标记值大于等于80,则输出“该分数等级为B”。 接着,如果标记值大于等于70,则输出“该分数等级为C”。 如果标记值大于等于60,则输出“该分数等级为D”。 最后,如果标记值小于60,则输出“该分数等级为E”。 3,请编写程序计算 1 + 3 + 5 + 7 + ... + 99 这些整数的和。 class he{ public static void main(String[] args){ int number = 1; // 设置初始值为1,后续每次递增2。 int sum = 0; for ( ; number <100; number+=2 ){ sum += number; } System.out.println(1+3+5+7+……+99 = +sum); } } 4、运用for循环来输出 9x9 的乘法表? 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9 = 9 2 * 9 = 18 3 * 9 = 27 4 * 9 = 36 5 * 9 = 45 6 * 9 = 54 7 * 9 = 63 8 * 9 = 72 9 * 9 = 81 通过嵌套循环,程序能够生成并展示九九乘法表。 在 `main` 方法中,使用嵌套 `for` 循环来实现这一功能。外部循环控制行数,内部循环控制列数。 老师的实现方式中,在判断语句中使用了 `k <= j` 来避免不必要的计算。 此外,为了优化效率,可以考虑使用 `continue` 代替 `break`,尽管这种方式可能会略微降低性能。 程序通过 `System.out.print()` 输出乘法表达式,并通过 `System.out.println()` 在每一行末尾换行,从而完整地呈现九九乘法表。 6、程序需生成所有满足条件的“水仙花数”。具体而言,“水仙花数”指的是一个三位数的整数,其每位数字的立方和恰好等于该数本身。例如,153 是一个“水仙花数”,因为 1 的立方 + 5 的立方 + 3 的立方 = 1 + 125 + 27 = 153。 class DafodilNumber { public static void main(String[] args) { System.out.println(以下是所有的水仙花数); int number = 100; 鉴于水仙花数定义为由三位数字组成的数字,且从100开始计算,因此从100开始计数。 } } int i, j, k; 这些变量分别代表数字的百位、十位和个位数值。 for (int sum; number < 1000; number++) { i = number / 100; j = (number - i * 100) % 10; k = number - i * 100 - j * 10; sum = i * i * i + j * j * j + k * k * k; if (sum == number) System.out.println(number + 是一个达芬奇数!); } } 7、计算表达式 a + aa + aaa + ... + aaaaaaaaa = ?,其中 a 是 1 到 9 之间的任意一个数字,并且可以指定项数。 import java.util.Scanner; class Multinomial { public static void main(String[] args) { int a; // 声明用于接收用户输入的整数 a int howMany; // 声明用于接收用户输入的项数 Scanner scanner = new Scanner(System.in); System.out.println(请输入一个 1 到 9 的 a 值:); a = scanner.nextInt(); System.out.println(请问要相加多少项?); howMany = scanner.nextInt(); int sum = 0; // 初始化和为 0 int a1 = a; // 保存 a 的初始值,用于后续计算 for (int i = 1; i <= howMany; i++) { sum += a; // 将当前 a 加到总和中 a = 10 * a + a1; // 计算下一项的值,即前一项乘以 10 再加上初始值 a。注意,a 的值已经更新。 } System.out.println(和为: + sum); // 输出计算得到的总和 } } 求前20项 21+32+53+85+138......之和。 class Sum { public static void main(String[] args) { double sum = 0; double numerator = 2.0, denominator = 1.0; // 初始化分子 (numerator) 为 2,分母 (denominator) 为 1 for (int i = 1; i <= 20; i++) { sum += numerator * denominator; // 将分子乘以分母,累加到总和中 denominator = numerator; // 计算下一次的分母,使其等于当前的分子 numerator += denominator; // 计算下一次的分子,使其等于当前分子加上分母 } System.out.println(The sum is: + sum); // 输出计算得到的总和值。 } } 通过运用编程技术,生成以下图形: * * * * * * * * * * * * * * * * * * * * * * * * * class Asterisk { public static void main(String[] args) { for (int i = 1; i <= 13; i += 2) { for (int j = 1; j <= i && i + j <= 14; j++) { System.out.print(*); } System.out.println(); // 添加注释以说明换行操作 } } } 11、计算圆周率。该公式为:PI = 4 - 4/3 + 4/5 - 4/7 + ... 等级求和。程序需输出第一个数值,其结果大于 3.1415 但小于 3.1416。 class Pi { public static void main(String[] args){ double pi = 0; // 设定初始值,用于存储计算结果。 double fenZi = 4; // 定义分子,初始值为4,用于计算每一项的近似值。 double fenMu = 1; // 定义分母,初始值为1,随着循环进行,分母会递增2。 for (int i = 0; i < 1000000000; i++){ // 循环迭代10亿次,以提高精度。虽然迭代次数较多,但可以显著提升计算准确度。 pi += (fenZifenMu) ; // 将当前分子和分母相乘的结果累加到 pi 中。 fenZi *= -1.0; // 更新分子:将分子乘以-1.0,实现正负交替变化。 fenMu += 2.0; // 更新分母:将分母增加2.0,实现分母递增2的规律。 } System.out.println(pi); // 输出计算得到的 pi 值。 } } 该程序通过一个循环计算圆周率 π 的近似值。程序首先定义了变量 `pi` 用于存储结果, `fenZi` 代表分子, `fenMu` 代表分母。循环内部不断更新分子和分母的值,并将其相乘后累加到 `pi` 中。分子每次变化为 +4 和 -4 交替出现,而分母每次递增2。循环迭代了十亿次以获得较高的精度,最终输出计算得到的 π 值约为3.1415926525880504,但由于迭代次数有限,结果可能存在一定的误差。 12、请提供一个数据值n,并以此计算斐波那契数列(Fibonacci)中第n项的值。数列的初始值为:1 1 2 3 5 8 13 21 34。 该数列遵循以下规律:每个数值等于其前两个数值的总和。 接下来,我们将展示一个用于计算斐波那契数列(Fibonacci)第n项值的Java程序: ```java public class Fibonacci { public static void main(String[] args) { int n = Integer.parseInt(args[0]); // 从命令行获取输入数据n int n1 = 1; // 定义第一个斐波那契数 int n2 = 1; // 定义第二个斐波那契数 int sum = 0; // 定义累加和 if (n <= 0) { System.out.println(参数错误!); // 如果n小于等于0,则输出错误信息 return; } if (n <= 2) { sum = 1; // 如果n小于等于2,则第n项的值为1 } else { for (int i = 3; i <= n; i++) { sum = n1 + n2; // 计算当前数值为前两个数值之和 n1 = n2; // 更新第一个斐波那契数 n2 = sum; // 更新第二个斐波那契数 } } System.out.println(sum); // 输出计算得到的第n项斐波那契数。 } } ``` 该程序旨在计算斐波那契数列(Fibonacci)中特定项的值,并将其余项全部输出。 以下是一个名为`FibonacciPrint`的Java类,其`main`方法实现了这一功能: ```java public class FibonacciPrint { public static void main(String[] args) { int n = Integer.parseInt(args[0]); // 从命令行获取要计算的斐波那契数列的项数 FibonacciPrint t = new FibonacciPrint(); // 创建FibonacciPrint类的实例 for (int i = 1; i <= n; i++) { // 循环迭代计算并打印数列中的每个值 t.print(i); // 调用print方法打印当前项的值 } } public void print(int n) { // 定义一个名为print的方法,用于计算和打印单个斐波那契数的值 int n1 = 1; // 初始化第一个斐波那契数 int n2 = 1; // 初始化第二个斐波那契数 int sum = 0; // 初始化和变量 if (n <= 0) { // 检查输入参数是否有效 System.out.println(参数错误!); // 如果参数无效,则输出错误信息并返回 return; } if (n <= 2) { // 如果要计算的项数为2或更小,则直接返回1,因为前两个斐波那契数都是1。 sum = 1; } else { // 如果要计算的项数大于2,则进行循环计算。 for (int i = 3; i <= n; i++) { // 从第三个数字开始迭代到n为止。 每次将前两个数字的和赋值给sum, 然后将第二个数赋值给n1, 将sum赋值给n2。 这样就完成了对下一个斐波那契数的计算。 注意这里i从3开始是因为我们已经定义了前两个数字n1和n2。 sum = n1 + n2; // 计算当前斐波那契数的值并将结果存储在sum变量中。 n1 = n2; // 将第二个数更新为当前斐波那契数的前一个值。 n2 = sum; // 将当前斐波那契数的计算结果更新为第二个数的值。 } } System.out.println(sum); // 输出计算出的斐波那契数列中的第n个值 。 } } ``` 13、计算数列 1 - 13 + 15 - 17 + 19 ... 的前50项之和。 a、确定并计算该数列的前50项的和。 b、求出数列中最后一项的绝对值小于 1e-5 的和。 15、将金字塔图案打印到屏幕上,共呈现n行,例如当n等于5时,图案将显示如下: * * * * * * * * * 该程序用于生成金字塔形状的星号图案。 以下代码定义了一个名为 `PrintStar` 的类,其中包含 `main` 方法。 在 `main` 方法中,程序首先接收一个整数参数 `col`,该参数表示金字塔的列数。 然后,使用一个 `for` 循环迭代每一行(从 1 到 `col`)。 在每一行的循环中,程序首先打印若干个空格,以实现金字塔的对齐效果。 这部分通过另一个 `for` 循环完成,其迭代次数由 `col - i` 决定,从而控制打印空格的数量。 接下来,程序打印星号。 利用第三个 `for` 循环,它迭代 `2*i - 1` 次,从而在当前行打印相应数量的星号。 最后,使用 `System.out.println()` 语句换行,以便开始下一行的打印操作。 16、歌德巴赫猜想指出,每一个大于六的偶数都可以被分解成两个质数之和。程序将枚举并输出所有满足此条件的可能组合。 任何一个大于六的偶数,都可以被分解成两个质数的总和。程序将输出所有满足此条件的可能组合。 以下是一个Java程序,用于实现此功能: ```java public class Gedebahe{ public static void main(String args[]){ int num = Integer.parseInt(args[0]); if(num<=6){ System.out.println(参数错误!); return; } if(num%2!=0){ System.out.println(参数错误!); return; } Gedebahe g = new Gedebahe(); // 1不是质数, 2是偶数, 因此从3开始循环 for(int i=3; i<=num; i++){ if(i%2==0){ //如果为偶数,则跳过本次循环迭代。 continue; } // 当i和num-i都为质数时,满足条件,打印结果。 if(g.isPrime(i) && g.isPrime(num-i)){ System.out.println(i + + + (num-i) + = + num); } } } // 辅助函数:判断一个数是否为质数。 (这里省略了isPrime的具体实现) private boolean isPrime(int n) { // 实现质数判断逻辑... 例如:遍历到sqrt(n)即可。 此处省略具体实现以保持代码简洁性。 return false; // Placeholder - Replace with actual prime check logic } } ``` 第4章 数组 首先,需要创建一个包含十个元素的整数一维数组,并为每个元素赋予随机生成的整数值。随后,程序应计算并确定该数组中所有元素的最高值、最低值、平均值以及总和。最后,将这些计算结果以清晰的方式输出到控制台或指定输出区域。 class ArrayNumber { public static void main(String[] args) { int[] arrayNumber; arrayNumber = new int[10]; System.out.println(以下是随机生成的10个整数:); // 填入随机的 10个整数 (This line is intentionally left blank as its a placeholder for the random number generation) for (int i = 0; i < arrayNumber.length; i++) { arrayNumber[i] = (int) (100 * Math.random()); System.out.print(arrayNumber[i] + ); } System.out.println(); int max = arrayNumber[0]; int min = arrayNumber[0]; int sum = 0; for (int i = 0; i < arrayNumber.length; i++) { if (max < arrayNumber[i]) { max = arrayNumber[i]; // 更新最大值。 } if (min > arrayNumber[i]) { min = arrayNumber[i]; // 更新最小值。 } sum += arrayNumber[i]; // 计算总和。 } System.out.println(最大值: + max + , 最小值: + min + , 总和: + sum + , 平均值: + (double) sum / arrayNumber.length); // 输出结果。 } } 第二步,声明一个整型的一维数组,其大小为10个元素,并依次赋予它们从1到10的整数值。随后,对数组中的每个元素进行循环操作,将每个元素的值向左移动一位位置。具体而言,数组的第一个元素的值将被赋值为第二个元素的值,第二个元素的值将被赋值为第三个元素的值,以此类推,直到最后一个元素的原始值被赋予第一个元素。最后,请将修改后的数组内容输出到屏幕上以供观察。 3. 首先,需要建立一个整数类型的单维数组,其大小为40个元素,用于记录每个学员的考试分数。随后,通过随机数生成器产生40个介于0到100之间的随机整数,并将这些随机数依次存入该数组中。接着,计算所有成绩的平均值,最后统计那些分数低于平均分学员的数量,并将这个数量输出到屏幕上。 4. (可选)在此基础上,请将前述的40条成绩数据按照由高到低的顺序进行排列展示。 通过编程实现,可以将一个数组中的元素顺序颠倒。 举例来说,如果初始数组包含数值 1、2、3、4 和 5,那么经过倒排操作后,数组中的值将变为 5、4、3、2 和 1。 要求首先创建一个包含100个元素的整型数组a,并用100个随机生成的四位整数填充该数组。随后,定义一个包含10个元素的整型数组b。接着,计算数组a中的每个元素除以10的余数,并统计余数为0的元素的个数,将该结果存储在b[0]中;统计余数为1的元素的个数,并将结果存储在b[1]中,以此类推,直至统计出余数为9的元素的个数并将其结果存储在b[9]中。 class Remain { public static void main( String[] args) { int[] a = new int[100]; // 初始化数组,为后续操作做准备。 for (int i = 0; i < 100; i++) { a[i] = 0; // 或者其他合适的初始值,例如随机数等。 } // 接下来可以对数组进行各种操作,例如赋值、遍历、排序等。 // 这里只展示了数组的声明和初始化。 } } 将随机生成的四位整数,共计一百个,存储到数组 `a` 中。 循环迭代执行以下操作:从 `i = 0` 到 `a.length - 1`,每次迭代将 `a[i]` 的值设置为一个介于 0 到 9999.999...之间的随机数,并将其转换为整数类型后赋值给 `a[i]`。 这段代码用于计算数组 `a` 中每个元素除以 10 的余数,并统计这些余数出现的次数。首先,声明了一个包含 10 个元素的整数数组 `b`,以及两个整型变量 `k` 和 `sum`。然后,使用嵌套循环遍历数组 `b` 中的每个索引 `j`。在内层循环中,遍历数组 `a` 中的每一个元素 `a[k]`。如果 `a[k]` 除以 10 的余数等于当前循环变量 `j`,则将计数器 `sum` 加 1。在内层循环结束后,将 `sum` 的值赋给数组 `b` 的第 `j` 个元素。最后,使用 `System.out.printf()` 方法将数组 `b` 中第 `j` 个元素的值输出到控制台,格式为 b[j]=value。 7. 首先,创建一个20行5列的二维数组,用于记录某班级共20名学员在五门课程上的成绩。这五门课程的顺序分别是:核心C++、核心Java、Servlet、JSP和EJB。 (1)随后,通过循环迭代访问二维数组中的每一个元素,并为其分配一个介于0到100之间的随机整数。 (2)接着,以列表的形式展示每个学员在每门课程中所取得的成绩。 (3)在此基础上,需要编写程序来计算每个学员的总分,并将这些总分存储在一个独立的单维数组中。 (4)最后,需要编写程序计算所有学员在特定某门课程上的平均分。 该代码片段定义了一个名为 `Student` 的类,其中包含一个 `main` 方法。该方法声明了一个二维整数数组 `mark`,其大小为 20 行 5 列。程序随后会为学生分配分数,这些分数是随机生成的。循环的初始化部分存在错误,需要修正以完成程序的逻辑。 8. 编写一个九宫格程序,其布局呈现出井字形(必须为奇数行列数),并填充数字。这些数字应被精心安排,以确保每一行、每一列以及两条对角线的数值之和均相等。 经验规则规定,起始于 1 的数字应按照顺序依次递增,并且第一行的中间位置应放置该数字。随后,下一个数字应向右上角斜向填充,以 45 度角进行递增。若数值超出单边边界,则应采用头尾相接的方式进行填充。同时,如果存在数值填写的冲突情况,则将该数值填入之前位置的底下一格。此外,若数字同时超出两侧边界,则同样将该数值填入之前位置的底下一格。 我认为,首先应该将中间的数字放置在九宫格的中心位置;随后,按照既定规则依次填充剩余的数字,同时确保头部和尾部对应的数字分别填入其相应的格子。(第 n 个数值与倒数第 n 个数值之间存在对应关系,且九宫格以中心格为对称轴。) 通过这种方法,能够同时完成两个数字的填写,从而显著提升了操作效率。虽然其准确性仍需通过严谨的数学证明来证实(但经过多次实验并未发现任何错误。) 此外,九宫格的 1 单元格可以被安置在其他三个位置上;然而,后续的填充顺序则需要相应调整。进一步地,根据九宫格本身的对称性特征,至少存在八种不同的填写方案。 import java.util.Scanner; class NinePalace { public static void main(String[] args) { 定义 N 为九宫格的行列数,需要输入。 System.out.println(请输入九宫格的行列规模(只能是奇数的)); Scanner n = new Scanner(System.in); int N; 确定一个格局是否为奇数,能够识别出偶数、负数以及小数。 声明一个双精度浮点型变量 `d`。 进入一个无限循环 `while (true)`: 首先,将用户输入的数值赋值给变量 `d`,使用 `n.nextDouble()` 方法获取。随后,将 `d` 转换为整数类型并存储在变量 `N` 中。 接着,检查以下条件之一是否成立:如果 `d` 与 `N` 的差值大于 1.0E-4(即小于 1.0E-4),或者 `N` 是偶数,或者 `N` 是负数,则输出错误信息“输入出错,格局只能是正奇数。请重新输入。”。 如果以上任何条件都不成立,则执行 `break` 语句,跳出循环。 为了记录老师的九宫格填写结果,首先需要创建一个二维整数数组,用于存储九宫格中的每个数字。具体而言,声明一个名为 `result` 的二维数组,其大小为 `N` 行 `N` 列,用于保存九宫格的填充值。随后,初始化行索引 `row` 为 0,列索引 `col` 为 `N/2` (因为列从 0 开始计数),代表九宫格的起始位置。 接着,使用一个循环从 1 迭代到 `N*N`,每次迭代将当前循环计数器 `i` 赋值给数组 `result` 的当前单元格:`result[row][col] = i;`。在循环内部,通过递减行索引 `row--` 和递增列索引 `col++` 来逐步向九宫格的中心移动。 如果行索引 `row` 变为负数且列索引 `col` 大于或等于 `N`,则表示已经到达了九宫格的边界之外。此时,需要调整列索引为 `col--` 并增加行索引为 2 (`row += 2;`) 以确保填充值继续在九宫格内移动。 如果行索引 `row` 变为负数,则意味着行已经越界了。在这种情况下,将行索引重置为九宫格的倒数第二行位置 (`N-1`)。 如果列索引 `col` 大于或等于 `N`,则表示列已经越界了。在这种情况下,将列索引重置为 0。 如果数组 `result[row][col]` 中已经存在了非零值(即存在冲突),则需要调整列索引为 `col--`, 并增加行索引为2 (`row += 2;`) ,以避免冲突并继续填充九宫格。 通过循环嵌套的结构,程序会生成一个九宫格的打印输出。外层循环从 i=0 迭代到 i以下是一个名为 `Employee` 的类,它定义了一个员工的基本信息。该类包含一个私有字符串变量 `name` 用于存储员工姓名,以及一个私有整数变量 `birth` 用于记录员工的出生年份。

此外,该类还提供了一个公共方法 `getName()`,用于返回员工的姓名。同时,它包含一个构造函数 `Employee(String name, int birth)`,该构造函数接受员工姓名和出生年份作为参数,并将其分别赋值给类的成员变量 `name` 和 `birth`。

还有一个名为 `getSalary(int month)` 的方法,它根据员工的出生月份来计算工资。如果传入的月份与员工的出生月份相同,则返回 100;否则,返回 0。

The `SalariedEmployee` class inherits from the `Employee` class. It defines a salaried employee object with a specific salary structure. This class includes a private instance variable named `salary` of type `double`, which represents the employees fixed compensation. The `SalariedEmployee` class is initialized with a name (String), birthdate (int), and a base salary (double) through its constructor. During construction, the `super(name, birth)` call invokes the constructor of the parent `Employee` class to set the employees name and birthdate. Subsequently, the `this.salary = salary;` statement assigns the provided base salary to the instance variable `salary`. The class provides a method called `getSalary(int month)` that calculates and returns the total monthly salary for a given month. This method combines the employees base salary (obtained using `super.getSalary(month)`) with their fixed monthly salary (`salary`). 该类 HourlyEmployee 继承自 Employee 类。它包含以下私有成员变量: hourlySalary(小时工资)和 hour(工作小时数)。构造函数 HourlyEmployee(String name, int birth, double hourSalary, int hour) 接受员工姓名、出生日期、小时工资和工作小时数作为参数,并调用父类 Employee 的构造函数进行初始化。此外,它将 hourlySalary 设为 hourlySalary,将 hour 设为 hour。getSalary(int month) 方法计算员工的月薪。如果工作小时数小于等于 160 小时,则返回 hourlySalary 乘以 hour 的值加上父类 Employee 的月薪;否则,返回 160 倍 hourlySalary 的值加上剩余小时数(hour - 160 小时)的 hourlySalary 的 1.5 倍,再加上父类 Employee 的月薪。 该SalesEmployee类继承自Employee类。它包含两个私有成员变量:销售额sales和绩效pre。构造函数SalesEmployee接受员工姓名name、出生日期birth、销售额sales和绩效pre四个参数,并调用父类Employee的构造函数进行初始化。同时,将销售额this.sales和绩效this.pre分别赋值给对应的成员变量。getSalary方法根据月份month计算员工的工资,返回销售额sales乘以绩效pre再加上父类Employee的getSalary方法计算的工资之和。 class BaseSalarySalesEmployee extends SalesEmployee { private double baseSalary; public BaseSalarySalesEmployee(String name, int birth, double sales, double pre, double baseSalary) { super(name, birth, sales, pre); this.baseSalary = baseSalary; } public double getSalary(int month) { return this.baseSalary + super.getSalary(month); } } * 对现有的员工练习程序进行代码修订。 * 公司将为SalaryEmployee每月额外支付2000元的加班费,为BasePlusSalesEmployee支付1000元的加班费。 * 修改现有的代码,以包含上述的加班费发放逻辑。 * 编写一个方法,用于打印出本月公司总共发放的加班费金额。 * @author Administrator public class EmployeeTest { * @param args * public static void main(String[] args) { Employee e[] = new Employee[4]; e[0] = new SalariedEmployee(魏威, 10, 5000); e[1] = new HourlyEmployee(段利峰, 8, 80, 242); e[2] = new SalesEmployee(林龙, 11, 300000, 0.1); e[3] = new BasedPlusSalesEmployee(华溪, 1, 100000, 0.15, 1500); for (int i = 0; i < e.length; i++) { System.out.println(e[i].getName() + : + e[i].getSalary(11)); } 通过对员工列表 `e` 进行遍历,计算加班费总额。程序首先初始化一个变量 `result` 为 0。然后,对于列表中的每一个元素 `e[i]`,进行以下判断:如果该元素是 `SalariedEmployee` 类型,则将其转换为 `SalariedEmployee` 对象 `s`,并累加其加班费 `s.getAddtionalSalary()` 到 `result` 中。如果该元素是 `BasedPlusSalesEmployee` 类型,则将其转换为 `BasedPlusSalesEmployee` 对象 `b`,并同样累加其加班费 `b.getAddtionalSalary()` 到 `result` 中。最终,计算出的加班费总额存储在变量 `result` 中。 for (int i = 0; i < e.length; i++) { result += e[i].getAddtionalSalary(); } System.out.println(加班费: + result); } 该接口定义了一个名为 AddtionalSalary 的模块,其核心功能在于提供获取额外工资的方法。具体来说,它包含一个名为 getAddtionalSalary 的函数,该函数负责计算并返回员工的额外工资数值。

该类 `Employee` 实现了 `AddtionalSalary` 接口。它包含员工姓名和生日月份作为其私有属性。

构造函数 `Employee` 接受员工姓名和生日月份作为参数,并将其分别赋值给 `name` 和 `birth` 属性。

`getSalary` 方法计算员工的工资。如果当月与员工的生日月份相同,则返回 100;否则,返回 0。

`getName` 方法用于获取员工的姓名。

This function returns an integer value representing any additional salary.

该类 `SalariedEmployee` 继承自 `Employee` 类。

它包含一个私有变量 `salaryPerMonth`,用于存储每月固定工资。

构造函数 `SalariedEmployee(String name, int birth, int salaryPerMonth)` 接受员工姓名、出生日期和每月固定工资作为参数,并调用父类的构造函数进行初始化,同时将 `salaryPerMonth` 赋值给实例变量。

方法 `getSalary(int month)` 返回员工在指定月份的工资,该工资包括每月固定工资、月份基本工资以及额外的补贴工资。

方法 `getAddtionalSalary()` 返回额外的补贴工资,其值为 2000。

该`HourlyEmployee`类继承自`Employee`类。它包含以下私有成员变量:`salaryPerHour`(每小时工资)和`hoursPerMonth`(每月工作小时数)。构造函数接受员工姓名、出生日期、每小时工资和每月工作小时数作为参数,并调用父类的构造函数进行初始化。此外,它还定义了一个名为`getSalary`的方法,该方法计算员工在给定月份的薪水。如果每月工作小时数小于等于160小时,则薪水等于每月工作小时数乘以每小时工资。否则,薪水包括160小时的工资以及超过160小时的部分,超过部分按每小时工资的1.5倍计算。最后,该方法返回计算得到的月薪加上父类 `Employee` 提供的月薪。 class SalesEmployee 继承自 Employee 类。 它包含两个私有成员变量:销售额 sales 和销售率 rate。 SalesEmployee 类构造函数接受员工姓名 name、出生日期 birth、销售额 sales 和销售率 rate 作为参数,并使用 super(name, birth) 调用父类 Employee 类的构造函数进行初始化。 随后,该类将私有变量 sales 和 rate 分别设置为传入的销售额和销售率。 SalesEmployee 类提供了一个 getSalary 方法,该方法根据月度工作时长 month 返回员工的总薪水。 计算方式为:sales 乘以 rate 再加上调用父类 Employee 类的 getSalary 方法返回的月薪。 该类 `BasedPlusSalesEmployee` 继承自 `SalesEmployee` 类。它包含一个私有整数变量 `basedSalary`,用于存储基本工资。构造函数 `BasedPlusSalesEmployee` 接受员工姓名、出生日期、销售额、提成率和基本工资作为参数,并调用父类的构造函数进行初始化,同时将 `basedSalary` 赋值给实例变量。 该类提供了 `getSalary` 方法,用于计算月薪,该月薪由基本工资、通过父类继承的月薪以及额外的工资组成。此外,还定义了一个名为 `getAddtionalSalary` 的方法,该方法返回一个固定的值 1000。 经典算法: 1. 一所学校为其学生安排宿舍,规定每6位学生占用一间房间,且不考虑学生的性别差异。因此,需要准备多少间房间以满足所有学生的住宿需求? 答案: (x+5) * 6 请注意理解整数类型的数值运算。 2. 让数值在 0~9 之间循环。 public class test{ public static void main(String[] args){ int i=0; while(true){ i = (i+1)%10; System.out.println(i); } } } 作业: 1. 设计一个数组类,用于存储对象: 该类应具备以下功能:添加(允许添加任意数量的元素)、修改现有元素、在指定位置插入新元素、删除指定位置的元素以及查询特定位置或满足条件的元素。 ```java class MyArray { private Object[] os = new Object[10]; public void add(Object o) { /* 实现添加功能 */ } public void set(int index, Object o) { /* 实现修改功能 */ } public void insert(int index, Object o) { /* 实现插入功能 */ } public void remove(int index) { /* 实现删除功能 */ } public void remove(Object o) { /* 实现删除指定对象的功能 */ } public Object get(int index) { /* 实现查询功能 */ } } ``` } public class TestMyArray { public static void main(String[] args) { MyArray ma = new MyArray(); ma.add(aaa); ma.add(bbb); ma.add(ccc); Object o = ma.get(1); Iterator it = ma.iterator(); while (it.hasNext()) { Object o1 = it.next(); System.out.println(o1); } } } 作业 10-08 1. 生成包含 20 个随机整数(范围在 10 以内)的 ArrayList,随后利用迭代器对该 ArrayList 进行遍历。 2. 接着,从 ArrayList 中移除所有值为 5 的元素。 3. 之后,生成另外三个整数,并将它们插入到 ArrayList 的第 4 个位置。 4. 最后,将 ArrayList 中所有值为 1 的数字替换为 10。 import java.util.ArrayList; class ArrayList { private Object[] os = new Object[20]; } public class TestArray { public static void main(String[] args) { ArrayList a = new ArrayList<>(); // 示例:向 ArrayList 中添加元素 a.add(Element 1); a.add(Element 2); a.add(Element 3); // 示例:访问 ArrayList 中的元素 System.out.println(a.get(0)); // 输出: Element 1 // 示例:遍历 ArrayList 中的元素 for (Object element : a) { System.out.println(element); } } } 通过调用ma.add()方法,依次将aaa、bbb和ccc添加到集合ma中。随后,使用一个对象变量o来存储ma集合的第一个元素,即ma.get(1)。为了遍历集合中的所有元素,我们利用Iterator接口it进行迭代。在while循环内部,通过it.next()方法获取当前迭代的元素,并将其赋值给对象变量o1。最后,使用System.out.println()语句将每个元素o1的内容输出到控制台。 1. 创建包含 3000 个介于 1 到 10 之间的整数的 HashSet。 2. 迭代该集合,并逐个打印其中的每个数值。 以下是 Java 代码示例: ```java import java.util.HashSet; import java.util.Iterator; import java.util.Random; public class TestHashSet { public static void main(String[] args) { Random r = new Random(); HashSet hs1 = new HashSet<>(); for (int i = 0; i < 3000; i++) { hs1.add(r.nextInt(10)); } Iterator it1 = hs1.iterator(); while (it1.hasNext()) { System.out.print(it1.next() + ); } } } ``` 由于 HashSet 的特性不允许重复元素,因此集合中最多包含 10 个不同的数字,这些数字按照哈希排序后呈现为:2, 4, 9, 8, 6, 1, 3, 7, 5, 0。 * 探索TreeSet的比较器功能, * 当TreeSet使用自定义比较器时,如何遵循Comparable接口的要求。 import java.util.*; class Teacher { int id; String name; int age; public Teacher() {} public Teacher(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } public int TeacherComparator(Object o) { Teacher t1 = (Teacher) o; if (t1.getId() > id) { return 1; } else if (t1.getId() < id) { return -1; } return 0; } } class TreeSet { } class Test { public static void main(String[] args) { String s1 = new String(aaa); String s2 = new String(bbb); String s3 = new String(aaa); System.out.println(s1 == s3); System.out.println(s1.equals(s3)); } } 利用HashSet数据结构,首先创建了一个新的空集合hs。随后,通过调用其add()方法,将字符串s1、s2和s3这三个元素依次添加到该集合中。为了遍历并打印集合中的每个元素,我们获取了集合的迭代器it。在while循环中,只要迭代器hasNext()返回true,就执行打印操作,即使用it.next()获取当前迭代的元素并将其输出到控制台。此外,还使用了System.out.printf()方法来输出每个字符串对象的哈希码。具体来说,对于s1、s2和s3这三个字符串对象分别计算其哈希码值,并通过格式化输出将其显示在控制台上。 构建一个HashMap,其中键(Key)使用学生姓名(name),值(Value)使用Student类对象。 以下是一个Java代码示例,展示了如何实现这个需求: ```java import java.util.*; class Student { int id; String name; int age; public Student() {} public Student(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } public class Main { public static void main(String[] args) { // 创建一个HashMap实例。 Map studentMap = new HashMap<>(); // 添加学生信息到HashMap中。例如:添加一个名为“张三”的18岁学生。 Student zhangSan = new Student(1, 张三, 18); studentMap.put(张三, zhangSan); // 添加另一个学生信息。例如:添加一个名为“李四”的20岁学生。 Student liSi = new Student(2, 李四, 20); studentMap.put(李四, liSi); // 访问HashMap中的数据。 获取“张三”的学生信息。 如果存在,则打印出来;否则,打印提示信息。 这种方式可以方便地检索和操作学生数据。 还可以通过遍历map来获取所有学生的信息进行处理。 if (studentMap.containsKey(张三)) { //检查是否包含key 张三 的元素是否存在,如果存在则执行if语句块中的代码,否则执行else语句块中的代码。 如果存在,则打印出该学生的id、name和age属性值;否则,打印提示信息“该学生不存在”。 这是一种常用的判断元素是否存在的方法。 这种方法可以避免在map中不存在的情况下访问map中的元素导致程序崩溃或者出现异常的情况发生。 此外,还可以根据需要对获取到的Student对象进行进一步的处理和操作,例如修改学生的年龄、姓名等属性值或者将学生的个人信息存储到文件中等。 这是一种灵活的处理方式,可以满足不同的应用场景需求 。 System.out.println(张三的id: + zhangSan.getId() + , name: + zhangSan.getName() + , age: + zhangSan.getAge()); } } ``` class TestHashMap { public static void main(String[] args) { HashMap hm = new HashMap<>(); Student s1 = new Student(1, jacky, 19); hm.put(jacky, s1); hm.put(tom, new Student(2, tom, 21)); hm.put(kitty, new Student(3, kitty, 17)); } } 通过迭代器,遍历哈希映射 `hm` 的键集合: 使用迭代器 `it`,循环访问哈希映射 `hm` 的键集。在每次迭代中,获取当前键 `key`,并将其转换为 `Student` 对象 `value`。随后,将键值对以特定的格式打印到控制台,具体格式为“key:id=value.id,age=value.age”。 循环结束后,打印一条分隔线,显示为“============================”。 对比一下 `KeySet()` 和 `entrySet()` 这两种不同的迭代方法。 以下代码展示了使用 `entrySet()` 迭代器的示例: ```java for(Iterator i1 = hm.entrySet().iterator(); i1.hasNext(); ) { Map.Entry me = (Map.Entry) i1.next(); Student s = (Student) me.getValue(); System.out.println(me.getKey()+: id=+s.id+, age=+s.age); } ``` 这段代码首先创建了一个 `entrySet()` 迭代器,用于遍历 HashMap `hm` 的所有键值对。 然后,在循环内部,它从迭代器中获取下一个键值对,将其存储在 `Map.Entry` 对象 `me` 中。 接着,从 `me` 对象中提取值,并将其类型转换为 `Student` 对象 `s`。最后,使用 `System.out.println()` 方法将键和学生对象的信息打印到控制台,其中学生ID和年龄通过字符串连接的方式显示出来。 day13 作业 1. ********************************************************************************** 设计一个自定义的栈数据结构:(采用先进后出原则)。 建议采用底层LinkedList来实现,并参考java.util.Stack的实现。 具体方法包括:boolean empty() 用于检查堆栈是否为空;E peek() 用于获取栈顶元素而不进行移除操作;E pop() 用于移除栈顶元素并将其返回值;E push(E item) 用于将元素压入栈顶;int search(Object o) 用于在栈中查找指定对象的位置,以1为基数。 *************************************************************************************** 由于继承会破坏封装,因此不应使用继承方式实现。只需直接调用即可。 import java.util.LinkedList; class MyStack{ private LinkedList list = new LinkedList(); public boolean empty() {return list.isEmpty();} public E peek() {return list.peek(); } public E pop() {return list.poll(); } public void push(E o) {list.addFirst(o); } The `indexOf` method returns the index of the first occurrence of the specified element within this list. If the list does not contain the element, it will return -1. Furthermore, the `search` method provides a concise implementation, simply returning the result of calling the `indexOf` method on the underlying list: `return list.indexOf(o);`. 2. 请定义以下类,并完成随后的任务,务必进行验证。 Exam类:代表考试的类,其特性包括若干名学生以及一张考卷。 提示:建议使用HashSet数据结构来存储学生的信息。 Paper类和考卷类都包含若干个试题。这些试题的信息以HashMap的形式进行存储,其中键(key)为String类型,精确地代表了每个试题的题号,而对应的值则为具体的试题对象。 Student类,即学生类。 该类包含以下属性:一名学生的名字,一份包含问题的答卷,以及一份完整的考试考卷,以及最终的考试成绩。 Question类和试题类都包含一系列关键属性。这些属性包括题号、详细的题目描述,以及一组备选答案。其中,备选答案通常以ArrayList的形式存储。 AnswerSheet类,又称答卷类,主要用于存储学生的答案信息。该类具备以下关键属性:每道题的答案。为了高效地管理和检索学生的答案,答卷中的每道题目答案均采用HashMap结构进行存储。具体而言,HashMap的键(key)采用String类型,用于标识题号;而HashMap的值(value)则表示学生对于该题目的所给出的答案。 针对Exam类,需要设计一个方法,该方法负责对所有学生的试卷进行评分,并随后以清晰的方式呈现出最终的成绩排名,具体包括名次、学生姓名以及对应的分数。 3. *************************************************************************************** 项目:商品管理系统 功能:实现商品增删改查操作,并能够根据多种属性进行检索。 商品属性:包括商品名称、价格(精确到两位小数)以及商品种类。 *************************************************************************************** day17 图形界面 1. 计算器 *****************例题 画出计算器的界面***************************** 呈现的图形界面如下: 1 2 3 + 4 5 6 - 7 8 9 * 0 . = ******************* import java.awt.*; import javax.swing.*; class Calculator { public static void main(String[] args) { JTextField textField = new JTextField(); JFrame frame = new JFrame(计算器); Font font = new Font(null, Font.BOLD, 25); // 使用默认字体 textField.setFont(font); // 设置字体 textField.setHorizontalAlignment(JTextField.RIGHT); // 使文本从右侧对齐 textField.setEditable(false); // 设置文本不可编辑,默认可编辑 frame.add(textField, BorderLayout.NORTH); // 将Frame和Dialog使用BorderLayout布局管理器 ButtonActionListener listener = new ButtonActionListener(textField); // 为文本框设置事件监听器 JPanel buttonPanel = new JPanel(); // 创建一个JPanel用于存放按钮 String expression = 123+456-789*0.=; // 定义表达式字符串 GridLayout gridLayout = new GridLayout(4, 4, 10, 10); // 创建一个GridLayout布局管理器 buttonPanel.setLayout(gridLayout); // 将布局管理器应用到JPanel for (int i = 0; i < expression.length(); i++) { char character = expression.charAt(i); // 获取字符串的第i个字符 JButton button = new JButton(character + ); // 创建一个按钮,显示字符 button.addActionListener(listener); // 为按钮添加事件监听器,以便响应点击事件 buttonPanel.add(button); // 将按钮添加到JPanel中 } // 循环构建的逻辑非常实用且广泛应用于各种计算器设计中。 frame.add(buttonPanel, BorderLayout.CENTER); // 将JPanel添加到Frame的CENTER位置 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭窗口时的默认操作为退出程序。 frame.setSize(300, 250); // 设置窗口大小。 frame.setVisible(true); // 显示窗口。这一句通常放在最后执行,确保所有其他操作完成后再显示界面。 } } 该类 `ButtonActionListener` 实现 `ActionListener` 接口。它包含一个 `JTextField` 对象作为私有成员变量。构造函数 `ButtonActionListener(JTextField textField)` 接收一个 `JTextField` 对象作为参数,并将其赋值给实例变量 `textField`。该类重写了其 `actionPerformed()` 方法。 textField.append(将“哈哈”以及若干个字符追加到文本中); } *********************未实现计算器的具体功能******************************* 扫雷游戏是一款经典的电子游戏,其核心玩法在于玩家需要在充满地雷的网格中,通过标记方块来逐步识别出地雷的位置,并最终安全地到达指定目标点。 游戏机制简单易懂,但同时也蕴含着一定的策略性和挑战性,需要玩家具备耐心和细致的观察能力。 这种类型的游戏通常被广泛应用于训练玩家的逻辑思维能力和风险评估能力。 3. 俄罗斯方块是一款经典的益智游戏,其核心玩法在于玩家需要通过旋转和移动方块,将它们落入指定区域的下层,从而消除水平方向上的行并获得分数。游戏以其独特的几何图形和策略性玩法而闻名,吸引了全球数百万玩家。 俄罗斯方块的规则简单易懂,但其精髓在于对空间想象力和反应速度的考验。 游戏在不断发展演变中,衍生出各种不同的变种和模式,为玩家提供了丰富的游戏体验。 day19 多线程 写两个线程,一个线程打印 1~52,另一个线程打印字母A-Z。打印顺序为12A34B56C……5152Z。要求用线程间的通信。 注:分别给两个对象构造一个对象o,数字每打印两个或字母每打印一个就执行o.wait()。 在o.wait()之前不要忘了写o.notify()。 class Test{ public static void main(String[] args) { Printer p = new Printer(); Thread t1 = new NumberPrinter(p); Thread t2 = new LetterPrinter(p); t1.start(); t2.start(); } } class Printer{ private int index = 1;设为1,方便计算3的倍数 打印数字的构造方法,每打印两个数字,等待打印一个字母 public synchronized void print(int i){ while(index%3==0){try{wait();}catch(Exception e){}} System.out.print( +i); index++; notifyAll(); } 打印字母,每打印一个字母,等待打印两个数字 public synchronized void print(char c){ while(index%3!=0){try{wait();}catch(Exception e){}} System.out.print( +c); index++; notifyAll(); } } 打印数字的线程 class NumberPrinter extends Thread{ private Printer p; public NumberPrinter(Printer p){this.p = p;} public void run(){ for(int i = 1; i<=52; i++){ p.print(i); } } } 打印字母的线程 class LetterPrinter extends Thread{ private Printer p; public LetterPrinter(Printer p){this.p = p;} public void run(){ for(char c=A; c<=Z; c++){ p.print(c); } } } *如果这题中,想保存需要打印的结果,可在Printer类里定义一个成员变量 String s = ; 不写“”的话是null,null跟没有东西是不一样的,它会把null当成字符 =_= 然后在两个print()方法里面,while循环后分别加上 s = s + +i; 以及 s = s + + c;*

全部评论 (0)

还没有任何评论哟~
客服
客服
  • 优质
    本书《雷达原理练习题解答》提供了大量关于雷达系统基本理论及应用方面的习题解析,旨在帮助学生和工程师深化对雷达技术的理解。 西安电子科技大学雷达原理课后习题解答(pdf)不包含题目。
  • 优质
    这本书籍或资料包含了丰富的电工练习题及其详细解答,旨在帮助学习者通过大量实践加深理解并掌握电工知识和技能。 电工学习题与答案 1. 问题:电流的定义是什么? 答案:电流是指电荷在导体中的定向移动形成的物理量。 2. 问题:什么是电阻? 答案:电阻是阻碍电路中电流流动的一种特性,单位为欧姆(Ω)。 3. 问题:电压和电动势有何区别? 答案:电压是指两点间的电位差;而电动势则是电源内部非静电力将单位正电荷从负极移送到正极所做的功。 4. 问题:交流电路中,感抗与容抗分别是如何定义的? 答案:在交流电路里,线圈对电流产生的阻碍称为感抗;而由电容器导致的阻滞作用则被称为容抗。两者的计算公式分别为XL=2πfL 和XC = 1/(2πfC)。 5. 问题:三相电源系统中各相电压之间的关系是什么? 答案:在理想情况下,对于星形连接(Y型)的三相电网而言,线间电压是相应相电压的根号3倍;而对于三角形接法(Δ),则每个线电压等于其对应的相电压。 6. 问题:怎样计算串联电路中的总电阻? 答案:当几个电阻按照首尾相连的方式连接时(即串联),它们之间的关系为R_total=R1+R2+...+RN,其中N代表所有参与的元件数量。 7. 问题:并联电路中各支路电流和干路总电流的关系是什么? 答案:在并联电路里,并接的所有电阻上流过的电流之和等于主干线上的总电流值。 8. 问题:电容器的作用有哪些? 答案:电容可以储存能量、滤除杂波信号以及进行耦合隔离等作用,广泛应用于各种电子设备中。
  • 优质
    本书提供了针对吴恩达在Coursera上开设的《机器学习》课程中各练习题目的详细解答和解析,旨在帮助学习者更好地理解和掌握机器学习的核心概念和技术。 吴恩达的机器学习课程习题答案可以在网上找到多种资源。这些解答可以帮助学生更好地理解和掌握课程内容。建议在寻求答案的同时也要注重自己动手解决问题的能力,以加深对知识的理解和应用技巧。
  • 优质
    本书提供了详细的Java教科书练习题答案和解析,帮助学生深入理解编程概念、提高解题技巧。适用于学习Java语言的学生及初学者参考使用。 大连东软信息学院的Java教材课后答案。大连东软信息学院的Java教材课后答案。大连东软信息学院的Java教材课后答案。
  • 优质
    本书《Java程序设计练习题及解答》提供了丰富的Java编程练习与详细解析,旨在帮助读者巩固和提升编程技能。 这段文字描述了一套包含JAVA基础阶段各方面习题的资料,非常适合初学者以及希望提高技能的人使用。
  • 优质
    本书为《Java》教材第十四章配套习题解析,提供详细的解题思路与步骤,帮助读者巩固所学知识和提高编程技能。 第十五章作业,这确实很不错,真的没骗你。
  • 优质
    本资源包含雷达原理课程的核心习题解答与详尽课件内容,旨在帮助学生深入理解雷达系统的工作原理及其关键技术。适用于教学和自学参考。 雷达原理课后习题答案与指导包含详细讲解。此外还有雷达课程讲义与PPT资料。
  • 优质
    本书提供了丰富的MATLAB练习题及其详细解答,旨在帮助读者巩固和提升使用MATLAB进行科学计算、数据分析及编程的能力。 这是MATLAB课后习题的答案,需要的同学可以下载。
  • 优质
    PRML练习题解答是一本针对模式识别与机器学习(PRML)经典教材配套习题的详细解析书籍,旨在帮助读者深入理解相关理论和算法。 经典教材《模式识别与机器学习》的课后习题答案。