Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Структура и вложенная структура

Подскажите как сделать задание, такого рода
Иванов Математика 80
История 60
Физика 67

Сидоров Математика 80
История 60
Физика 67

Пупкин Математика 80
История 60
Физика 67
C++
1
2
3
4
5
6
7
8
9
10
Реализовать с помощью вложенной структуры. Как инициализировать структуру и заполнить рандомно оценки?
struct predmet{
    char npred;
    int *mark;
    };
struct student {
    char name[20];
    predmet prr[3];
    
};
Ответ: можно начать отсюда
Вопрос: Объясните программу по теме "Структуры"

Добрый день. Необходима ваша помощь в решении задачи по теме "Структуры". Есть структура, элементы которой мы заполняем данными о людях. Не могу понять, как сделать поиск по году рождения, если я ввожу в данных о человеке Дату рождения в формате xx.xx.xxxx. Спасибо за ответ.
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <stdio.h>
using namespace std;
const int SIZE = 100;
void enter(), init_list(), display(), input(int i), clean_data(), update(), Search(), Search_pol(), Search_birthday();
int menu();
struct human
{
    char name[100];
    char birthday[11];
    char address[100];
    char pol;
} person[SIZE];
int main()
{
    setlocale(LC_ALL, "Russian");
    char choice;
    init_list();
    for(;;)
    {
        choice = menu();
        switch(choice)
        {
        case 'a': enter();
            break;
        case 'b': display();
            break;
        case 'c': clean_data();
            break;
        case 'd': update();
            break;
        case 'e': Search();
            break;
        case 'f': return 0;
        }
    }
}
void init_list()
{
    int t;
    for(t = 0; t < SIZE; t++) *person[t].name='\0';
}
int menu()
{
    char ch;
    do
    {
        cout << "A. Ввести данные\n";
        cout << "B. Отобразить данные\n";
        cout << "C. Удалить данные\n";
        cout << "D. Удаление заданной структурированной переменной\n";
        cout << "E. Поиск информации\n";
        cout << "F. Выйти из программы\n";
        cout << "Выберите команду: ";
        cin >> ch;
    } while(!strchr("abcdef", tolower(ch)));
    return ch;
}
void enter()
{
    int i;
    for(i = 0; i < SIZE; i++)
        if(!*person[i].name) break;
    input(i);
}
void input(int i)
{
    getchar();
    cout << "Ф.И.О: ";
    cin.getline(person[i].name, 40);
    cout << "Дата Рождения: ";
    cin.getline(person[i].birthday, 15);
    cout << "Адрес: ";
    cin.getline(person[i].address, 40);
    cout << "Пол: ";
    cin >> person[i].pol;
    cout << endl;
}
void display()
{
    int t;
    for(t = 0; t < SIZE; t++)
    {
        if(*person[t].name)
        {
            cout << "Ф.И.О: " << person[t].name << endl;
            cout << "Дата Рождения: " << person[t].birthday << endl;
            cout << "Адрес: " << person[t].address << endl;
            cout << "Пол: " << person[t].pol << endl;
        }
    }
}
void clean_data()
{
    int i;
    for (i = 0; i < SIZE; i++)
    {
        *person[i].name = '\0';
    }
}
void update()
{
    int t;
    char name_del[15];
    cout << "Введите Ф.И.О для удаления: ";
    getchar();
    cin.getline(name_del, 40);
    for (t = 0; t < SIZE; t++)
    {
        if (*person[t].name == *name_del)
        {
            *person[t].name = '\0';
            t++;
        }
        else break;
    }
}
void Search()
{
    char option;
    cout << "A. Поиск по полу\n";
    cout << "B. Поиск по году рождения\n";
    cout << "Выберите команду: ";
    cin >> option;
    if (option == 'a')
    {
        Search_pol();
    }
    else if (option == 'b')
    {
        Search_birthday();
    }
}
void Search_pol()
{
    char ch;
    cout << "Введите пол(m/w): ";
    cin >> ch;
    int t;
    for (t = 0; t < SIZE; t++)
    {
        if (person[t].pol == ch)
        {
            cout << "Ф.И.О: " << person[t].name << endl;
            cout << "Дата Рождения: " << person[t].birthday << endl;;
            cout << "Адрес: " << person[t].address << endl;
        }
    }
}
void Search_birthday()
{
    int t, i;
    char mas[4], data[5];
    cout << "Введите год рождения: ";
    cin >> mas;
    for (t = 0; t < SIZE; t++)
    {
        
    }
    
}
Ответ: Я написал абстрактно. Вам точно придется пробежаться по массиву структур. На каждом шагу вам надо будет взять поле birthday. Либо вытащить из него подстроку с годом и сравнить с введенной строкой. Либо искать введенную строку как подстроку во всем birthday.

1. Вытаскивать строку из birthday можно создавая std::string, как я показал (первый листинг). Также можно весь birthday перевести в std::string.
2. Введенную строку можно точно также перевести в std::string.
3. Сравнивать std::string можно при помощи =.
4. Если Вы решили не вытаскивать ничего из birthday. То можно сразу ее преобразовать в std::string целиком и воспользоваться функцией find.
5. Если вообще не использовать std::string то почитайте про функцию strcmp

Добавлено через 4 минуты
Чтобы чуть-чуть ускорить поиск можно сравнивать посимвольно с конца в начало и при несовпадении переходить к следующей структуре. Потому что обычное сравнение строк тоже происходит посимвольно слева направо. А последняя цифра года с большей вероятностью отличается у разных персон, чем первые две
Вопрос: Создать массив структур без использования массивов и нотации массивов

Доброго времени суток!
Есть задание, в котором нужно создать массив структур, имея следующую структуру:
C++
1
2
3
4
5
struct name {
     string id;
     float info;
     int vozrast;
}
Вариант с созданием элементов структуры при помощи

C++
1
name element [n]; 
не пройдёт. Преподаватель запретил использование массивов и вообще знаков [ ] в коде быть не должно. Можно ли как-то это организовать?
Благодарю всех за ответы и всех с наступающими праздниками!
Ответ: ТимурКаримов, Ну решение для истории оставь!
Вопрос: Присвоение структуре другой структуры из массива структур

Привет всем вот всё ковыряю задание с клубами. Из-за незнания нюансов и отсутствие практики не могу присвоить и отсортировать массив структур, помогите кому не лень ) Выбивает ошибку на sForSort = &aArrayClub[0];. Хочу score перевести в int и задействовать в сортировке но не могу присвоить дополнительной структуре структуру из массива которая бы вылетала, думаю мою мысль неглубокую понятно =) Кто может помочь помогите.

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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
    /*1) створіть структуру Club з полями: name - назва клубу; city - місто, яке він представляє;
    * score - кількість набраних очок;*/
 
struct Club
{
    char cCity[255];
    char cName[255];
    char cScore[255];
};
 
struct AdditionalStructForSort
{
    char cCity[255];
    char cName[255];
    char cScore[255];
};
 
int main(void)
{
    struct AdditionalStructForSort sForSort;
    struct Club sClub;
    signed int i;
 
    for ( i = 0; i < 255; i++ )
    {
        sForSort.cCity[i] = 0;
        sForSort.cName[i] = 0;
        sForSort.cScore[i] = 0;
    }
 
    for ( i = 0; i < 255; i++ )
    {
        sClub.cCity[i] = 0;
        sClub.cName[i] = 0;
        sClub.cScore[i] = 0;
    }
 
    /* 2) створіть файл, в якій внесіть дані - майбутні значення полів структури Club
    * (кожне поле - з нового рядка, без пробілів!), кількість клубів - не менше 10
    * (розташувати у файлі в довільному порядку, не залежно від кількості очок);*/
 
    FILE *pClub;
 
    //3) збережіть створений файл як текстовий;
 
    pClub = fopen ( "FileAllClubs.txt", "a+" );
 
    printf ( "Input name city: " );
    gets ( sClub.cCity );
    printf ( "Input name club: " );
    gets ( sClub.cName );
    printf ( "Input score club: " );
    gets ( sClub.cScore );
 
    fprintf ( pClub, "%s\n%s\n%s\n", &sClub.cCity[0], &sClub.cName[0], &sClub.cScore[0] );
    fclose ( pClub );
 
    for ( i = 0; i < 255; i++ )
    {
        sClub.cCity[i] = 0;
        sClub.cName[i] = 0;
        sClub.cScore[i] = 0;
    }
 
    /*4) введіть з клавіатури число N - кількість клубів,
    дані про які потрібно прочитати з файлу;*/
 
    signed int N = 0;
    printf ( "Input N: " );
    scanf ( "%d", &N );
 
    //5) виділіть динамічно пам’ять для масиву з n структур;
 
    struct Club *aArrayClub = ( struct Club* ) malloc ( N * sizeof ( struct Club ) );
 
    if ( ( aArrayClub = ( struct Club* ) malloc ( N * sizeof ( struct Club ) ) ) == NULL )
    {
        printf ( "ERROR\n" );
        exit ( 1 );
    }
 
    pClub = fopen ( "FileAllClubs.txt", "r+" );
 
    //6) прочитайте у відповідний масив максимально можливу кількість даних про клуби;
 
    for ( i = 0; i < N; i++ )
    {
        fgets ( sClub.cCity, 255, pClub );
        strcpy ( aArrayClub[i].cCity, sClub.cCity );
        fgets ( sClub.cName, 255, pClub );
        strcpy ( aArrayClub[i].cName, sClub.cName );
        fgets ( sClub.cScore, 255, pClub );
        strcpy ( aArrayClub[i].cScore, sClub.cScore );
 
        puts ( aArrayClub[i].cCity );
        puts (aArrayClub[i].cName );
        puts ( aArrayClub[i].cScore );
 
    }
 
    fclose ( pClub );
 
    /*7) здійснить сортування даного масиву за спаданням кількості очок клубів -
    першим елементом щоб стала структура, клуб якої має максимальну кількість очок,
    і далі - в порядку зменшення;Примітка: - з метою обміну структур місцями оголосіть
    додаткову аналогічну структуру, в яку тимчасово будете копіювати ті, що підлягають перестановці;
    доступ до елементів масиву структур здійснюйте за допомогою покажчиків!*/
 
    signed int iValue = 0;
    signed int iMaxScore = 0;
 
    sForSort = &aArrayClub[0]; // <- Ошибка
 
    iMaxScore = atoi( aArrayClub[0].cScore );
 
    for( i = 0; i < N; i++ )
    {
        if( ( iValue = atoi( aArrayClub[i].cScore ) ) > iMaxScore )
        {
               iMaxScore = atoi( aArrayClub[i].cScore );
        }
    }
 
    printf( "%d", iMaxScore );
 
    /*8) дані відсортованого масиву виведіть до іншого текстового файлу
    (по можливості використовуючи форматування для кращої читабельності);
    перевірте файл на предмет правильного порядку розташування в ньому даних про клуби.*/
 
    FILE *pFinalClub;
    pFinalClub = fopen( "FinalClub.txt", "a+" );
    //fprintf ("" );
    fclose( pFinalClub );
 
   return 0;
}
Добавлено через 12 часов 35 минут
Говорят что можно по елементно присваивать но что других способов нету?
Ответ: Все я понял в чем дело у меня біло 2 одинаковых но разных структури [мат]
Вот:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
struct Club
{
    char cCity[255];
    char cName[255];
    char cScore[255];
};
 
struct AdditionalStructForSort
{
    char cCity[255];
    char cName[255];
    char cScore[255];
};
Анадо было делать типо структуры 1 типа в этом и вся проблема была. Спс всем за помощь.
Вопрос: Изменение заданной структуры в массиве структур

Добрый день! Интересует вопрос по поводу изменения уже существующей структуры. Нужно просто изменить значение полей. Буду рад любой помощи.Код функции изменения(Передаю в нее нужную структуру).
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
void edit(General general)
{
    printf("Enter the typography:    ");
    gets(general.typography);
    printf("Enter the price:     ");
    scanf("%d",&general.price);
    getchar();
    printf("Enter the type of object (1 Book 2 Calendar):    ");
    scanf("%d",&general.typeObj);
    getchar();
    
    if(general.typeObj==1)
    {
        printf("Enter the headline:  ");
        gets(general.choice.book.name);
        printf("Enter the author:    ");
        gets(general.choice.book.author);
        printf("Enter the number of pages:   ");
        scanf("%d",&general.choice.book.pages);
        getchar();
    }   else {
        printf("Enter the type:     ");
        gets(general.choice.calendar.type);
        printf("Enter the format:    ");
        gets(general.choice.calendar.format);
        printf("Enter the size:     ");
        scanf("%d",&general.choice.calendar.size);
        getchar();
    }
 
    puts("");
}
А вот объявление структур
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
typedef struct Book {
    char name[20];
    char author[20];
    int pages;
}Book;
typedef struct Calendar {
    int size;
    char type[20];
    char format[20];
}Calendar;
typedef union Choice {
    Book book;
    Calendar calendar;
}Choice;
typedef struct General {
    Choice choice;
    TypeObj typeObj;
    char typography[20];
    int price;
}General;
Данные не меняются. При печати данной структуры поля остаются преждними.
Ответ: Отчасти я Вас понял.Функция создает структуру, но она никуда не записывается. Решил проблему передав в параметры сам массив и номер изменяемого элемента. Большое спасибо.
Вопрос: Глобальное определение структур (использование одной структуры в разных юнитах)

Учусь программировать по немногу. Вычитал о том что хорошо иметь отдельный юнит для хранения всех глобальных переменных и т.д. С переменными я разобрался - в unit2.сpр пишу, к примеру, int a = 5; в unit2.h extern int a; соответственно. Все прекрасно работает, в любом юните к которому подключен unit2.h переменная а = 5. А что делать с структурой, к примеру struct MyStruct {int x, y, z ;} Struct1;? У меня получилось объявить структуру в unit2.h, но при этом в остальных модулях создается, как я понял, экземпляр Struct1. Как объявить структуру в .срр а потом при помощи extern .h сделать ее глобальной (по аналогии с выше приведенным примером int a = 5; или как то по другому)? И пожалуйста, по проще объясните и с примером. Спасибо.
Ответ: Спасибо за оперативный ответ, действительно просто все показали. Сделал по аналогии, все работает. Нашел у себя наверное косяк, я написал:
C++
1
extern struct MyStruct {int x;int y;int z;} Struct1;
а у вас:
C++
1
2
3
4
5
struct MyStruct
{
    int x, y, z;
};
extern MyStruct Struct1;
т.е. это разные вещи и путать их нельзя?

