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

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

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

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

02.04.2011, 13:32. Просмотров 2031. Ответов 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
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
02.04.2011, 14:23 #2
Разбирать такой код - дело неблагодарное. Без обид, конечно, но строки с 14 по 33 - яркий пример индусского (быдло-, китайского - нужное подчеркнуть) кода, который можно было бы с успехом заменить одним циклом.
Еще настораживает другое - что выделяемая в функции print память нигде не высвобождается.
Сформулируй, пожалуйта, четко задание, т.е. полностью опиши, что должна делать программа, какие у нее входные данные, какие действия ожидаются от пользователя (приведенное выше описание мне ни о чем конкретно не говорит) - возможно, все это можно переписать лучшим образом.
1
Fafle
34 / 34 / 4
Регистрация: 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
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
02.04.2011, 14:49 #4
Я бы реализовал саму "змею" в виде односвязного списка-очереди. Элементы очереди - это координаты сегментов змеи. "Голова" змеи будет являться хвостом очереди, и наоборот. Визуализация всего этого - вывод на экран сегментов по координатам, которые храняться в очереди. Тогда перемещение будет очень легко реализовать: ставим в хвост очереди координату нового положения "головы" змеи и удаляем из головы очереди один элемент. После чего выводим нашу змею на экран. Аналогично реализуется и рост змеи.
0
Fafle
34 / 34 / 4
Регистрация: 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
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 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
Fafle
34 / 34 / 4
Регистрация: 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
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2011, 15:12 #8
Строка 43 и аналогичные приводят к утечке памяти. Указатель в str[0] перезаписывается пез освобождения памяти.
А код мутный, да. Ничё нипанятна ваще.

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


Не катит, как реализуется освобождение памяти?
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 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
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2011, 15:21 #11
Цитата Сообщение от Fafle Посмотреть сообщение
Не катит, как реализуется освобождение памяти?
потому что массивы удаляются не так, а delete [] str[0];
0
Fafle
34 / 34 / 4
Регистрация: 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
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2011, 15:33 #13
Цитата Сообщение от Fafle Посмотреть сообщение
консолька ругается
Ещё веселее будет, когда ты начнёшь удалять за собой. У тебя в массиве str перемешаны указатели на динамические и статически размещённые строки. Кривая логика в программе. Очень кривая.
Придётся delete вызывать для каждого ar(1-20) по отдельности.
Очень мутно всё.
0
Fafle
34 / 34 / 4
Регистрация: 19.03.2010
Сообщений: 136
02.04.2011, 15:34  [ТС] #14
Задание не из курса, и не из простых, она скорее на логику чем на синтаксис, логика верна, а вот синтаксис скорее всего подачал, но я к сожалению ошибки не вижу
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2011, 15:35 #15
Я уж не говорю о том, что функция print ничего не печатает, а модифицирует матрицу.
0
02.04.2011, 15:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2011, 15:35
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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