Необходимо вводить данные о нескольких переменных структуры (формат - 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)
return width!=0 || height!=0;
должно быть
return width!=0 && height!=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);
}
...
}