16 / 16 / 1
Регистрация: 15.03.2009
Сообщений: 94
1

Черепашья графика

07.02.2010, 19:18. Показов 12427. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Полистал тут Дейтелов, пятое большое издание и нашёл простенькую задачку, но код получился черезчур увесистый, по моему разумению. Помогите оптимизировать и привести к более компактному виду. Заодно может научусь чему новому...

Текст задачи:
Язык Лого, особенно популярный среди пользователей персональных компьютеров, сделал знаменитой черепашью графику. Представьте себе механическую черепаху, которая ползает по комнате под управлением программы на C++. Черепаха несет пишущее перо, которое может находиться в одной из двух позиций - нижней или верхней. Если перо в нижней позиции, черепаха вычерчивает траекторию движения, если в верхней, то черепаха передвигается свободно и ничего не вычерчивает. В этой задаче вы будете моделировать действия черепахи и создавать компьютерезированный эскиз пути.
Используя массив floor размером 20 на 20 с нулевым начальным условиями. Считывайте команды из содержащего их массива. Всё время отмечайте текущую позицию черепахи и положение пера - нижнее или верхнее. Предполагйте, что черепаха всегда стартует из позиции 0, 0 на полу с верхним положением пера. Ваша программа должна подавать команды черепахе в соответствии со следующими обозначениями:
1 - поднять перо
2 - опустить перо
3 - поворот направо
4 - поворот налево
5 - движение вперёд
6 - печать массива 20 на 20
9 - конец данных (контрольное значение)



вот моё решение задачи:
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
#include <iostream>
    using std::cout;
    using std::endl;
    using std::cin;
#include <iomanip>
    using std::setw;
 
void printFloor( bool [ 20 ][ 20 ] );
int move( bool [ 20 ][ 20 ], bool, bool );
 
int main( void )
{
    bool array[ 20 ][ 20 ] = { 0 };
    int press;
    bool feather = 0;
    bool way = 0;
    
    do
    {
        cout << "Enter a command:\n";
        cin >> press;
        
        switch( press )
        {
            case 1:
                feather = 0;//pero vverhu
                break;
            case 2:
                feather = 1;//pero vnizu
                break;
            case 3:
                way = 0;//vpravo
                break;
            case 4:
                way = 1;//vlevo
                break;
            case 5:
                move( array, way, feather );        
                break;
            case 6:
                printFloor( array );
                break;
            case 9:
                break;
            default:
                cout << "Wrong enter. Try again.\n";
                break;
        }
        
    }
    while( press != 9 );
 
    return 0;
}
 
int move( bool array[ 20 ][ 20 ], bool way, bool feather )
{
    static int nowX = 5;
    static int nowY = 5;
    
    static int lastX = 6;
    static int lastY = 5;
    
    if( way == 0 )//dvishenie vpravo
    {
        if( (nowX == lastX - 1) && (nowY == lastY) )
        {
            lastX = nowX;
            lastY = nowY;
            nowY++;
            if( feather == 1 )
                array[ nowX ][ nowY ] = 1;
            return 0;
        }
        if( (nowX == lastX) && (nowY == lastY + 1) )
        {
            lastX = nowX;
            lastY = nowY;
            nowX++;
            if( feather == 1 )
                array[ nowX ][ nowY ] = 1;
            return 0;
        }
        if( (nowX == lastX + 1) && (nowY == lastY) )
        {
            lastX = nowX;
            lastY = nowY;
            nowY--;
            if( feather == 1 )
                array[ nowX ][ nowY ] = 1;
            return 0;
        }
        if( (nowX == lastX) && (nowY == lastY - 1) )
        {
            lastX = nowX;
            lastY = nowY;
            nowX--;
            if( feather == 1 )
                array[ nowX ][ nowY ] = 1;
            return 0;
        }
    }
    else//dvishenie vlevo
    {
        if( (nowX == lastX - 1) && (nowY == lastY) )
        {
            lastX = nowX;
            lastY = nowY;
            nowY--;
            if( feather == 1 )
                array[ nowX ][ nowY ] = 1;
            return 0;
        }
        if( (nowX == lastX) && (nowY == lastY - 1) )
        {
            lastX = nowX;
            lastY = nowY;
            nowX++;
            if( feather == 1 )
                array[ nowX ][ nowY ] = 1;
            return 0;
        }
        if( (nowX == lastX - 1) && (nowY == lastY) )
        {
            lastX = nowX;
            lastY = nowY;
            nowY++;
            if( feather == 1 )
                array[ nowX ][ nowY ] = 1;
            return 0;
        }
        if( (nowX == lastX) && (nowY == lastY + 1) )
        {
            lastX = nowX;
            lastY = nowY;
            nowX--;
            if( feather == 1 )
                array[ nowX ][ nowY ] = 1;
            return 0;
        }
    }
}
 
void printFloor( bool array[ 20 ][ 20 ])
{
    for( int i = 0; i < 20; i++ )
    {
        for( int j = 0; j < 20; j++ )
        {
            if( array[ i ][ j ] == 1 )
                cout << setw( 2 ) << '*';
            else
                cout << setw( 2 ) << ' ';
        }
        
        cout << endl;
    }
}
Добавлено через 15 часов 49 минут
32 просмотра и ниодного комментария, это говорит об моей идеально решённой задаче?)))
неужели ни у кого нет других вариантов? да, код грамоздкий, но если чуть-чуть изменить условия задачи, а именно сделать не просто поворот на лево/поворот направо, а, грубо говоря, так:
3 - шаг влево
4 - шаг вправо
5 - шаг вверх
6 - шаг вниз
то задача решается проще пареной репы, одним switch'ом. Но тут то и интересность задачи, в её формулировке. Поэтому мне чисто интересно, возможно ли написать более простой и более понятный алгоритм в функции move()...может кто нибудь всё таки поделится идеями? Потому что мне кажется, что от этого алгоритма один шаг до создания игры "змейка"...кстати, следующая прога, которую я собираюсь писать.
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.02.2010, 19:18
Ответы с готовыми решениями:

Черепашья графика
Текст задачи из учебника Дейтела: Язык Лого, особенно популярный среди пользователей...

Черепашья графика
Язык Лого, особенно популярный среди пользователей персональных компьютеров, сделал знаменитой...

Черепашья графика
Многоугольник (не обязательно выпуклый) задан след. образом: длина очередной стороны, угол поворота...

Черепашья графика (язык Лого)
Хочу смоделировать перемещение черепахи по полю. У черепахи есть перо. Если оно опущено, то на поле...

