【问题标题】:Sorting fractions into ascending order in C languageC语言对分数进行升序排序
【发布时间】:2016-10-29 04:57:58
【问题描述】:

我的程序向用户提供了三个选项。第一个选项让用户输入分子,然后输入分母。第二个选项显示我输入的那些分数。现在对于第三个选项,假设按照从小到大的顺序对其进行排序。纠结了好久,不知道怎么办

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

//Struct to hold fraction data
typedef struct
{
    int numerator, denom;
}fraction;

double Calc_Frac(fraction b)
{
    return((double)b.numerator / b.denom);
}

int main()
{
    //Array of 100 fractions
    fraction arrFraction[100];

    int i = 0;
    int j;
    int num = 1;

    while (num == 1)
    {
        int choice;
        printf("\nPress 1 to enter a fraction\n");
        printf("Press 2 to view stored fractions\n");
        printf("Press 3 to sort fractions\n");
        scanf("%d", &choice);

        if(choice == 1)
        {
            //Prompting user
            printf("\nEnter your fraction, numerator followed by   denominator\n");

            //Reading values from user
            scanf("%d %d", &arrFraction[i].numerator, &arrFraction[i].denom);

            //Incrementing counter
            i++;

        }

        if (choice == 2) 
        {
            printf("-------------------------\n");
            for (j = 0; j < i; j++) 
            {
                printf("%d  %d/%d \n",      arrFraction[j].numerator/arrFraction[j].denom,  
                    arrFraction[j].numerator%arrFraction[j].denom,  arrFraction[j].denom);
            }
            printf("\n-------------------------\n\n");
         }

        if (choice == 3)
        {
            int min;
            fraction tmp;

            for (i = 0; i < j; i++)
            {
                min = i;
                for (j = i + 1; j < i; j++)
                {
                    if (Calc_Frac(arrFraction[j]) < Calc_Frac(arrFraction[min]))
                    {
                        min = j;
                    }
                }
                tmp = arrFraction[i];
                arrFraction[i] = arrFraction[min];
                arrFraction[min] = tmp;
            }
            i++;
        }

   } // end of while loop

  system("pause");

  return(0);
}

【问题讨论】:

  • 别忘了检查零分母
  • 您在 for 循环外的排序代码取决于 j 即 i &lt; j 。但是 j 的值是多少?它会根据用户是否输入选项2而改变。
  • 我建议首先采用排序逻辑并独立运行它,看看它是否真的排序正确。
  • *.com/questions/40315424/… 的完全相同的副本。其实我觉得你是同一个用户(airdemko3 -> ademko)
  • 让多个帐户问同一个问题是不好的做法

标签: c arrays sorting fractions


【解决方案1】:

在选择 3 中,

for (i = 0; i < j; i++)
    {
        min = i;
        for (j = i + 1; j < i; j++)
        {
            if (Calc_Frac(arrFraction[j]) < Calc_Frac(arrFraction[min]))
            {
                min = j;
            }
        }
        tmp = arrFraction[i];
        arrFraction[i] = arrFraction[min];
        arrFraction[min] = tmp;
    }
    i++;

搞砸了,因为您在无法重用的地方重用了变量。如果i 应该是您的计数器,那么您在这里破坏了该值。与j 一起使用单独的计数器变量并保留i

for (int k = 0; k < i; k++)
    {
        min = k;
        for (j = k + 1; j < i; j++)
        {
            if (Calc_Frac(arrFraction[j]) < Calc_Frac(arrFraction[min]))
            {
                min = j;
            }
        }
        tmp = arrFraction[k];
        arrFraction[k] = arrFraction[min];
        arrFraction[min] = tmp;
    }

此外,在结束时不需要i 的第二个增量。

其他一些问题是:

  1. 接受值时记得检查分母是否为零。

  2. 为用户提供退出程序的选项。目前,while 循环是无限的,因为num 的值永远不会更新。

【讨论】:

    【解决方案2】:

    您只需要同时输入分子、分母并检查分母是否不为零,如果为零,则向用户提示该数字应大于零:

    scanf("%d",&numerator[i]);
    if(denominator[i]<=0){
       printf("Enter denominator greater than zero ");}
    else{
      scanf("%d",&denominator[i]);
     }
    

    存储所有输入后, 确保在分子和分母中输入的数字数量必须相等,例如 n。现在将分母的所有数字相乘,并将其存储在一个必须为 long 类型的变量中,例如 multi_long。接下来的任务是将 multi_long 除以分母,然后将其与分子相乘,然后将其存储在一个新数组中。

    array_new[i]=(multi_long/denominator[i])*numerator[i];
    

    因为通过使用冒泡排序对该数组进行排序,我们可以很容易地找到最大和最小的数字,因为 new_array[i] 元素在分母[] 和分子[] 中相同索引处的任何索引中都很小。 在冒泡排序中,当您在一个循环中查找数组中的最大元素时,它只会找到一个更大的数字。

    【讨论】:

    • 这不是一个特别好的主意。它本质上仅限于小分数列表,因为乘法很快会产生对于内置类型来说太大的值。是的,您可以使用多精度算术库;不,这真的没有必要。使用冒泡排序通常也不是一个好主意。