【问题标题】:Arguments aren't passing into my function [duplicate]参数没有传递到我的函数中[重复]
【发布时间】:2020-12-27 17:07:30
【问题描述】:

背景:这里是 C 菜鸟。我正在尝试整理一个计算一段文本可读性的程序。为此,我使用 Coleman–Liau 索引。我正在尝试构建一个函数并传递 3 个参数,即文本中有多少个字母、单词和句子。

问题: 函数没有按预期处理变量。我已经包含了一些打印语句来查看函数中发生了什么

在我的 main() 函数下面声明的函数:

float Coleman_Liau_index(int words_, int letters_, int sentences_)

{
    float L = (letters_ / words_) * 100;
    printf("Average number of letters per 100 words %.2f\n", L);

    float S = (sentences_ / words_) * 100;
    printf("Average number of sentences per 100 words %.2f\n", S);

    float index = 0.0588 * L - 0.296 * S - 15.8;

    return index;
}

ma​​in() 内部函数的实现:

float words = spaces + 1;

printf("%i letter(s)\n", letter);
printf("%.0f word(s)\n", words);
printf("%i sentence(s)\n", sentences);

//Putting it all together - Coleman_Liau_index
float index = Coleman_Liau_index(words, letter, sentences);

错误输出示例:

Average number of letters per 100 words 400.00
Average number of sentences per 100 words 0.00

所需输出示例:

Average number of letters per 100 words 421.43
Average number of sentences per 100 words 4.29

【问题讨论】:

  • 在计算 letters_ / words_sentences_ / words_ 时,你正在做整数运算,所以你会丢失分数。
  • 您能否向我们解释一下您认为(letters_ / words_) 的类型是什么?还有(sentences_ / words_)?
  • 有趣。我完全理解为什么不正确地转换这些变量会是一个问题,但我尝试这样做而不在函数之外进行转换,它不会很好。为什么函数会更改所需的声明?
  • 它与是否在函数内部无关,它与操作数的类型有关。如果你将两个整数相除,你会得到一个整数结果。您需要按照您所说的那样显示代码“工作”的位置。

标签: c function


【解决方案1】:

除法前必须转换整数

    float L = (letters_ / (float)words_) * 100;
    printf("Average number of letters per 100 words %.2f\n", L);

    float S = (sentences_ / (float)words_) * 100;
    printf("Average number of sentences per 100 words %.2f\n", S);

单词_.

中的通知(浮动)

【讨论】:

  • 感谢您的建议。为什么只有在函数内部才需要强制转换这些?当我不使用函数时,我得到了我想要的输出
  • 跟那个无关,跟类型有关。如果您要除数(例如,5/2 将是 2.5,但不是 x/y,x=5 和 y=2 为 int),编译器会将它们视为浮点数(如果需要)。关键是在你的函数中,参数被指定为整数,所以当你调用函数时它们被强制转换。你的类型永远是类型定义所说的,所以要小心。
  • 因此,尽管您将单词视为浮点数,但只要您将单词作为参数传递,它就会被视为整数。这不是问题,但想象一下 word_=2.5 并调用您的函数。您将收到 2 而不是 2.5
猜你喜欢
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 2017-07-05
  • 2021-01-27
  • 2020-01-16
  • 2013-06-19
  • 1970-01-01
  • 2020-03-04
相关资源
最近更新 更多