Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.98/47: Рейтинг темы: голосов - 47, средняя оценка - 4.98
1 / 1 / 0
Регистрация: 18.05.2018
Сообщений: 16
1

Создать двумерный динамический массив типа String

19.05.2018, 11:54. Показов 8783. Ответов 29

Мне нужно создать динамический массив типа string с заранее неизвестной размерностью, которая вводится при запуске программы. После чего массив заполняется случайными символами (у меня взяты - и _). Со статическим у меня проблем нет.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.05.2018, 11:54
Ответы с готовыми решениями:

Как создать и заполнить динамический массив строк типа std::string?
Как создать и заполнить динамический массив строк типа string? Если заполнять массивы через...

Как создать динамический массив типа string? Как создать класс такого массива?
Как создать динамический массив типа string? Как создать класс такого массива? =-O Помогите,...

Создать динамический двумерный массив типа int. Ввести таблицу из 5x5 чисел. Полсчитать количество положительн
Создать динамический двумерный массив типа int. Ввести таблицу из 5x5 чисел. Полсчитать количество...

двумерный динамический массив типа char
#include <iostream> #include <iomanip> #include <windows.h> using namespace std; void...

29
nd2
3422 / 2802 / 1252
Регистрация: 29.01.2016
Сообщений: 9,426
19.05.2018, 12:06 2
Цитата Сообщение от Luchshbli Посмотреть сообщение
ужно создать динамический массив типа string
C++
1
2
3
int n;
cin >> n;
string* arr = new string[n];
0
12 / 12 / 13
Регистрация: 18.05.2018
Сообщений: 67
19.05.2018, 13:08 3
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
/*Создание двухмерного динамического массива */
#include <iostream>
#include <string>
#include <ctime>
 
using std::string;
using std::cin;
 
int main(void)
{
 
   int a(0);
   const int b(2);
   string (*p)[b](0);
   
   srand(static_cast<unsigned>(time(0)));
   
   cin >> a;
   
   p = new string[a][b];
   
   for(int i = 0; i < b; i++)
       for(int j = 0; j < b; j++)
          p[i][j] = rand() % 2 ? '-' : '_';
   
  
   delete [] p;
   p = NULL;
   
   return 0;
}
0
1 / 1 / 0
Регистрация: 18.05.2018
Сообщений: 16
19.05.2018, 13:27  [ТС] 4
Прости, но не объяснишь эти строки?:
int a(0);
const int b(2);
string (*p)[b](0);

мне непонятны круглые скобки в данных строках.

Добавлено через 14 минут
Так, я по-моему немного разобрался. Мне нужно задать не только количество строк, но и столбцов.
0
12 / 12 / 13
Регистрация: 18.05.2018
Сообщений: 67
19.05.2018, 15:03 5
Код
C++
1
2
3
int a(0);
const int b(2);
string (*p)[b](0);
Эквивалентен
C++
1
2
3
int a = 0;
const int b = 2;
string (*p)[b] = 0;
Переменная "p" - указатель на двухмерный массив.
Примеры :
C++
1
2
int a[3][5];
int (*p)[5] = a;
C++
1
2
char a[5][3][5];
char (*p)[3][5] = a;
0
1 / 1 / 0
Регистрация: 18.05.2018
Сообщений: 16
19.05.2018, 16:27  [ТС] 6
При попытке создания двумерного динамического массива с успешным запуском программы и вводе числа все ломается и ссылается на следующее
Миниатюры
Создать двумерный динамический массив типа String  
0
12 / 12 / 13
Регистрация: 18.05.2018
Сообщений: 67
19.05.2018, 17:22 7
Код программы покажи.

Добавлено через 6 минут
Я в коде допустил ошибку.
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
/*Создание двухмерного динамического массива */
#include <iostream>
#include <string>
#include <ctime>
 
using std::string;
using std::cin;
 
int main(void)
{
 
   int a(0);
   const int b(2);
   string (*p)[b](0);
   
   srand(static_cast<unsigned>(time(0)));
   
   cin >> a;
   
   p = new string[a][b];
   // Где "b" должно быть "a"
   for(int i = 0; i < b; i++)
       for(int j = 0; j < b; j++)
          p[i][j] = rand() % 2 ? '-' : '_';
   
  
   delete [] p;
   p = NULL;
   
   return 0;
}
Правильно :
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
/*Создание двухмерного динамического массива */
#include <iostream>
#include <string>
#include <ctime>
 
using std::string;
using std::cin;
 
