Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
 Аватар для CrazyDron
9 / 7 / 4
Регистрация: 08.07.2015
Сообщений: 56

Сложный struct в C++

15.03.2019, 10:06. Показов 2671. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем.

Есть достаточно известный код, знаменитый в первую очередь тем, что влезает на визитку:
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 <math.h>
#include <stdio.h>
#include <stdlib.h>
#define h return
#define F printf
#define S struct
typedef float d;typedef int i;d H=1003;d w(){h drand48();}S v{d x,y,z;v(d a=0,d b=0,d
c=0){x=a;y=b;z=c;}v a(v b){h v(x+b.x,y+b.y,z+b.z);}v c(v b){h v(x*b.x,y*b.y,z*b.z);}d
e(v b){h x*b.x+y*b.y+z*b.z;}v f(d b){h v(x*b,y*b,z*b);}v n(d s=1){h f(s/sqrt(x*x+y*y+
z*z));}v p(v a){h v(y*a.z-z*a.y,z*a.x-x*a.z,x*a.y-y*a.x);}};S r{v o,a;r(v j,v k){o=j;
a=k;}v p(d t){h a.f(t).a(o);}};S s{v p;d l;i C(r q,d&t){v o=q.o.f(-1).a(p);d b=q.a.e(
o);d c=o.e(o)-l;c=b*b-c;if(c<0)h 0;c=sqrt(c);d v=b-c;if(v>0&&v<t){t=v;h 1;}h 0;}};i g
(d c){h pow(c<0?0:c>1?1:c,.45)*255+.5;}r C(d x,d y){v e=v(x,-y,1).n(4);d a=6*w(),c=.2
*sqrt(w());d b=sin(a)*c;a=cos(a)*c;e.x-=a;e.y-=b;h r(v(a,b),e.n());}s u[10] ={{v(0,-2
,5),1},{v(0,-H),1e6},{v(0,H),1e6},{v(H),1e6},{v(-H),1e6},{v(0,0,-H),1e6},{v(0,0,H+3),
1e6},{v(-2,-2,4),2},{v(2,-3,4),1},{v(2,-1,4),1}}; i p(r a,d&t){i n=-1;for(i m=0;m<10;
m++){if(u[m].C(a,t))n=m;}h n;}v e(r a,d b){d t=1e6;i o=p(a,t);if(b>5||o<0)h v();if(!o
)h v(.9,.5,.1);v P=a.p(t);v V=u[o].p.f(-1).a(P).n();if(o>7){a=r(P,a.a.a(V.f(-2*V.e(a.
a))));h e(a,++b).f((o-6.5)/2);}d O=6*w();d A=sqrt(w());v U=a.a.f(-1).p(V).n();v T=U.p
(V);a=r(P,T.f(cos(O)*A).a(U.f(sin(O)*A)).a(V.f(sqrt(1-A*A))).n());v j(1,1,1);if(o==3)
j.x=j.z=0;if(o==4)j.y=j.z=0;h e(a,++b).c(v(j));}i main(){F("P3\n512 512\n255\n");for(
i m=0;m<512;m++)for(i n=0;n<512;n++){v q;for(i k=0;k<100;k++){r j=C(n/256.0-1,m/256.0
-1);q=q.a(e(j,0).f(0.02));}F("%d %d %d ",g(q.x),g(q.y),g(q.z));}}
Приведём его в более удобочитаемый вид:
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
float H = 1003;
float w() { return (rand() / (RAND_MAX + 1.0)); }
struct v
{
    float x, y, z;
    v(float a = 0, float b = 0, float c = 0)
    {
        x = a;
        y = b;
        z = c;
    }
    v a(v b) { return v(x + b.x, y + b.y, z + b.z); }
    v c(v b) { return v(x * b.x, y * b.y, z * b.z); }
    float e(v b) { return x* b.x + y* b.y + z* b.z; }
    v f(float b) { return v(x * b, y * b, z * b); }
    v n(float s = 1) { return f(s / sqrt(x * x + y * y + z * z)); }
    v p(v a) { return v(y * a.z - z * a.y, z * a.x - x * a.z, x * a.y - y * a.x); }
};
struct r
{
    v o, a;
    r(v j, v k)
    {
        o = j;
        a = k;
    }
    v p(float t) { return a.f(t).a(o); }
};
struct s
{
    v p;
    float l;
    int C(r q, float & t)
    {
        v o = q.o.f(-1).a(p);
        float b = q.a.e(
            o);
        float c = o.e(o) - l;
        c = b * b - c;
        if (c < 0)
            return 0;
        c = sqrt(c);
        float v = b - c;
        if (v > 0 && v < t) {
            t = v;
            return 1;
        }
        return 0;
    }
};
int g(float c) { return pow(c < 0 ? 0 : c > 1 ? 1 : c, .45) * 255 + .5; }
r C(float x, float y)
{
    v e = v(x, -y, 1).n(4);
    float a = 6 * w(), c = .2
        * sqrt(w());
    float b = sin(a) * c;
    a = cos(a) * c;
    e.x -= a;
    e.y -= b;
    return r(v(a, b), e.n());
}
s u[10] = { { v(0, -2, 5), 1 }, { v(0, -H), 1e6 }, { v(0, H), 1e6 }, { v(H), 1e6 }, { v(-H), 1e6 }, { v(0, 0, -H), 1e6 }, { v(0, 0, H + 3),
                                                                                                                              1e6 },
    { v(-2, -2, 4), 2 }, { v(2, -3, 4), 1 }, { v(2, -1, 4), 1 } };
int p(r a, float& t)
{
    int n = -1;
    for (int m = 0; m < 10;
         m++) {
        if (u[m].C(a, t))
            n = m;
    }
    return n;
}
v e(r a, float b)
{
    float t = 1e6;
    int o = p(a, t);
    if (b > 5 || o < 0)
        return v();
    if (!o)
        return v(.9, .5, .1);
    v P = a.p(t);
    v V = u[o].p.f(-1).a(P).n();
    if (o > 7) {
        a = r(P, a.a.a(V.f(-2 * V.e(a.a))));
        return e(a, ++b).f((o - 6.5) / 2);
    }
    float O = 6 * w();
    float A = sqrt(w());
    v U = a.a.f(-1).p(V).n();
    v T = U.p(V);
    a = r(P, T.f(cos(O) * A).a(U.f(sin(O) * A)).a(V.f(sqrt(1 - A * A))).n());
    v j(1, 1, 1);
    if (o == 3)
        j.x = j.z = 0;
    if (o == 4)
        j.y = j.z = 0;
    return e(a, ++b).c(v(j));
}
int main()
{
    printf("P3\n512 512\n255\n");
    for (
        int m = 0; m < 512; m++)
        for (int n = 0; n < 512; n++) {
            v q;
            for (int k = 0; k < 2000; k++) {
                r j = C(n / 256.0 - 1, m / 256.0
                        - 1);
                q = q.a(e(j, 0).f(0.002));
            }
            printf("%d %d %d ", g(q.x), g(q.y), g(q.z));
        }
}
Я споткнулся буквально на объявлении struct v.
В Си я не силён, и хочу разобрать этот код для переноса на другой язык.
Пробовал гуглить учебники по Си, в том числе описание struct, но там везде объясняются простые структуры. Просто поля данных, объединённые единым общим именем.
Тут же внутри struct находятся и функции, возвращающие результат, и объявления себя внутри себя типа v a(v b) { return v(x + b.x, y + b.y, z + b.z); }

Я понимаю, что этот код запутан и сложен для новичка типа меня, но, повторюсь, я не нашёл примеры подобных struct в интернете.

Просьба: разжевать мне, что это за такие странные struct, либо отправить в нужном направлении почитать. Английский понимаю.

Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.03.2019, 10:06
Ответы с готовыми решениями:

Как открыть struct в struct
Здравствуйте, есть код, мне нужно узнать как можно открыть struct в struct, к примеру чтобы заполнить public string Osnv_Glagol; ...

Struct sockaddr vs. struct sockaddr_in
Вопрос,связанный с переносимостью кода на другие платформы. Читаю эту книжку http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html...

сложный запрос (для меня сложный)
Есть таблица с продажами услуг от разных фирм, есть таблица с оплатой за предоставленные услуги (при этом сумма оплат может не совпадать с...

11
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33193 / 21489 / 8233
Регистрация: 22.10.2011
Сообщений: 36,875
Записей в блоге: 12
15.03.2019, 13:01
Цитата Сообщение от CrazyDron Посмотреть сообщение
Пробовал гуглить учебники по Си, в том числе описание struct, но там везде объясняются простые структуры
Гуглить надо учебники по С++, в которых написано, что такое struct, и чем оно отличается от class.
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
15.03.2019, 15:53
Цитата Сообщение от CrazyDron Посмотреть сообщение
В Си я не силён
Этот код на C++.

Цитата Сообщение от CrazyDron Посмотреть сообщение
странные struct
Это классы. В C++ struct - это class type. Поэтому гуглить надо классы C++. А еще лучше взять книжку для начинающих и почитать соответствующий раздел о классах там.
1
 Аватар для CrazyDron
9 / 7 / 4
Регистрация: 08.07.2015
Сообщений: 56
15.03.2019, 19:53  [ТС]
Спасибо за ответы, но для меня ничего не прояснилось.

Цитата Сообщение от DrOffset Посмотреть сообщение
Этот код на C++.
В заголовке темы я собсно и указал, что C++, далее просто для краткости писал Си.

Был бы очень признателен, если бы вы смогли дать ссылку на учебник по С++, где есть описание подобных структур, а пока...

Ладно, пусть будет класс.

У класса есть как переменные, так и процедуры/функции.
Вопросы:
1. Структура класс v. Содержит переменные x,y,z, а также функции a,c,e,f,n,p.
а) почему функции внутри объявления класса имеют этот же тип v?
б) что значит код
C
1
2
3
4
5
6
v(float a = 0, float b = 0, float c = 0)
    {
        x = a;
        y = b;
        z = c;
    }
2. Строка 30: v p(float t) { return a.f(t).a(o); }
a - это переменная типа v. Объявлена в строке 24. Т.е можно вызвать функции a.f(xxx) или a.a(xxx). Что значит конструкция a.f(t).a(o), ведь функция f не является классом или структурой?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
15.03.2019, 20:01
CrazyDron, C и C++ разные языки, поэтому такая "краткость" здесь неуместна.
К слову, Ваш код даже не собирется компилятором C.
Список литературы есть здесь: Литература C++
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
15.03.2019, 20:02
Цитата Сообщение от CrazyDron Посмотреть сообщение
Был бы очень признателен, если бы вы смогли дать ссылку на учебник по С++, где есть описание подобных структур
https://www.cyberforum.ru/post1993739.html
1
2 / 2 / 1
Регистрация: 27.11.2017
Сообщений: 57
15.03.2019, 20:35
Почитайте книгу Шилдта Базовый курс С++
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
15.03.2019, 21:09
Цитата Сообщение от Ivenho Посмотреть сообщение
Почитайте книгу Шилдта Базовый курс С++
да, читается легко, даже очень.
1
 Аватар для CrazyDron
9 / 7 / 4
Регистрация: 08.07.2015
Сообщений: 56
15.03.2019, 21:37  [ТС]
Ivenho, _stanislav, скачал, прочитал весь раздел "Глава 10. Структуры и объединения".

Ничего нового, кроме:
Структура также может содержать в качестве своего члена указатель на эту же
структуру. И в самом деле для структуры вполне допустимо содержать член, который
является указателем на нее саму. Например, в следующей структуре переменная sptr
объявляется как указатель на структуру типа mystruct, т.е. на объявляемую здесь структуру.
struct mystruct {
int а;
char str[80];
mystruct *sptr; // указатель на объекты типа mystruct
};
Структуры, содержащие указатели на самих себя, часто используются при создании
таких структур данных, как связные списки. По мере изучения языка C++ вы встретите
приложения, в которых применяются подобные вещи.
Всё. Остальное - это обычные поля структур, указатели, массивы и работа с функциями (параметр или результат - структура).

По-прежнему вопрос по этим сложным struct открыт.
Дабы не оффтопить, прошу ссылки, где есть описание именно вот таких лихозакрученных структур. Если конечно таковые найдутся.

З.Ы. Я не то, чтобы полная зелень в С/С++. Когда-то писал на нём простой софт. Периодически разбираю сишный код для бэкпортирования. Но вот с такими struct встретился впервые, и поэтому в ступоре.

З.З.Ы. В основном пользую Lazarus, т.е. Паскаль, и планировал этот код перенести в fpc.
0
2 / 2 / 1
Регистрация: 27.11.2017
Сообщений: 57
15.03.2019, 22:10
Struct в с++ могут иметь свои функции-члены. или друзей структуры
Например чтобы сделать перегрузку ввода или вывода данной структуры следует зафрендить операторы ввода/вывода
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
15.03.2019, 22:13
Лучший ответ Сообщение было отмечено CrazyDron как решение

Решение

Цитата Сообщение от CrazyDron Посмотреть сообщение
прочитал весь раздел "Глава 10. Структуры и объединения".
Читайте еще раз, но внимательно. Цитата из 10 главы (важное подчеркнул):

В C++ структуры и объединения имеют как объектно-ориентированные, так и не объектно-ориентированные атрибуты. В этой главе рассматриваются только последние. Об объектно-ориентированных и их свойствах речь пойдет в следующей главе после введения понятия о классах и объектах.
1
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
15.03.2019, 22:15
Лучший ответ Сообщение было отмечено CrazyDron как решение

Решение

Цитата Сообщение от CrazyDron Посмотреть сообщение
что значит код

C++
1
2
3
4
5
6
v(float a = 0, float b = 0, float c = 0)
 {
 x = a;
 y = b;
 z = c;
 }
Это конструктор. Почитайте учебник, особенно синтаксис объявления функций.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.03.2019, 22:15
Помогаю со студенческими работами здесь

typedef struct Foo или struct Foo
В чём разница между: typedef struct { int a; }Foo; и struct Foo { int a; }

Struct
У мя есть структура: указатель на предыдущий, следующий и значение... Ввод/вывод работает, а вот добавление после определённого значения...

struct (с++)
Кто может написать полный синтаксис структуры. Чем отличается структура от класса ? Всем ответившим высказываю свою благодарность.

struct
Привествую ) Такой вопрос назрел ) Хочу создать переменную типа структуры: Всегда создавал так: my_struct var;

Struct{...}
Драсьте мне нужна помощь. Написать программу ввода и вывода студентов группы и каждый из них характеризуется фамилией и номером...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru