Opened 4 years ago

Closed 4 years ago

Last modified 4 years ago

#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 Артур Гулецкий (huletski)

Type: ожидается проверкаожидаются исправления

Корректность

  • не работает валидация аргументов, пример:
    {hw_02}[2283]$ ./hw_02
    
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    O move:1
    O move:1^C
    {hw_02}[2283]$ ./hw_02
    
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    O move:-1 -2
    O move:0x6 
    
    ......O...
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    

Стиль

Board.h

  • const у методов не проставлен;

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

  • имена test case'ов ничего не говорят о проверяемом сценарии (т.е. сложно сказать в чем (если судить по имени) разница между testIsWin1 и testIsWin4). Используйте в качестве основы для имен текст из комментариев для соотвествующего метода.

Misc

  • test.cpp -> Test.cpp
  • test_main.cpp -> test.cpp

Баллы

Корректность: 15;
Стиль: 4.

comment:2 Changed 4 years ago by stotskiy.nikita

Type: ожидаются исправленияожидается проверка
Version: 1.02.0

Имена не смог переименовать, т.к. на маке. Кроме дубляжа и логики считывания все исправил.

comment:3 Changed 4 years ago by Артур Гулецкий (huletski)

Resolution: задача сдана
Status: assignedclosed

Корректность

Решение не собирается:

{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 Артур Гулецкий (huletski)

UPD: пояснение к "проверку на silent mode лучше вынести в print_board, т.к. она дублируется по коду. Если silent mode включен -- ничего не печатать;"

  • проверку можно оставить, но убрать/сократить дублирование реорганизацией цикла;
  • внести в print_board, но добавить аргумент bool force_print (со значением по умолчанию false), который будет приводить к печати доски, даже если silent mode активен.
Note: See TracTickets for help on using tickets.