int main(void)
{
 
   int a(0);
   const int b(2);
   string (*p)[b](0);
   
   srand(static_cast<unsigned>(time(0)));
   
   cin >> a;
   
   if(a <= 0)
     a = 1;
 
   p = new string[a][b];
   
   for(int i = 0; i < a; i++)
       for(int j = 0; j < b; j++)
          p[i][j] = rand() % 2 ? '-' : '_';
   
  
   delete [] p;
   p = NULL;
   
   return 0;
}
Добавлено через 10 минут
Кстати.
При динамическом выделении памяти для многомерного массива, только самый левый индекс массива может быть динамическим.
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main(void)
{
   int a(3);
   const int b(3), c(2);
 
   int (*p)[3][2] = new int[a][b][c];
 
   // b, c - только константы.
   // a - динамическое.
 
   delete [] p;
   p = 0;
 
   //Не забываем удалять и обнулять указатель.
   return 0;
}
0
Модератор
Эксперт С++
11484 / 9401 / 5650
Регистрация: 18.12.2011
Сообщений: 25,116
19.05.2018, 17:31 8
Лучший ответ Сообщение было отмечено Luchshbli как решение

Решение

KuolFyI, с чего Вы решили, что только самый левый
C++
1
2
3
4
5
6
string **s;
int n=5; // к-во строк
int m=10; // к-во столбцов
s=new string*[n];
for(int i=0;i<n;i++)
   s[i]=new string[m];
0
298 / 207 / 174
Регистрация: 11.05.2016
Сообщений: 655
19.05.2018, 17:31 9
Цитата Сообщение от KuolFyI Посмотреть сообщение
При динамическом выделении памяти для многомерного массива, только самый левый индекс массива может быть динамическим.
чта?
0
1 / 1 / 0
Регистрация: 18.05.2018
Сообщений: 16
19.05.2018, 18:44  [ТС] 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
#include <iostream>
#include <conio.h>
#include <string>
#include <iomanip>
#include <ctime>
#include <stdlib.h>
using namespace std;
int k = 0;
int px = 0;
int py = 0;
static const char ar[] = { '-', '-', '-', '_' };
string cc = "-";
int render(int *n, string **map);
void cls();
void find(int *n, string **map);
void exit(); // куча объявлений
 
int main()
{
    int n;
    cin >> n;
    string **map = new string*[n]; //создание карты
    for (int i = 0; i < 2; i++)
        map[i] = new string[n];
    for (int i = 0; i<n; i++)
        for (int j = 0; j<n; j++)
            map[i][j] = ar[rand() % (sizeof(ar))];
    int i = 0;
    map[19][19] = '@';
    while (i == 0) {
        render(&n, map);
        cout << "X " << py + 1 << " Y " << px + 1 << endl;
        k = _getch();
        cls(); // очистка консоли после считывания, чтобы карта не дублировалась 
    }
    for (int i = 0; i<n; i++)
        delete[] map[i];
        return 0;
    }
 
int render(int *n, string **map) { //вывод карты
    find(n, map);
    int lu, hl, hr, ld;
    if (px - 10 < 0) lu = px;
    else lu = 10;
    if (py - 10 < 0) hl = py;
    else hl = 10;
    if (px + 10 > *n) ld = *n - px;
    else ld = 10;
    if (py + 10 > *n) hr = *n - py;
    else hr = 10;
    for (int i = px - lu; i<px + ld; i++)
    {
        for (int j = py - hl; j<py + hr; j++)
            cout << setw(2) << map[i][j];
        cout << endl;
    }
    return 0;
}
 
void cls() { //очистка консоли
    system("cls");
}
 
void find(int *n, string **map) { //поиск ключа на карте
    for (int i = 0; i<*n; i++)
        for (int j = 0; j<*n; j++)
            if (map[i][j] == "@")
            {
                px = i;
                py = j;
            }
}
 
 
 
void exit() { exit(0); }
0
Модератор
Эксперт С++
11484 / 9401 / 5650
Регистрация: 18.12.2011
Сообщений: 25,116
19.05.2018, 19:28 11
Luchshbli, А зачем map имеет тип string, если Вы храните в каждой строке только по одному символу?
И еще надо
C++
1
2
3
    for (int i = 0; i<n; i++)
        delete[] map[i];
    delete[] map;
0
1 / 1 / 0
Регистрация: 18.05.2018
Сообщений: 16
19.05.2018, 19:40  [ТС] 12
Как по мне не особо имеет значение char или string.
И еще надо(с)
C++
1
2
3
 for (int i = 0; i<n; i++)
        delete[] map[i];
    delete[] map;
У меня есть:
C++
1
2
for (int i = 0; i<n; i++)
        delete[] map[i];
Зачем там еще один delete[] map? Он ведь и так его полностью удаляет. Разве нет?
0
298 / 207 / 174
Регистрация: 11.05.2016
Сообщений: 655
19.05.2018, 19:52 13
Цитата Сообщение от Luchshbli Посмотреть сообщение
Разве нет?
нет
0
1 / 1 / 0
Регистрация: 18.05.2018
Сообщений: 16
19.05.2018, 19:58  [ТС] 14
Я ориентировался на эту статью http://cppstudio.com/post/432/
0
298 / 207 / 174
Регистрация: 11.05.2016
Сообщений: 655
19.05.2018, 20:06 15
Цитата Сообщение от Luchshbli Посмотреть сообщение
Я ориентировался на эту статью
C++
1
2
3
4
// удаление двумерного динамического массива
    for (int count = 0; count < 2; count++)
        delete []ptrarray[count];
    system("pause");