23
1 / 1 / 0
Регистрация: 18.02.2010
Сообщений: 4
18.02.2010, 23:04 2
Привет. Лень кодить на плюсах, сделал на додиезе. Вот посмотри мой вариант, явно покороче получилось. Правда задача нечётко сформулирована, и поэтому возможны вольности в трактовке некоторых моментов. Но идея общая сохранится в любом случае. В плане реализации таких задач на алгоритмы C# мало чем отличается от Си++.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Tortoise
{
    class Tortoise
    {
        private int[] dx = new int[4] {-1, 0, 1, 0};
        private int[] dy = new int[4] { 0, 1, 0, -1 };
        private int[,] floor = new int[20, 20];
        private int x;
        private int y;
        private int pen = 0;
        private int direction = 2;
 
        private void SafeInc(ref int value, int delta, int min, int max, bool cycle)
        {
            int newval = value + delta;
            if (cycle)
                value = newval < (min) ? max : (newval > max ? min : newval);
            else
                value = newval < (min) ? min : (newval > max ? max : newval);
        }
 
        public void Command(int cmd)
        {
            if (cmd < 3)
            {
                pen = (cmd == 2) ? 1 : 0;
                if (pen == 1) 
                    floor[x, y] = 1; //это чтобы можно было точки ставить
            }
            else
                if (cmd < 5)
                {
                    SafeInc(ref direction, 2 * cmd - 7, 0, 3, true);
                }
                else
                    if (cmd == 5)
                    {
                        SafeInc(ref x, dx[direction], 0, 19, false);
                        SafeInc(ref y, dy[direction], 0, 19, false);
                        floor[x, y] = pen;
                    }
                    else
                        if (cmd == 6)
                        {
                            for (int i = 0; i < 20; i++)
                            {
                                for (int j = 0; j < 20; j++)
                                    Console.Write(floor[i,j]);
                                Console.WriteLine();
                            }
                            
                        }
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Tortoise t = new Tortoise();
            int cmd;
            do
            {
                t.Command(cmd = Console.Read() - Convert.ToInt16('0'));
            }
            while (cmd != 9);
            Console.ReadLine();
        }
    }
}
1
16 / 16 / 1
Регистрация: 15.03.2009
Сообщений: 94
19.02.2010, 09:10  [ТС] 3
2spacistor:
а не мог бы в двух словах обрисовать идею алгоритма, а то я чет пару моментов в твоём коде недопонимаю....
0
1 / 1 / 0
Регистрация: 18.02.2010
Сообщений: 4
19.02.2010, 10:56 4
G-Cat, нет никакой идеи или алгоритма. Задача решается в лоб. Класс Tortoise представляет требуемую черепаху. У неё хранится состояние: floor - поле 20 * 20, x,y - положение черепахи, pen - положение пера (0 - поднято, 1 опущено). direction - направление куда повёрнута голова черепахи (целое число от 0 до 3х). Приращения для перехода черепахи если будет дана команда "двигаться прямо" берутся из массивов dx, dy. То есть x += dx[direction], y+=dy[direction]. Это позволяет избежать громоздких конструкций со switch как при движении прямо, так и при поворотах. Когда приходит команда поворот налево, я просто уменьшаю direction на единицу, направо - увеличиваю (разумеется, надо учесть что если значение выходит за пределы 0..3, то оно должно "проворачиваться"). Вот собственно и всё.
По методам:
SafeInc: увеличивае т значение value (передаётся по указателю) на величину delta с проверкой, что значение не может выходить за пределы min..max. Если cycle истина, то при выходе за указанные пределы значение "проворачивается" и принимает максимальное значение если было меньше минимального и минимальное если было больше максимального. Если же cycle ложно, то value просто "упирается" в ограничитель (min или max) и не выходит за пределы. Этот метод используется для инкрементирования(delta >0)/декрементирования(delta < 0) direction (cycle = true) и x, y (cycle = false).
Command: выполняет команду, переданные в виде целого числа.
Если cmd < 3 - Это команда поднять/опустить перо. Причём если "опустить" то сразу ставится точка на поле.
Если 3 <= cmd < 5 - это команда на поворот. direction просто инкрементируется или дектрементируется на единицу. "2 * cmd - 7" принимает -1 если cmd = 3 и +1 если cmd = 4 работает быстрее, чем if, но в 99,9% случаев так лучше не писать, ибо запутывает код.
Если cmd = 5 - движение. Просто инкрементим x, y на величину dx[direction], dy[direction]. Кстати там у меня баг - надо floor[x, y] = pen делать только если перо опущено:
C#
1
2
if (pen == 1)
  floor[x,y] = 1;
Если cmd = 6, печать массива, тут без комментариев.

В основной программе посимвольно с консоли считываются команды и выполняются, пока не встретится 9 (конец ввода).
C#
1
cmd = Console.Read() - Convert.ToInt16('0')
это просто преобразование кода символа в цифру. (то есть '7' -> 7).
0
arbuzaki
20.01.2011, 01:00 5
Привет! Чуток доделал! На "с" будет выглядеть так:
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
#include <stdio.h>
#include <stdlib.h>
 
#define SIZE 50
#define SIZE2 50
 
void printArray(int [][SIZE2]);
int dvishenie(int [][SIZE2], int, int);
 
main()
{
    int floor[SIZE][SIZE2] = {0};
    int vvod, pero = 0, napr = 2;
 
    do {
        printf("Вводите команды черепахе:\n1 - хвост вверх, 2 - хвост вниз, 3 - на право, 4 - на лево,\n"
                "5 - движение в перед, 6 - печать на экран, 9 - конец ввода:\n");
        scanf("%d", &vvod);
 
        switch (vvod) {
            case 1:
                pero = 0;                                       /*хвост вверх*/
                break;
            case 2:
                pero = 1;                                       /*хвост вниз*/
                break;
            case 3:
                napr = 0;                                       /*в право*/
                break;
            case 4:
                napr = 1;                                       /*в лево*/
                break;
            case 5:
                dvishenie(floor, napr, pero);                   /*движение*/
                break;
            case 6:
                printArray(floor);
                break;
        }
    }
    while (vvod != 9);
 
    return 0;
}
 
int dvishenie(int array[SIZE][SIZE2], int way, int feather)
{
   static int nowX = 25, nowY = 25, lastX = 26, lastY = 25, k = 1;
   int step;
    
 
   if(way == 0) {                                           /*движение в право*/
       if( (nowX == lastX - k) && (nowY == lastY) ) {
           lastX = nowX;
           lastY = nowY;
           printf("На сколько шагов двигаться: ");
           scanf("%d", &step);
           k = step;
           for(; step > 0; step--) {
               nowY++;
               if( feather == 1 )
                   array[ nowX ][ nowY ] = 1;
           }
           return 0;
       }
       if( (nowX == lastX) && (nowY == lastY + k) ) {
           lastX = nowX;
           lastY = nowY;
           printf("На сколько шагов двигаться: ");
           scanf("%d", &step);
           k = step;
           for(; step > 0; step--) {
               nowX++;
               if( feather == 1 )
                   array[ nowX ][ nowY ] = 1;
           }
           return 0;
       }
       if( (nowX == lastX + k) && (nowY == lastY) ) {
           lastX = nowX;
           lastY = nowY;
           printf("На сколько шагов двигаться: ");
           scanf("%d", &step);
           k = step;
           for(; step > 0; step--) {
               nowY--;
               if( feather == 1 )
                   array[ nowX ][ nowY ] = 1;
           }
           return 0;
       }
       if( (nowX == lastX) && (nowY == lastY - k) ) {
           lastX = nowX;
           lastY = nowY;
           printf("На сколько шагов двигаться: ");
           scanf("%d", &step);
           k = step;
           for(; step > 0; step--) {
               nowX--;
               if( feather == 1 )
                   array[ nowX ][ nowY ] = 1;
           }
           return 0;
       }
   }
   else {                                               /*движение в лево*/
        if( (nowX == lastX - k) && (nowY == lastY) ) {
            lastX = nowX;
            lastY = nowY;
            printf("На сколько шагов двигаться: ");
            scanf("%d", &step);
            k = step;
            for(; step > 0; step--) {
                nowY--;
                if( feather == 1 )
                    array[ nowX ][ nowY ] = 1;
            }
            return 0;
            }
            if( (nowX == lastX) && (nowY == lastY - k) ) {
                lastX = nowX;
                lastY = nowY;
                printf("На сколько шагов двигаться: ");
                scanf("%d", &step);
                k = step;
                for(; step > 0; step--) {
                    nowX++;
                    if( feather == 1 )
                        array[ nowX ][ nowY ] = 1;
                }
                return 0;
                }
                if( (nowX == lastX - k) && (nowY == lastY) ) {
                    lastX = nowX;
                    lastY = nowY;
                    printf("На сколько шагов двигаться: ");
                    scanf("%d", &step);
                    k = step;
                    for(; step > 0; step--) {
                        nowY++;
                        if( feather == 1 )
                            array[ nowX ][ nowY ] = 1;
                    }
                    return 0;
                }
                if( (nowX == lastX) && (nowY == lastY + k) ) {
                    lastX = nowX;
                    lastY = nowY;
                    printf("На сколько шагов двигаться: ");
                    scanf("%d", &step);
                    k = step;
                    for(; step > 0; step--) {
                        nowX--;
                        if( feather == 1 )
                            array[ nowX ][ nowY ] = 1;
                    }
                    return 0;
                }
    }
}
 
void printArray(int Array[SIZE][SIZE2])
{
    int i, j;
 
    for(i = 0; i <= SIZE - 1; i++) {
        printf("\n");
        for(j = 0; j <= SIZE2 - 1; j++)
            if (Array[i][j] == 1)
                printf("*");
            else
                printf(" ");
    }
}[C]
[/C]
0 / 0 / 0
Регистрация: 30.01.2011
Сообщений: 23
05.03.2011, 18:18 6
Добавил буфер памяти для команд, чтобы двигаться вперед ввести 5 затем количество шагов (контрольное значение сделал -1 чтобы не мешало).

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
#include <stdio.h>
#include <stdlib.h>
 
#define SIZE 50
#define SIZE2 50
#define CMD 100
 
void printArray(int [][SIZE2]);
int direction(int [][SIZE2], int, int, int);
int commands [CMD] = {0}; // массив команд
 
int main()
{
    int floor[SIZE][SIZE2] = {0};
    int vvod, pero = 0, napr = 2, i = 0;
    
    printf("Вводите команды черепахе:\n1 - хвост вверх, 2 - хвост вниз, 3 - направо, 4 - налево,\n"
     "5 - движение вперед, 6 - печать на экран, -1 - конец ввода:\n");
    
    do {
        scanf("%d", &vvod);
        commands[i] = vvod;
        i++;
    }
    while (vvod != -1 && i <= CMD - 1);
    
    for (i = 0; i <= CMD - 1; i++) {
        vvod = commands[i];
        
        switch (vvod) {
            case 1:
                pero = 0;                                       /*хвост вверх*/
                break;
            case 2:
                pero = 1;                                       /*хвост вниз*/
                break;
            case 3:
                napr = 0;                                       /*направо*/
                break;
            case 4:
                napr = 1;                                       /*налево*/
                break;
            case 5:
                i++;
                vvod = commands[i];
                direction(floor, napr, pero, vvod);
                break;
            case 6:
                printArray(floor);
                break;
    
        }           
    }
    return 0;
}
 
int direction(int array[SIZE][SIZE2], int way, int feather, int vvod)
{
    static int nowX = 25, nowY = 25, lastX = 26, lastY = 25, k = 1;
    if(way == 0) {                             
        if( (nowX == lastX - k) && (nowY == lastY) ) {
            lastX = nowX;
            lastY = nowY;
        k = vvod;
        for(; vvod > 0; vvod--) {
            nowY++;
            if( feather == 1 )
                array[ nowX ][ nowY ] = 1;
        }
            return 0;
        
        }
        if( (nowX == lastX) && (nowY == lastY + k) ) {
            lastX = nowX;
            lastY = nowY;
            k = vvod;
            for(; vvod > 0; vvod--) {
                nowX++;
                if( feather == 1 )
                    array[ nowX ][ nowY ] = 1;
            }
            return 0;
        }
        if( (nowX == lastX + k) && (nowY == lastY) ) {
            lastX = nowX;
            lastY = nowY;
            k = vvod;
            for(; vvod > 0; vvod--) {
                nowY--;
                if( feather == 1 )
                    array[ nowX ][ nowY ] = 1;
            }   
            return 0;
        }
        if( (nowX == lastX) && (nowY == lastY - k) ) {
                lastX = nowX;
                lastY = nowY;
            k = vvod;
            for(; vvod > 0; vvod--) {
                nowX--;
                if( feather == 1 )
                    array[ nowX ][ nowY ] = 1;
        }
            return 0;
    }
    }
        else { 
        if( (nowX == lastX - k) && (nowY == lastY) ) {
                lastX = nowX;
                lastY = nowY;
            k = vvod;
            for(; vvod > 0; vvod--) {
                nowY--;
                if( feather == 1 )
                    array[ nowX ][ nowY ] = 1;
        }
            return 0;
        }
        if( (nowX == lastX) && (nowY == lastY - k) ) {
                lastX = nowX;
                lastY = nowY;
                k = vvod;
                for(; vvod > 0; vvod--) {
                    nowX++;
                    if( feather == 1 )
                        array[ nowX ][ nowY ] = 1;
            }
            return 0;
            }
        if( (nowX == lastX - k) && (nowY == lastY) ) {
                lastX = nowX;
                lastY = nowY;
                k = vvod;
                for(; vvod > 0; vvod--) {
                    nowY++;
                    if( feather == 1 )
                        array[ nowX ][ nowY ] = 1;
                }
            return 0;
            }
        if( (nowX == lastX) && (nowY == lastY + k) ) {
                lastX = nowX;
                lastY = nowY;
                k = vvod;
                for(; vvod > 0; vvod--) {
                    nowX--;
                    if( feather == 1 )
                        array[ nowX ][ nowY ] = 1;  
            }
            return 0;
            }       
        }
        return 0;
    }
 
void printArray(int Array[SIZE][SIZE2])
{
    int i, j;
    
    for(i = 0; i <= SIZE - 1; i++) {
        printf("\n");
        for(j = 0; j <= SIZE2 - 1; j++)
            if (Array[i][j] == 1)
                printf("*");
            else
                printf(" ");
    }
}
Добавлено через 14 минут
arbuzaki что здесь делает #include <stdlib.h> ?
0
Vlad-grigoryan
09.07.2011, 01:20 7
Вот код программы только что написал и протестиравал на dev-c++ все работает там все прокоментириванно наслождайтесь

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
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
// Черепашия графика
// программа полочает команди
// 1 - поднимает перо
// 2 - опускает перо
// 3 - поворот направо
// 4 - поворот налево
// 5 + step - движение вперод на step шагов
// 6 - печать масива 20 на 20 
// 9 - конец данных (контрольное значение)
 
#include <iostream>
        using std::cout;
        using std::endl;
        using std::cin;
#include <iomanip>
        using std::setw;
 
// функция получает масив и 
// печатет масив так чтобы первый элемент масива был 
// вниз левый уголь 
void printFloor( int array [ 20 ][ 20 ] )
{
     for (int j = 19 ; j >= 0 ; j--)
     {
         for (int i = 0 ; i < 20; i++)
         {
             // все елементы масива которые ровны  1 
             // печатаются звездочкоми
             if (array [i][j] == 1)
               cout << "* " ;
             else 
               cout << "  " ;
             }
          cout << endl ;   // печат масива в табулирнов формате
         }
     } //конец printFloor
 
// функция получает аргументы : масив 20 на 20 (array [ 20 ][ 20 ]), 
// feather (если feather == 1 то перо опушенно ,если feather == 0 то перо поднято)
// way (если way == 0 то черепаха ходит на право
// если way == 1 то черепаха ходит вниз  если way == 2 то черепаха ходит на лево
// если way == 3 то черепаха ходит вверх)
// step - для каждого хода черепахи число ходов  
 
int move( int array [ 20 ][ 20 ], bool feather, int way, int step)
{
    // статические координаты черепахи для отображения хода черепахи
     static int nowX = 0;
     static int nowY = 0;
     
    //feather == 1 то перо опушенно  
     if (feather == 1 )
     {
        // для направления черепахи
        // для кождого направления черепаха делает step ходов 
        //в ниже привиденном алгориме с опушенном пером
        switch (way)
        {
           case 0 :
                // начиная с nowX делает step ходов в право
                for (int i = 0 ; i < step ; i++)
                    array[i + nowX][nowY] = 1 ;
                 
               // если бы нижний оператор был бы вверху как в case 2 :
               // то он бы пропустил nowX ходов в абцицах и потом началь бы печатать     
                 nowX = nowX + step - 1 ;   
                 break ;
                 
           case 1 :
                nowY = nowY - (step - 1) ;
                   
                for (int j = (step-1)  ; j >= 0 ; j--)
                   array[nowX][j + nowY] = 1;
                      break ;
 
             
           case 2 :
                // если бы нижний оператор был бы внизу  как в case 0 :
                // то во время печатьи был бы зазор в nowX ходов
                nowX = nowX - (step - 1) ;
                
                for (int i = (step-1) ; i >= 0 ; i--)
                   array[i + nowX][nowY] = 1 ;
                   
                      break ;
                      
           case 3 :
                for (int j = 0 ; j < step ; j ++)
                   array [nowX][j + nowY] = 1;
                   
                   nowY = nowY + step - 1 ;
                     break ;   
              
              default :
                      cout << "это некогда не случиться ";
                
           } // конец switch
           
           // выход из диапозона 
           if (nowX < 0 || nowY < 0)
             return -1 ;
        
                                }// конец внешнего if 
  
  // все то же самое повторяется когда  feather == 1      
     else 
     {
        switch (way)
        {
           case 0 :
                for (int i = 0 ; i < step ; i++)
                    array[i + nowX][nowY] = 0 ;
                    
                 nowX = nowX + step - 1 ;   
                 break ;
                 
           case 1 :
                 nowY = nowY - (step - 1) ;
                   
                for (int j = (step-1)  ; j >= 0 ; j--)
                   array[nowX][j + nowY] = 0;
                      break ;
                      
           case 2 :
                nowX = nowX - (step - 1) ;
                
                for (int i = (step-1) ; i >= 0 ; i--)
                   array[i + nowX][nowY] = 0 ;
                   
                      break ;
                      
           case 3 :
                for (int j = 0 ; j < step ; j ++)
                   array [nowX][j + nowY] = 0;
                   
                   nowY = nowY + step - 1 ;
                     break ;   
              
              default :
                      cout << "это некогда не случиться";
                
           } // конец switch 
            
           if (nowX < 0 || nowY < 0)
             return -1 ;
               }// конец внешнего if 
           
         // если не вышло из диапазона       
        return 0 ;
     }// конец функции move
     
 
int main()
{
        int array[ 20 ][ 20 ] = { 0 };// масив 20 на 20 
        int press; // для ввода комонды
        bool feather = 0; //  перо внизу по умолчании
        int way = 3; // по умолчании напровление на вверх
        int step ; // число шагов
         int diapason = 0 ; // если вышло из диапазона 
        
 
        
        do
        {
         //вводим команду     
        cout << "Enter the command  : " ;
        cin >> press ;
        
           switch (press )
              {
                  // поднимаем перо
                  case 1 :
                       feather = 0 ;
                       break ;
                   
                  //опускаем перо     
                  case 2 :
                       feather = 1 ;
                       break ;
                   
                  // даем путь на право      
                  case 3 :
                       way = (way + 1)% 4 ;
                       break ;
                 
                  // даем путь на лево     
                  case 4 :
                       way = (way + 3) % 4 ;
                       break ;
                   
                   // сколько шагов надо сделать   
                  case 5 :
                       cout << "Enter the number for step : " ;
                       cin >> step ; 
                       // запрос для диапазона 
                       diapason = move (array , feather , way , step ) ;
                       if (diapason == -1) 
                       {
                          cout << "You are darate " << endl ;
                          press = 9 ;
                          }
                       break ;
                       
                  // печатаем масив      
                  case 6 :
                       printFloor ( array ) ;
                       
                  case 9 :
                       break ;
                       
                  default :
                          cout << "You are Enter the wrong command \n"
                          << "Please try agаin \n" ;
                          break ;     
                       
                      } //конец switch
                      
                      }
                          while (press != 9);
                          
                          // для просмотра вехода  
                          cin >> diapason ;
                          return 0 ;
              
                           }//конец  main
 
 
// программа полочает команди
// 1 - поднимает перо
// 2 - опускает перо
// 3 - поворот направо
// 4 - поворот налево
// 5 + step - движение вперод на step шагов
// 6 - печать масива 20 на 20 
// 9 - конец данных (контрольное значение)
 
#include <iostream>
        using std::cout;
        using std::endl;
        using std::cin;
#include <iomanip>
        using std::setw;
 
// функция получает масив и 
// печатет масив так чтобы первый элемент масива был 
// вниз левый уголь 
void printFloor( int array [ 20 ][ 20 ] )
{
     for (int j = 19 ; j >= 0 ; j--)
     {
         for (int i = 0 ; i < 20; i++)
         {
             // все елементы масива которые ровны  1 
             // печатаются звездочкоми
             if (array [i][j] == 1)
               cout << "* " ;
             else 
               cout << "  " ;
             }
          cout << endl ;   // печат масива в табулирнов формате
         }
     } //конец printFloor
 
// функция получает аргументы : масив 20 на 20 (array [ 20 ][ 20 ]), 
// feather (если feather == 1 то перо опушенно ,если feather == 0 то перо поднято)
// way (если way == 0 то черепаха ходит на право
// если way == 1 то черепаха ходит вниз  если way == 2 то черепаха ходит на лево
// если way == 3 то черепаха ходит вверх)
// step - для каждого хода черепахи число ходов  
 
int move( int array [ 20 ][ 20 ], bool feather, int way, int step)
{
    // статические координаты черепахи для отображения хода черепахи
     static int nowX = 0;
     static int nowY = 0;
     
    //feather == 1 то перо опушенно  
     if (feather == 1 )
     {
        // для направления черепахи
        // для кождого направления черепаха делает step ходов 
        //в ниже привиденном алгориме с опушенном пером
        switch (way)
        {
           case 0 :
                // начиная с nowX делает step ходов в право
                for (int i = 0 ; i < step ; i++)
                    array[i + nowX][nowY] = 1 ;
                 
               // если бы нижний оператор был бы вверху как в case 2 :
               // то он бы пропустил nowX ходов в абцицах и потом началь бы печатать     
                 nowX = nowX + step - 1 ;   
                 break ;
                 
           case 1 :
                nowY = nowY - (step - 1) ;
                   
                for (int j = (step-1)  ; j >= 0 ; j--)
                   array[nowX][j + nowY] = 1;
                      break ;
 
             
           case 2 :
                // если бы нижний оператор был бы внизу  как в case 0 :
                // то во время печатьи был бы зазор в nowX ходов
                nowX = nowX - (step - 1) ;
                
                for (int i = (step-1) ; i >= 0 ; i--)
                   array[i + nowX][nowY] = 1 ;
                   
                      break ;
                      
           case 3 :
                for (int j = 0 ; j < step ; j ++)
                   array [nowX][j + nowY] = 1;
                   
                   nowY = nowY + step - 1 ;
                     break ;   
              
              default :
                      cout << "это некогда не случиться ";
                
           } // конец switch
           
           // выход из диапозона 
           if (nowX < 0 || nowY < 0)
             return -1 ;
        
                                }// конец внешнего if 
  
  // все то же самое повторяется когда  feather == 1      
     else 
     {
        switch (way)
        {
           case 0 :
                for (int i = 0 ; i < step ; i++)
                    array[i + nowX][nowY] = 0 ;
                    
                 nowX = nowX + step - 1 ;   
                 break ;
                 
           case 1 :
                 nowY = nowY - (step - 1) ;
                   
                for (int j = (step-1)  ; j >= 0 ; j--)
                   array[nowX][j + nowY] = 0;
                      break ;
                      
           case 2 :
                nowX = nowX - (step - 1) ;
                
                for (int i = (step-1) ; i >= 0 ; i--)
                   array[i + nowX][nowY] = 0 ;
                   
                      break ;
                      
           case 3 :
                for (int j = 0 ; j < step ; j ++)
                   array [nowX][j + nowY] = 0;
                   
                   nowY = nowY + step - 1 ;
                     break ;   
              
              default :
                      cout << "это некогда не случиться";
                
           } // конец switch 
            
           if (nowX < 0 || nowY < 0)
             return -1 ;
               }// конец внешнего if 
           
         // если не вышло из диапазона       
        return 0 ;
     }// конец функции move
     
 
int main()
{
        int array[ 20 ][ 20 ] = { 0 };// масив 20 на 20 
        int press; // для ввода комонды
        bool feather = 0; //  перо внизу по умолчании
        int way = 3; // по умолчании напровление на вверх
        int step ; // число шагов
         int diapason = 0 ; // если вышло из диапазона 
        
 
        
        do
        {
         //вводим команду     
        cout << "Enter the command  : " ;
        cin >> press ;
        
           switch (press )
              {
                  // поднимаем перо
                  case 1 :
                       feather = 0 ;
                       break ;
                   
                  //опускаем перо     
                  case 2 :
                       feather = 1 ;
                       break ;
                   
                  // даем путь на право      
                  case 3 :
                       way = (way + 1)% 4 ;
                       break ;
                 
                  // даем путь на лево     
                  case 4 :
                       way = (way + 3) % 4 ;
                       break ;
                   
                   // сколько шагов надо сделать   
                  case 5 :
                       cout << "Enter the number for step : " ;
                       cin >> step ; 
                       // запрос для диапазона 
                       diapason = move (array , feather , way , step ) ;
                       if (diapason == -1) 
                       {
                          cout << "You are darate " << endl ;
                          press = 9 ;
                          }
                       break ;
                       
                  // печатаем масив      
                  case 6 :
                       printFloor ( array ) ;
                       
                  case 9 :
                       break ;
                       
                  default :
                          cout << "You are Enter the wrong command \n"
                          << "Please try agаin \n" ;
                          break ;     
                       
                      } //конец switch
                      
                      }
                          while (press != 9);
                          
                          // для просмотра вехода  
                          cin >> diapason ;
                          return 0 ;
              
                           }//конец  main
3 / 3 / 2
Регистрация: 07.10.2011
Сообщений: 87
18.10.2011, 19:16 8
Как то тут все сложновато у Вас, если кому-то интересно гляньте как я реализовал эту задачу на С:

Код
#include "stdio.h"
#define SIZE 10


int main(){
 int command[20]={2,4,5,49,3,5,10,8,5,30,4,5,15,6};
 int floor [50][50]={0};
 int i=0;
 int j=0;
 int k=0;
 int h=0;
 int g=0;
 int ziy=0;
 for (k=0;k<=20;k++){
	 int z=0;
	 if (command[k]==1){
		g++;
		
		}// 1 if pero podniato
	 if (command[k]==2){
			h++;
		    }//2 if  pero opyscheno
     if ((command[k]==5)&&(h>=g)){
		 if (command[k-1]==3){
			 for(z;z<command[k+1];z++){
				 floor[i][j++]=1;
				
			 }//end for
		  printf("i=%d  j=%d\n", i,j);
		 }//pero vpravo
		 if (command[k-1]==4){
                             
			 for(z;z<command[k+1];z++){
				 floor[i++][j]=1;
			 }//end for
			 printf("%d  %d\n", i,j); 
		 
		 }//pero vniz
		 
		  if (command[k-1]==7){
                z=0;             
			 for(z;z<command[k+1];z++){
				 floor[i][j--]=1;
			 }//end for
			 printf("%d  %d\n", i,j); 
		 
		 }//pero vlevo
		 
		 if (command[k-1]==8){
                z=0;             
			 for(z;z<command[k+1];z++){
				 floor[i--][j]=1;
			 }//end for
		 printf("%d  %d\n", i,j); 
		 
		 }//pero vverh
		 
		 
		 
		 
   }//end if5
   
	 if (command[k]==6){
		 for (i=0;i<50;i++){
			 printf("\n");
			 for (j=0;j<50;j++){
				 printf("%d",floor[i][j]);
			 }
		 }

	 
	 }//if 6
		 if (command[k]==3){
		 continue;
		 }
        if (command[k]==4){
		 continue;
		 }
		 if (command[k]==7){
		 continue;
		 }
		 if (command[k]==8){
		 continue;
		 }
 }	// end for
    scanf("%d",&h);
	return 0;
}// end all
ту часть, где перо поднято не стал реализовывать потому, что там тоже самое только надо вместо 1 оставить в массиве floor 0 при движении. И не понятно, у Дейтела в этом задании сказано, что необходимо написать свои команды для удобства, считать повороты как я сразу хотел оказалось как-то трудоемко - я дописал 2 команды на движение курсора вверх и вниз.

Добавлено через 7 минут
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
18.10.2011, 19:23 9
Vlad-grigoryan, твоя прога просит меня команды вводить и сколько их нужно ввести? Так-то всю жизнь вводить можно
1
1 / 1 / 2
Регистрация: 21.12.2011
Сообщений: 73
09.04.2012, 23:23 10
Дошёл в книжке до этого задания, но вот что-то черепаха упорно отказывается идти правильно.

Проверьте мою карикатуру и скажите что тут не так.

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
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
/*
**********************************
*        Массив 50x100           *
**********************************
**********************************
*          1000000000            *
*          0000000000            *
*          0000000000            *
*          0000000000            *
*          0000000000            *
*                                *
* 1 - начальная позиция черепахи *
**********************************
**********************************
*           Команды:             *
* 1 - поднять перо(по умолчанию) *
* 2 - опустить перо              *
* 3 - поворот направо            *
* 4 - поворот налево             *
* 5 - ввести количество шагов    *
* 6 - вывести путь черепахи      *
* 9 - завершение программы       *
**********************************
*/
 
 
 
#include <iostream>
using namespace std;
 
void cherepaha(int [][100], int, int, int);
void printArray(int [][100]);
 
int main()
{
   int floor[50][100] = { { 0 }, { 0 } };
   int comanda;
   int pero = 1;
   int povorot, steps = 0;
 
   do
   {
      cout << "Введите команду: ";
      cin >> comanda;
 
      switch(comanda)
      {
         case 1: pero = comanda; break;
         case 2: pero = comanda; break;
         case 3: povorot = comanda; break;
         case 4: povorot = comanda; break;
         case 5:
            cout << "Сколько шагов?: ";
            cin >> steps;
            cherepaha(floor, povorot, steps, pero); break;
         case 6: printArray(floor); break;
         case 9: return 0; break;
         default: cout << "Введена неверная команда!" << endl;
      }
   }
   while(comanda != 9);
 
   cin.get();
   return 0;
}
 
void cherepaha(int floor[][100], int povorot, int steps, int pero)
{
   static int posX = 0, posY = 0;
   static int rightUpToDown = 0, rightDownToUp = 0;
   static int rightLeftToRight = 0, rightRightToLeft = 0;
 
   static int leftUpToDown = 0, leftDownToUp = 1;
   static int leftLeftToRight = 0, leftRightToLeft = 0;
 
   //Движение влево
      //Справа налево
   if(povorot == 4 && (leftDownToUp == 1 || rightDownToUp == 1))
   {
      leftLeftToRight = 1;
      if(leftDownToUp == 1)
      {
         leftDownToUp = 0;
      }
      else
         rightDownToUp = 0;
 
      if(pero == 2)
      {
         for(int i = posX; i == posX; i++)
         {
            for(int j = 0; j < steps; j++, posY--)
            {
               floor[posX][posY] = 1;
            }
         }
      }
      else
      {
         for(int i = posX; i == posX; i++)
         {
            for(int j = 0; j < steps; j++, posY--)
            {
               floor[posX][posY] = 0;
            }
         }
      }
   }
      //Слева направо
   else if(povorot == 4 && (leftUpToDown == 1 || rightUpToDown == 1))
   {
      leftLeftToRight = 1;
      if(leftUpToDown == 1)
      {
         leftUpToDown = 0;
      }
      else
         rightUpToDown = 0;
 
      if(pero == 2)
      {
         for(int i = posX; i == posX; i++)
         {
            for(int j = 0; j < steps; j++, posY++)
            {
               floor[posX][posY] = 1;
            }
         }
      }
      else
      {
         for(int i = posX; i == posX; i++)
         {
            for(int j = 0; j < steps; j++, posY++)
            {
               floor[posX][posY] = 0;
            }
         }
      }
   }
      //Снизу вверх
   else if(povorot == 4 && (leftLeftToRight == 1 || rightLeftToRight == 1))
   {
      leftDownToUp = 1;
      if(leftLeftToRight == 1)
      {
         leftLeftToRight = 0;
      }
      else
         rightLeftToRight = 0;
 
      if(pero == 2)
      {
         for(int i = posY; i == posY; i++)
         {
            for(int j = 0; j < steps; j++, posX--)
            {
               floor[posX][posY] = 1;
            }
         }
      }
      else
      {
         for(int i = posY; i == posY; i++)
         {
            for(int j = 0; j < steps; j++, posX--)
            {
               floor[posX][posY] = 0;
            }
         }
      }
   }
      //Сверху вниз
   else if(povorot == 4 && (leftRightToLeft == 1 || rightRightToLeft == 1))
   {
      leftUpToDown = 1;
      if(leftRightToLeft == 1)
      {
         leftRightToLeft = 0;
      }
      else
         rightRightToLeft = 0;
 
      if(pero == 2)
      {
         for(int i = posY; i == posY; i++)
         {
            for(int j = 0; j < steps; j++, posX++)
            {
               floor[posX][posY] = 1;
            }
         }
      }
      else
      {
         for(int i = posY; i == posY; i++)
         {
            for(int j = 0; j < steps; j++, posX++)
            {
               floor[posX][posY] = 0;
            }
         }
      }
   }
 
   //Движение вправо
      //Справа налево
   else if(povorot == 3 && (leftUpToDown == 1 || rightUpToDown == 1))
   {
      rightRightToLeft = 1;
      if(rightUpToDown == 1)
      {
         rightUpToDown = 0;
      }
      else
         leftUpToDown = 0;
 
      if(pero == 2)
      {
         for(int i = posX; i == posX; i++)
         {
            for(int j = 0; j < steps; j++, posY--)
            {
               floor[posX][posY] = 1;
            }
         }
      }
      else
      {
         for(int i = posX; i == posX; i++)
         {
            for(int j = 0; j < steps; j++, posY--)
            {
               floor[posX][posY] = 0;
            }
         }
      }
   }
      //Слева на право
   else if(povorot == 3 && (leftDownToUp == 1 || rightDownToUp == 1))
   {
      rightLeftToRight = 1;
      if(leftDownToUp == 1)
      {
         leftDownToUp = 0;
      }
      else
         rightDownToUp = 0;
 
      if(pero == 2)
      {
         for(int i = posX; i == posX; i++)
         {
            for(int j = 0; j < steps; j++, posY++)
            {
               floor[posX][posY] = 1;
            }
         }
      }
      else
      {
         for(int i = posX; i == posX; i++)
         {
            for(int j = 0; j < steps; j++, posY++)
            {
               floor[posX][posY] = 0;
            }
         }
      }
   }
      //Снизу вверх
   else if(povorot == 3 && (leftRightToLeft == 1 || rightRightToLeft == 1))
   {
      rightDownToUp = 1;
      if(leftRightToLeft == 1)
      {
         leftRightToLeft = 0;
      }
      else
         rightRightToLeft = 0;
 
      if(pero == 2)
      {
         for(int i = posY; i == posY; i++)
         {
            for(int j = 0; j < steps; j++, posX--)
            {
               floor[posX][posY] = 1;
            }
         }
      }
      else
      {
         for(int i = posY; i == posY; i++)
         {
            for(int j = 0; j < steps; j++, posX--)
            {
               floor[posX][posY] = 0;
            }
         }
      }
   }
      //Сверху вниз
   else if(povorot == 3 && (leftLeftToRight == 1 || rightLeftToRight == 1))
   {
      rightUpToDown = 1;
      if(rightLeftToRight == 1)
      {
         rightLeftToRight = 0;
      }
      else
         leftLeftToRight = 0;
 
      if(pero == 2)
      {
         for(int i = posY; i == posY; i++)
         {
            for(int j = 0; j < steps; j++, posX++)
            {
               floor[posX][posY] = 1;
            }
         }
      }
      else
      {
         for(int i = posY; i == posY; i++)
         {
            for(int j = 0; j < steps; j++, posX++)
            {
               floor[posX][posY] = 0;
            }
         }
      }
   }
}
 
void printArray(int floor[][100])
{
   for(int i = 0; i < 50; i++)
   {
      for(int j = 0; j < 100; j++)
      {
         if(floor[i][j] == 0)
         {
            cout << " ";
         }
         else
            cout << "*";
      }
      cout << endl;
   }
}
0
31 / 31 / 3
Регистрация: 19.05.2012
Сообщений: 67
24.05.2012, 15:26 11
Мой вариант, полностью работает
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
#include <iostream>
#include <conio.h>
#include <iomanip>
 
using namespace std;
 
void printFloor( const int [][ 20 ], const int ); // Вывод на экран "черепахи"
void moveFloor( int [][ 20 ], bool, bool, bool, bool, const int, const int = 0 ); // Передвижение "черепахи"
 
int currentA = 0;
int currentB = 0;
int side = 0; // { 0 - вперед, 1 - вниз, 2 - влево, 3 - вправо }
 
int main( void )
{
    const int arraySize = 20; // Размер пространства
    int floor[ 20 ][ 20 ] = { { 0 }, { 0 } }; // Пространство для похождений черепахи
    int currentPress; // Нажатая цифра в данный момент
    int moveTo;
    bool pen = false; // Определяет состояние пера
 
    while( currentPress != 9 )
    {
        cout << "Enter command: ";
        cin >> currentPress;
 
        // Выполняем команду пользователя
        switch( currentPress )
        {
            // Поднять перо
            case 1:
                pen = false;
                cout << "Pen is up. " << endl;
                break;
            // Опустить перо
            case 2:
                pen = true;
                cout << "Pen is down. " << endl;
                break;
            // Поворот направо
            case 3:
                moveFloor( floor, pen, 0, 1, 0, arraySize );
                break;
            // Поворот налево
            case 4:
                moveFloor( floor, pen, 0, 0, 1, arraySize );
                break;
            // Движение вперед на n шагов
            case 5:
                cin >> moveTo;
                moveFloor( floor, pen, 1, 0, 0, arraySize, moveTo );
                break;
            // Вывод массива "черепашки"
            case 6:
                printFloor( floor, arraySize );
                break;
            // Выход из программы
            case 9:
                cout << "See you later!" << endl;
                break;
            // На случай, если такой команды не существует
            default:
                cout << "Unknown command!" << endl;
        }
 
        cout << endl;
    }
 
    getch();
    return 0;
}
 
void printFloor( const int array[][ 20 ], const int sizeOfArray  )
{
    for( int i = 0; i < sizeOfArray; i++ )
    {
        for( int j = 0; j < sizeOfArray; j++ )
        {
            if( array[ i ][ j ] == 1 )
            {
                cout << '*';
            }
            else
            {
                cout << ' ';
            }
            if( ( j % 19 == 0 ) && ( j != 0 ) )
            {
                cout << endl;
            }
        }
    }
}
 
void moveFloor( int array[][ 20 ], bool pen, bool forward, bool right,
                        bool left, const int size, const int moveTo )
{
    if( forward ) // Если движение вперед
    {
        if( pen )
        {
            switch( side )
            {
                case 0: // Вправо
                    for( int i = currentB + 1; i <= currentB + moveTo; i++ )
                        array[ currentA ][ i ] = 1;
                    currentB += moveTo;
                    break;
                case 1: // Вниз
                    for( int j = currentA + 1; j <= currentA + moveTo; j++ )
                        array[ j ][ currentB ] = 1;
                    currentA += moveTo;
                    break;
                case 2: // Влево
                    for( int z = currentB - 1; z >= currentB - moveTo; z-- )
                        array[ currentA ][ z ] = 1;
                    currentB -= moveTo;
                    break;
                case 3: // Вверх
                    for( int w = currentA - 1; w >= currentA - moveTo; w-- )
                        array[ w ][ currentB ] = 1;
                    currentA -= moveTo;
                    break;
            }
 
        }
        else
        {
            switch( side )
            {
                case 0: // Вправо
                    currentB += moveTo;
                    break;
                case 1: // Вниз
                    currentA += moveTo;
                    break;
                case 2: // Влево
                    currentB -= moveTo;
                    break;
                case 3: // Вверх
                    currentA -= moveTo;
                    break;
            }
        }
        cout << "Turtle moving for " << moveTo << endl;
    }
 
    if( right ) // Если поворот вправо
    {
        if( side == 3 )
        {
            side = 0;
        }
        else
        {
            side += 1;
        }
        cout << "Turtle rotating right. Current side is " << side << endl;
    }
 
    if( left ) // Если поворот влево
    {
        if( side == 0 )
        {
            side = 3;
        }
        else
        {
            side -= 1;
        }
        cout << "Turtle rotating left. Current side is " << side << endl;
    }
}
vars-cat, уж какой-то слишком большой код у тебя
0
0 / 0 / 0
Регистрация: 08.12.2012
Сообщений: 7
17.01.2013, 23:46 12
Цитата Сообщение от arbuzaki Посмотреть сообщение
Привет! Чуток доделал! На "с" будет выглядеть так:
Немного непонятен этот момент, если можно, подробнее объясните этот фрагмент кода.

