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

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

Войти
Регистрация
Восстановить пароль
 
Skrypnyk
1 / 1 / 0
Регистрация: 15.01.2013
Сообщений: 40
#1

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

14.04.2013, 22:45. Просмотров 518. Ответов 8
Метки нет (Все метки)

Здравствуйте! Пытаюсь создать кристаллическую решетку произвольной величины. Для этого использую трехмерный динамический массив (подскажите что-нибудь более подходящее, если такое есть), каждый элемент которого должен содержать 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2013, 22:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Массив: Создать кристаллическую решетку произвольной величины (C++):

Задано массив строк произвольной длины. Отформатировать данный массив по ширине поля. - C++
Задано массив строк произвольной длины. Отформатировать данный массив по ширине поля.

Создать класс арифметика произвольной разрядности - C++
Необходимо создать класс в С++. Реализовать в нем сложение,вычитание,умножение,деление и деление по модулю для целых,дробных и...

Массив произвольной размерности и работа с ним - C++
Доброго времени суток. Появилась интересная задача: создать функцию для создания массива, размерность которого укажут в ходе программы(то...

Создать программу вычисления указанной величины - C++
В C++ начал работать совсем недавно,поэтому не ругайте) Написал код для вычисления выражения при заданных исходных данных, но выдает...

Создать программу вычисления указанной величины - C++
Создать программу вычисления указанной величины. Результат проверить при заданных исходных значениях, приведённых на картинке. Заранее...

Массивы: создать цепочку символов «а» произвольной длины, после которой следует символ «b» - C++
Всем привет! Помогите пожалуйста сделать программу с комментариями! Цепочка символов «а» произвольной длины, после которой...

8
Ласковая Киса
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() непомешает.
0
Skrypnyk
1 / 1 / 0
Регистрация: 15.01.2013
Сообщений: 40
14.04.2013, 23:25  [ТС] #3
Нет, произвольные числа не подходят.
"а" - это параметр кристаллической решетки, будет задаваться пользователем. Я принял его равным 1 для простоты.
В моей постановке координаты будут варьироваться от (0;0;0) до (2;2;2). Причем, повторов не должно быть. Для этого и нужны три вложенных for цикла.

Мой вопрос был "почему выводятся не все значения?", как ожидалось бы от трех вложенных циклов. Программа обрывается на 012, а должна заканчиваться на 222.
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
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) прекрасно оформляются отступами. Просто комментарии часто акцентируют своё внимание.

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

Цитата Сообщение от AnyOne697 Посмотреть сообщение
зачем Вам класс или трёхмерный монолитный массив?
В последствии будут атомы других типов, у них будет свой алгоритм заполнения (вместо i*a). И к тому, я хочу использовать позже координаты всех атомов, поэтому мне надо много объектов класса Atom. Для этого мне служит массив. Если есть идеи по более эффективной реализации, буду признателен.
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
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 );
    ....
}
Как-то так...
0
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++)
Нельзя превышать размеры массива. Всем спасибо за интерес.
1
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
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;
            }
        }
    }
Зачем три цикла подряд? И это в такой небольшой программке. Мне кажется, если будет в том же духе, будет очень, очень сложно...
0
Skrypnyk
1 / 1 / 0
Регистрация: 15.01.2013
Сообщений: 40
15.04.2013, 12:07  [ТС] #9
Спасибо, дельное замечание. Я еще на начальном этапе изучения, поэтому не всегда получается оптимально решить задачу.
0
15.04.2013, 12:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2013, 12:07
Привет! Вот еще темы с ответами:

Помогите найти ошибку: Создать строку символов произвольной длины, заданную диапазоном - C++
/*Задание: Создать строку символов произвольной длины. Ввести с клавиатуры начало и конец диапазона в строке. Записать строку без...

Создать функцию, подсчитывающую по заданным сторонам треугольника величины его углов - C++
Привет, помогите составить программу. Создать функцию, подсчитывающую по заданным сторонам треугольника величины его углов. Выведите...

Создать программу вычисления указанной величины; результат проверить при заданных исходных значениях - C++
{ссылка удалена модератором} можете решить пожалуйста

Создать программу вычисления указанной величины. Результат проверить при заданных исходных значениях. - C++
#include &lt;vcl.h&gt; #pragma hdrstop #include &lt;iostream.h&gt; #include &lt;math.h&gt; ...


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

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

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