#745 closed ожидается проверка (задача сдана)
HW #2
Reported by: | stotskiy.nikita | Owned by: | Артур Гулецкий (huletski) |
---|---|---|---|
Component: | HW #2 (X0) | Version: | 2.0 |
Keywords: | Cc: |
Description
Change History (4)
comment:1 Changed 4 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
Имена не смог переименовать, т.к. на маке. Кроме дубляжа и логики считывания все исправил.
comment:3 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Корректность
Решение не собирается:
{hw_02}[2011]$ pwd && svn up && svn status && make /home/hfx/dvl/cpp19/stotskiy.nikita/hw_02 Updating '.': At revision 3073. mkdir -p obj g++ -c -g -std=c++11 -Iinclude -Wall -Wextra -Werror src/Board.cpp -o obj/Board.o In file included from src/Board.cpp:1: include/Board.h:22:21: error: ‘size_t’ has not been declared 22 | Player get_cell(size_t, size_t) const; | ^~~~~~ include/Board.h:22:29: error: ‘size_t’ has not been declared 22 | Player get_cell(size_t, size_t) const; | ^~~~~~ src/Board.cpp: In constructor ‘Board::Board()’: src/Board.cpp:5:10: error: ‘size_t’ was not declared in this scope; did you mean ‘std::size_t’? 5 | for (size_t i = 0; i < BOARD_SIZE; ++i) | ^~~~~~ | std::size_t In file included from /usr/include/c++/9/cassert:43, from include/Board.h:4, from src/Board.cpp:1: /usr/include/x86_64-linux-gnu/c++/9/bits/c++config.h:254:26: note: ‘std::size_t’ declared here 254 | typedef __SIZE_TYPE__ size_t; | ^~~~~~ src/Board.cpp:5:24: error: ‘i’ was not declared in this scope 5 | for (size_t i = 0; i < BOARD_SIZE; ++i) | ^ src/Board.cpp:7:10: error: ‘size_t’ was not declared in this scope; did you mean ‘std::size_t’? 7 | for (size_t i = 0; i < BOARD_SIZE; ++i) | ^~~~~~ | std::size_t In file included from /usr/include/c++/9/cassert:43, from include/Board.h:4, from src/Board.cpp:1: /usr/include/x86_64-linux-gnu/c++/9/bits/c++config.h:254:26: note: ‘std::size_t’ declared here 254 | typedef __SIZE_TYPE__ size_t; | ^~~~~~ src/Board.cpp:7:24: error: ‘i’ was not declared in this scope 7 | for (size_t i = 0; i < BOARD_SIZE; ++i) | ^ src/Board.cpp:8:20: error: expected ‘;’ before ‘j’ 8 | for (size_t j = 0; j < BOARD_SIZE; ++j) | ^~ | ; src/Board.cpp:8:28: error: ‘j’ was not declared in this scope 8 | for (size_t j = 0; j < BOARD_SIZE; ++j) | ^ src/Board.cpp: In destructor ‘Board::~Board()’: src/Board.cpp:14:10: error: ‘size_t’ was not declared in this scope; did you mean ‘std::size_t’? 14 | for (size_t i = 0; i < BOARD_SIZE; ++i) { | ^~~~~~ | std::size_t In file included from /usr/include/c++/9/cassert:43, from include/Board.h:4, from src/Board.cpp:1: /usr/include/x86_64-linux-gnu/c++/9/bits/c++config.h:254:26: note: ‘std::size_t’ declared here 254 | typedef __SIZE_TYPE__ size_t; | ^~~~~~ src/Board.cpp:14:24: error: ‘i’ was not declared in this scope 14 | for (size_t i = 0; i < BOARD_SIZE; ++i) { | ^ src/Board.cpp: In member function ‘Player Board::determine_winner(Player, int, int) const’: src/Board.cpp:23:10: error: ‘size_t’ was not declared in this scope; did you mean ‘std::size_t’? 23 | for (size_t i = 0; i < BOARD_SIZE; i++) { | ^~~~~~ | std::size_t In file included from /usr/include/c++/9/cassert:43, from include/Board.h:4, from src/Board.cpp:1: /usr/include/x86_64-linux-gnu/c++/9/bits/c++config.h:254:26: note: ‘std::size_t’ declared here 254 | typedef __SIZE_TYPE__ size_t; | ^~~~~~ src/Board.cpp:23:24: error: ‘i’ was not declared in this scope 23 | for (size_t i = 0; i < BOARD_SIZE; i++) { | ^ src/Board.cpp:34:10: error: ‘size_t’ was not declared in this scope; did you mean ‘std::size_t’? 34 | for (size_t i = 0; i < BOARD_SIZE; i++) { | ^~~~~~ | std::size_t In file included from /usr/include/c++/9/cassert:43, from include/Board.h:4, from src/Board.cpp:1: /usr/include/x86_64-linux-gnu/c++/9/bits/c++config.h:254:26: note: ‘std::size_t’ declared here 254 | typedef __SIZE_TYPE__ size_t; | ^~~~~~ src/Board.cpp:34:24: error: ‘i’ was not declared in this scope 34 | for (size_t i = 0; i < BOARD_SIZE; i++) { | ^ src/Board.cpp: In member function ‘bool Board::is_finished(Player, int, int) const’: src/Board.cpp:79:10: error: ‘size_t’ was not declared in this scope; did you mean ‘std::size_t’? 79 | for (size_t i = 0; i < BOARD_SIZE; ++i) | ^~~~~~ | std::size_t In file included from /usr/include/c++/9/cassert:43, from include/Board.h:4, from src/Board.cpp:1: /usr/include/x86_64-linux-gnu/c++/9/bits/c++config.h:254:26: note: ‘std::size_t’ declared here 254 | typedef __SIZE_TYPE__ size_t; | ^~~~~~ src/Board.cpp:79:24: error: ‘i’ was not declared in this scope 79 | for (size_t i = 0; i < BOARD_SIZE; ++i) | ^ src/Board.cpp:80:20: error: expected ‘;’ before ‘j’ 80 | for (size_t j = 0; j < BOARD_SIZE; ++j) | ^~ | ; src/Board.cpp:80:28: error: ‘j’ was not declared in this scope 80 | for (size_t j = 0; j < BOARD_SIZE; ++j) | ^ src/Board.cpp: At global scope: src/Board.cpp:110:8: error: ‘Player Board::get_cell’ is not a static data member of ‘class Board’ 110 | Player Board::get_cell(size_t row, size_t col) const { | ^~~~~ src/Board.cpp:110:24: error: ‘size_t’ was not declared in this scope; did you mean ‘std::size_t’? 110 | Player Board::get_cell(size_t row, size_t col) const { | ^~~~~~ | std::size_t In file included from /usr/include/c++/9/cassert:43, from include/Board.h:4, from src/Board.cpp:1: /usr/include/x86_64-linux-gnu/c++/9/bits/c++config.h:254:26: note: ‘std::size_t’ declared here 254 | typedef __SIZE_TYPE__ size_t; | ^~~~~~ src/Board.cpp:110:36: error: ‘size_t’ was not declared in this scope; did you mean ‘std::size_t’? 110 | Player Board::get_cell(size_t row, size_t col) const { | ^~~~~~ | std::size_t In file included from /usr/include/c++/9/cassert:43, from include/Board.h:4, from src/Board.cpp:1: /usr/include/x86_64-linux-gnu/c++/9/bits/c++config.h:254:26: note: ‘std::size_t’ declared here 254 | typedef __SIZE_TYPE__ size_t; | ^~~~~~ src/Board.cpp:110:46: error: expression list treated as compound expression in initializer [-fpermissive] 110 | Player Board::get_cell(size_t row, size_t col) const { | ^ Makefile:13: recipe for target 'obj/Board.o' failed make: *** [obj/Board.o] Error 1
Если починить, то не хватает пробелов в конце promt'a (должно быть, например, "O move: ", а не "O move:"). Примечательно, что для починки этого недочета пришлось править код в нескольких местах (привет, дублирование).
Логика считывания, кажется, деградировала -- "Bad move!" не печатается в тривиальном случае:
{hw_02}[2014]$ ./hw_02 .......... .......... .......... .......... .......... .......... .......... .......... .......... .......... O move: 30 420 O move:
Silent режим работает не совсем верно: сообщение об ошибке выводится на той же строке, что и последняя строка доски.
Стиль
Board.h
- размер поля лучше сделать константой класса:
class Board { static constexpr std::size_t Board_Sz = 10; ... };
StdioBoardView?.cpp
- проверку на silent mode лучше вынести в print_board, т.к. она дублируется по коду. Если silent mode влючен -- ничего не печатать;
- дублирование логики печати prompt'а.
Баллы
Корректность: 15 (стало хуже, поэтому баллы предыдущей попытки);
Стиль: 6.25 (учитывая поломку сборки, неполное решение и оставшиеся замечания с прошлого раза)
comment:4 Changed 4 years ago by
UPD: пояснение к "проверку на silent mode лучше вынести в print_board, т.к. она дублируется по коду. Если silent mode включен -- ничего не печатать;"
- проверку можно оставить, но убрать/сократить дублирование реорганизацией цикла;
- внести в print_board, но добавить аргумент
bool force_print
(со значением по умолчанию false), который будет приводить к печати доски, даже если silent mode активен.
Корректность
Стиль
Board.h
11: поле должно быть скрыто, иначе нарушение инкапсуляции;
Board.cpp
4: 10 лучше сделать константой или параметром класса;
21: в методе дублирование кода; counter слишком общее имя; имена методам лучше давать отглагольные (e.g. determine_winner);
78: и тут counter, почему не free_cells_nm?
85: оригинальная реализация. В принципе, ок, но проще было бы в поле класса хранить;
101: _table[r][c] != Player::none было бы очевиднее;
106: это имя вводит в заблуждение. Лучше try_turn при такой реализации;
StdioBoardView?.cpp
18, 24: логику считывания, валидации и разбора хода лучше вынести в отдельную функцию;
40: может print или show/display вместо send?
42: size_t для типа индекса массива;
44: кмк использование switch сделало бы код более читабельным; прямого, неконстантного доступа к полям модели лучше избегать;
70: и тут switch помог бы, скорее всего. При написании любой почти if-elif конструкции, особенно в которой анализируются значения enum class'a, рассматривайте switch альтернативу;
BoardTest?.h
Misc
Баллы
Корректность: 15;
Стиль: 4.