Форум программистов, компьютерный форум CyberForum.ru

Массив: Создать кристаллическую решетку произвольной величины - C++

Восстановить пароль Регистрация
 
Skrypnyk
1 / 1 / 0
Регистрация: 15.01.2013
Сообщений: 40
14.04.2013, 22:45     Массив: Создать кристаллическую решетку произвольной величины #1
Здравствуйте! Пытаюсь создать кристаллическую решетку произвольной величины. Для этого использую трехмерный динамический массив (подскажите что-нибудь более подходящее, если такое есть), каждый элемент которого должен содержать 3 координаты атома (х, у, z). Создаю класс Atom, который содержит три переменные (х, у, z). Определяю производный от класса тип данных и создаю массив такого типа. Когда запускаю программу для проверки, получаю следующий результат:
Atom1: 000 001 002 010 011 012 - Три цифры обозначают соответственно x, y, z.
Хотя ожидаемый результат - все возможные комбинации 0, 1 и 2.
Подскажите, пожалуйста, что не так. Заранее благодарен!
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
#include <iostream>
 
using namespace std;
 
class Atom
{
    public:
 
    float x, y, z;
};
 
typedef class Atom AtomType;
 
int main () // beginning of the DoBCC function
{
    float a=1; // lattice parameter
    int Lx=2, Ly=2, Lz=2; // number of translated lattices along each axis
 
    AtomType ***Atom1; // 3-dimensional dynamic array for atom type 1
 
    Atom1 = new AtomType** [Lx];
 
    for (int i=0; i<Lx; i=i+a) // start of for loop
    {
        Atom1[i] = new AtomType* [Ly];
    } // end of for loop
    for (int i=0; i<Lx; i=i+a) // start of the outer for loop
    {
        for (int j=0; j<Ly; j=j+a)
        {
            Atom1[i][j] = new AtomType [Lz];
        }
    } // end of the outer for loop
cout << "Atom1:" << endl;
    for (int i=0; i<=Lx; i++) // start of the 3 nested for loops to populate atoms of type 1
    {
        for (int j=0; j<=Ly; j++)
        {
            for (int k=0; k<=Lz; k++)
            {
                Atom1[i][j][k].x = i*a;
                Atom1[i][j][k].y = j*a;
                Atom1[i][j][k].z = k*a;
 
                cout << Atom1[i][j][k].x << "   " << Atom1[i][j][k].y << "   " << Atom1[i][j][k].z << endl;
            }
        }
    } // end of the 3 nested for loops to populate atoms of type 1
 
 
    for (int i=0; i<=Lx; i++) // start deleting array Atom1
    {
        for (int j=0; j<=Ly; j++)
        {
            delete[] Atom1[i][j];
        }
    }
    for (int i=0; i<=Lx; i++)
    {
        delete[] Atom1[i];
    }
    delete[] Atom1; // end of deleting array Atom1
    
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2013, 22:45     Массив: Создать кристаллическую решетку произвольной величины
Посмотрите здесь:

C++ Создать программу вычисления указанной величины. Результат проверить при заданных исходных значениях.
Объявить массив не более чем 15 элементов. Вывести обратные по модулю величины и проверить изменились ли адреса элементов этих двух массивов. C++
Массивы: создать цепочку символов «а» произвольной длины, после которой следует символ «b» C++
C++ Массив произвольной размерности и работа с ним
C++ Задано массив строк произвольной длины. Отформатировать данный массив по ширине поля.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ласковая Киса
 Аватар для Ласковая Киса
82 / 8 / 1
Регистрация: 11.01.2013
Сообщений: 55
14.04.2013, 22:57     Массив: Создать кристаллическую решетку произвольной величины #2
Если Вы хотите всевозможные комбинации тогда я непонимаю смыслы этих строк:
C++
1
2
3
                Atom1[i][j][k].x = i*a;
                Atom1[i][j][k].y = j*a;
                Atom1[i][j][k].z = k*a;
Уж скорее
C++
1
2
3
                Atom1[i][j][k].x = rand()%3;
                Atom1[i][j][k].y = rand()%3;
                Atom1[i][j][k].z = rand()%3;
Ну и srand() непомешает.
Skrypnyk
1 / 1 / 0
Регистрация: 15.01.2013
Сообщений: 40
14.04.2013, 23:25  [ТС]     Массив: Создать кристаллическую решетку произвольной величины #3
Нет, произвольные числа не подходят.
"а" - это параметр кристаллической решетки, будет задаваться пользователем. Я принял его равным 1 для простоты.
В моей постановке координаты будут варьироваться от (0;0;0) до (2;2;2). Причем, повторов не должно быть. Для этого и нужны три вложенных for цикла.

Мой вопрос был "почему выводятся не все значения?", как ожидалось бы от трех вложенных циклов. Программа обрывается на 012, а должна заканчиваться на 222.
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
14.04.2013, 23:54     Массив: Создать кристаллическую решетку произвольной величины #4
Вот что получилось у меня:
Bash
1
2
3
4
5
6
7
8
Atom1:
0   0   0
0   0   1
0   0   2
0   1   0
0   1   1
0   1   2
Segmentation fault (core dumped)
Segmentation fault - где-то вылезли за память.
Только я одного не понимаю... У Вас есть класс Atom с полями x, y, z: integer.
У Вас есть трёхмерный массив Atom'ов.
Вопрос, зачем Вам класс или трёхмерный монолитный массив?.. Фактически, у Вас происходит дублирование x, y, z в i, j, k - индексах массива.

Не по теме:

P.S.
За комментарии спасибо, впрочем не стоит писать по комментарию на каждое открытие/закрытие блока. Небольшие (строчек < 10-20) прекрасно оформляются отступами. Просто комментарии часто акцентируют своё внимание.

Skrypnyk
1 / 1 / 0
Регистрация: 15.01.2013
Сообщений: 40
15.04.2013, 00:06  [ТС]     Массив: Создать кристаллическую решетку произвольной величины #5
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Segmentation fault - где-то вылезли за память.
Как это исправить?

Цитата Сообщение от AnyOne697 Посмотреть сообщение
зачем Вам класс или трёхмерный монолитный массив?
В последствии будут атомы других типов, у них будет свой алгоритм заполнения (вместо i*a). И к тому, я хочу использовать позже координаты всех атомов, поэтому мне надо много объектов класса Atom. Для этого мне служит массив. Если есть идеи по более эффективной реализации, буду признателен.
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
15.04.2013, 02:05     Массив: Создать кристаллическую решетку произвольной величины #6
Цитата Сообщение от Skrypnyk Посмотреть сообщение
Если есть идеи по более эффективной реализации, буду признателен.
Может не стоит рекомендовать везде и всюду std::map, но всё же.
Ключ - координаты. Либо реализуем класс, либо перемножаем как-то так:
C++
1
2
3
4
5
6
7
8
9
10
... //includes
... //usings
 
#define maxCoord 997 //it's important to take prime number
 
int main ( ... ) {
    ...
    map[ x + y*maxCoord + z*maxCoord*maxCoord ] = func ( x, y, z );
    ....
}
Как-то так...
Skrypnyk
1 / 1 / 0
Регистрация: 15.01.2013
Сообщений: 40
15.04.2013, 10:06  [ТС]     Массив: Создать кристаллическую решетку произвольной величины #7
Ошибку нашел человек на другом форуме:

for (int i=0; i<=Lx; i++) // start of the 3 nested for loops to populate atoms of type 1
{
for (int j=0; j<=Ly; j++)
{
for (int k=0; k<=Lz; k++)
Нельзя превышать размеры массива. Всем спасибо за интерес.
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
15.04.2013, 11:21     Массив: Создать кристаллическую решетку произвольной величины #8
Цитата Сообщение от Skrypnyk Посмотреть сообщение
Нельзя превышать размеры массива. Всем спасибо за интерес.
Пожалуйста. Ночью особо такие моменты не заметны, сейчас только заметил, иду сюда - а здесь уже решено.
Зато заметна не самая лучшая архитектура.
Плохо как минимум то, что приходится в трёх циклах инициализировать трёхмерный массив - такое лучше хотя заинкапсулировать в конструктор.
Более того, вот это:
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
    for (int i=0; i<Lx; i=i+a) // start of for loop
    {
        Atom1[i] = new AtomType* [Ly];
    } // end of for loop
    for (int i=0; i<Lx; i=i+a) // start of the outer for loop
    {
        for (int j=0; j<Ly; j=j+a)
        {
            Atom1[i][j] = new AtomType [Lz];
        }
    } // end of the outer for loop
cout << "Atom1:" << endl;
    for (int i=0; i<=Lx; i++) // start of the 3 nested for loops to populate atoms of type 1
    {
        for (int j=0; j<=Ly; j++)
        {
            for (int k=0; k<=Lz; k++)
            {
                Atom1[i][j][k].x = i*a;
                Atom1[i][j][k].y = j*a;
                Atom1[i][j][k].z = k*a;
 
                cout << Atom1[i][j][k].x << "   " << Atom1[i][j][k].y << "   " << Atom1[i][j][k].z << endl;
            }
        }
    } // end of the 3 nested for loops to populate atoms of type 1


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    for (int i = 0; i < Lx; i = i+a) // start of the outer for loop
    {
        Atom1[i] = new AtomType* [Ly];
        for (int j = 0; j < Ly; j = j+a)
        {
            Atom1[i][j] = new AtomType [Lz];
            for (int k = 0; k < Lz; k++)
            {
                Atom1[i][j][k].x = i*a;
                Atom1[i][j][k].y = j*a;
                Atom1[i][j][k].z = k*a;
 
                cout << Atom1[i][j][k].x << "   " << Atom1[i][j][k].y << "   " << Atom1[i][j][k].z << endl;
            }
        }
    }
Зачем три цикла подряд? И это в такой небольшой программке. Мне кажется, если будет в том же духе, будет очень, очень сложно...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2013, 12:07     Массив: Создать кристаллическую решетку произвольной величины
Еще ссылки по теме:

Создать программу вычисления указанной величины C++
C++ Создать функцию, подсчитывающую по заданным сторонам треугольника величины его углов
C++ Помогите найти ошибку: Создать строку символов произвольной длины, заданную диапазоном

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

Или воспользуйтесь поиском по форуму:
Skrypnyk
1 / 1 / 0
Регистрация: 15.01.2013
Сообщений: 40
15.04.2013, 12:07  [ТС]     Массив: Создать кристаллическую решетку произвольной величины #9
Спасибо, дельное замечание. Я еще на начальном этапе изучения, поэтому не всегда получается оптимально решить задачу.
Yandex
Объявления
15.04.2013, 12:07     Массив: Создать кристаллическую решетку произвольной величины
Ответ Создать тему
Опции темы

Текущее время: 14:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru