Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
Fafle
34 / 34 / 4
Регистрация: 19.03.2010
Сообщений: 136
#1

Не могу разобраться с отработкой циклов - C++

02.04.2011, 13:32. Просмотров 2045. Ответов 49
Метки нет (Все метки)

Есть код:
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
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define SIZE1 21
#define SIZE2 60
 
using namespace std;
void print(char ar[][60]) {
    int i = 1;
    int j = 1;
    int a, leng = 5;
    ar[i][j] = 'X';
    char *ar1 = new char[100];
    char *ar2 = new char[100];
    char *ar3 = new char[100];
    char *ar4 = new char[100];
    char *ar5 = new char[100];
    char *ar6 = new char[100];
    char *ar7 = new char[100];
    char *ar8 = new char[100];
    char *ar9 = new char[100];
    char *ar10 = new char[100];
    char *ar11 = new char[100];
    char *ar12 = new char[100];
    char *ar13 = new char[100];
    char *ar14 = new char[100];
    char *ar15 = new char[100];
    char *ar16 = new char[100];
    char *ar17 = new char[100];
    char *ar18 = new char[100];
    char *ar19 = new char[100];
    char *ar20 = new char[100];
    char *str[20] = {ar1, ar2, ar3, ar4, ar5, ar6, ar7, ar8, ar9, ar10, ar11, ar12, ar13, ar14, ar15, ar16, ar17, ar18, ar19, ar20};
    while (1 != 0) {
        for (int g = 0; g < SIZE1; g++)
            puts(ar[g]);
        a = getch();
        switch (a) {
            case 67:
                if ((j + 1) != SIZE2 - 2) {
                    ar[i][j + 1] = ar[i][j];
                    str[0] = &ar[i][j];
                    j++;
                } else {
                    ar[i][j - (SIZE2 - 4)] = ar[i][j];
                    str[0] = &ar[i][j];
                    j = j - (SIZE2 - 4);
                }
                break;
            case 66:
                if (i + 1 != SIZE1 - 1) {
                    ar[i + 1][j] = ar[i][j];
                    str[0] = &ar[i][j];
                    i++;
                } else {
                    ar[i - (SIZE1 - 3)][j] = ar[i][j];
                    str[0] = &ar[i][j];
                    i = i - (SIZE1 - 3);
                }
                break;
            case 65:
                if ((i - 1) != 0) {
                    ar[i - 1][j] = ar[i][j];
                    str[0] = &ar[i][j];
                    i--;
                } else {
                    ar[i + (SIZE1 - 3)][j] = ar[i][j];
                    str[0] = &ar[i][j];
                    i += SIZE1 - 3;
                }
                break;
            case 68:
                if ((j - 1) != 0) {
                    ar[i][j - 1] = ar[i][j];
                    str[0] = &ar[i][j];
                    j--;
                } else {
                    ar[i][j + (SIZE2 - 4)] = ar[i][j];
                    str[0] = &ar[i][j];
                    j += SIZE2 - 4;
                }
                break;
        }
         for (int v = leng+2; v > 0; v--)
            str[v] = str[v - 1];
        *str[leng+2] = ' ';
 
        system("cls");
        
    }
}
 
int main() {
    char ar[21][60];
 
    for (int i = 0; i < SIZE1; i++) {
        for (int j = 0; j < SIZE2; j++) {
            if (j == SIZE2 - 1)
                ar[i][j] = '\0';
            else {
                if ((i == 0) || (i == SIZE1 - 1) || (j == 0) || (j == SIZE2 - 2)) {
                    ar[i][j] = 'X';
                } else {
                    ar[i][j] = ' ';
                }
            }
        }
    }
    print(ar);
}
Блок мэйн создает и инициализирует Массив из строк размером SIZE1 на SIZE2, в функции принт создает массив указателей на наш массив строк, далее задается вечный цикл для отображения на экран нашего массива, к помощью оператора getch() мы задаем внесение изменение, в массив указателей мы заносим адрес измененной ячейки, цикл
C++
1
2
 for (int v = leng+2; v > 0; v--)
            str[v] = str[v - 1];
позволяет смещать адреса в массиве указателей, с помощью переменной leng мы задаем номер адреса в массиве указателей для возврата его в первоначальный вид. По логике вроде все "четко", но есть одно но, результат немного не тот, к примеру при leng =5 должен возвращаться в изначальный вид символ по адресу leng[4] который был изменен 5 витков цикла while назад, но увы этого не происходит...

Возможны некоторые ошибки в коде в плане синтаксиса, переделал вручную под винду с Линукса.
У самого уже мозг не варит 3 дня овыряюсь не могу ошибку найти, заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2011, 13:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не могу разобраться с отработкой циклов (C++):

Не могу разобраться с отработкой рекурсивной функции - C++
Доброго времени суток. Имеется функция находящая в первом массиве количество повторения второго массива: #include &lt;iostream&gt; using...

не могу разобраться.. - C++
Вывести на экран все натуральные числа из диапазона от A до B, в записи которых цифра 7 встречается ровно N раз. При отсутствии чисел с...

Не могу разобраться с С++ - C++
Всем Привет, так я кодеру в Делфи. Не давно нашел что мне нужно но оy написан на С. Вот и начался у меня проблемы с кодами. Вот часть...

Не могу разобраться с ошибкой - C++
Всю голову переломал почему он ругается на cout в 11 строке. Подскажите пожалуйста. #include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include...

Не могу разобраться с программой - C++
Я поступил в Колледж Вычислительной Техники и у нас началось программированиею Сказали поставить Visual C++ 2010, я поставил и теперь не...

Не могу разобраться с задачей - C++
Найдите последовательность, содержащую N последовательных натуральных чисел (N=2k+1), таких, что сумма квадратов первых k+1 чисел равна...

49
Fafle
34 / 34 / 4
Регистрация: 19.03.2010
Сообщений: 136
02.04.2011, 15:39  [ТС] #16
Название мне кажется не принципиально, а вот по поводу выделений памяти можно по подробней?
Выделения я даже и не учитывал, ведь чем может один байт навредить
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2011, 15:42 #17
Цитата Сообщение от Fafle Посмотреть сообщение
по поводу выделений памяти можно по подробней?
str[0] = &ar[][] - присваивание адреса статической строки в указатель, для которого будет вызван delete (если ты решишь удалять за собой).
И выделяешь ты не один байт, а 20 раз по 100 байт.)
В данном случае не критично, но нужно быть культурным программистом и убирать за собой. Чтобы не выработалась дурная привычка бросать всё как есть.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2011, 15:47 #18
Цитата Сообщение от <jnf Посмотреть сообщение
привет

Не по теме:

не оффтопь и здравствуй

1
Fafle
34 / 34 / 4
Регистрация: 19.03.2010
Сообщений: 136
02.04.2011, 16:02  [ТС] #19
Цитата Сообщение от Deviaphan Посмотреть сообщение
str[0] = &ar[][] - присваивание адреса статической строки в указатель, для которого будет вызван delete (если ты решишь удалять за собой).
И выделяешь ты не один байт, а 20 раз по 100 байт.)
В данном случае не критично, но нужно быть культурным программистом и убирать за собой. Чтобы не выработалась дурная привычка бросать всё как есть.
Ну это при создании, но позже будет реализовано и ее удаление, в данных строках еще появится "яблочко" и при совпадении ar[i][j] с ним будет увеличиваться leng, при достижением leng значения 100 будет вызов другой функции извещающей о победе, вот перед ней и будет цикл
C++
1
2
for(int f=0;f<20;f++)
delete [] str[f];
Это будет, но проблема остается, почему неправильно отрабатывает цикл и указатель с концом строки?

Вообще будет выделено памяти эдак на 300 строк размером в 100 байт...

Добавлено через 12 минут
Главная проблема в том что змея удлиняется на один символ при увеличении leng на 3, соответственно чтоб реализовать змею в 100 символов мне нужно выделить 300 указателей по 100 байт, а это уже солидны баг.
Если ошибки не видно я могу и так реализовать программу, но неприятный осадок остается

Ну спасибо и на этом
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2011, 16:04 #20
Мало того, что код непонятный, он ещё и не весь. Судя по тому куску, что видно, от str вообще никакого толку, используется только нулевой, остальные ни на что не влияют.
В общем ничё не понятно.
Попробуй обнулить все строки сразу после выделения.
Что за указатель с концом строки я не понял.
Как выйти из while тоже не понял.

Добавлено через 1 минуту
Так это игра "ЗМейка"?
ОМГ
Я бы не догадался, пока не запустил.)))
0
Fafle
34 / 34 / 4
Регистрация: 19.03.2010
Сообщений: 136
02.04.2011, 16:07  [ТС] #21
Вот использование остальных указателей
C++
1
*str[leng+2] = ' ';
Что касается незаконченности, то целиком код будет еще не понятней, попробуй скомпилировать, будет видна сути проги, я потом выложу сюда полный код, чисто что вы поржали как я изощряюсь

Добавлено через 57 секунд

Не по теме:

Цитата Сообщение от <jnf Посмотреть сообщение
Fafle, почему мне никто не отвечает? я новичок.
подожди, может кто и откликнется

0
Fafle
34 / 34 / 4
Регистрация: 19.03.2010
Сообщений: 136
02.04.2011, 16:10  [ТС] #22
ВОТ
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
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define SIZE1 21
#define SIZE2 60
 
using namespace std;
 
void print(char ar[][60]) {
    int i = 1;
    int j = 1;
    int a, leng = 12;
    ar[i][j] = 'X';
    char *str[50];
    for (int m = 0;m < 50; m++)
        str[m] = new char[100];
    while (1 != 0) {
        for (int g = 0; g < SIZE1; g++)
            puts(ar[g]);
        a = getch();
        switch (a) {
            case 67:
                if ((j + 1) != SIZE2 - 2) {
                    ar[i][j + 1] = ar[i][j];
                    str[0] = &ar[i][j];
                    j++;
                } else {
                    ar[i][j - (SIZE2 - 4)] = ar[i][j];
                    str[0] = &ar[i][j];
                    j = j - (SIZE2 - 4);
                }
                break;
            case 66:
                if (i + 1 != SIZE1 - 1) {
                    ar[i + 1][j] = ar[i][j];
                    str[0] = &ar[i][j];
                    i++;
                } else {
                    ar[i - (SIZE1 - 3)][j] = ar[i][j];
                    str[0] = &ar[i][j];
                    i = i - (SIZE1 - 3);
                }
                break;
            case 65:
                if ((i - 1) != 0) {
                    ar[i - 1][j] = ar[i][j];
                    str[0] = &ar[i][j];
                    i--;
                } else {
                    ar[i + (SIZE1 - 3)][j] = ar[i][j];
                    str[0] = &ar[i][j];
                    i += SIZE1 - 3;
                }
                break;
            case 68:
                if ((j - 1) != 0) {
                    ar[i][j - 1] = ar[i][j];
                    str[0] = &ar[i][j];
                    j--;
                } else {
                    ar[i][j + (SIZE2 - 4)] = ar[i][j];
                    str[0] = &ar[i][j];
                    j += SIZE2 - 4;
                }
                break;
        }
        for (int v = leng + 2; v > 0; v--)
            str[v] = str[v - 1];
        *str[leng + 2] = ' ';
 
        system("cls");
 
    }
}
 
int main() {
    char ar[21][60];
 
    for (int i = 0; i < SIZE1; i++) {
        for (int j = 0; j < SIZE2; j++) {
            if (j == SIZE2 - 1)
                ar[i][j] = '\0';
            else {
                if ((i == 0) || (i == SIZE1 - 1) || (j == 0) || (j == SIZE2 - 2)) {
                    ar[i][j] = 'X';
                } else {
                    ar[i][j] = ' ';
                }
            }
        }
    }
    print(ar);
}
то что есть сейчас, потом это обрастет до полноценной проги
Переменная leng будет изменяться и указывает длину змеи
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2011, 16:13 #23

Не по теме:

Цитата Сообщение от <jnf Посмотреть сообщение
может я там непрвильно отправила?
Блин, дай ссылку, я тебе что-нибудь напишу там.


 Комментарий модератора 
Желающие могуть помочь по ссылке многослойный персептрон


Добавлено через 2 минуты
оК. Скомпилировал, запустил, не упало ничего.
В чём ошибка и как её повторить?
0
Fafle
34 / 34 / 4
Регистрация: 19.03.2010
Сообщений: 136
02.04.2011, 16:20  [ТС] #24
Цитата Сообщение от Deviaphan Посмотреть сообщение

Не по теме:


Блин, дай ссылку, я тебе что-нибудь напишу там.



Добавлено через 2 минуты
оК. Скомпилировал, запустил, не упало ничего.
В чём ошибка и как её повторить?
Поиграйся с переменной leng, по логике она отвечает за длину змеи и должна при увеличении на 1 увеличивать змею на 1, но для увеличения змеи нужно ее увеличить на 3, но мы привязаны к массиву указателей вызывая из него
C++
1
*str[leng+2] = ' ';
На +2 не зацикливайся, это был шаманский обряд

Не по теме:

Я надеюсь теперь индусский код обретает смысл? А то я начинаю за себя бояться

0
Nameless One
02.04.2011, 16:22
  #25

Не по теме:

Fafle, главное - стремиться к совершенству

0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2011, 16:24 #26
Добавь в цикл
C++
1
2
        case 'q':
            return;
Чтоб хоть выйти можно было.)

При любом leng у меня только рамка и Х в левом верхнем углу.
0
Fafle
34 / 34 / 4
Регистрация: 19.03.2010
Сообщений: 136
02.04.2011, 16:32  [ТС] #27
Замени 65 66 67 68 на 119 115 100 97 и пользоваться w s d a для управления, у меня просто линь и ASCII таблица другая
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2011, 17:33 #28
Ага, заработало.
НАписал бы case 'w' и т.п. и не пудрил мозги.)))

Добавлено через 8 минут
А прикольно.)
Раз уж я компилятор всё равно включил, напишу по другому.)

Добавлено через 40 минут
Но мерцает сильнее, т.к. я посимвольно пишу.
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
#include <conio.h>
#include <list>
 
#define SIZE1 21
#define SIZE2 60
 
typedef std::pair<int,int> Link;
typedef std::list<Link> Snake;
 
Link operator+ ( Link lhs, const Link & rhs )
{
    lhs.first += rhs.first;
    lhs.second += rhs.second;
    return lhs;
}
 
bool SnakeHere(const Snake & s, int w, int h )
{
    for( Snake::const_iterator ii = s.begin(); ii != s.end(); ++ii )
    {
        if( ii->first == w && ii->second == h )
            return true;
    }
 
    return false;
}
 
void Play()
{
    Snake snake;
    const int linkCount = 10;
 
    for( int i = 0; i < linkCount; ++i )
        snake.push_back( Link(i+1,1) );
 
    Link dir;
 
    while( true )
    {
        system("cls");
        
        for( int h = 0; h < SIZE1; ++h )
        {
            for( int w =0; w < SIZE2; ++w )
            {
                const bool edge = h == 0 || h == (SIZE1-1) || w == 0 || w == (SIZE2-1);
                if( edge )
                    putch( 'W' );
                else  if( SnakeHere( snake, w, h ) )
                    putch( 'O' );
                else
                    putch( ' ' );
            }
            putch( '\n' );
        }
 
        switch( _getch() )
        {
        case 'q':
            return;
        case 'w':
            dir = Link(0,-1);
            break;
        case 'a':
            dir = Link(-1,0);
            break;
        case 'd':
            dir = Link(1,0);
            break;
        case 's':
            dir = Link(0,1);
            break;
        };
 
        snake.pop_front();
        snake.push_back( snake.back() + dir );
    };
 
}
 
int main() {
    Play();
    return 0;
}
Добавлено через 38 секунд
И никаких проверок естессно не делаю.)
0
Fafle
34 / 34 / 4
Регистрация: 19.03.2010
Сообщений: 136
02.04.2011, 17:36  [ТС] #29
Ну по другому мне тоже будет интересно посмотреть, н оне забывай о уровне знаний, ничего сложнее строк
Заодно может решишь проблему с leng

Добавлено через 2 минуты
Ну здесь много мне неизвестного
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2011, 17:39 #30
Стандартные контейнеры не знаешь?
Я просто тебе сделал задел для змейки переменной длины. Там чуток только код дополнить.
list и pair можешь заменить на свою реализацию списка и любой структуры, хранящей координаты.
В этой реализации тебе будет проще проверять самопоедание змейки и столкновение с границами.
Я этого писать не стал, чтоб не захламлять код.
1
02.04.2011, 17:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2011, 17:39
Привет! Вот еще темы с ответами:

Не могу разобраться с кодом - C++
Суть состоит в том чтобы составить программу, выводящую на экран расписание экзаменов и зачетов (предмет,вид...

не могу разобраться рекурсией) - C++
Напишите программу, которая запрашивает число и показатель степени. Напишите рекурсивную функцию, которая возводит число в степень путем...

Не могу разобраться с ошибкой - C++
Программа ханойские башни, нужно что бы выводил графически. Но пишет вот такую ошибку Ошибка 1 error C1083: Не удается открыть файл...

Не могу разобраться с программой в С++ - C++
Написала программку на С++, он ее запускает и как я понимаю выполняет, но вот результатов я не вижу( И вот что мне выдает сама программа: ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.