C / C ++。输入数字行

时间:2014-03-19 21:16:32

标签: c++ c io scanf cin

需要输入有关多个结构变量的数据(格式 - 一行中3组2个数字)。使用“for”和自定义输入功能(也计算一些参数)。现在尝试使用“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 ++编译器/(纯C版本的gcc)

2 个答案:

答案 0 :(得分:0)

从您的调试输出代码中,我收集了用于测试目的的RECTANGLES_COUNT实际上定义为3。 此外,因为它能够执行任何类型的计算,并且给出了||运算符需要进行延迟评估,您必须将will_continue初始化为false

当你的第一个输入(i = 0)实际上有效时(即宽度或高度不为0),will_continue被设置为true,会发生什么。然后,由于true || 任何必须为true,因此不再为i=1,2,...调用input_rectangle(延迟评估),因此在该循环中只设置rectangle[0]。当您在calculate中调用调试输出时,将显示所有3个矩形&#39;宽度/高度/ S包括2可能已被初始化为0(并保持其初始值)。

我猜测(虽然没有显示)int S = calculate(rectangles)实际上可能会分配rectangle[i].S的总和(恰好等于rectangle[0].S,因为其他的都是0 )然后打印到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);
  }
  ... 
}

答案 1 :(得分:0)

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

应该是

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