-2

我希望函数 getCategory() 返回 "invalid" ,而不是在函数输入无效时打印单词 "invalid" (即,而不是使用 printf )(即当身高或体重低于零时)。请帮忙:

#include<stdio.h>
#include<conio.h>

char getCategory(float height,float weight)
{
    char invalid = '\0'; 
    float bmirange;

    if(height<=0 || weight<=0)
        return invalid;
    else
    {
        height=height*0.01;        //1 centimeter = 0.01 meters
        bmirange=[weight/(height*height)];

        if(bmirange< 15 )
            return starvation;
    } 
}

int main()
{
    char Category;
    float height,weight;

    printf("enter height");
    scanf("%f",&height);

    printf("enter weight");
    scanf("%f",&weight);

    Category=getCategory(height,weight);

    if(Category == 0)
        printf("invalid");
    else
        printf("%c", Category);
 }
4

6 回答 6

2

注意:原始问题已被多次更改,代码也经常更改,在每次迭代中引入新错误。我留下这个答案,因为它回答了原始代码,请参阅历史。在这个答案下面有一个更新提供建议而不是代码,因为这在这里似乎更合适。

嗯,旁观者删除了他的答案。但也许这就是你应该拥有的:*

char getCategory(float height,float weight)
{
    char invalid = '\0';

    if(height<=0 || weight<=0)
        return invalid;

    return 'c';   /* do something for the valid cases */
}

*最初包含的问题height || weight <= 0和变量没有值invalid

代码注释:
通过适当的缩进,您的程序流程变得更加清晰。我更正了你的 if 语句,假设这是你的意图,实际上。最后一行应包含您当前在问题中遗漏的内容。我在第一行添加了一个初始化,因为有一个值比没有一个值更好(这意味着:如果你不初始化,它可以是任何东西,真的)。

在您的调用代码中,您可以执行以下操作:

Category = getCategory(height, weight);
if(Category == 0)
    printf("invalid");
else
    printf("%c", Category);

如果这是您的意图,它实际上会在输出中打印“无效”一词。


更新:根据问题中的新文本,很明显提问者想要别的东西,所以这里有一个新答案。我离开了上面,它仍然适用于原始问题。

您现在要求不要打印单词“invalid”,并且不要为无效的情况使用特殊值。相反,您要求 return "invalid",我理解为返回值为“invalid”的字符串(它本身仍然返回一个特殊值)。

你做不到

简而言之:你不能那样做。当前函数具有返回类型char。我不知道你的函数的目的,但我相信你已经考虑过了,并且有理由使用char. 一个 char 只能包含一个字符。而“无效”一词是多个字符。您有几个选项,选择最适合您的选项:

其他方法

  • 将返回类型更改stringchar,这需要重新设计所有涉及的代码;
  • 通过返回一个特殊值来解决。您不显示函数的主体,但如果它通常永远不会返回\0,您可以使用该值,如我上面的示例所示。当然,您可以选择任何其他 char 值;
  • 引发异常并在正文中使用 try/catch。但是你使用 C,而不是 C++。这是一个链接,描述了对 C 使用 C++ 样式的异常处理,但这可能有点越界,学习 C 最好在当时迈出一小步。

什么是通常的最佳实践

在正常情况下,通常选择特殊情况值(通常在较旧或更基本的语言中,如 C 或汇编程序)或异常值(通常用于更结构化的语言,如 C++、Java、Python)。出于特殊情况(如无效输入)的目的而更改完整函数通常被认为是不好的做法。

为什么

相反,函数的调用者应该处理这些特殊情况。这样做的原因是编程中的一条非常重要的规则:函数永远无法事先知道该函数的用户在发生坏事(非法输入)时想要做什么。一个人可能会选择打印“非法输入”(对于命令行用户),另一个人想要退出程序(对于在库中),而另一个人想要忽略并且什么也不做(对于自动处理)。简而言之:您想要实现的目标,您应该尝试以不同的方式实现(参见上面的选项 2 和 3,以及我的原始解决方案)。

教师和教科书

到目前为止,对于任何(未来的)同事来说,使用这种方法是最容易理解的,也是最容易理解的,因为它遵循常见的计算机实践。当然,我没有看过你的作业或教科书,所以我不知道他们想要解决的方向是什么,也不会是第一个教你走错路的教科书或老师,让你颤抖,然后告诉你正确的道路。

于 2009-12-04T15:34:57.290 回答
1

getCategory 方法并不总是返回(因为 if 语句)。另外,不确定 if 语句中的高度。在方法末尾添加另一个 return invalid 。

char getCategory(float height,float weight)
{
    char invalid;
    if(height<=0 || weight<=0)
       return invalid;
    return 0
}
于 2009-12-04T15:32:07.443 回答
0

您需要(非常仔细地)仔细阅读您的教科书,以确定上述代码中的大量错误。
1,您在 getCategory 中的测试几乎肯定不会按照您的意愿进行。
2,您在某些情况下返回无效(但不是全部,请参阅#1)。但是,没有办法知道无效没有已知值。
3. 在其他情况下,getCategory 根本不返回任何值

于 2009-12-04T15:33:20.593 回答
0

您正在定义一个名为invalid. 它的内容是未定义的(它可以是从 -128 到 127 的任何值)。当您返回此变量时,您将返回任何内容;你想invalid在返回之前给变量赋值吗?例如


char invalid;
invalid = 'i';
if ( ... ) {
  return invalid;
} else {
  return 0;
}
于 2009-12-04T15:34:51.230 回答
0

无效应该映射到什么?你应该有这样的约定:

char invalid_category = '?';

也许:

#define INVALID_CATEGORY '?'

这最好在 getCategory 函数之外定义,以便调用代码可以访问它。

此外,当将有效参数传递给它时,您的代码返回的内容并不明显。

于 2009-12-04T15:35:10.927 回答
0

顺便说一句,在您的函数getCategory中,您有一个未使用或未声明的变量 - starvation。那是从哪里来的?我怀疑这是一个全局变量。

此外,该变量bmirange没有意义,也不会编译

bmirange=[体重/(身高*身高)];

如您所见,这是一个左侧表达式(LHS),但您在表达式(RHS)的右侧使用了数组下标运算符。那是违法的说法!

你在那里的意图是什么?那是一对括号吗?

你能证实这一点吗?

许多答案令人困惑,因为 OP 没有明确说明错误是什么,也没有解释正在发生的事情导致其他人最终发布的代码不满足 OP。

希望这会有所帮助,最好的问候,汤姆。

于 2009-12-05T14:10:53.557 回答