介意帮助遇到第一个减速带的新人吗?

Mind helping a newcomer who hit their first speed bump?

我刚开始学习如何在 Java 中编程。到目前为止一切顺利.. 直到我遇到这个 "bonus" question/problem 我们的老师给了我们额外的 "challenge".

Please click here to view the Question and the Sample input/output(图片文件)

请注意,我不允许使用 class 中未教授或未讨论的任何内容。因此,排除了数组、方法重载、将数组解析为方法、parseInt 等内容。

到目前为止,这是我能想到的:

import java.util.Scanner;
public class Test 
{
    public static void main(String[] args) 
    {
         int N; // number of lines of input
         double length1, length2, length3; // the 3 lengths
         double perimeter; // you get this by adding the 3 lengths
         double minperimeter=0; // dummy value

         Scanner input = new Scanner(System.in);
         System.out.println("Enter the number of triangles you have:");
         N = input.nextInt();

         System.out.println("Insert the lengths of the sides of these " +  
                            "triangles (3 real numbers per line):");

         for (int counter=0; counter<N; counter++)
         {
             length1 = input.nextDouble();
             length2 = input.nextDouble();
             length3 = input.nextDouble();

             perimeter = (length1 + length2 + length3);
             minperimeter = Math.min(perimeter,Math.min(perimeter,perimeter));
         }

         System.out.printf("The minimum perimeter is %.1f%n", minperimeter); 
    }
}

我的两个主要问题是:

1) 该程序仅存储和处理 'last' 输入。 它之前的那些替换成了这个。[更新:解决了这个问题]

2) 我如何 在最终输出中打印 "triangle number" [更新:也解决了这个问题]

所以,谁能帮我想出一个只需要 Java 的最基本知识的解决方案? 如果有帮助,this is the book我们正在使用。目前在第 4 章。但是我们确实学习了数学 Class(在第 5 章中)。

更新: 非常感谢大家的回复!我能够想出一个完全符合我的问题的解决方案。

Math.min(perimeter,perimeter)永远给你perimeter。你可能想做 Math.min(perimeter,minPerimeter)

因为这是一个编程作业,如果我不给你第二个问题的完整解决方案是最好的,但你的提示是在 for 循环的 counter 参数中。在更新 minperimeter 时保存它,这样您就知道在循环的哪次迭代中找到了最小值。

此外,将您的 minPerimeter 初始化为 10000 或更高。如果从 0 开始,Math.Min 将永远不会低于该数值。

将您的 for 循环更改为:

double minperimeter=-1;

for (int counter=0; counter<N; counter++)
     {
         length1 = input.nextDouble();
         length2 = input.nextDouble();
         length3 = input.nextDouble();

         perimeter = (length1 + length2 + length3);

         if(minperimeter == -1){
               minperimeter = perimeter;
         } else{
               Math.min(perimeter,minperimeter);
         }
     }

您必须将较小的周长存储在变量 perimeter 中。

您的任务提示告诉您,任何给定的周长都小于 1000。因此将周长初始化为 1000。

在您的 for 循环中,您必须存储较小的周长:

perimeter = Math.min(perimeter, length1 + length2 + length3)

如果边的总和小于当前周长,则存储较小的值。

请注意,根据您给定的任务,您必须在一行内输入 3 个双打。

备选方案

制作一个 ArrayList 并将所有周长添加到该列表,然后从该列表中找到最小值。

     List<Double> perimeter = new ArrayList<>();
     
     for (int counter=0; counter<N; counter++)
     {
         length1 = input.nextDouble();
         length2 = input.nextDouble();
         length3 = input.nextDouble();

         perimeter.add(length1 + length2 + length3);
     }

     System.out.printf("The minimum perimeter is %.1f%n", Collections.min(perimeter));