Это не полное удаление
0
1 / 1 / 0
Регистрация: 18.05.2018
Сообщений: 16
19.05.2018, 20:07  [ТС] 16
Нашел проблему... Зачем-то здесь стояла 2, а не n. Наверное, не углядел при редактировании
C++
1
2
for (int i = 0; i < 2; i++)
        map[i] = new string[n];
0
298 / 207 / 174
Регистрация: 11.05.2016
Сообщений: 655
19.05.2018, 20:08 17
Не буду расписывать из-за алкоголя в крови, но
Цитата Сообщение от zss Посмотреть сообщение
delete[] map;
по-нормальному нужен.
0
12 / 12 / 13
Регистрация: 18.05.2018
Сообщений: 67
19.05.2018, 20:24 18
Я прочитал ваш код и понял его.
Я уже видел такие вещи, но это не многомерный массив.
Поясню.
По определению c++ многомерный массив - это массив, у которого более одного индекса(Айвор Хортон - Visual C++ 2010. Полный курс).
В этом коде создаётся указатель на массив указателей, и этот массив указателей заполняется указателями
на какие-то элементы(в этом примере указателями на массив string)
Здесь одномерный массив, хронящий указатели на массивы.
Код B :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
using std::cout;
using std::endl;
 
class A
{
public:
    ~A(void)
    {
        cout << "~A" << endl;
    }
};
 
int main(void)
{
   A (*p)[3] = new A[2][3];
 
   delete [] p;
   p = NULL;
 
   return 0;
}
Код 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
#include <iostream>
 
using std::cout;
using std::endl;
 
class A
{
public:
    ~A(void)
    {
        cout << "~A" << endl;
    }
};
 
int main(void)
{
   A **p;
 
   p = 0;
   p = new A*[2];
 
   for(int i = 0; i < 2; i++)
       p[i] = new A[3];
 
   for(int i = 0; i < 2; i++)
       delete [] p[i];
 
   delete [] p;
   p = 0;
 
   return 0;
}
Сравните код B и С.
Первый код двухмерный массив, а второй массив указателей на массивы.
Для доступа к элементам можно использовать p[][];
Если конечные элементы массивов заполнены одинакова, то результат p[][] будут одинаковы в двух кодах,
но в коде C имитация многомерного массива, если смотреть со стороны p[][](Можно использовать в коде B), а использовать p[][] можно по правилам языка в двух кодах.
Если хотите посмотрите в Айвор Хортон - Visual C++ 2010. Полный курс. Тема многомерные массивы и их динамическое создание.
0
298 / 207 / 174
Регистрация: 11.05.2016
Сообщений: 655
19.05.2018, 21:18 19
Цитата Сообщение от KuolFyI Посмотреть сообщение
Я прочитал ваш код и понял его.
Я уже видел такие вещи, но это не многомерный массив.
чта? Продемонстрируйте многомерный массив тут.
Цитата Сообщение от KuolFyI Посмотреть сообщение
В этом коде создаётся указатель на массив указателей
и, как по-Вашему, зачем это делается?
Это ли не двумерный массив?

Добавлено через 16 минут
Цитата Сообщение от KuolFyI Посмотреть сообщение
это массив, у которого более одного индекса
смотрите какой трехмерный массив получается
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
    int  ***f = new int**[3];
    for(int i=0; i<3; i++)
    {
        f[i] = new int*[3];
        for(int j=0; j<3; j++)
        {
            f[i][j] = new int[3];
            for(int k = 0; k<3; k++)
            {
                f[i][j][k] = rand()%10;
            }
        }
 
    }
 
    for(int i=0; i<3; i++)
    {
        for(int j=0; j<3; j++)
        {
            for(int k=0; k<3; k++)
            {
                std::cout << f[i][j][k] <<".";
            }
            std::cout << " ";
        }
        std::cout << "\n";
    }
к нему даже по индексам обращаться можно, коих более чем один!
0
1 / 1 / 0
Регистрация: 18.05.2018
Сообщений: 16
19.05.2018, 21:20  [ТС] 20
Я разобрался. Здесь я, похоже, пропустил при редактировании двойку и не заменил ее на n:
C++
1
2
 for (int i = 0; i < 2; i++)
        map[i] = new string[n];
0
19.05.2018, 21:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.05.2018, 21:20

Двумерный динамический массив типа char
Как создать двумерный динамический массив типа char, в который будут записываться слова разной...

Как создать динамический двумерный массив
Можно ли создать на С++ динамический двухмерный масив? Как? int z , x ; cin &gt;&gt; z ; cin &gt;&gt; x ;...

Создать двумерный динамический массив char
Нужно сделать динамический двумерный массив типа char , Надо чтобы было только через char вот...

Возможно ли создать двумерный динамический массив?
существует ли возможность создать двумерный динамический массив, к примеру 2х5 ?


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

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

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