C / C ++. строка ввода чисел

0

Необходимо вводить данные о нескольких переменных структуры (формат - 3 группы из 2 чисел в одной строке). Используется функция "для" и пользовательского ввода (также она вычисляет некоторые параметры). Теперь попробовал использовать "std :: cin":

typedef struct {
  short width;
  short height;
  short left;
  short top;

  int S;
  short orientation;
} Rectangle;

bool input_rectangle(Rectangle* rect) {
  short width;
  short height;

  std::cin >> width >> height;

  (*rect).width  = width;
  (*rect).height = height;
  (*rect).S      = width * height;

  (*rect).top  = 0;
  (*rect).left = 0;

  if(width>height) {
    (*rect).orientation = HORIZONTAL;
  }
  else {
    (*rect).orientation = VERTICAL;
  }

  return width!=0 || height!=0;
}

int main() {
  Rectangle* rectangles = new Rectangle[RECTANGLES_COUNT];
  ...
  while(1) {
    ...
    for(int i=0;i<RECTANGLES_COUNT;i++) {
      will_continue = will_continue || input_rectangle(&rectangles[i]);
    }
    if(!will_continue) {
      break;
    }
    else {
      int S = calculate(rectangles);
    }
    ... 
  }
}

Это дает неправильный результат. Попытка добавить вывод отладки для "вычисления":

for(int i=0;i<RECTANGLES_COUNT;i++)
  std::cout << rectangles[i].width << " x " << rectangles[i].height << " = " << rectangles[i].S << "\n";

Пример результата.

4 16 6 6 5 10 #my input
4 x 16 = 64   #right
0 x 0 = 0     #??? Must be 6 x 6  = 36
0 x 0 = 0     
646 x 6 = 36
0 x 0 = 0
0 x 0 = 0
365 x 10 = 50
0 x 0 = 0
0 x 0 = 0

Как я могу улучшить его? Также я попытался использовать scanf("%hd %hd", &width, &height); (возможно, это чистая C в этой задаче), но он дает тот же результат.

Используется компилятор g++/(gcc для чистой версии C)

  • 0
    Вы использовали отладчик для пошагового выполнения кода? Таким образом, вы можете сделать паузу в определенной строке и проверить, что содержит каждая переменная.
  • 0
    Кроме того, ваша программа работает для меня .
Показать ещё 5 комментариев
Теги:
io
scanf
cin

2 ответа

0
return width!=0 || height!=0;

должно быть

return width!=0 && height!=0;
0

Из вашего кода вывода отладки я собираю это для ваших целей тестирования. RECTANGLES_COUNT на самом деле определяется как 3. Также, поскольку он способен выполнять любые вычисления, и учитывая, что || оператор подвергается ленивой оценке, вы должны инициализировать will_continue на false.

Что происходит, когда ваш первый вход (i = 0) действительно действителен (т.е. ширина или высота не равна 0), will_continue получает значение true. Тогда, так как true || все должно быть правдой, input_rectangle больше не называется (ленивая оценка) для i=1,2,... Таким образом, в этом цикле устанавливается только rectangle[0]. Когда вы последний раз вызываете свой отладочный вывод в calculate, вы показываете все 3 ширины/высоту прямоугольника /S, включая 2, которые предположительно были инициализированы до 0 (и остаются до их начального значения).

Я предполагаю (хотя и не показано), что int S = calculate(rectangles) может фактически присваивать сумму rectangle[i].S (который оказывается равным rectangle[0].S, так как остальные равны 0s) на S который вы затем печатаете. Это объясняет строки, содержащие 646 (64 с последующим 6 x 6) и 365 (36 с последующим 5 x 5).

Я предполагаю, что вы хотели, вероятно, больше по следующим направлениям:

...
while(1) {
  ...
  bool will_continue = false;
  for(int i=0;i<RECTANGLES_COUNT;i++) {
    will_continue = input_rectangle(&rectangles[i]);
    if (!will_continue) {
      break;
    }
  }
  if(!will_continue) {
    break;
  }
  else {
    int S = calculate(rectangles);
  }
  ... 
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню