Программист 1С
859 / 647 / 187
Регистрация: 03.03.2009
Сообщений: 1,154
1

Переписать визуальный проект в консольное приложение: Обход конем всех клеток шахматного поля.

07.08.2014, 10:37. Показов 1585. Ответов 8
Метки нет (Все метки)

Приветствую друзья!Прошу помощи у экспертов, т.к. ООП почти не изучал.
Дана программа с исходниками и исполняемым файлом, рабочая, но с объектами на форме.
Требуется перевести её в исполняемый файл командной строки!
Задание и файлы во вложении. Заранее спасибо...
Вложения
Тип файла: rar Программа.rar (2.59 Мб, 27 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.08.2014, 10:37
Ответы с готовыми решениями:

Необходимо написать программу обхода конем всего шахматного поля
Доброго времени суток! Необходимо написать программу обхода конем всего шахматного поля. Конь...

Переписать консольное приложение под WinForms
Добрый день уважаемые коллеги у меня возник вопрос у меня есть прокси сервер в консольном...

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

Консольное приложение переписать под оконное
Здравствуйте. Помогите пожалуйста. Имеется программа работы с классами в консольном варианте C#....

8
Почетный модератор
Эксперт С++
5849 / 2860 / 392
Регистрация: 01.11.2011
Сообщений: 6,905
07.08.2014, 10:44 2
Цитата Сообщение от Давид Посмотреть сообщение
Требуется перевести её в исполняемый файл командной строки!
Как это понять?

P.S. и вы бы указывали, что в архиве лежит проект шестого билдера, все таке. Сразу б по максимуму информации.
1
Программист 1С
859 / 647 / 187
Регистрация: 03.03.2009
Сообщений: 1,154
07.08.2014, 10:52  [ТС] 3
SatanaXIII, Виноват!!!
Вообщем мне нужно чтобы прога работала из командной строки. Форма, кнопки и т.д. не нужны.
0
Почетный модератор
Эксперт С++
5849 / 2860 / 392
Регистрация: 01.11.2011
Сообщений: 6,905
07.08.2014, 11:03 4
Давид, понятно.

С вашего позволения вытащу код, чтобы можно было не скачивать проект кому лень:
Функциональная часть проекта
.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
private:    // User declarations
   //массив для храмения информации о посещенных клетках
   int board[8][8];
 
   //эти массивы используются для расчета новых координат коня
   //они указывают перемещение по горизонтали и вертикали
   int horizontal[8];
   int vertical[8];
 
   //текущие координаты
   int currentRow;
   int currentColumn;
 
   //этот массив нужен для выбора следующего хода
   int accessibility[8][8];
   int firstMove[8];
 
   /*
   Эта функция выполняет очередной ход. Текущие координаты передаются
   по ссылке (таким образом, функция их может изменить).
   Numb - код хода (используестя как индекс для массивов vertical и
   horizontal).
   cnt - счетчик, содержит номер очередного хода.
   */
   void move(int board[][8], int vertical[], int horizontal[],
       int &currentRow, int &currentColumn, int Numb, int cnt);
 
   /*
   Эта функция выбирает очередной ход и возвращает его код. Если
   сделать ход нельзя, то функция возвращает "-1".
   crRow и crColumn - текущие координаты коня.
   */
   int FindMove(int board[][8], int accessibility[][8],
       int vertical[], int horizontal[], int crRow, int crColumn);
 
   /*
   При выполнении очередного хода эта функция уменьшает значения
   соответствующих элементов массива accessibility на 1.
   */
   void DecAccessibility(int accessibility[][8],int horizontal[],
       int vertical[], int crRow, int crColumn);
.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  //установка начальных значений элементов массивов
  int board[][8] = {{0},{0},{0},{0},{0},{0},{0},{0}};
  int horizontal[] = {2, 1, -1, -2, -2, -1, 1, 2};
  int vertical[] = {-1, -2, -2, -1, 1, 2, 2, 1};
  int accessibility[][8] = {{2,3,4,4,4,4,3,2},
                            {3,4,6,6,6,6,4,3},
                            {4,6,8,8,8,8,6,4},
                            {4,6,8,8,8,8,6,4},
                            {4,6,8,8,8,8,6,4},
                            {4,6,8,8,8,8,6,4},
                            {3,4,6,6,6,6,4,3},
                            {2,3,4,4,4,4,3,2}};
  //инициализация генератора случайных чисел
  srand(time(NULL));
 
  bool Go = true; //признак того, что можно начинать ходить
  try
   {
     //установка начальных значений
     currentRow = StrToInt(Edit2->Text);
     currentColumn = StrToInt(Edit1->Text);
     //проверка допустимости начальных значений
     if(currentRow>7 || currentRow<0 || currentColumn>7 ||
                                        currentColumn<0)
      {
       //сообщение об ошибке
       Application->MessageBoxA("Вы должны ввести цифру от 0 до 7",
                               "Ошибка", MB_OK);
       Go = false;
      }
   }
  catch(...)
   {
     Application->MessageBoxA("Вы должны ввести цифру от 0 до 7",
     "Ошибка", MB_OK);
     Go = false;
   }
  //начинаем искать решение
  if(Go)
   {
    //устанавливаем коня на заданную клетку
    DecAccessibility(accessibility, horizontal, vertical,
                              currentRow, currentColumn);
    board[currentRow][currentColumn] = 1;
    StringGrid1->Cells[currentColumn][currentRow] = IntToStr(1);
 
    int MoveNumber; //код хода
    int count = 1; //счетчик ходов
    bool exit = true; //нужна для выхода из цикла
 
    //перемещаем коня пока это возможно
    do
     {
       MoveNumber = FindMove(board, accessibility, vertical,
                     horizontal, currentRow, currentColumn);
       if (MoveNumber !=-1)
        {
          count++;
          move(board, vertical, horizontal, currentRow,
                     currentColumn, MoveNumber, count);
          DecAccessibility(accessibility, vertical, horizontal,
                                    currentRow, currentColumn);
        }
       else exit = false;
     }
    while(exit);
   }
}
//---------------------------------------------------------------------------
void TForm1::move(int board[][8], int vertical[], int horizontal[],
          int &currentRow, int &currentColumn, int Numb, int cnt)
{
  //изменяем текущие координаты
  currentRow += vertical[Numb];
  currentColumn += horizontal[Numb];
  //запоминаем, что на этой клетке мыуже были
  board[currentRow][currentColumn] = 1;
  //выводим номер хода в StringGrid
  StringGrid1->Cells[currentColumn][currentRow] = IntToStr(cnt);
}
//---------------------------------------------------------------------------
void TForm1::DecAccessibility(int accessibility[][8],int horizontal[],
                       int vertical[], int crRow, int crColumn)
{
  int Hmove, Vmove; //координаты клеток, лежащих в одном ходу от текущей
 
  //перебираем все возможные варианты ходов и уменьшаем на 1 значения
  //соответствующих элементов массива accessibility
  for(int i=0; i<8; i++)
   {
     Hmove = crRow + vertical[i];
     Vmove = crColumn + horizontal[i];
     //проверка выхода за границу массива
     if((Hmove<8)&&(Hmove>=0)&&(Vmove<8)&&(Vmove>=0))
       accessibility[Hmove][Vmove] -= 1;
   }
}
//---------------------------------------------------------------------------
int TForm1::FindMove(int board[][8], int accessibility[][8],
       int vertical[], int horizontal[], int crRow, int crColumn)
{
  //Индексы элементов этого массива соответствуют кодам возможных ходов.
  //Элементы массива будут содержать "-1" если ход невозможен или
  //число равное значению соответствующего элемента массива accessibility
  int PossibleMoves[8] = {-1,-1,-1,-1,-1,-1,-1,-1};
 
  int tRow, tColumn; //временные координаты
 
  //проверяем все возможные варианты ходов
  for(int i=0; i<8; i++)
   {
    tRow = crRow + vertical[i];
    tColumn = crColumn + horizontal[i];
    //проверка выхода за границу массива и того, ходили ли мы на
    //эту клетку раньше
    if(tRow<8 && tRow>=0 && tColumn<8 &&tColumn>=0 &&
                             board[tRow][tColumn]==0)
      PossibleMoves[i] = accessibility[tRow][tColumn];
   }
 
  //анализ массива PossibleMoves
  int count = 0;
  int min = 8;
  int Pos = 0;
  //находим минимальный элемент массива не равный "-1", если таких
  //элементов несколько - запоминаем их количество
  for(int j=0; j<8; j++)
   if(PossibleMoves[j]!=-1 && PossibleMoves[j]<=min)
    {
     min = PossibleMoves[j];
     count++;
     Pos = j;
    }
 
  //возможных ходов нет
  if(count==0) return -1;
 
  //возможен только 1 ход (или он оптимальный)
  if(count==1) return Pos;
 
  //Возможно несколько ходов, но мы не можем определить какой из
  //них лучше. Поэтому выбираем ход случайным образом. При выборе
  //учитываем только лучшие ходы.
  int Ind = rand()%count;
  for(int k=0; k<8; k++)
    if(PossibleMoves[k]==min && Ind==0)
      {
       Pos = k;
       break;
      }
    else Ind--;
  return Pos;
}
1
Программист 1С
859 / 647 / 187
Регистрация: 03.03.2009
Сообщений: 1,154
07.08.2014, 12:11  [ТС] 5
Тема попрежнему актуальна.
Люди откликнитесь пожалуйста! Очень нужно...
0
Почетный модератор
Эксперт С++
5849 / 2860 / 392
Регистрация: 01.11.2011
Сообщений: 6,905
07.08.2014, 12:32 6
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

Давид, а приложенный в архиве экзешник точно собран именно на том коде, который в проекте? Ничего в проекте не менялось потом?
Если нет, то я значит криво перевел. Результат разный.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
#pragma hdrstop
#pragma argsused
 
#include <tchar.h>
#include <stdio.h>
#include <iomanip>
#include <iostream>
using namespace std;
 
// Всякая глобальная фигня сюда переехала
 
   int PseudoStringGrid[8][8]; // Заместо StringGrid
 
 
   //массив для храмения информации о посещенных клетках
   int board[8][8];
 
   //эти массивы используются для расчета новых координат коня
   //они указывают перемещение по горизонтали и вертикали
   int horizontal[8];
   int vertical[8];
 
   //текущие координаты
   int currentRow;
   int currentColumn;
 
   //этот массив нужен для выбора следующего хода
   int accessibility[8][8];
   int firstMove[8];
 
   /*Эта функция выполняет очередной ход. Текущие координаты передаются
   по ссылке (таким образом, функция их может изменить).
   Numb - код хода (используестя как индекс для массивов vertical и
   horizontal).
   cnt - счетчик, содержит номер очередного хода.*/
   void move( int board[][8], int vertical[], int horizontal[],
              int &currentRow, int &currentColumn, int Numb, int cnt );
 
   /*Эта функция выбирает очередной ход и возвращает его код. Если
   сделать ход нельзя, то функция возвращает "-1".
   crRow и crColumn - текущие координаты коня.*/
   int FindMove( int board[][8], int accessibility[][8],
                 int vertical[], int horizontal[], int crRow, int crColumn );
 
   /*При выполнении очередного хода эта функция уменьшает значения
   соответствующих элементов массива accessibility на 1.*/
   void DecAccessibility( int accessibility[][8],int horizontal[],
                          int vertical[], int crRow, int crColumn );
 
   void move(int board[][8], int vertical[], int horizontal[],               //// Бывшие методы формы
             int &currentRow, int &currentColumn, int Numb, int cnt);          //
   void DecAccessibility(int accessibility[][8],int horizontal[],              //
                         int vertical[], int crRow, int crColumn);             //
   int FindMove(int board[][8], int accessibility[][8],                        //
                int vertical[], int horizontal[], int crRow, int crColumn);  ////
 
 
int main()
{
//void __fastcall TForm1::Button1Click(TObject *Sender)
//{
  //установка начальных значений элементов массивов
  int board[][8] = {{0},{0},{0},{0},{0},{0},{0},{0}};
  int horizontal[] = {2, 1, -1, -2, -2, -1, 1, 2};
  int vertical[] = {-1, -2, -2, -1, 1, 2, 2, 1};
  int accessibility[][8] = {{2,3,4,4,4,4,3,2},
                            {3,4,6,6,6,6,4,3},
                            {4,6,8,8,8,8,6,4},
                            {4,6,8,8,8,8,6,4},
                            {4,6,8,8,8,8,6,4},
                            {4,6,8,8,8,8,6,4},
                            {3,4,6,6,6,6,4,3},
                            {2,3,4,4,4,4,3,2}};
  //инициализация генератора случайных чисел
  srand(time(NULL));
 
  bool Go = true; //признак того, что можно начинать ходить
  try
   {
     //установка начальных значений
     cout << "x: ";
     cin >> currentRow;// = StrToInt(Edit2->Text);
     cout << "y: ";
     cin >> currentColumn;// = StrToInt(Edit1->Text);
     cout << endl;
     //проверка допустимости начальных значений
     if(currentRow>7 || currentRow<0 || currentColumn>7 ||
                                        currentColumn<0)
      {
       //сообщение об ошибке
       cout << "Вы должны ввести цифру от 0 до 7";
       Go = false;
      }
   }
  catch(...)
   {
     cout << "Вы должны ввести цифру от 0 до 7";
     Go = false;
   }
  //начинаем искать решение
  if(Go)
   {
    //устанавливаем коня на заданную клетку
    DecAccessibility(accessibility, horizontal, vertical,
                              currentRow, currentColumn);
    board[currentRow][currentColumn] = 1;
    //StringGrid1->Cells[currentColumn][currentRow] = IntToStr(1);
    PseudoStringGrid[currentRow][currentColumn] = 1;
 
    int MoveNumber; //код хода
    int count = 1; //счетчик ходов
    bool exit = true; //нужна для выхода из цикла
 
    //перемещаем коня пока это возможно
    do
     {
       MoveNumber = FindMove(board, accessibility, vertical,
                     horizontal, currentRow, currentColumn);
       if (MoveNumber !=-1)
        {
          count++;
          move(board, vertical, horizontal, currentRow,
                     currentColumn, MoveNumber, count);
          DecAccessibility(accessibility, vertical, horizontal,
                                    currentRow, currentColumn);
        }
       else exit = false;
     }
    while(exit);
   }
 
   // Вывод в консоль результатов
   for( int i=0; i<8; i++ )
     {
     for( int j=0; j<8; j++ )
       {
       cout.width(3);
       cout << PseudoStringGrid[i][j];
       }
     cout << endl;
     }
 
cin.ignore(2);
return 0;
}
//---------------------------------------------------------------------------
void move(int board[][8], int vertical[], int horizontal[],
          int &currentRow, int &currentColumn, int Numb, int cnt)
{
  //изменяем текущие координаты
  currentRow += vertical[Numb];
  currentColumn += horizontal[Numb];
  //запоминаем, что на этой клетке мыуже были
  board[currentRow][currentColumn] = 1;
  //выводим номер хода в StringGrid
  //StringGrid1->Cells[currentColumn][currentRow] = IntToStr(cnt);
  PseudoStringGrid[currentRow][currentColumn] = cnt;
}
//---------------------------------------------------------------------------
void DecAccessibility(int accessibility[][8],int horizontal[],
                      int vertical[], int crRow, int crColumn)
{
  int Hmove, Vmove; //координаты клеток, лежащих в одном ходу от текущей
 
  //перебираем все возможные варианты ходов и уменьшаем на 1 значения
  //соответствующих элементов массива accessibility
  for(int i=0; i<8; i++)
   {
     Hmove = crRow + vertical[i];
     Vmove = crColumn + horizontal[i];
     //проверка выхода за границу массива
     if((Hmove<8)&&(Hmove>=0)&&(Vmove<8)&&(Vmove>=0))
       accessibility[Hmove][Vmove] -= 1;
   }
}
//---------------------------------------------------------------------------
int FindMove(int board[][8], int accessibility[][8],
             int vertical[], int horizontal[], int crRow, int crColumn)
{
  //Индексы элементов этого массива соответствуют кодам возможных ходов.
  //Элементы массива будут содержать "-1" если ход невозможен или
  //число равное значению соответствующего элемента массива accessibility
  int PossibleMoves[8] = {-1,-1,-1,-1,-1,-1,-1,-1};
 
  int tRow, tColumn; //временные координаты
 
  //проверяем все возможные варианты ходов
  for(int i=0; i<8; i++)
   {
    tRow = crRow + vertical[i];
    tColumn = crColumn + horizontal[i];
    //проверка выхода за границу массива и того, ходили ли мы на
    //эту клетку раньше
    if(tRow<8 && tRow>=0 && tColumn<8 &&tColumn>=0 &&
                             board[tRow][tColumn]==0)
      PossibleMoves[i] = accessibility[tRow][tColumn];
   }
 
  //анализ массива PossibleMoves
  int count = 0;
  int min = 8;
  int Pos = 0;
  //находим минимальный элемент массива не равный "-1", если таких
  //элементов несколько - запоминаем их количество
  for(int j=0; j<8; j++)
   if(PossibleMoves[j]!=-1 && PossibleMoves[j]<=min)
    {
     min = PossibleMoves[j];
     count++;
     Pos = j;
    }
 
  //возможных ходов нет
  if(count==0) return -1;
 
  //возможен только 1 ход (или он оптимальный)
  if(count==1) return Pos;
 
  //Возможно несколько ходов, но мы не можем определить какой из
  //них лучше. Поэтому выбираем ход случайным образом. При выборе
  //учитываем только лучшие ходы.
  int Ind = rand()%count;
  for(int k=0; k<8; k++)
    if(PossibleMoves[k]==min && Ind==0)
      {
       Pos = k;
       break;
      }
    else Ind--;
  return Pos;
}
1
Почетный модератор
Эксперт С++
5849 / 2860 / 392
Регистрация: 01.11.2011
Сообщений: 6,905
07.08.2014, 12:47 7
Скомпилированный экзешник: Project1.rar
1
Почетный модератор
Эксперт С++
5849 / 2860 / 392
Регистрация: 01.11.2011
Сообщений: 6,905
07.08.2014, 13:10 8
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Результат разный.
Вот в чем оказывается дело:
C++
1
2
3
4
  //Возможно несколько ходов, но мы не можем определить какой из
  //них лучше. Поэтому выбираем ход случайным образом. При выборе
  //учитываем только лучшие ходы.
  int Ind = rand()%count;

Так что все там работает.
1
Программист 1С
859 / 647 / 187
Регистрация: 03.03.2009
Сообщений: 1,154
07.08.2014, 13:14  [ТС] 9
Спасибо за помощь. Очень помогли...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.08.2014, 13:14
Помогаю со студенческими работами здесь

Переписать консольное приложение в Windows Forms
using System; namespace SortApp { class Program { static void Main(string...

Как переписать консольное приложение под WinForms?
Здравствуйте!Помогите кто-нибудь пожалуйста!! В консольном приложении писала код(получаю данные из...

Переписать консольное приложение под Windows Forms
Кто может, помогите переделать это консольное приложение в форму class kompleksnoe_chislo { ...

Сколько клеток находится под боем шахматного коня
есть задача. http://acm.timus.ru/problem.aspx?space=1&amp;num=1197 написал решение: #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru