当前位置: 首页 > 知识库问答 >
问题:

7个按数组排序的分数,java?

夏侯弘量
2023-03-14

这就是我的问题。我需要帮助,试图找出我做错了什么,并从那里开始。我需要创建一个运行这些指令的程序。

创建名为Fraction的java类。该类用于表示两个整数的比率。包括允许用户设置分子和分母的突变体方法。还包括在屏幕上显示分数作为配给(例如5/9)的方法。此方法不需要将分数降低到最低项。

分数类应包含以下内容:

•用于存储分子、分母和比值的私有实例变量。

•设置所有实例变量的构造函数

•获取和设置实例变量的公共方法。

•一个名为reduce()的公共方法,返回分数的最低项。

一个名为toString()的公共方法,它返回一个包含分数作为比率的String。

•一个私有方法名gcd(),返回两个整数的最大公约数。

创建一个测试程序,允许用户创建7个分数的数组。然后程序将按升序对分数进行排序。最高和最低的分数被扔掉,剩下的分数被加在一起。程序应显示所有分数及其总和。总和应减少到最低值,并显示在屏幕上。例如,如果总和为20/60,程序应显示1/3。

测试程序中编写排序方法,对分数数组进行排序并计算总和。

假设您有以下7个分数:6/7, 2/4, 3/4, 3/18, 1/8, 10/20, 2/6,那么丢弃最低和最大分数后的输出示例将是:

3 / 18 2 / 6 2 / 4 10 / 20 3 / 4 = 9 / 4

我完全不知道该如何解决这个问题,我陷入了困境。下面是一份我的课程和作业。主文件。我尝试了一些不同的东西,并用“//”进行了注释,因此很抱歉提前输入了很长的代码。我一次又一次地想弄明白这一点,但已经被困了好几天。它一直给我一个奇怪的错误,叫做null。

我怎么才能让这个工作?谢谢。

import java.io.*;
import java.util.*;

public class Arrays_hw5 {

    private static final Scanner keyb = null;
    public static void main(String[] args) {
        Fraction [] fr = new Fraction[7];
        String reduce = "";
        int numerator = 0, denominator = 0;

        Scanner keyb = null;
        FileInputStream fis = null;
        //Scanner keyb = new Scanner(System.in);  
        try {
          fis = new FileInputStream(new File("Fraction"));
              keyb = new Scanner(fis);
       } catch (FileNotFoundException e) {
           e.printStackTrace();}

        for (int i = 0; i < fr.length; i++) {
            //System.out.println("Enter numerator then denominator, hit enter after each entry: ");
           // fr[i] = new Fraction(i, i);
           // fr[i].getNumerator(keyb.nextInt());
           // fr[i].denominator(keyb.nextInt());
           System.out.print(fr[i] + "  ");  }}

    public static void selectionSort(int[]arr)  
    {
        int smallest = 0;
        for (int outer = 0; outer < arr.length - 1; outer++)
        {
            smallest = outer;
            for(int inner = outer + 1; inner < arr.length; inner++)
            {
                if (arr[inner] < arr[smallest])
                    smallest = inner;
            }
            int v = arr[outer];
            arr[outer] = arr[smallest];
            arr[smallest] = v; }
    }
}

这是分数课。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Fraction {
    public int numerator = 1;
    public int denominator = 1;
    public int gcd;
    public Fraction() {
        super();
    }
    public Fraction(int n, int d) {
        numerator = n;
        denominator = d;
    }
    public int getNumerator() {
        return numerator;
    }
    public void setNumerator(int numerator) {
        this.numerator = numerator;
    }
    public int getDenominator() {
        return denominator;
    }
    public void setDenominator(int denominator) {
        this.denominator = denominator;
    }
    private static int gcd(int numerator, int denominator) {
        return denominator == 0 ? numerator : gcd(denominator, numerator % denominator);
    }
    public double decimal(double numerator, double denominator) {
        return numerator / denominator;
    }


    public static String reduce(int numerator, int denominator) {
        int gcd = gcd(numerator, denominator);
        return (numerator / gcd) + "/" + (denominator / gcd);
    }
    @Override
    public String toString() {
        return numerator + "/" + denominator;
    }}

共有1个答案

闻人伟
2023-03-14

准备一个长答案。首先,在编写任何代码之前,最好先计划好一个项目,因此我们将采取以下步骤:1)从用户处读取输入,并将该输入存储到一个分数数组中。2) 对这个分数数组进行排序,然后删除(忽略)数组中的最高值和最低值。3) 对数组中除最高值和最低值之外的所有值求和,减少此和,然后将此和打印到屏幕上。

你在正确的轨道上,但你没有正确阅读用户输入。首先,出于某种原因打开一个文件。这是不必要的,因为您只需要从命令行读取。其次,您没有正确读取或存储输入。我建议反复提示用户输入分子,然后输入分母。每次读取一个分子和一个分母时,在提示用户输入之前,将这些值存储为分数。请参阅以下代码块以理解我的意思:

Fraction[7] fractions = new Fraction[7]; // array that will hold our fractions
Scanner inputScanner = new Scanner(System.in); // scanner that takes input from the command line

...

public void readInput()
{
    int tempNumer; // variable to store numerator on each iteration
    int tempDenom; // variable to store denominator on each iteration
    for (int i = 0; i < fractions.length; i++)
    {
        System.out.println("Enter a numerator:");
        tempNumer = inputScanner.nexInt();  // store the user-inputted numerator
        System.out.println("Enter a denominator");
        tempDenom = inputScanner.nextInt(); // store the user-inputted denominator
        fractions[i] = new Fraction(tempNumer, tempDenom); // store a Fraction from our temp variables into our fractions array
    }
    
    return;
}

完成此方法后,分数数组将按照用户输入的顺序充满分数对象。

那么,在普通数学中,我们怎么知道一个分数比另一个分数大呢?我们把两个分数转换成gcd作为每个分数的分母,然后我们比较分子(顺便说一句,你的gcd方法是错误的。gcd在两个分数的分母之间,而不是一个分数的分子和分母)。此时分子越大,分数越大。因此,最简单的方法是使用一个名为fracCompare的方法,它接受两个分数,将它们转换,然后返回哪个分数更大。我们可以这样做:

public int fracCompare(Fraction fracOne, Fraction fracTwo)
{
    // First, find the gcd of the fractions
    int gcd = gcd(fracOne.getDenominator, fracTwo.getDenominator);
    
    // Now, we need to convert the numerator accordingly
    // We will do this by finding the factor by which the denominator is
    // increased and multiply the numerator by this factor
    int factorOne = gcd / fracOne.getDenominator();
    int tempFracOneNum = fracOne.getNumerator() * factorOne;
    int factorTwo = gcd / fracTwo.getDenominator();
    int tempFracTwoNum = fracTwo.getNumerator() * factorTwo;

    // Now we compare these numerators
    // We will return 1 if fracOne is greater than fracTwo
    // We will return 2 if fracTwo is greater than fracOne
    // We will return 0 if they are the same
    if (tempFracOneNum > tempFracTwoNum)
        return 1;
    else if (tempFracTwoNum > tempFracOneNum)
        return 2;
    else
        return 0;
}

public int gcd(int firstNum, int secondNum)
{
    int a = firstNum.getDenominator();
    int b = secondNum.getDenominator();
    while(a != 0 && b != 0) // until either one of them is 0
    {
        int c = b;
        b = a % b;
        a = c;
    }
    return a+b; // either one is 0, so return the non-zero value
}

注意:我公然从用户那里窃取了这个gcd方法,这是拉希尔在另一篇帖子上的回答。现在我们有了比较方法,可以对数组进行排序了。我将把排序留给您,因为我已经厌倦了格式化代码,但下面是一些冒泡排序伪代码,让您开始:

