平均3个整数

时间:2010-09-18 20:50:35

标签: c

我的任务是修复代码。我在下面编辑了我的代码,下面是原始代码。我想我在这里仍然有一些错误。我的错误检查似乎不起作用,我不确定我的getchar()函数是否已编写或正常工作。

请假设我一无所知,因为这是相当准确的。

代码编译,但答案总是2.我在这段代码中大约需要4个小时,之后还需要3个小时。

我的代码

#include <stdio.h> 

double get_number(double num);

main () {
  double n1,n2,n3;
  double average;

  printf("\nCompute the average of 3 integers\n");
  printf("--------------------------------\n");
  n1 = get_number(1);
  n2 = get_number(2);
  n3 = get_number(3);
  average = (n1 + n2 + n3)/3;
  printf("The average is %0.2f\n",average);
}

double get_number(double num) { 
  double value = 0;
  char c;
  int i;
  printf("Please input number %d: ", num);

  while (c = getchar != '\n') { 
    if ( (c>9) || (c<0) ) { 
      printf("Incorrect character entered as a number - %c\n",c);
      return(0);
    }
    else {
    value = num;
    }
  }
  return(value);
}

原始代码

#include <stdio.h> 

main () {
  double n1,n2,n3;
  double average;

  printf("\nCompute the average of 3 integers\n");
  printf("--------------------------------\n");
  n1 = get_number(1);
  n2 = get_number(2);
  n3 = get_number(3);
  average = (n1 + n2 + n3)/3;
  printf("The average is %0.2f\n",average);
}

double get_number(int num) { 
  double value = 0;
  char c;
  printf("Please input number %d: ", num);
  while (c = getchar() != '\n') { 
    if ( (c<=9) && (c>=0) ) { 
      printf("Incorrect character entered as a number - %c\n",c);
      exit(-1);
    }
    else {
      value = 10*value + c - '0';
    }
  }
  return(value);
}

4 个答案:

答案 0 :(得分:3)

一些问题:

1。你应该使用'9'和'0',因为你想要数字'9'(0x39)和'0'(0x30)的ASCII值,而不是0x9和0x0。

if ( (c>'9') || (c<'0') ) { 

2。 !=具有比=更高的优先级,所以你需要parens。学习operator precedence,如果您有疑问,请使用parens:

3。 getchar是一个函数,而不是一个变量。

while ((c = getchar()) != '\n') { 

4。您使用错误的转换。 num是双倍的,因此您需要%f。或者,您可以将num设为int

printf("Please input number %f: ", num);

5。你从来没有以任何方式实际使用c(错误检查除外)。你总是返回0或num(参见你的else子句),这没有任何意义。原文的其他正文是正确的。

答案 1 :(得分:1)

你得到的浮点解析都错了,不应该自己做。有一种更简单的方法:

double get_number(double num) { 
  double value = 0.0;
  printf("Please input number %lf: ", num);
  scanf("%lf", &value);
  return(value);
}

答案 2 :(得分:1)

原始计划的问题是:

  1. getchar()返回一个ASCII码,条件错误。检查边界时,请使用((c<'0') || (c>'9'))
  2. 对于exit函数,您需要包含“stdlib.h”。
  3. 要使main函数了解get_number是什么,您需要将函数移动到main函数之前,或者使用前向声明。
  4. 赋值运算符(=)的优先级低于不等式运算符(!=),因此您需要使用括号,例如:((c = getchar()) != '\n')
  5. 您实际上已经创建了几个问题,因此我不会依赖您的代码。

    在任何情况下,一般情况下 - 建议您学习如何使用调试器。一旦您的代码编译(为此您需要习惯于编译错误消息),您需要开始调试代码。我建议您花点时间学习如何设置断点,设置监视,并逐步进入代码。对于优秀的开发人员来说,这项技能绝对必要

答案 3 :(得分:1)

以下是我如何纠正代码...

  1. http://ideone.com/a0UMm - 编译错误
  2. http://ideone.com/ljUg1 - 警告,但现在有效
  3. http://ideone.com/Qd0gp - 没有错误,没有警告,测试运行正常
  4. 对于1.我使用了您发布的“原始代码”。

    对于2.我使用了int main(void),在定义get_number之前声明了函数main,在第20行添加了括号,并添加了#include <stdlib.h>

    对于3.我在return 0;的最终}之前添加了main。我还删除了混淆了ideone界面的额外输出(它在交互式界面上看起来更好)


    编辑完成纠正原始代码任务所需的更多测试