5 / 5 / 3
Регистрация: 28.02.2010
Сообщений: 166
1

Задать размер двумерного массива

20.10.2012, 13:37. Показов 28507. Ответов 18
Метки нет (Все метки)

по форуму искал, но находил только для одномерных либо, немного не понятные.
Можете написать и объяснить как ввести с клавиатуры размер двухмерного массива и создать этот массив?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.10.2012, 13:37
Ответы с готовыми решениями:

Размер двумерного массива
Есть функция void edit(char *file, char **text){ FILE *f; if ((f=fopen(file, "ab")) ==...

Задать размер массива
Доброго времени суток. Делаю программу, которая шифрует перестановкой с ключем. Суть алгоритма:...

Задать размер массива другой переменной
Есть такой код: #include <vector> using namespace std; int main() { vector<float> vec; ...

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

18
5489 / 4884 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.10.2012, 13:54 2
Как-то так:
C++
1
2
3
4
5
6
int n, m;
cin >> n >> m;
 
int **pp = new int*[n];
for (int i = 0; i < n; i++)
     pp[i] = new int[m];
2
погромист
414 / 250 / 30
Регистрация: 27.08.2012
Сообщений: 550
20.10.2012, 18:20 3
Можно так:
C++
1
2
3
4
int x,y;
cin >> x;
cin >> y;
int array[x][y];
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.10.2012, 18:28 4
coloc, нельзя так. Размер массива должен быть константой(или выражением), определяемой на этапе компиляции.
0
погромист
414 / 250 / 30
Регистрация: 27.08.2012
Сообщений: 550
20.10.2012, 18:48 5
Странно, у меня компилятор ни на что не ругается при таком методе... И в настройках компилятора прописано виводить все уведомления об ошибках. (IDE Dev C++)
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.10.2012, 18:52 6
coloc, VLA - расширение компилятора. Стандарт С++ определяет следующее объявление массива
Код
D1 [constant-expression] attribute-specifier-seq
И все.
0
0 / 0 / 0
Регистрация: 20.10.2012
Сообщений: 9
20.10.2012, 22:01 7
введи просто большую константу масива.
например
C++
1
2
3
4
int a[100][100];
int x,y;
cin >> x;
cin >> y;
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.10.2012, 22:04 8
Евгений 1994, вопрос стоит не "как запихнуть в массив не более 10 000 элеметов", а "как динамически выделить память под массив произвольного размера".
0
go
Эксперт С++
3645 / 1377 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
20.10.2012, 22:12 9
soon, так есть variable length array.

Добавлено через 27 секунд
Цитата Сообщение от maSt Посмотреть сообщение
Можете написать и объяснить как ввести с клавиатуры размер двухмерного массива и создать этот массив?
Используйте std::vector.
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.10.2012, 22:13 10
go, в С99, если мне не изменяет память. В С++ такого нет. По стандарту.
0
0 / 0 / 0
Регистрация: 20.10.2012
Сообщений: 9
20.10.2012, 22:35 11
точно нету.
0
73 / 7 / 0
Регистрация: 08.08.2012
Сообщений: 223
Записей в блоге: 1
20.10.2012, 22:53 12
Значит так, сейчас прозвучит мудрая и очевидная идея.
Можно задавать как простой двумерный массив с определенными значениями размера массива (I = номер столбца, j=номер строки).
Например, так
C++
1
2
3
4
5
6
int n,m;
cin>>n>>m;
int a[n][m];//вместо n,m могут быть числа
for (int i=0; i<n; i++)
{    for(int j=0;j<n;j++)
      cin>>a[i][j]; }//считали двумерный массив
Также, если заранее не известен размер массива, то можно создать, так назывемый двумерный динамический массив, выполняеться это при помощи указателей.
C++
1
2
3
4
5
6
7
8
int **p;
int n,m,i,j;
cin>>n>>m;
p=new int*[n];
for (i=0;i<n;i++){
p[i]=new int [m]; //это все была инициализация массива
for (j=0; j<m; j++)
... //идет заполнение массива
Если что объяснить спрашивай
Помог, нажми спасибо!
5
5 / 5 / 3
Регистрация: 28.02.2010
Сообщений: 166
21.10.2012, 02:46  [ТС] 13
mr_free,
Первый вариант ,кстати, невозможен , n и m должны быть константными значениями.
А второй вариант, при попытке заполнения просто выдает ошибку
Просто попытался каждому значению присвоить сумму номеров строк и столбцов.
То есть tab[0][0] было бы 0 . [0][1] было бы 1 и так далее.
Я просто с указателями раньше вообще не имел дела и не могу понять в чем ошибка.
0
5489 / 4884 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2012, 09:46 14
Во втором посте что-то не так?
0
14 / 14 / 2
Регистрация: 21.10.2012
Сообщений: 140
21.10.2012, 09:54 15
это часть моей домашней проги....
C++ (Qt)
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
#include <iostream> 
#include <time.h>
#include <stdlib.h>
 
using namespace std; 
 
void print(int **arr, int ncol, int nrow) 
{ 
    for(int i = 0; i < nrow; i++)
    {
        for(int j = 0; j < ncol; j++)
            cout << arr[i][j] << " ";
        cout << endl;
    }
}
 
 
int main()
{   
    srand(time(NULL));
    int nrow, ncol, n1 = 0, n2 = 0;
    int i, j;
        
    cout << "Enter amount row: ";
    cin >> nrow;
    cout << endl << "Enter amount column: ";
    cin >> ncol;
        
    // Объявляется переменная типа "указатель на указатель на int"
    // и выделяется память под массив указателей на строки массива
    int **arr = new int*[nrow]; 
    //Цикл выделяет память под каждую строку массива 
    for (i = 0; i < nrow; i++)
    //Каждому элементу массива указателей на строки присваевается адресс начала участка памяти
    arr[i] = new int [ncol];
 
    cout << "Fill in array: " << endl << "1. Auto" << endl << "2. Manual" << endl << "Make your choice: ";
    cin >> n1;
 
        switch(n1)
            {
                case 1:
                    for(int i = 0; i < nrow; i++)
                        for(int j = 0; j < ncol; j++)
                            arr[i][j] = rand()%100;
                    cout << endl << "Generated array: " << endl;
                    print(arr, nrow, ncol);
                    break;
                
                case 2:
                    cout << endl << "Enter elements array: " ;
                        for(int i = 0; i < nrow; i++)
                            for(int j = 0; j < ncol; j++)
                                cin >> arr[i][j];
                    cout << "Your array: " << endl;
                    print(arr, nrow, ncol);
                    break;
                
                default :
                    cout << "Your choice is not correct" << endl;
                    break;
            }
 
    
    
}
можно и автоматом и в ручную заполнить и выбрать размер массива
0
5489 / 4884 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2012, 09:58 16
Продолжу.
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
#include <iostream>
using namespace std;
 
int main()
{
  int n, m;
  cin >> n >> m;
 
  int **pp = new int*[n];
  for (int i = 0; i < n; i++)
       pp[i] = new int[m];
 
  for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            pp[i][j] = i + j;
  
  cout << endl;
  for (int i = 0; i < n; i++)
  {
        for (int j = 0; j < m; j++)
            cout << pp[i][j] << ' ';
        cout << endl;
  }
  
  for (int i = 0; i < n; i++)
        delete pp[i];
    
  delete [] pp;    
  
  cout << endl;
  system("pause");
  return 0;
}
Миниатюры
Задать размер двумерного массива  
2
73 / 7 / 0
Регистрация: 08.08.2012
Сообщений: 223
Записей в блоге: 1
28.10.2012, 19:47 17
Цитата Сообщение от maSt Посмотреть сообщение
mr_free,
Первый вариант ,кстати, невозможен , n и m должны быть константными значениями.
А второй вариант, при попытке заполнения просто выдает ошибку
Просто попытался каждому значению присвоить сумму номеров строк и столбцов.
То есть tab[0][0] было бы 0 . [0][1] было бы 1 и так далее.
Я просто с указателями раньше вообще не имел дела и не могу понять в чем ошибка.
Первый вариант рабочий, просто рефлекторно написал так как можно объявлять двумерные массивы в MinGW, ведь в нем нетребуються указатели.
Так же все GUI компиляторы не требуют объявления указателей. А вот Студия и т.д. требуют!
А со вторым лажанул
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
28.10.2012, 19:56 18
Цитата Сообщение от mr_free Посмотреть сообщение
Первый вариант рабочий, просто рефлекторно написал так как можно объявлять двумерные массивы в MinGW, ведь в нем нетребуються указатели.

Он не возможен, зарубите себе на носу уже. Нельзя так делать по стандарту. То, что это пропускает MinGW, объясняется расширением компилятора. И, да, с чего это там указатели не требуются?
Цитата Сообщение от mr_free Посмотреть сообщение
Так же все GUI компиляторы не требуют объявления указателей. А вот Студия и т.д. требуют!
Компилятор не может быть с гуем, это, как минимум, напрасная трата ресурсов.
0
0 / 0 / 0
Регистрация: 07.02.2019
Сообщений: 55
07.06.2019, 12:02 19
mr_free, а как дальше сделать ввод, у меня программа начинает ломаться(тип закройте программу или на отладку).
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.06.2019, 12:02
Помогаю со студенческими работами здесь

Как задать переменный размер массива
Как задать переменный размер массива?

Задать размер массива в стороннем файле
В файле записано число, допустим 5, нужно считать его и создать массив такого размера ifstream...

Можно ли задать размер строкового массива переменной
Можно ли задать размер строкового массива переменной? Например считаю сколько слов в введенном...

Не получается задать произвольный размер массива в struct
Добрый вечер. Возникла проблема с лабараторной в универе. Не могу задать произвольный размер...


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

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

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