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

Нужен пример объявления структуры

02.01.2012, 21:50. Показов 2684. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
прошу помощи разобраться
любая структура
C++
1
2
3
4
5
struct human
{
  int age;
  int height;
};
если я знаю какое именно количество будет людей, то проблем нету..
если не известное количество, и по ходу выполнению программы добавляются, проблема возникает

пару вариантов:
1)
C++
1
vector<human> example;
и он якобы сам изменяется при добавлении элементов.. это не совсем устраивает..

который надо:
2) использования списков..
броздя форумом, видел как используют указатели, но начинаешь путаться, когда один говорит так,а другой отвечающему противоречит..
и в каждой теме бывает реализация... и становится хаос в голове..

что прошу..
чтобы привели пример объявления, присвоение значения (и как при этом меняется указатель)
либо какой то материал..

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

Передача структуры без объявления переменной
здравствуйте форумчане. вопрос мой таков: имеется структура struct Rect { Point LTPoint,RBPoint; } Point-структура...

Приведите пример объявления динамического двумерного целочисленного массива из 5 столбцов и 25 строк
Приведите пример объявления динамического двумерного целочисленного массива из 5 столбцов и 25 строк. Выделите и освободите память.

Что означает имя переменной в конце объявления структуры?
Всем привет. Что значит такая запись в конце структуры? }*head; И что было бы, если было бы так: }head;? struct Link ...

17
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
02.01.2012, 22:03
Самый просто вариант для понимания с помощью временной переменной.
Вот пример, сделаете через циклы
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
#include <iostream>
#include <vector>
 
using namespace std;
 
typedef struct human
{
  int age;
  int height;
} human_t;
 
int main ()
{
    vector <human_t> v;
    human_t t;
    
    t.age = 5;
    t.height = 10;
    
    v.push_back (t);
    
    t.age = 55;
    t.height = 20;
    
    v.push_back (t);
    
    cout << v[0].age << " " << v[0].height << endl;
    cout << v[1].age << " " << v[1].height << endl;
}
1
10 / 10 / 5
Регистрация: 12.03.2011
Сообщений: 39
02.01.2012, 22:07  [ТС]
спасибо, этот вариант я понимаю, но он меня не устраивает

хочу понять с использованием списков (если корректно выразился.. )
0
35 / 35 / 11
Регистрация: 25.05.2010
Сообщений: 211
02.01.2012, 22:35
C++
1
list<human>
если ты про етот список. то схема действий с ним примерно такая же как и с вектором ,показанная го.
только до произвольного елемента ты не сможешь добраться нужно использовать итераторы.
вот смотри тут
http://www.cplusplus.com/reference/stl/list/
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
02.01.2012, 23:11
Цитата Сообщение от Don't Посмотреть сообщение
что прошу..
чтобы привели пример объявления, присвоение значения (и как при этом меняется указатель)
Односвязный список это цепочка однотипных структур, каждая из которых хранит как сами данные хранящиеся в списке, так и адрес следующей такой структуры. Ниже простой пример такого списка
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
#include <iostream>
 
//----------
 
template<typename T>
struct node
{
    T data; // данные хранящиеся в списке
    node* next; // указатель на следующий элемент
};
 
//----------
 
struct human
{
    int age;
    int height;
};
 
//----------
 
int main()
{
    // выделяем память под первый элемент списка и присваиваем значения хранящимся в нём данным
    node<human>* first_node = new node<human>();
    first_node->data.age = 1;
    first_node->data.height = 1;
    // второму элементу списка присваиваем нулевой адрес(признак конца списка)
    first_node->next = NULL;
 
    // выводим список на экран(перебираем все указатели пока не доберёмся до нулевого)
    for(node<human>* p = first_node; p != NULL; p = p->next)
        std::cout << p->data.age << ", " << p->data.height << std::endl;
    std::cout << std::endl;
 
    //---------------
 
    // всё то же самое для второго элемента списка
    first_node->next = new node<human>(); // выделяем память под второй элемент списка
    first_node->next->data.age = 2;
    first_node->next->data.height = 2;
    first_node->next->next = NULL; // третий элемент равен NULL(признак конца списка)
 
    for(node<human>* p = first_node; p != NULL; p = p->next)
        std::cout << p->data.age << ", " << p->data.height << std::endl;
    std::cout << std::endl;
 
    //-----------------
 
    // для третьего
    first_node->next->next = new node<human>(); // выделяем память под третий элемент списка
    first_node->next->next->data.age = 3;
    first_node->next->next->data.height = 3;
    first_node->next->next->next = NULL; // четвёртый элемент равен NULL(признак конца списка)
 
    for(node<human>* p = first_node; p != NULL; p = p->next)
        std::cout << p->data.age << ", " << p->data.height << std::endl;
    std::cout << std::endl;
}
естественно, в реальной программе все действия со списком(добавление, удаление, вставка...) автоматизируется c помощью функций.
1
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
02.01.2012, 23:24
rangerx, имелось ввиду действие со стандартным контейнером list
0
 Аватар для BUMER
157 / 12 / 0
Регистрация: 01.04.2009
Сообщений: 103
02.01.2012, 23:28
go, в стандартном контейнере работа с указателями не требуется, а просили объяснить именно ее.
rangerx, в общем-то все правильно рассказал, но пример далеко не из простых. Если все понятно, то хорошо, если нет - Don't, дай знать.
0
10 / 10 / 5
Регистрация: 12.03.2011
Сообщений: 39
02.01.2012, 23:28  [ТС]
go,
неа, rangerx, описал вроде то что я хотел, сейчас буду разбираться
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
02.01.2012, 23:32
BUMER, проще с итераторами

Don't, тогда при чем здесь вектор?

P. S. Списки бывают разные.
0
 Аватар для BUMER
157 / 12 / 0
Регистрация: 01.04.2009
Сообщений: 103
02.01.2012, 23:41
go, я знаю, что проще. но во всех образовательных программах на первых порах запрещают пользоваться библиотекой стандартных шаблонов
0
10 / 10 / 5
Регистрация: 12.03.2011
Сообщений: 39
02.01.2012, 23:47  [ТС]
go,
чуток промахнулся, написал лишь что вариант с вектором не устраивает, а то что я понял не описал

rangerx,
спасибо понятно,

но нюанс,разобрано добавлению добавлению по элементу списка,
к примеру бы будем иметь цикл, в котором добавляются элементы,
для универсальности нужно будет создать что-то типо "указателя"?, и его менять каждый при каждом проходе.
__

я попросил описать, 2й вариант
ибо под таким способом, который описывал go,
я увидел критики много, по этому решил что 2й вариант более правильный

соответственно назревает вопрос какой метод является лучшим, заметно сразу, что 1й на много проще
0
 Аватар для BUMER
157 / 12 / 0
Регистрация: 01.04.2009
Сообщений: 103
02.01.2012, 23:49
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
struct human
{
  int age;
  int height;
};
 
struct node
{
    human data; // данные хранящиеся в списке
    node* next; // указатель на следующий элемент
};
 
int main()
{
    node* head = new node;
    head->data.age=1;
    head->data.height=1;
    head->next=0;
    node *p=head;
    for(int i=0;i<4;i++)
    {
        node *n = new node;
        //заполнение поля data
        n->next=p->next; 
        p=n;
    }
}
вот попроще кусочек. в итоге получится список из 5-ти элементов. указатель последнего равен 0 (признак конца списка).
важно: в конце программы не забудь удалить динамически взятую память. процесс удаления похож на создание.
1
10 / 10 / 5
Регистрация: 12.03.2011
Сообщений: 39
03.01.2012, 00:10  [ТС]
спасибо всем
при повторном просмотре заметил, что и rangerx описан цикл с указателям..

но в итоге , есть ли недостатки у 1го способа перед вторым?
и предпочтительнее использовать его?
0
 Аватар для BUMER