наверное лучше выложить весь код, посмотрите пожалуйста
Кликните здесь для просмотра всего текста

VarUnit.h ( в VarUnit описываю переменные и функции)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//---------------------------------------------------------------------------
#include <vector>
#ifndef VarUnitH
#define VarUnitH
using namespace std;
 
extern struct MyStruct {int x;int y;int z;} Struct1;
 
extern void YYY(vector<MyStruct> UIO, MyStruct IOP) ;
extern vector<MyStruct> Canel1;
 
//---------------------------------------------------------------------------
#endif
VarUnit.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//---------------------------------------------------------------------------
#pragma hdrstop
#include "Unit1.h"
#include "VarUnit.h"
#include <vector>      // ïîäêëþ÷Г*ГҐГ¬ áèáëèîòåêó äëÿ Г°Г*áîòû Г± âåêòîðîè
 
MyStruct Struct1;
vector<MyStruct> Canel1;
 
void YYY(vector <MyStruct> UIO, MyStruct IOP)
    {
     IOP.x = 789 ;
     IOP.y = 123 ;
     IOP.z = 118 ;
     UIO.push_back(IOP) ;
     Form1->Edit1->Text = IntToStr(UIO[0].x) ;
     Form1->Edit2->Text = IntToStr(UIO[0].y) ;
    }
//---------------------------------------------------------------------------
#pragma package(smart_init)
UnitMain.cpp (тут я использую функцию из VarUnit)
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
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <math.h>      // ïîäêëþ÷Г*ГҐГ¬ áèáëèîòåêó äëÿ Г°Г*áîòû Г± òðèãîГ*îìåòðèåé
#include <vector>      // ïîäêëþ÷Г*ГҐГ¬ áèáëèîòåêó äëÿ Г°Г*áîòû Г± âåêòîðîè
 
#include "Unit1.h"
#include "VarUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
YYY(Canel1, Struct1) ;
Edit3->Text = IntToStr(Struct1.x) ;
}
//---------------------------------------------------------------------------

как вы видите вызываю функцию из VarUnit в которую я передаю структуру Struct1. В функции происходит присваивание значений. Т.е. Struct1.x = 789 или нет? И тут же я вывожу в дрогой Edit значение Struct1.x и оно равно 0 (нулю, ваш Кэп). Что я делаю не так? Прошу пояснить мне где я туплю лаконично и подробно. Спасибо

Добавлено через 42 минуты
Понял! Я не поставил аперсанд (&) перед аргументом функции. Простите за потраченное на прочтение этой темы время. Volvo, спасибо за помощь.
Вопрос: Динамическая структура

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

чтобы как бы вот так (абстрактным языком)
Код:

 
byte[] BytBuf ; // уже заполненный байтовый массив

infCol[] // уже заполненный массив структур "информация о колонках "

СТРУКТУРА структ = new СТРУКТУРА() // объявили пустую структуру-приемник

for(int n=0; n<Кол-воКолонок ; n++)
{
структ.ДобавитьНовоеПоле.Тип = infCol[n].type ;
}

Ответ:
Цитата:
Сообщение от p51x
обычно мапируется на классы логики.
еще не скромный вопрос можно ?
что такое "мапируется" ???

и как это на классы логики ???

можно ли это применить к моему случаю ???
Вопрос: Запись структуры данных в файл. Динамический список

Первый вопрос.
Программа вроде бы пишет в файл. Читает из файла тоже корректно, однако, при чтении в список добавляется еще один элемент.

Например список состоит из 5 структур, а при чтении из файла, загружаются 6-ть структур. 6-я структура не несет в себе данных, и выводит ерунду.

прикладываю файл 1.txt. Положить в корень диска D:

см. код ниже.
void fr_list() - чтение из файла
void fw_list() - запись в файл.

Код 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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <string>
#include <clocale>
#include <fstream>
 
using namespace std;
 
struct ZD   //описываем структуру списка
{
    struct zdDate   //описываем структуру даты
    {
        int day;    //информационное поле для дня
        int month;  //информационное поле для месяца
        int year;   //информационное поле для года
    } rDate;
 
    struct zdTime   //описываем структуру времени
    {
        int hours;  //информационное поле для часов
        int minuts; //информационное поле для мину
    } rTime;
 
    char route[256];    //информационное поле по направлению
    int freeplaces; //информационное поле для свободных мест
    struct ZD* next;    //указатель на следующий элемент списка
};
 
typedef struct ZD sZD;
sZD* headlist = NULL;   //начало списка
sZD* endlist = NULL;    //конец списка
 
