确定C语言中最大的非整数

  • 本文关键字:整数 语言 确定 c
  • 更新时间 :
  • 英文 :


我正在尝试制作一个接受4个数字的程序,无论它是整数还是非整数。它将确定输入中最大的非整数。如果不存在非整数,那么它将打印一条消息,表示不存在。

下面是我的代码:
#include <stdio.h>
int main()
{
float num1, num2, num3, num4;
//Enter Numbers 
printf("Enter 4 Numbers : ");
scanf("%f %f %f %f", &num1, &num2, &num3, &num4);
//Numbers are Integer
if ((num1 - (int) num1) == 0
&& (num2 - (int) num2) == 0
&& (num3 - (int) num3) == 0
&& (num4 - (int) num4) == 0) {
printf("Output : No Non-Whole Numbers foundn");
} else {
//Numbers are Float
if (num1 > num2 && num1 > num3 && num1 > num4) {
printf("Output : %.1fn", num1);
} else if (num2 > num1 && num2 > num3 && num2 > num4) {
printf("Output : %.1fn", num2);
} else if (num3 > num1 && num3 > num2 && num3 > num4) {
printf("Output : %.1fn", num3);
} else {
printf("Output : %.1fn", num4);
}
}
}

但是我有一些问题,例如当用户输入:

输入4数字:12.5 15 2 1输出:15而应该是12.5

输入4数字:10.5 10.5 7 8输出:8.0而应该是10.5

正如Nils Martel指出的那样,这应该被编码为数组上的循环。
与他的实现唯一的不同是我认为我的实现更容易理解,因为它更接近原始代码

#include <stdio.h>
#include <stdlib.h>
#define FALSE (0 != 0)
#define TRUE  (!FALSE)
#define ABS(x) ((x >= 0) ? (x) : (-x))
#define NUMS 4
int is_whole(float num)
{
return (ABS(num) - (int)ABS(num)) == 0;
}
int main()
{
float nums[NUMS];
int contains_float = FALSE;
int largest = 0; // Initialized with the first element
//Enter Numbers 
printf("Enter 4 Numbers : ");
scanf("%f %f %f %f", &nums[0], &nums[1], &nums[2], &nums[3]);
//Numbers are Integer
for (int i = 0; i < NUMS; ++i) {
if (is_whole(nums[i]) == FALSE) {
contains_float = TRUE;
// The additional condition here accounts for the case when
// nums[0] is the largest element in the array
if (nums[i] > nums[largest] || is_whole(nums[largest]))
largest = i;
}
}

if (contains_float)
printf("Output : %.1fn", nums[largest]);
else
printf("Output : No Non-Whole Numbers foundn");
}

你可以在这里运行https://onlinegdb.com/rkVwPZaZu

我认为确定一个数字是否为非while的最佳检查是floor(n) != n

现在,在你的代码中,你经常重复你自己,你的逻辑变得非常复杂,很难理解,仅仅看它。

你可能会发现这个练习是学习更多关于数组和循环的知识的好时机!

我试图重写你的代码使用floor(n) != n检查,并通过使用数组和循环。注意,我的C有点生疏,但我希望你能理解我的代码:

#include <stdio.h>
#include <math.h>
void print_largest_non_while(float *numbers, int length) {
int is_set = 0;
float greatest;
for (int i = 0; i < length; i++) {
float n = numbers[i];
if (floor(n) != n) {
// n is a non while number
if (!is_set) {
is_set = 1;
greatest = n;
continue;
}
if (greatest < n) greatest = n;
}
}
if (is_set) printf("%fn", greatest);
}
int main() {
float num[4];
// Enter Numbers
printf("Enter 4 Numbers : ");
scanf("%f %f %f %f", num, num + 1, num + 2, num + 3);
print_largest_non_while(num, 4);
}

您的测试认为所有的数字都不是整数,或者它们都是整数。同时考虑到num1 - (int)num1) == 0测试可能会给出错误的结果。更好的方法:将abs的差异与阈值进行比较。

#define N   4
#include <stdio.h>
#include <math.h>
int main(){
float num[N];
//Enter Numbers 
printf("Enter %d Numbers : ", N);
for (int i = 0; i < N; ++i) {
int t = scanf ("%f", &num[i]);
if (t != 1) return 1;
}

float eps = 1.0e-5;
int found = 0;
float vmax;
for (int i = 0; i < N; ++i) {
int check = fabs(num[i] - rint(num[i])) > eps;
found += check;
if (check) {
if (found == 1) {
vmax = num[i];
} else {
if (num[i] > vmax) {
vmax = num[i];
}
}
}
}
//Numbers are all Integer if found == 0
if(found == 0) {
printf("Output : No Non-Whole Numbers foundn");
} else {
printf("Output : %.1fn", vmax);
}
return 0;
}

最新更新