157 / 12 / 0
Регистрация: 01.04.2009
Сообщений: 103
03.01.2012, 00:17
Don't, используется обычно первый способ. но, как я писал, в обучающих целях, чтоб понимать, что вообще происходит, нужно сначала освоить второй.
1
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
03.01.2012, 10:44
Ну вот написал не сложный вариант, если самому реализовывать
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
#include <iostream>
 
using namespace std;
 
const int MAX_SIZE = 100;
 
typedef struct human
{
  int age;
  int height;
} human_t;
 
template <class T>
class queue {
private:
    T q[MAX_SIZE];
    int sloc, rloc;
public:
    queue () { sloc = rloc = 0; }
    void qput (T val) {
        if ( sloc == MAX_SIZE ) {
            cout << " QUEUE filled with " << endl;
            return ;
        }
        q[++sloc] = val;
    }
    T* qget() {
        if ( rloc == sloc ) {
            cout << " QUEUE 0 " << endl;
            return NULL;
        }
        return &q[++rloc] ;
    }
};
 
int main(int argc, char* argv[])
{
    queue<human_t> q;
    human_t t, *tt;
 
    cin >> t.age >> t.height;
    q.qput(t);
 
    tt = q.qget();
 
        if ( tt )
        cout << tt->age << " " << tt->height << endl;
 
    system ("pause");
    return 0;
}
Добавлено через 4 минуты
Кстати, очередь LIFO.
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
03.01.2012, 17:57
Цитата Сообщение от Don't Посмотреть сообщение
но в итоге , есть ли недостатки у 1го способа перед вторым?
и предпочтительнее использовать его?
Стандартная библиотека для того и существует чтобы ей активно пользоваться(std::forward_list односвязный список, std::list двусвязный), но для учёбы конечно лучше написать свои версии стандартных структур данных. Вообще, я бы советовал начать с самого простого - со стека, затем можно реализовать очередь, и только потом браться за список и всё остальное.
Цитата Сообщение от go Посмотреть сообщение
Кстати, очередь LIFO.
FIFO LIFO это стек.
1
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
03.01.2012, 18:43
Цитата Сообщение от rangerx Посмотреть сообщение
FIFO LIFO это стек.
Да, перепутал. Это обычная очередь. First In, First Out первым пришёл — первым ушёл

Добавлено через 9 минут
Цитата Сообщение от rangerx Посмотреть сообщение
но для учёбы конечно лучше написать свои версии стандартных структур данных.
В С++ очень много удобства дает библиотека STL. Отказываться от нее, ИМХО, глупо.

Цитата Сообщение от rangerx Посмотреть сообщение
и только потом браться за список
Списки бывают разные: однонаправленные, двунаправленные, кольцевые и т.д. Какие необходимо автору темы - загадка (он так и не уточнил).
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
04.01.2012, 09:23
Цитата Сообщение от go Посмотреть сообщение
В С++ очень много удобства дает библиотека STL. Отказываться от нее, ИМХО, глупо.
Но всё же лучше в полной мере понимать, как устроены и как работают фундаментальные структуры данных и алгоритмы. А в полной мере понять это лучше всего моэно, если самостоятельно реализовать их.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.01.2012, 09:23
Помогаю со студенческими работами здесь

Что означает слово struct внутри объявления структуры?
Допустим объявляю структуру следующим образом: struct element{ int id; struct element* next; }; Что означает в данном...

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

Легкий пример про структуры
Задача заключается в том чтобы присвоить значения переменной х и всем объектам к которым она имеет отношение.

Разобрать пример объявления динамического массива
нашел такой пример объявления динамического массива ,но без комментариев не могу понять,как это работает с третьей строчки почему там...

Создание формы отправки объявления на сайт. (пример автору, авито.ру)
Привет всем нуждаюсь в некой помощи &quot;прошаренных&quot; людей. Сделал некий макет сайта для объявлений. Я так как я первый раз этим решил...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
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