//процедура вывода списка
void print_list()
{
    if (!headlist)
    {
        cout << "Список расписаний пустой!\n";
        cout << "\n";
        return;
    }
    sZD* current = headlist;
    //if (!current) cout << "List is empty!\n";
    cout << "Таблица расписаний:\n";
    while (current)
    {
 
        cout << "Дата: ";
        cout << current->rDate.day << "/";
        cout << current->rDate.month << "/";
        cout << current->rDate.year << "\t";
        cout << "Время: ";
        cout << current->rTime.hours << ":";
        cout << current->rTime.minuts << "\t";
        cout << "Направление: ";
        cout << current->route << "\t";
        cout << "Свободно мест: ";
        cout << current->freeplaces << ".";
        cout << "\n";
        current = current->next;
    }
}
 
//процедура добавления элемента список
void add_element()
{
    sZD* current = new sZD;
    int xday, xmonth, xyear, xhours, xminuts, xfreeplaces;
    char xroute[256];
    //string xmonth;
    //вводим информацию по дате отправления
    cout << "Введите день, ДД: ";
    cin >> xday;
    current->rDate.day = xday;
 
    cout << "Введите месяц, ММ: ";
    cin >> xmonth;
    current->rDate.month = xmonth;
 
    cout << "Введите год, ГГГГ: ";
    cin >> xyear;
    current->rDate.year = xyear;
 
    //вводим информацию по времени отправления
    cout << "Введите часы, ЧЧ: ";
    cin >> xhours;
    current->rTime.hours = xhours;
 
    cout << "Введите минуты, ММ: ";
    cin >> xminuts;
    current->rTime.minuts = xminuts;
 
    //вводим информацию по направлению
    cout << "Введите направление: ";
    cin >> xroute;
    strcpy_s(current->route, xroute);
 
    //вводим информацию по кол-ву свободных мест
    cout << "Введите количесво свободных мест: ";
    cin >> xfreeplaces;
    current->freeplaces = xfreeplaces;
 
    current->next = NULL;
 
    if (!headlist)
    {
        headlist = current;
    }
    else endlist->next = current;
 
    endlist = current;
 
    cout << endl;
}
 
//процедура создания списка
void make_list()
{
    int n;
    cout << "Введите количесво новых расписаний: ";
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cout << "Данные нового расписания " << i << ":\n";
        add_element();
    }
}
 
//процедура поиска элемента в списке
void find_element()
{
    if (!headlist)
    {
        cout << "Список расписаний пустой!\n";
        cout << "\n";
        return;
    }
    sZD* current = headlist;
    char xroute[256];
    cout << "Введите направление: ";
    fflush(stdin);
    gets_s(xroute);
    while (current)
    {
        if (!strcmp(current->route, xroute))
        {
            cout << "Дата: ";
            cout << current->rDate.day << "/";
            cout << current->rDate.month << "/";
            cout << current->rDate.year << "\t";
            cout << "Время: ";
            cout << current->rTime.hours << ":";
            cout << current->rTime.minuts << "\t";
            cout << "Направление: ";
            cout << current->route << "\t";
            cout << "Свободно мест: ";
            cout << current->freeplaces << ".";
            cout << "\n";
 
        }
        current = current->next;
    }
}
 
//процедура полного удаления списка
void del_list()
{
    if (!headlist)
    {
        cout << "Список расписаний пустой!\n";
        cout << "Удалять нечего :)!\n";
        cout << "\n";
        return;
    }
    while (headlist)
    {
        sZD* current = headlist;
        headlist = current->next;
        delete current;
    }
}
 
//процедура записи в файл
void fw_list()
{
    if (!headlist)
    {
        cout << "Список расписаний пустой!\n";
        cout << "Записывать в файл нечего :)!\n";
        cout << "\n";
        return;
    }
    
    ofstream fileout("d:\\1.txt", ios::binary | ios::out | ios::trunc); //Открываем файл в двоичном режиме для записи
    sZD* current = headlist;
    while (current)
    {
        fileout.write((char*)&current->rDate.day, sizeof current->rDate.day); //Записываем в файл
        fileout.write((char*)&current->rDate.month, sizeof current->rDate.month); //Записываем в файл
        fileout.write((char*)&current->rDate.year, sizeof current->rDate.year); //Записываем в файл
        fileout.write((char*)&current->rTime.hours, sizeof current->rTime.hours); //Записываем в файл
        fileout.write((char*)&current->rTime.minuts, sizeof current->rTime.minuts); //Записываем в файл
        fileout.write((char*)&current->route, sizeof current->route); //Записываем в файл
        fileout.write((char*)&current->freeplaces, sizeof current->freeplaces); //Записываем в файл     
 
        if (current->next == NULL)
            break;
        current = current->next;
        
    }
    fileout.close(); //Закрываем файл   
}
 
//процедура чтения из файла
void fr_list()
{
    fstream filein("d:\\1.txt", ios::binary | ios::in); //Открываем файл в двоичном режиме для чтения
    if (!filein.is_open())                      // если файл не открыт выводится сообщение
    {
        cout << "Файл не может быть открыт!\n";
        cout << "\n";
        return;
    }   
 
    
    while (!filein.eof())
    {
        sZD* current = new sZD;
        filein.read((char*)&current->rDate.day, sizeof current->rDate.day); //Записываем в информационное поле
        filein.read((char*)&current->rDate.month, sizeof current->rDate.month); //Записываем в информационное поле
        filein.read((char*)&current->rDate.year, sizeof current->rDate.year); //Записываем в информационное поле
        filein.read((char*)&current->rTime.hours, sizeof current->rTime.hours); //Записываем в информационное поле
        filein.read((char*)&current->rTime.minuts, sizeof current->rTime.minuts); //Записываем в информационное поле
        filein.read((char*)&current->route, sizeof current->route); //Записываем в информационное поле
        filein.read((char*)&current->freeplaces, sizeof current->freeplaces); //Записываем в информационное поле
 
        current->next = NULL;
 
        if (!headlist)
        {
            headlist = current;
        }
        else endlist->next = current;
        endlist = current;
 
    }
    filein.close(); //Закрываем файл    
}
 
//главная программа
void main()
{
    setlocale(LC_ALL, "Russian");
    int answer;
    do
    {
        system("cls");
        cout << "1. Загрузить расписание из файла" << endl;
        cout << "2. Поиск свободных мест по направлению" << endl;
        cout << "3. Добавить данные по расписанию поездов" << endl;
        cout << "4. Вывести все данные по расписанию поездов" << endl;
        cout << "5. Удалить все данные из списка" << endl;
        cout << "0. Выход" << endl;
        cout << "\nВаш выбор: ";
        cin >> answer;
        switch (answer)
        {
            //
        case 1:
            system("cls");
            cout << endl << "1. Загрузить расписание из файла\n" << endl;
            fr_list();
            //fw_list();
            system("pause");
            break;
            //
        case 2:
            system("cls");
            cout << "2. Поиск свободных мест по направлению\n" << endl;
            find_element();
            system("pause");
            break;
            //
        case 3:
            system("cls");
            cout << "3. Добавить данные по расписанию поездов\n" << endl;
            make_list();
            system("pause");
            break;
            //
        case 4:
            system("cls");
            cout << "4. Вывести все данные по расписанию поездов\n" << endl;
            print_list();
            system("pause");
            break;
        case 5:
            system("cls");
            cout << "5. Удалить все данные из списка\n" << endl;
            del_list();
            //system("pause");
            break;
            //
        case 0:
            system("cls");
            del_list();
            system("pause");
            break;
            //
        default:
            cout << endl << "Ошибка ввода..." << endl;
            system("pause");
            break;
 
        }
 
    } while (answer != 0);
    cin.get();
}
Второй вопрос, про кирилицу.
Категорически отказывается char route[256]; принимать значение кирилицы, только латиница. Что только не пробовал.

Жду от Вас помощи.
Ответ: Условие:
Кликните здесь для просмотра всего текста

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


Вот код программы, если кому понадобиться:
Кликните здесь для просмотра всего текста

Код 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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <string>
#include <clocale>
#include <fstream>
#include <Windows.h>
 
using namespace std;
 
struct ZD   //описываем структуру списка
{
    struct zdDate   //описываем структуру даты
    {
        int day;    //информационное поле для дня
        int month;  //информационное поле для месяца
        int year;   //информационное поле для года
    } rDate;
 
    struct zdTime   //описываем структуру времени
    {
        int hours;  //информационное поле для часов
        int minuts; //информационное поле для мину
    } rTime;
 
    char route[25]; //информационное поле по направлению
    int freeplaces; //информационное поле для свободных мест
    struct ZD* next;    //указатель на следующий элемент списка
};
 
typedef struct ZD sZD;
sZD* headlist = NULL;   //начало списка
sZD* endlist = NULL;    //конец списка
 
//процедура вывода списка
void print_list()
{
    if (!headlist)
    {
        cout << "Список расписаний пустой!\n";
        cout << "\n";
        return;
    }
    sZD* current = headlist;
    cout << "Таблица расписаний:\n";
    while (current)
    {
 
        cout << "Дата: ";
        cout << current->rDate.day << "/";
        cout << current->rDate.month << "/";
        cout << current->rDate.year << "\t";
        cout << "Время: ";
        cout << current->rTime.hours << ":";
        cout << current->rTime.minuts << "\t";
        cout << "Направление: ";
        cout << current->route << "\t";
        cout << "Свободно мест: ";
        cout << current->freeplaces << ".";
        cout << "\n";
        current = current->next;
    }
}
 
//процедура добавления элемента список
void add_element()
{
    sZD* current = new sZD;
    int xday, xmonth, xyear, xhours, xminuts, xfreeplaces;
    char xroute[25];
    
    //вводим информацию по дате отправления
    cout << "Введите день, ДД: ";
    cin >> xday;
    current->rDate.day = xday;
 
    cout << "Введите месяц, ММ: ";
    cin >> xmonth;
    current->rDate.month = xmonth;
 
    cout << "Введите год, ГГГГ: ";
    cin >> xyear;
    current->rDate.year = xyear;
 
    //вводим информацию по времени отправления
    cout << "Введите часы, ЧЧ: ";
    cin >> xhours;
    current->rTime.hours = xhours;
 
    cout << "Введите минуты, ММ: ";
    cin >> xminuts;
    current->rTime.minuts = xminuts;
 
    //вводим информацию по направлению
    cout << "Введите направление: ";
    cin >> xroute;
    strcpy_s(current->route, xroute);
 
    //вводим информацию по кол-ву свободных мест
    cout << "Введите количесво свободных мест: ";
    cin >> xfreeplaces;
    current->freeplaces = xfreeplaces;
 
    current->next = NULL;
 
    if (!headlist)
    {
        headlist = current;
    }
    else endlist->next = current;
 
    endlist = current;
 
    cout << endl;
}
 
//процедура создания списка
void make_list()
{
    int n;
    cout << "Введите количесво новых расписаний: ";
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cout << "Данные нового расписания " << i << ":\n";
        add_element();
    }
}
 
//процедура поиска элемента в списке
void find_element()
{
    if (!headlist)
    {
        cout << "Список расписаний пустой!\n";
        cout << "\n";
        return;
    }
    sZD* current = headlist;
    char xroute[25];
    cout << "Введите направление: ";
    fflush(stdin);
    gets_s(xroute);
    while (current)
    {
        if (strcmp(current->route, xroute) == 0)
        {
            cout << "Дата: ";
            cout << current->rDate.day << "/";
            cout << current->rDate.month << "/";
            cout << current->rDate.year << "\t";
            cout << "Время: ";
            cout << current->rTime.hours << ":";
            cout << current->rTime.minuts << "\t";
            cout << "Направление: ";
            cout << current->route << "\t";
            cout << "Свободно мест: ";
            cout << current->freeplaces << ".";
            cout << "\n";
 
        }
        current = current->next;
    }
}
 
//процедура полного удаления списка
void del_list()
{
    if (!headlist)
    {
        cout << "Список расписаний пустой!\n";
        cout << "Удалять нечего :)!\n";
        cout << "\n";
        return;
    }
    while (headlist)
    {
        sZD* current = headlist;
        headlist = current->next;
        delete current;
    }
}
 
//процедура записи в файл
void fw_list()
{
    if (!headlist)
    {
        cout << "Список расписаний пустой!\n";
        cout << "Записывать в файл нечего :)!\n";
        cout << "\n";
        return;
    }
    
    ofstream fileout("d:\\raspisanie.txt", ios::binary | ios::out | ios::trunc); //Открываем файл в двоичном режиме для записи
    sZD* current = headlist;
    while (current)
    {
        fileout.write((char*)&current->rDate.day, sizeof current->rDate.day); //Записываем в файл
        fileout.write((char*)&current->rDate.month, sizeof current->rDate.month); //Записываем в файл
        fileout.write((char*)&current->rDate.year, sizeof current->rDate.year); //Записываем в файл
        fileout.write((char*)&current->rTime.hours, sizeof current->rTime.hours); //Записываем в файл
        fileout.write((char*)&current->rTime.minuts, sizeof current->rTime.minuts); //Записываем в файл
        fileout.write((char*)&current->route, sizeof current->route); //Записываем в файл
        fileout.write((char*)&current->freeplaces, sizeof current->freeplaces); //Записываем в файл     
        current = current->next;
        
    }
    fileout.close(); //Закрываем файл
    cout << "Запись данных в файл выполнена :)!\n";
    cout << "\n";
}
 
 
//процедура чтения из файла
void fr_list()
{
    
    fstream filein("d:\\raspisanie.txt", ios::binary | ios::in); //Открываем файл в двоичном режиме для чтения
    if (!filein.is_open())                      // если файл не открыт выводится сообщение
    {
        cout << "Файл не может быть открыт!\n";
        cout << "\n";
        return;
    }
    
    while (true)
    {
        sZD* current = new sZD;
        filein.read((char*)&current->rDate.day, sizeof current->rDate.day); //Записываем в информационное поле
        if (filein.eof())
            break;
        filein.read((char*)&current->rDate.month, sizeof current->rDate.month); //Записываем в информационное поле
        filein.read((char*)&current->rDate.year, sizeof current->rDate.year); //Записываем в информационное поле
        filein.read((char*)&current->rTime.hours, sizeof current->rTime.hours); //Записываем в информационное поле
        filein.read((char*)&current->rTime.minuts, sizeof current->rTime.minuts); //Записываем в информационное поле
        filein.read((char*)&current->route, sizeof current->route); //Записываем в информационное поле
        filein.read((char*)&current->freeplaces, sizeof current->freeplaces); //Записываем в информационное поле
 
        current->next = NULL;
 
        if (!headlist)
        {
            headlist = current;
        }
        else endlist->next = current;
        endlist = current;
 
    }
    filein.close(); //Закрываем файл
 
    cout << "Чтение данных их файлв выполнено :)!\n";
    cout << "\n";
}
 
 
//главная программа
void main()
{
    setlocale(LC_ALL, "Russian");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int answer;
    do
    {
        system("cls");
        cout << "1. Загрузить расписание из файла" << endl;
        cout << "2. Поиск свободных мест по направлению" << endl;
        cout << "3. Добавить данные по расписанию поездов" << endl;
        cout << "4. Вывести все данные по расписанию поездов" << endl;
        cout << "5. Удалить все данные из списка" << endl;
        cout << "0. Выход" << endl;
        cout << "\nВаш выбор: ";
        cin >> answer;
        switch (answer)
        {
            //1. Загрузить расписание из файла
            case 1:
                system("cls");
                cout << "1. Загрузить расписание из файла\n" << endl;
                fr_list();
                system("pause");
                break;
            
            //2. Поиск свободных мест по направлению
            case 2:
                system("cls");
                cout << "2. Поиск свободных мест по направлению\n" << endl;
                find_element();
                system("pause");
                break;
            
            //3. Добавить данные по расписанию поездов
            case 3:
                system("cls");
                cout << "3. Добавить данные по расписанию поездов\n" << endl;
            
                if (headlist != NULL)
                {
                    make_list();
                    fw_list();
                }
                else
                    cout << "Данные по расписанию поездов не загружены\n" << endl;
                system("pause");
                break;
                
            //4. Вывести все данные по расписанию поездов
            case 4:
                system("cls");
                cout << "4. Вывести все данные по расписанию поездов\n" << endl;
                print_list();
                system("pause");
                break;
            
            //5. Удалить все данные из списка
            case 5:
                system("cls");
                cout << "5. Удалить все данные из списка\n" << endl;
                del_list();
                system("pause");
                break;
            
            //0. Выход
            case 0:
                system("cls");
                del_list();
                system("pause");
                break;
                
            //Ошибка, если некорректно введен пункт меню
            default:
                cout << endl << "Ошибка ввода..." << endl;
                system("pause");
                break;
 
        }
 
    } while (answer != 0);
    cin.get();
}

Файл raspisanie.txt положить в корень диска D:
Вопрос: Как правильно сохранить структуру, унаследованную от структуры, содержащую виртуальный деструктор?

Здравствуйте!

Имеется структура:

C++
1
2
3
4
5
6
7
8
struct Product
{
    int mId;
    double mCost;
    int mAmount;
    Product()   {}
    virtual ~Product() {}
};
И наследник:

C++
1
2
3
4
5
struct ProductVideo: public Product
{
    char mType[FIELD_LENGHT];
    char mColor[FIELD_LENGHT];
};
Вопрос как правильно сохранить(а потом считать) в (из) файла обьект структуры ProductVideo.

Стандартно пробовал - сохраняет, считывает все ок.
После того как считал структуру из файла в динамически созданый новый обьект, при попытке удаления получаю необработаное исключение. В процессе отладки вроде понял - при сохранении структуры в файл, так как у родителя присутствует виртуальный деструктор, я удачно сохраняю адрес указателя VPTR, но при загрузке из файла я получаю указатель который указывает в никуда.

Вопрос: как правильно сохранить(считать) такую структуру?
Заранее благодарен.
Ответ: Спасибо.
Вопрос: Структуры, указывающие на следующую структуру

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
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
    int data;
    struct x1 *next;
    struct x1 *prev;
 
} Node;
 
Node *createFunc()
{
    int num;
    Node *head;
    Node *prev, *next;
    printf("Enter how many nodes you want\n");
    scanf("%d", &num);
    for(;num;num--, next++)
    {
        if(!head)
        {
            head = (Node*)malloc(num * sizeof(Node));
            head->next = next;
            head->prev = prev;
        }
            next = (Node*)malloc(num * sizeof(Node));
 
    }
}
 
int main()
{
    return 0;
}
готовлюсь на экзамен, подскажите пожалуйста как правильно связывать структуры?

Добавлено через 39 минут
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
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
    int data;
    struct x1 *next;
    struct x1 *prev;
 
} Node;
 
Node *createFunc()
{
    int num;
    Node *head;
    Node *prev, *next;
    printf("Enter how many nodes you want\n");
    scanf("%d", &num);
    for(;num;num--)
    {
        if(!head)
        {
            head = prev  = next = (Node*)malloc(num * sizeof(Node));
            head->data = 1;
            head->next = next;
            head->prev = prev;
        }
            next = (Node*)malloc(sizeof(Node));
            next->data = 1;
            next->prev = prev;
            prev->next = next;
            prev = next;
 
    }
    return head;
}
 
int main()
{
    Node *ptr;
    ptr = createFunc();
 
    return 0;
}
написал все таки но что то не правильно а понять что не могу
подскажите плиз
Ответ: nwhta, посмотри написано и нарисовано, как должно работать.
А можно посмотреть примеры, ссылка на стек, но можешь пошариться по сайту и найти списки, деки,...