Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
Другие темы раздела
C++ как организовать ? http://www.cyberforum.ru/cpp-beginners/thread93140.html
вот такой вопрос нужно написать программу которая определяет минимальное число во введенной с клавиатуры последовательности положительных чисел (ДЛИНА ПОСЛЕДОВАТЕЛЬНОСТИ НЕОГРАНИЧЕННА) если перебор организовать могу то вот как сделать неограниченной длину последовательности ?
C++ Некоректности в булевом выражении Я недавно начал изучать C++ и я немного преуспел (для начинающего), но тут меня кое-что конкретно тормознуло. Тормозом оказалась проблемка в этом коде: #include <iostream> #include <stdio.h> using namespace std; void HackAlert() { string answer; cout << "Are you a hacker? (Y or N)" << endl; cin >> answer; http://www.cyberforum.ru/cpp-beginners/thread93123.html
Дан целочисленный массив, нужно исключить из него все нули C++
Дан целочисленный массив, нужно исключить из него все нули. Если нулей нет-написать "сжатие невозможно". Составить динамический массив и ввод элементов я смогу. А как реализовать поиск 0 и их удаление?
Вычислить процент от общего количества C++
Помогите пожалуйста разобратся с этой прогой: Написать прогамму, которая обрабатывает результаты экзамена. Для каждой оценки программа должна вычислить процент от общего количества оценок. Оценки от 5 до 2. Среда разработки: С++
C++ Шахматная доска и строка http://www.cyberforum.ru/cpp-beginners/thread93094.html
Есть 3 задачки, немного не соображу как их решить. Помогите горе-программисту :) 1) Поле шахматной доски определяется парой натуральных чисел, первое из которых задаст номервертикали, а второе- номер горизонтали. Даны натуральные числа k, l, m, n. Требуется выяснить, являются ли поля (k, l) и (m, n) полямиодного цвета. 2)В последовательности введённых символов (последний '$') определить...
C++ Матрица и элементы Помогите решить задачу: Сформиромать матрицу С (N,M) элементами которой являются случайные числа, равномерно распределённые в интервале (-4.0, 8.2). Переставляя её строки и столбцы, добиться того, чтобы наименьшийэлемент этой матрицы оказался в левом верхнем углу. Матрицу сформировать динамическим массивом я могу, рандом тоже могу, а всё остальное не знаю как. Помогите пожалуйста! подробнее

Показать сообщение отдельно
G-Cat
16 / 16 / 1
Регистрация: 15.03.2009
Сообщений: 94
07.02.2010, 19:18     Черепашья графика
Полистал тут Дейтелов, пятое большое издание и нашёл простенькую задачку, но код получился черезчур увесистый, по моему разумению. Помогите оптимизировать и привести к более компактному виду. Заодно может научусь чему новому...

Текст задачи:
Язык Лого, особенно популярный среди пользователей персональных компьютеров, сделал знаменитой черепашью графику. Представьте себе механическую черепаху, которая ползает по комнате под управлением программы на 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()...может кто нибудь всё таки поделится идеями? Потому что мне кажется, что от этого алгоритма один шаг до создания игры "змейка"...кстати, следующая прога, которую я собираюсь писать.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 05:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru