Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/14: Рейтинг темы: голосов - 14, средняя оценка - 4.86
34 / 34 / 9
Регистрация: 19.03.2010
Сообщений: 136
1

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

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

Author24 — интернет-сервис помощи студентам
Есть код:
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.04.2011, 13:32
Ответы с готовыми решениями:

Не могу разобраться с отработкой рекурсивной функции
Доброго времени суток. Имеется функция находящая в первом массиве количество повторения второго...

Организация циклов, не могу разобраться
Используя операторы циклов, организовать необходимый поиск и вычисления. Тип результата...

Задали работу, не могу разобраться. Используется делфи 10, не могу разобраться, как это сделать
В одномерном массиве, состоящем из n вещественных элементов, вычислить: минимальный элемент массива...

Не могу разобраться разобраться с кодом меню
Добрый день. Я понимаю, что тут все, наверное, элементарно. Но я только начала изучение js и пока...

49
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
02.04.2011, 14:23 2
Разбирать такой код - дело неблагодарное. Без обид, конечно, но строки с 14 по 33 - яркий пример индусского (быдло-, китайского - нужное подчеркнуть) кода, который можно было бы с успехом заменить одним циклом.
Еще настораживает другое - что выделяемая в функции print память нигде не высвобождается.
Сформулируй, пожалуйта, четко задание, т.е. полностью опиши, что должна делать программа, какие у нее входные данные, какие действия ожидаются от пользователя (приведенное выше описание мне ни о чем конкретно не говорит) - возможно, все это можно переписать лучшим образом.
1
34 / 34 / 9
Регистрация: 19.03.2010
Сообщений: 136
02.04.2011, 14:31  [ТС] 3
Цитата Сообщение от Nameless One Посмотреть сообщение
Разбирать такой код - дело неблагодарное. Без обид, конечно, но строки с 14 по 33 - яркий пример индусского (быдло-, китайского - нужное подчеркнуть) кода, который можно было бы с успехом заменить одним циклом.
Еще настораживает другое - что выделяемая в функции print память нигде не высвобождается.
Сформулируй, пожалуйта, четко задание, т.е. полностью опиши, что должна делать программа, какие у нее входные данные, какие действия ожидаются от пользователя (приведенное выше описание мне ни о чем конкретно не говорит) - возможно, все это можно переписать лучшим образом.
Был бы очень рад увидеть конструкцию которой можно заменить эти строки, самому мозолит глаза, но как заменить вариантов не вижу.
А суть задания в реализовании в консоли игры "Змейка"
С помощью
C++
1
2
3
  for (int v = leng+2; v > 0; v--)
            str[v] = str[v - 1];
        *str[leng+2] = ' ';
и
C++
1
str[0] = &ar[i][j];
надеюсь реализовать окончание змеи, которое по длине должно соответствовать leng.
Принципиально реализовать найпростейшими методами через строки.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
02.04.2011, 14:49 4
Я бы реализовал саму "змею" в виде односвязного списка-очереди. Элементы очереди - это координаты сегментов змеи. "Голова" змеи будет являться хвостом очереди, и наоборот. Визуализация всего этого - вывод на экран сегментов по координатам, которые храняться в очереди. Тогда перемещение будет очень легко реализовать: ставим в хвост очереди координату нового положения "головы" змеи и удаляем из головы очереди один элемент. После чего выводим нашу змею на экран. Аналогично реализуется и рост змеи.
0
34 / 34 / 9
Регистрация: 19.03.2010
Сообщений: 136
02.04.2011, 14:55  [ТС] 5
Цитата Сообщение от Nameless One Посмотреть сообщение
Я бы реализовал саму "змею" в виде односвязного списка-очереди. Элементы очереди - это координаты сегментов змеи. "Голова" змеи будет являться хвостом очереди, и наоборот. Визуализация всего этого - вывод на экран сегментов по координатам, которые храняться в очереди. Тогда перемещение будет очень легко реализовать: ставим в хвост очереди координату нового положения "головы" змеи и удаляем из головы очереди один элемент. После чего выводим нашу змею на экран. Аналогично реализуется и рост змеи.
Мы только строки проходим, и уровень решения должен быть соответственным
единственное что в моем решении не корректно это отработка связки
C++
1
2
3
 for (int v = leng+2; v > 0; v--)
            str[v] = str[v - 1];
        *str[leng+2] = ' ';
И не мог бы подсказать как реализовать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  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};
через цикл?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
02.04.2011, 15:03 6
C++
1
2
3
char *str[20];
for(i = 0; i < 20; ++i)
    str[i] = new char[100];
Ну и не забыть, естественно, удалить память, когда надобность в ней пропадет.
1
34 / 34 / 9
Регистрация: 19.03.2010
Сообщений: 136
02.04.2011, 15:12  [ТС] 7
блин, не знаю чего меня лимануло на такие перлы
Ну вот упрощенный вариант, может подскажешь с реализацией длины в чем трабл?
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
#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 *str[20];
    for (int m = 0;m < 20; 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;
           }
 
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);
}
Уже делал функцию с таким же алгоритмом, там отработка верна, не могу понять в чем трабл.
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2011, 15:12 8
Строка 43 и аналогичные приводят к утечке памяти. Указатель в str[0] перезаписывается пез освобождения памяти.
А код мутный, да. Ничё нипанятна ваще.