C++
1
2
3
4
5
6
7
8
9
10
11
12
 if(way == 0) {                                           /*движение в право*/
       if( (nowX == lastX - k) && (nowY == lastY) ) {
           lastX = nowX;
           lastY = nowY;
           printf("На сколько шагов двигаться: ");
           scanf("%d", &step);
           k = step;
           for(; step > 0; step--) {
               nowY++;
               if( feather == 1 )
                   array[ nowX ][ nowY ] = 1;
           }
0
190 / 160 / 35
Регистрация: 22.05.2013
Сообщений: 455
Записей в блоге: 1
22.05.2013, 12:43 13
Прочитал уже несколько тем об этой черепахе, но нигде не смог найти решение ситуации, на которой застопорился я. Мне понятен алгоритм движения черепахи и рисования траектории ее движения, с этим проблем нет. Проблема есть в следующем. К этой задаче прилагается пример:
12 шагов вперед;
поворот направо;
12 шагов вперед...
и так 4 раза. В примере следует утверждение, что при данных командах черепаха нарисует квадрат 12x12. Вот это мне не понятно и я буду рад любой помощи.
Я рассуждаю так:
1. Если я стою в начальной ячейке (0,0) и делаю 5 шагов вправо (предположим, что это вектор черепахи по умолчанию) с опущенным пером, то в какой ячейке я окажусь в итоге и какие ячейки будут закрашены. С точки зрения реального мира, если я опущу перо в начальной ячейке и сделаю 5 шагов (шаг = 1 ячейка), то я окажусь в ячейке (0,5) и все посещенные мной ячейки будут отмечены (включая начальную и конечную). Их будет 6, а не 5, но это противоречит логике примера.
2. Для достижения результатов, указанных в примере, во время движения мне необходимо считать мою текущую ячейку как пройденную(1 шаг). Кажется, что логика в этом есть, но... если мой шаг равен 1, то черепаха в этом случае не меняет своего местоположения, а это уже нонсенс.
Так какой из вариантов мне выбрать для реализации (может предложите еще варианты)? Может я где то отклонился от сути в своих размышлениях? Или же это просто ошибка в примере? Помогите, 3-й час уже пошел, а мне хочется сегодня уснуть "со спокойной душой и ясным разумом"
0
9 / 9 / 1
Регистрация: 28.04.2013
Сообщений: 55
22.05.2013, 17:36 14
Vlad-grigoryan, пожалуй самый путевый метод

Добавлено через 8 минут
Цитата Сообщение от undertacker Посмотреть сообщение
Vlad-grigoryan, пожалуй самый путевый метод
поторопился я с выводами)
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
22.05.2013, 17:39 15
Мимино, длину хода можно представить как количество закрашенных ячеек. В данном случае при вводе 5, закрашиваются все ячейки кроме той, где черепаха останавливается.
То есть реализовать можно в цикли вот так:

C++
1
2
for ( int i = 0; i < steps; i++ )
   floor[ x++ ][ y ] = true;
0
190 / 160 / 35
Регистрация: 22.05.2013
Сообщений: 455
Записей в блоге: 1
22.05.2013, 17:44 16
Ну, раз на то пошло, прошу оценить и мое "творение"
З.Ы. Постом выше я описал свою проблему понимания этой задачи. Взял для реализации 1-й вариант. Принцип тот же, а ошибку завышения/занижения на 1 исправить можно.
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
#include "stdafx.h"
#include <iostream>
using namespace std;
 
int x = 0, y = 0, turn = 0, pen = 1;
 
void printFloor(int [][20], int);
void turtleStep(int [][20], int, int);
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    const int n = 20, m = 20;
    int floor[n][m] = {0};
    int command = 1, step;
 
    cout << "************************************************************************" << endl;
    cout << "               Погонять черепаху? Нет ничего проще!" << endl;
    cout << "  Запоминай команды, которые нужно вводить через \"пробел\" или \"Enter\"." << endl;
    cout << "            По умолчанию черепаха двигается туда ----->" << endl << endl;
    cout << "1 - Поднять перо(по умолчанию)" << endl << "2 - Опустить перо (осторожно, оставляет следы на полу!)" << endl;
    cout << "3 - Повернуть направо" << endl << "4 - Налево (не рекомендуется семейным людям)." << endl;
    cout << "5 - Пнуть черепаху" << endl << "Циферка после 5-ки - как далеко пнуть." << endl;
    cout << "6 - Посмотреть и ужаснуться от следа на полу." << endl;
    cout << "8 - \"Дяденька, а где черепаха? :'(\"" << endl;
    cout << "9 - Надоело!" << endl;
    cout << "************************************************************************" << endl << endl;
    cout << "Правила обращения с черепахой:" << endl;
    cout << "1. Не заставляйте черепаху биться головой о стену - это больно!" << endl;
    cout << "2. Не \"говорите\" черепахе команд, которых она не знает." << endl << "Она их может не понять или вовсе зависнуть. " << endl << endl;
    cout << "ВПЕРЕД, КОМАНДИР ЧЕРЕПАХИ! ДЕЙСТВУЙ!" << endl << endl;
    while (command != 9)
    {
        cin >> command;
        switch (command)
        {
            case 1:
                pen = 1;
                break;
            case 2:
                pen = 2;
                break;
            case 3:
                turn++;
                break;
            case 4:
                turn--;
                break;
            case 5:
                cin >> step;
                turtleStep(floor, n, step);
                break;
            case 6:
                printFloor(floor, n);
                break;
            case 8:
                cout << "(" << x << ", " << y << ")" << endl;
                break;
            case 9:
                break;
            default:
                cout << "Черепаха вас не понимает :(" << endl;
                break;
        }
    }
 
    system("pause");
    return 0;
}
 
 
void turtleStep(int ground[][20], int a, int walk)
{
    if (turn >= 4 || turn <= -4)
        turn = turn % 4;
    if (turn < 0)
        turn = 4 + turn;
 
    switch (turn)
    {
        case 0:
            if (y + walk > 19)
            {
                cout << "Черепаха стоит и не хочет ударяться головой о стену" << endl;
                break;
            }
 
            if (pen == 1)
                y = y + walk;
            else
                for (int i = 0; i <= walk; i++)
                {
                    ground[x][y]++;
                    if (i < walk) 
                        y++;
                }
            break;
 
        case 1:
            if (x + walk > 19)
            {
                cout << "Черепаха стоит и не хочет ударяться головой о стену" << endl;
                break;
            }
 
            if (pen == 1)
                x = x + walk;
            else
                for (int i = 0; i <= walk; i++)
                {
                    ground[x][y]++;
                    if (i < walk)
                        x++;
                }
            break;
        case 2:
            if (y - walk < 0)
            {
                cout << "Черепаха стоит и не хочет ударяться головой о стену" << endl;
                break;
            }
 
            if (pen == 1)
                y = y - walk;
            else
                for (int i = 0; i <= walk; i++)
                {
                    ground[x][y]++;
                    if (i < walk)
                        y--;
                }
            break;
        case 3:
            if (x - walk < 0)
            {
                cout << "Черепаха стоит и не хочет ударяться головой о стену" << endl;
                break;
            }
 
            if (pen == 1)
                x = x - walk;
            else
                for (int i = 0; i <= walk; i++)
                {
                    ground[x][y]++;
                    if (i < walk)
                        x--;
                }
            break;
 
    }
}
 
 
void printFloor(int arr[][20], int size)
{
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            if (arr[i][j] > 0)
                cout << "*";
            else
                cout << " ";
 
        }
        cout << endl;
    }
}
Добавлено через 3 минуты
Цитата Сообщение от Toshkarik Посмотреть сообщение
Мимино, длину хода можно представить как количество закрашенных ячеек. В данном случае при вводе 5, закрашиваются все ячейки кроме той, где черепаха останавливается.
То есть реализовать можно в цикли вот так:

C++
1
2
for ( int i = 0; i < steps; i++ )
   floor[ x++ ][ y ] = true;
Хоть кто-то отозвался, спасибо. Я вот тоже сначала выбрал этот путь, но, опять же, как быть с перемещением на 1 шаг? В этом случае факт движения присутствует, а на положении черепахи это никак не отображается.
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
22.05.2013, 17:46 17
Мимино, ну как же, она передвигается на 1 шаг. Закрашивает текущую клетку и сдвигается на следующую.
0
190 / 160 / 35
Регистрация: 22.05.2013
Сообщений: 455
Записей в блоге: 1
22.05.2013, 18:00 18
Цитата Сообщение от Toshkarik Посмотреть сообщение
Мимино, ну как же, она передвигается на 1 шаг. Закрашивает текущую клетку и сдвигается на следующую.
Да, мысль понял. Но этот метод тоже немного "взрывает" мой мозг Объясню. Это равносильно тому, что перо поднимается при последнем шаге. Или, к примеру, если черепаху повернуть и сдвинуть на 1 шаг, это изменит траекторию черепахи, а на "графическом" отображении траектории это не будет заметно.
Я даже провел следующий опыт:
1. Разложил на полу 6 листов бумаги в ряд.
2. Взял бутылку с водой.
3. Встал на 1-й лист и приоткрыл бутылку, чтобы из нее текла вода (опустил перо).
4. Сделал 5 шагов.
Итог: траектория моего движения полностью отображена на полу, мокрые 6 листов, а не 5.
На чем я прокололся (мозг/выбор профессии не в счет)?
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
22.05.2013, 18:10 19
Задание обучающее, и дано в книге для изучения массивов, если мне не изменяет память. Можно так же закрашивать все клетки, по которым прошла черепаха, суть то, в принципе, не в этом.
1
190 / 160 / 35
Регистрация: 22.05.2013
Сообщений: 455
Записей в блоге: 1
22.05.2013, 18:16 20
Цитата Сообщение от Toshkarik Посмотреть сообщение
Задание обучающее, и дано в книге для изучения массивов, если мне не изменяет память. Можно так же закрашивать все клетки, по которым прошла черепаха, суть то, в принципе, не в этом.
Вот это уж точно +/- 1 тут особой роли не играет.
0
22.05.2013, 18:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.05.2013, 18:16
Помогаю со студенческими работами здесь

Черепашья графика на С (Си)
Черепаха несет перо, которое может находится в одной из 2х позиций – нижней или верхней. Если перо...

Черепашья графика
Как это сделать через процедуры? Составить процедуры построения фигур: а) квадрата по известной...

Черепашья графика в консоли на C
Привет. Для меня сложная задача. Бьюсь над ней долго. Условие задачи: Есть поле 50х50...

Chart - диаграмма: изменить точность делений графика, установить центр графика в (0,0)
Создал диаграмму (все прекрасно считается точки расставляются), но есть проблемыЖ 1. В случае...


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

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

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