在C语言中将分数按升序排序

时间:2016-10-29 04:57:59

标签: c arrays sorting fractions

我的程序为用户提供了三个选项。第一个选项允许用户输入分子,然后输入分母。第二个选项显示我输入的那些分数。现在对于第三种选择,假设按照从最小到最大分数的顺序对其进行排序。我已经坚持了一段时间,不知道该怎么做

这是我的代码:

#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);
}

2 个答案:

答案 0 :(得分: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;
    }

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

其他一些问题是:

  1. 请记住在接受这些值时检查分母是否为零。

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

答案 1 :(得分:0)

你只需要输入分子,分母和分母不是零,如果这是零,那么给用户一个消息,该数字应该大于零:

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

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

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

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