我的程序为用户提供了三个选项。第一个选项允许用户输入分子,然后输入分母。第二个选项显示我输入的那些分数。现在对于第三种选择,假设按照从最小到最大分数的顺序对其进行排序。我已经坚持了一段时间,不知道该怎么做
这是我的代码:
#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);
}
答案 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
的第二个增量。
其他一些问题是:
请记住在接受这些值时检查分母是否为零。
为用户提供退出程序的选项。目前,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]元素在分母[]和分子[]中的相同索引处的任何索引中都很小。 在冒泡排序中,当您在一个循环中找到数组中的最大元素时,它只找到一个更大的数字。