i = 0
loop until i = fractions.length - 1
    j = i
    loop until j = fractions.length - 1
    if fraction at j > fraction at j+1
        swap fraction at j and fraction at j+1

最后一步。为了添加分数,我们再次需要使用gcd。我们用这个gdc来看看如何增加两个加法分数的分子。然后我们将取这个和,并将其添加到数组中的所有其他值中。最后,我们将减少大笔金额。

int tempGcd;
int tempFactorOne;
int tempFactorTwo;
Fraction sum = fractions[1];
for (int i = 2; i < fractions.length - 2; i++) // we loop from 2 to fractions.length-2 because 
                                               // we ignore the least and greatest values in the array
                                               // and we assigned the initial sum to the first fraction
{
    tempGcd = gcd(sum.getDenominator(), fractions[i].getDenominator());
    tempFactorOne = tempGcd / sum.getDenominator();
    tempFactorTwo = tempGcd / fractions[i].getDenominator();
    
    sum.setNumerator(tempFactorOne * sum.getNumerator() + tempFactorTwo * fractions[i].getNumerator()); // add the numerators and store as the sum
    sum.setDenominator(gcd); // obviously the denominator is the gcd
}

希望这一切都能奏效。我厌倦了打字,所以我将把分数的减少留给你。这很简单——你只需要找到分子和分母的最大公约数,然后用那个除数除掉它们。对不起,如果我的确切代码不能编译,我懒得自己做,你也不应该剽窃学校的项目。

 类似资料:
  • 这是我的问题,我需要创建一个运行以下指令的程序。 创建名为Fraction的java类。此类用于表示两个整数的比率。包括允许用户设置分子和分母的mutator方法。还包括一种在屏幕上以定量显示分数的方法(例如5/9)。这种方法不需要将分数减少到最低项。 分数类应包含以下内容: 用于存储分子、分母和ratio\u值的私有实例变量 创建一个测试程序,允许用户创建7个分数的数组。然后程序将按升序对分数进

  • 问题内容: 我有2个表格-包含课程ID和课程名称的课程以及包含每个课程标签的tagCourse。 我想编写一个函数,该函数按给定的标签数组搜索课程,并按匹配标签的数量将其返回。但是我不知道如何正确,有效地编写它。请帮我。 IE。 问题答案: CREATE OR REPLACE FUNCTION search_by_tags(tags varchar[]) RETURNS TABLE (id_cou

  • 我有一个数组的值。我用一个条件对它进行排序,以保持某些项目在顶部。到目前为止,这是有效的。现在我想运行两个条件,例如,我有两个前缀要与数组中的每个项相匹配:tableprefix和第二个daryprefix。我已经实现的是将tableprefix保持在顶部。其余的项目必须按字母顺序排序。 我想要达到的目标: 1:数组项匹配表前缀在最顶部//已经实现 2:与secondaryprefix匹配的数组项

  • 我在Java中有一个数组,其中包含一组随机日期: {2015年1月20日、2015年2月12日、2015年2月20日、2015年6月21日、2015年7月12日、2015年7月28日、2015年7月30日、2015年9月24日、2015年12月31日} 如何按月将此阵列拆分为多个阵列? 我想要 {2015年1月20日}、{2015年2月12日、2015年2月20日}、{2015年6月21日}、{2

  • 假设我有两个NumPy数组 我希望根据中的值,将数组有效地拆分为子数组。 我想要的输出是 假设以零开始并按升序排序,那么最有效的方法是什么? 注意:这个问题是这个问题的排序版本:根据另一个数组的值(未排序,而是分组)将NumPy数组拆分为子数组

  • 我没有找到任何解决方案,如何简单地排序原始数组。 我尝试了更多的解决方案,但都不起作用。我在这里也找到了一些解决方案,但没有一个解决方案可以同时使用更多的数组,最多使用2。 如果我只使用以下内容: 然后它只对arr3中的项进行排序,但其他数组中的其他项不适合。 出于某种原因,返回类型需要int而不是double。