如何在C中创建自己的楼层功能?
我正在创建一个程序,它将从用户那里获取日期、月份和年份,然后以三种不同的格式显示,一种是日历格式,一种是顺序格式,另一种是ISO工作日编号。为了计算第几天,我提供的伪代码声明我需要使用floor函数来计算它。但是,我需要创建自己的,不能使用C库中的标准。很明显,这个节目的内容不止这些,但我被困在这一部分 我不知道从哪里开始,我也不确定我是否把它过度复杂化了。我看了一下floor函数的作用,了解到只要它等于或小于原始值,它就会将某个值返回到最接近的整数。我想用三个参数来创建它,因为这是算法中需要的数量,然后可能使用舍入到最接近的整数,但如果floor的答案大于原始值,则插入一个条件以向下舍入 我的伪代码如下所示:如何在C中创建自己的楼层功能?,c,C,我正在创建一个程序,它将从用户那里获取日期、月份和年份,然后以三种不同的格式显示,一种是日历格式,一种是顺序格式,另一种是ISO工作日编号。为了计算第几天,我提供的伪代码声明我需要使用floor函数来计算它。但是,我需要创建自己的,不能使用C库中的标准。很明显,这个节目的内容不止这些,但我被困在这一部分 我不知道从哪里开始,我也不确定我是否把它过度复杂化了。我看了一下floor函数的作用,了解到只要它等于或小于原始值,它就会将某个值返回到最接近的整数。我想用三个参数来创建它,因为这是算法中需要的
int calculate_ordinal_day(day, month, year)
if month = 1; {
return day;
}
if month = 2; {
return day + 31;
}
ordinal_day = myfloor(30.6 * month - 91.4) + day
{
if isyearleap == 1
return ordinal_Day + 60
}
return ordinal_day + 59
顺便说一句,我的课程希望使用Ansi C/K&R,这就是为什么其中一些可能与其他人使用的不同。最简单的解决方案可能是让C来做。Per: 当实浮点类型的有限值转换为除_Bool以外的整数类型时,小数部分被丢弃,即该值被截断为零 因此,您只需将值转换为整数,然后再将其转换回浮点:
float myFloor(float value) {
return (float) (int) value;
}
如果您需要处理负片,您可以轻松地执行以下操作:
float myFloor(float value) {
float tmp = (float) (int) value;
return (tmp != value) ? (tmp - 1.0f) : tmp;
}
一种方法是转换-
float myFloor(float value) {
return (float) (int) value;
}
但你不能用这种方式解决它。编写自己的实现的最佳方法是从平台上的C标准库中窃取实现。但请注意,这可能包含特定于平台的细微差别,因此可能无法移植
C标准库楼层函数通常很聪明,因为它不能通过转换为整型来工作。如果是这样的话,您将面临有符号整数溢出的风险,其行为尚未定义。注意,int的最小可能范围是-32767到+32767
精确的实现还取决于平台上使用的浮点方案
对于使用IEEE754浮点和long-long类型的平台,您可以采用以下方案:
如果数字的大小大于2的53次方,
返回它,因为它已经是完整的。
否则,强制转换为64位
键入long long,然后将其返回。
为此使用浮点运算是有问题的,因为浮点运算将结果舍入为可表示的值,舍入可能会导致30.6*month-91.4分别产生略小于31或184的值,即月份为4和9。那么myfloor30.6*月-91.4将是不希望的值30或183,而不是期望的31或184 无需使用浮点运算,因为整数运算就足够了:
ordinal_day = (306 * month - 914 + 10000) / 10 - 1000 + day;
306*月-914/10在数学上相当于30.6*月-91.4,除了整数除法截断结果,有效地向零方向舍入为整数,而不是向负无穷方向舍入为整数。因为我们需要下限,所以加10000以确保商为正,然后在除法后减去1000以进行补偿。如果月份可能是−30或更低,需要进一步调整,因为商可能是负数。您的问题是关于编写一个floor函数,但给出的代码并不反映您创建此类函数的尝试。最简单的方法可能是float myFloorfloat value{return float int value;}…@usr2564301我不确定该方法是否能涵盖floor所做的所有事情,因为我已经看过了一些People实现该方法的示例,它们看起来相当复杂,而且,我也不完全确定如何将其从文字转换为代码。另外,如果month=1,你会期望什么;{…}如果是第2个月;{…}要做什么?指定-ansi相当于指定-std=c89或-std=c90,它们的意思相同。这两种方式都不意味着您必须以K&R风格编写代码。我的很多代码都是在这个标准下编译的,但是没有一个包含K&R风格的函数定义。是的,我也有使用C99或C11特性的代码。您应该考虑使用GCC——ANSI-PANANTIC-WORK-WOLT-WORK-WEDS原型- WRADE原型- WORD样式声明- WORD样式定义…和其他选项,如您所见。您的编译器可能不接受-Wold-*选项中的一个或两个。我更愿意使用此选项,但我的课程说明我需要创建自己的选项:/What,确切地说,它说了什么?我猜你就是不能使用floor函数……注意:这只对正值有效。如果为负值,则这不是楼层功能。它也被限制在这个范围内
对于月的有效输入,这两个都不是问题。它说我需要编写自己的楼层函数,而不是使用标准C库中的楼层函数。是的,所有的值都是正数和整数,所以这应该没有问题。标准C库中的一个是floor。