Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 15.01.2013
Сообщений: 40

Массив: заполнить пространство определенным количеством атомов

16.03.2013, 17:18. Показов 1065. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Я делаю проект для учебы. Передо мной стоит задача заполнить пространство определенным количеством атомов. Для этого я использовал трехмерный массив Atom [10][10][10]. Этим массивом я обозначаю 1000 атомов. Кроме того, каждый элемент массива должен хранить сведения о пространственных координатах. Для этого я создаю класс Atom с переменными x, y, z и создаю на его базе новый тип данных AtomType. Теперь все мои координаты могут быть получены следующим выражением: Atom [i][j][k].x (или Atom [i][j][k].у, Atom [i][j][k].z). Теперь, чтобы задать координаты, соответствующие положениям атомов я использую 3 вложенных цикла for.
Привожу для наглядности код:
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
#include <iostream>
 
class Atom
{
  public:
    float x, y, z; // Coordinates of the atoms
};
 
typedef class Atom AtomType;
 
    AtomType Atom1 [10][10][10]; // Create a 3 dimensional array to fill the space with atoms of type 1
 
    int i, j, k; // Variables for array Atom [i][j][k]
 
int main ()
{
    for (i=0; i<10; i++)
    {
        for (j=0; j<10; j++)
        {
            for (k=0; k<10; k++)
            {
                Atom1 [i][j][k].x=i-4; // We get '-4' because we want our origin to be in the centre of array
                Atom1 [i][j][k].y=j-4;
                Atom1 [i][j][k].z=k-4;
            }
        }
    }
return 0;
}
Вопрос: как мне получить этот же результат, используя указатели?

Заранее благодарен!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.03.2013, 17:18
Ответы с готовыми решениями:

Как вывести массив на экран рядами с определенным количеством элементов в каждом?
Задание такое: отсортировать массив по возрастанию его модулей методом простого выбора. Отсортированные элементы массива вывести на экран...

Заполнить массив А определенным образом
Решить задачу в дельфи. Помогите плз. var A:array of byte; Заполнить массив А следующим образом: 1 1 1 … 1 1 1 0 1 1...

Заполнить массив А определенным образом
1. var A:array of byte; Заполнить массив А следующим образом: 1|2|...|10 11|12|...|20 21|22|...|30 ...|...|...|... ...

6
3 / 3 / 1
Регистрация: 24.06.2012
Сообщений: 50
16.03.2013, 17:35
Оператор a[i] эквивалентен *(a + i).
А Вам нужно трижды разыменовать:
C++
1
2
3
*(*(*(Atom1 + i) + j) + k).x = i - 4;
*(*(*(Atom1 + i) + j) + k).y = j - 4;
*(*(*(Atom1 + i) + j) + k).z = k - 4;
1
1 / 1 / 0
Регистрация: 15.01.2013
Сообщений: 40
16.03.2013, 18:01  [ТС]
Цитата Сообщение от shau-kote Посмотреть сообщение
Оператор a[i] эквивалентен *(a + i).
А Вам нужно трижды разыменовать:
C++
1
2
3
*(*(*(Atom1 + i) + j) + k).x = i - 4;
*(*(*(Atom1 + i) + j) + k).y = j - 4;
*(*(*(Atom1 + i) + j) + k).z = k - 4;
Спасибо за ответ. Скажите пожалуйста, а почему мы суммируем "а" и "i"? Мне казалось, что у "а" нет значения.
0
 Аватар для Nagdiel
117 / 116 / 8
Регистрация: 23.12.2012
Сообщений: 195
16.03.2013, 18:19
Цитата Сообщение от Skrypnyk Посмотреть сообщение
Скажите пожалуйста, а почему мы суммируем "а" и "i"?
Это адресная арифметика. Пусть объявлено Atom a[10]. Операция (a+i) прибавляет i*sizeof(Atom) байт к адресу, записанному в a (это адрес первого элемента массива).
1
3 / 3 / 1
Регистрация: 24.06.2012
Сообщений: 50
16.03.2013, 19:02
Skrypnyk, почитайте немного про адресную арифметику в C\C++.
Там всё несколько своеобразно.

Попробую изложить кратко.
В C определена операция сложения над указателями. Если мы к указатели прибавим, допустим единицу, то указатель увеличится на количество байт, которое занимает единица того, типа, на который указывает указатель.
То есть
C++
1
2
3
int a, *p;
p = &a; // p указывает на a
++p; // p сместился на 4 байта
Формально мы можем записать в эту новую ячейку памяти число, но лучше так не делать, поскольку мы не выделяли там память, и компилятор может использовать эту память как-то по своему.

Но когда объявляете массив
C++
1
int a[100]
то компилятор делает следующее:
1) создаёт переменную-указатель типа int*;
2) выделяет под неё 400 байт памяти;
3) устанавливает указатель a на начало этого куска памяти.

А когда вы обращаетесь к i-ому элементу массива - a[i] - компилятор фактически заменяет этот код на *(a + i) - сдвинуть указатель на i ячеек по 4 байта от начала области памяти, на которую указывает a и работать с этой ячейкой.

Таким образом, с C\C++ массивы - и не массивы вовсе, а указатели на области памяти. И всё.

Если всё же не понятно - почитайте ещё про адресную арифметику в С, на эту тему много написано.
Я бы посоветовал классиков - Кернигана и Ритчи.
1
1 / 1 / 0
Регистрация: 15.01.2013
Сообщений: 40
16.03.2013, 20:46  [ТС]
shau-kote, спасибо, кажется, понял. Но на всякий случай прочту.

Цитата Сообщение от shau-kote Посмотреть сообщение
Я бы посоветовал классиков - Кернигана и Ритчи.
Их "Язык программирования С" не рекомендуется для новичков. Я сейчас читаю Харви Дейтела "Как программировать на С++". Что скажете, сгодится для старта?
0
3 / 3 / 1
Регистрация: 24.06.2012
Сообщений: 50
20.03.2013, 02:25
Skrypnyk, не рекомендуется?..
Удивлён, честно. Книга написана прекрасным языком, я сам читал её с большим удовольствием - как первую книгу по Си.

Добавлено через 9 минут
Другой вопрос, что надо понимать, что книга именно по С, а не по C++.
Тем не менее, её стоит прочитать даже если Вы собираетесь на C++. Дело в том, что C++, принеся в С много нового, немало оставил по-старому - та же адресная арифметика с массивами, которые не массивы, тот же оператор switch-case-break, совершенно неприличный для высокоуровневого языка.

Что касается книг именно по C++, то того же Дейтела многие хвалят, но я его не читал.
Могу порекомендовать Подбельского В.В., "Язык Си++", могу не рекомендовать читать Страуструпа, по крайней мере, пока Вы не освоитесь в языке достаточно хорошо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.03.2013, 02:25
Помогаю со студенческими работами здесь

Заполнить массив А определенным образом
Заполнить массив А следующим образом 1 2 . . .10 11 12 . . .20 21 22 . . .30 ...

Заполнить массив А определенным образом
1. var A:array of byte; Заполнить массив А следующим образом: 1 2 3 … 10 0 1 2 … 9 0 0 1 … 8 … 0 ...

Заполнить массив определенным образом
Помогите пожалуйста: Дана целочисленная матрица А (10х10). Заполнить массив А следующим образом: а) 0 0 0...0 ...

Заполнить массив А определенным образом
1. var A:array of byte; Заполнить массив А следующим образом: 1 0 0 … 0 0 9 0 1 0 … 0 9 0 0 0 1 … 9 0 ...

Заполнить массив определённым образом
Помогите с задачей. Есть ряд квадратных матриц 10х10 и нужно заполнить массив следующим образом, как показано в прикреплённом файле. ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru