Усреднение 3 целых - PullRequest
       1

Усреднение 3 целых

2 голосов
/ 19 сентября 2010

Мое задание - исправить код. У меня есть отредактированный код ниже и оригинальный код ниже. Я полагаю, у меня все еще есть несколько ошибок здесь. Моя проверка ошибок не работает, и я не уверен, что моя функция 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 ]

3 голосов
/ 19 сентября 2010

Несколько вопросов:

1.Вы должны использовать «9» и «0», так как вы хотите, чтобы значения ASCII для цифры «9» (0x39) и «0» (0x30), а не 0x9 и 0x0.

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

2.! = имеет более высокий приоритет, чем =, поэтому вам нужны парены.Изучите приоритет оператора , и, если у вас есть сомнения, используйте скобки:

3.getchar - это функция, а не переменная.

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

4.Вы используете неправильное преобразование.num является двойным, поэтому вам нужно будет %f.Или вы можете сделать num a int.

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

5.Вы никогда не используете c в любом случае (кроме проверки ошибок).Вы всегда возвращаете 0 или num (см. Ваше предложение else), что не имеет смысла.Остальное тело оригинала правильное.

1 голос
/ 19 сентября 2010

Вот как я могу исправить код ...

  1. http://ideone.com/a0UMm - ошибки компиляции
  2. http://ideone.com/ljUg1 - предупреждения, но теперь это работает
  3. http://ideone.com/Qd0gp - без ошибок, без предупреждений, тестовый запуск в порядке

Для 1. Я использовал «оригинальный код», как вы отправили.

Для 2. Я использовал int main(void), объявил функцию get_number перед определением main, добавил скобки в строке 20 и добавил #include <stdlib.h>

Для 3. Я добавил return 0; перед окончательным } из main. Я также удалил дополнительный вывод, который испортил интерфейс ideone (он выглядит лучше на интерактивном интерфейсе)


Редактировать требуется больше тестов для выполнения задачи по исправлению исходного кода

1 голос
/ 19 сентября 2010

Проблемы с оригинальной программой:

  1. getchar () возвращает код ASCII, и условие было неверным.При проверке границ используйте ((c<'0') || (c>'9')).
  2. Для функции exit необходимо включить «stdlib.h».
  3. Чтобы функция main поняла, что такое get_number, вам нужно либо переместить функцию вбыть перед функцией main, или вы можете использовать прямое объявление.
  4. Оператор присваивания (=) имеет более низкий приоритет, чем оператор неравенства (!=), поэтому вам нужно использовать скобки,например: ((c = getchar()) != '\n')

Вы действительно создали еще несколько проблем, поэтому я бы не стал полагаться на ваш код.

В любом случае, в общем - советуем вам изучить, как использовать отладчик.Как только ваш код компилируется (и для этого вам нужно привыкнуть к сообщениям об ошибках компиляции), вам нужно начать отладку вашего кода.Я предлагаю вам потратить некоторое время, чтобы научиться устанавливать точки останова, устанавливать часы и шаг за шагом переходить к своему коду.Этот навык абсолютно необходим для хорошего разработчика.

1 голос
/ 19 сентября 2010

Вы неправильно проанализировали число с плавающей запятой и не должны делать это самостоятельно. Есть более простой способ:

double get_number(double num) { 
  double value = 0.0;
  printf("Please input number %lf: ", num);
  scanf("%lf", &value);
  return(value);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...