Цитата Сообщение от Fafle Посмотреть сообщение
через цикл?
Именно.
0
34 / 34 / 9
Регистрация: 19.03.2010
Сообщений: 136
02.04.2011, 15:14  [ТС] 9
Цитата Сообщение от Deviaphan Посмотреть сообщение
А код мутный, да. Ничё нипанятна ваще.
С данным уровнем знаний не вижу другой реализации
Цитата Сообщение от Deviaphan Посмотреть сообщение
Строка 43 и аналогичные приводят к утечке памяти. Указатель в str[0] перезаписывается пез освобождения памяти.
стоит перед ее применением делать
C++
1
delete str[0];
?


Не катит, как реализуется освобождение памяти?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
02.04.2011, 15:16 10
Fafle, чтобы избежать утечек памяти, надо перед выходом из функции вставить код высвобождения памяти:
C++
1
2
for(i = 0; i < 20; ++i)
    delete[] str[i];
В твоем коде действительно сложно найти ошибку на глаз. Попробуй пройтись по программе с отладчиком, вставь отладочную печать - часто эти меры позволяют найти ошибку.
1
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2011, 15:21 11
Цитата Сообщение от Fafle Посмотреть сообщение
Не катит, как реализуется освобождение памяти?
потому что массивы удаляются не так, а delete [] str[0];
0
34 / 34 / 9
Регистрация: 19.03.2010
Сообщений: 136
02.04.2011, 15:28  [ТС] 12
Ну выход я пока еще не реализовывал, он будет при достижении переменной leng значения 100, и я обязательно учту твой совет.
К сожалению отладчик мне толком ничего не дал, проходил и не раз, на бумаге логика верна да и на функции с подобным алгоритмом тоже, 3 дня ищу ошибку, вполне возможно я что то не учел из мелких подробностей.

Добавлено через 2 минуты
Цитата Сообщение от Deviaphan Посмотреть сообщение
потому что массивы удаляются не так, а delete [] str[0];
консолька ругается при выполнении, что то там про memmoy map

К тому же *str[0] вроде как указатель на другую область памяти и мы в дальнейшем будем использовать *str[0];
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2011, 15:33 13
Цитата Сообщение от Fafle Посмотреть сообщение
консолька ругается
Ещё веселее будет, когда ты начнёшь удалять за собой. У тебя в массиве str перемешаны указатели на динамические и статически размещённые строки. Кривая логика в программе. Очень кривая.
Придётся delete вызывать для каждого ar(1-20) по отдельности.
Очень мутно всё.
0
34 / 34 / 9
Регистрация: 19.03.2010
Сообщений: 136
02.04.2011, 15:34  [ТС] 14
Задание не из курса, и не из простых, она скорее на логику чем на синтаксис, логика верна, а вот синтаксис скорее всего подачал, но я к сожалению ошибки не вижу
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2011, 15:35 15
Я уж не говорю о том, что функция print ничего не печатает, а модифицирует матрицу.
0
34 / 34 / 9
Регистрация: 19.03.2010
Сообщений: 136
02.04.2011, 15:39  [ТС] 16
Название мне кажется не принципиально, а вот по поводу выделений памяти можно по подробней?
Выделения я даже и не учитывал, ведь чем может один байт навредить
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2011, 15:42 17
Цитата Сообщение от Fafle Посмотреть сообщение
по поводу выделений памяти можно по подробней?
str[0] = &ar[][] - присваивание адреса статической строки в указатель, для которого будет вызван delete (если ты решишь удалять за собой).
И выделяешь ты не один байт, а 20 раз по 100 байт.)
В данном случае не критично, но нужно быть культурным программистом и убирать за собой. Чтобы не выработалась дурная привычка бросать всё как есть.
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2011, 15:47 18
Цитата Сообщение от <jnf Посмотреть сообщение
привет

Не по теме:

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

1
34 / 34 / 9
Регистрация: 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
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2011, 16:04 20
Мало того, что код непонятный, он ещё и не весь. Судя по тому куску, что видно, от str вообще никакого толку, используется только нулевой, остальные ни на что не влияют.
В общем ничё не понятно.
Попробуй обнулить все строки сразу после выделения.
Что за указатель с концом строки я не понял.
Как выйти из while тоже не понял.

Добавлено через 1 минуту
Так это игра "ЗМейка"?
ОМГ
Я бы не догадался, пока не запустил.)))
0
02.04.2011, 16:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.04.2011, 16:04
Помогаю со студенческими работами здесь

Редирект с отработкой кода
У меня на странице выполняется код, если переменные существуют - выполняется вывод данных, если не...

Проблемма с отработкой ShellExecute
Привет всем. Есть такая проблемма. Я выбираю при помощи OpenDialog файл. Потом по ходу программы,...

Приветствую, не могу разобраться с кодом программы и не могу сделать .obj файл
.model tiny; нужно будет получить исполняемый файл формата СОМ .code org 100h start: mov ax,...

Не могу написать комментарии для функции поиска, не могу разобраться...
void __fastcall TForm1::FindDialog1Find(TObject *Sender) { int found, start, end; //...


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

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