Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
alexlarichkin5
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
1

Функции работаты с массивом структур или с отдельной структурой через указатели

25.06.2016, 11:57. Просмотров 297. Ответов 12
Метки нет (Все метки)

Всем доброго времени суток. Я вот переписал код, но прога не работает. Не пойму почему. Помогите, пожалуйста.
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
342
343
344
345
346
347
348
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <Windows.h>
#include <string.h>
#include <locale.h>
 
#define TRUE 1
#define FALSE 0
#define ESC 27
 
struct date
{
    int d, m, y;
};
 
typedef struct Student
{
    char Name[80];
    struct date start; //дата поступления
    struct date end; //дата отчисления
    int i_isFull; // флаг: 0 - пустой, 1 - содержит данные
}myType;
 
int menu(),
getCleanElem(),
growArray(),
sortByName(const void*, const void*),
sortByStart(const void*, const void*),
sortByEnd(const void*, const void*),
addElement(),
showElement(int),
deleteElement(int),
editElement(int),
cleanElem(int),
gotoxy(int x, int y),
showAll(),
sortSelect();
myType  *createArray();
 
 
//-------------------------------------------------------------------------------------------------
char *gcp_lastError = NULL;                                                 // строка сообщений об ошибках
myType *structArray;                                                        // глобальный массив структур
int gi_arrSize;                                                             // и его размер
int gp_sortFuncArr[3];                                                      // массив из трех сортировок
 
int main()
{
    setlocale(LC_ALL, "Russian");
    structArray = createArray();                                            // динамическое выделение памяти для массива
    system("cls");
    while (menu() == TRUE);                                                 // рабочий цикл программы
    free(structArray);                                                      // очистка массива
    return 0;
}
 
myType* createArray()                                                       // возвращает указатель на массив структур
{                                                                           //
    printf("Введите количество элементов массива: ");                       //
    scanf_s("%d", &gi_arrSize);                                             //
    myType *tempPtr;    //
    tempPtr = (myType*)malloc(gi_arrSize * sizeof(myType));                 //
    int i;
    for (i = 0; i<gi_arrSize; i++)                                          // сдвигаем указатель по массиву
    {                                                                       // и присваиваем его элементам
        strcpy(tempPtr->start.d, tempPtr->start.m, tempPtr->start.y, "");
        strcpy(tempPtr->Name, "");
        strcpy(tempPtr->end.d, tempPtr->end.m, tempPtr->end.y, "");
        tempPtr->i_isFull = 0;
        tempPtr++;                                                          // значение эталонной структуры
    }                                                                       // затем сдвигаем указатель structArray
    tempPtr -= i;                                                           // в начало массива
    return tempPtr;                                                         // возвращает указатель на массив структур
}
 
int addElement()                                                           // добавить элемент
{                                                                           //
    editElement(growArray());                                               // редактировать элемент, номер которого
    return 0;
}
 
int showElement(int number)                                             // вывод выбранного элемента
{
    if (number < 0 || number >= gi_arrSize)
    {
        gcp_lastError = "Выход за пределы массива (showElement)";
        return;
    }
    myType *tempPtr = structArray + number;
    printf("|%3d|%20s|%20d|%10d\n",
        number,
        tempPtr->Name,
        tempPtr->start,
        tempPtr->end);
    gcp_lastError = "Ошибок не было (show)";
    return 0;
}
 
int showAll()
{
    int i = 0;
    for (; i<gi_arrSize; i++)
    {
        gotoxy(10, 15 + i);
        showElement(i);
    }
    return 0;
}
 
int editElement(int number)                                                // 
{                                                                           // 
    if (number<0 || number >= gi_arrSize)                                       // 
    {                                                                       // 
        gcp_lastError = "Выход за пределы массива (editElement)";           // 
        return;                                                             // 
    }                                                                       //
    myType *tempPtr = structArray + number;                                   // указатель ориентирую на выбранный элемент структуры
    printf("Введите ФИО: ");                                                // и запрашиваю новые данные полей
    scanf("%s", tempPtr->Name);                                         // 
    printf("Дата поступления: ");                                                   // 
    scanf("%d", tempPtr->start);                                    // 
    printf("Дата отчисления: ");                                                        // 
    scanf("%d", tempPtr->end);                                          // 
                                                                        
    tempPtr->i_isFull = 1;                                                  // 
    gcp_lastError = "Ошибок не было (edit)";                                // 
    return 0;                                                                 // 
}
 
int cleanElem(int number)
{
    if (number<0 || number >= gi_arrSize)                                       // 
    {                                                                       // 
        gcp_lastError = "Выход за пределы массива (clean)";                 // 
        return;                                                             // 
    }                                                                       //
    myType *tempPtr = structArray + number;
    if (tempPtr->i_isFull == 0)
    {
        gcp_lastError = "Элемент пуст (clean)";
        return;
    }
    strcpy(tempPtr->start.d, tempPtr->start.m, tempPtr->start.y, " ");
    strcpy(tempPtr->Name, " ");
    strcpy(tempPtr->end.d, tempPtr->end.m, tempPtr->end.y, " ");
    tempPtr->i_isFull = 0;
    gcp_lastError = "Ошибок не было (clean)";
    return 0;
    return 0;
}
 
int getCleanElem()
{
    int i = 0;
    for (; i<gi_arrSize; i++)
    {
        if (structArray->i_isFull == 0)
        {
            structArray -= i;
            return i;
        }
        structArray++;
    }
    structArray -= i;
    gcp_lastError = "Ошибок не было (getClean)";
    return -1;
}
 
int growArray()                                                             // вызывается при добавлении элемента в массив.
{
    gi_arrSize += 1;                                                        // увеличиваем размер будущего массива. |
    myType *tempPtr = (myType*)malloc((gi_arrSize) * sizeof(myType));           // динамическое выделение памяти        |
    int i = 0;                                                                  // под новый массив размера "size+1".   |
    for (; i<gi_arrSize - 1; i++)                                       // копирование всех                 |
    {                                                                       // элементов исходного массива      |
        *tempPtr++ = *structArray++;                                        // в новый путём сдвига указателей. |
    }                                                                       //
    tempPtr -= i;                                                           // сдвиг в начало массива временного и  |
    structArray -= i;                                                       // основного указателей.                |
    free(structArray);                                                      // освобождение памяти из-под старого массива   |
    structArray = tempPtr;                                                  // и ориентирование указателя на новый          |
    return gi_arrSize - 1;
}
 
int deleteElement(int number)
{
    if (number < 0 || number >= gi_arrSize)
    {
        gcp_lastError = "Выход за пределы массива (deleteElement)";
        return;
    }
    int i = number;
    for (; i<gi_arrSize - 1; i++)
    {
        structArray[i] = structArray[i + 1];
    }
    cleanElem(i);                                                           // очистка последнего элемента после сдвига
    gcp_lastError = "Ошибок не было (delete)";
    return 0;
}
 
int sortSelect()                                                                // сортировка массива по полям
{
    gp_sortFuncArr[0] = sortByName;                                             // заполняю массив сортировок
    gp_sortFuncArr[1] = sortByStart;                                                //
    gp_sortFuncArr[2] = sortByEnd;                                          //
            
    int choice;                                                             //  
    choice = _getch();
    if (choice < '1' || choice > '4')
    {
        gcp_lastError = "Не верный выбор (sortBy)";
        return;
    }
    choice = choice - '0';                                                      // 
    qsort(structArray, gi_arrSize, sizeof(myType), gp_sortFuncArr[choice - 1]); // вызов библиотечной сортировки
    gcp_lastError = "Ошибок не было (sortBy)";                                  // с выбранным полем сортировки
    return 0;
}
 
int sortByName(const void *arg1, const void *arg2)
{
    myType *one = (myType*)arg1;
    myType *two = (myType*)arg2;
    return strcmp(one->Name, two->Name);                                    // сравнение двух строк (библ.функция)
}
 
int sortByStart(const void *arg1, const void *arg2)
{
    myType *one = (myType*)arg1;
    myType *two = (myType*)arg2;
    return strcmp(one->start.d, two->start.d);                              // сравнение двух строк (библ.функция)
}
 
int sortByEnd(const void *arg1, const void *arg2)
{
    myType *one = (myType*)arg1;
    myType *two = (myType*)arg2;
    return strcmp(one->end.d, two->end.d);                      // сравнение двух строк (библ.функция)
}
 
int gotoxy(int xpos, int ypos)
{
    COORD scrn;
    HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);
    scrn.X = xpos; scrn.Y = ypos;
    SetConsoleCursorPosition(hOuput, scrn);
    return 0;
}
 
int menu()
{
    system("cls");
    printf("Размер массива: %d\t"
        "Сообщения об ошибках: %s\n", gi_arrSize, gcp_lastError);
    printf("\t1 - добавить строку\n"
        "\t2 - вывод строки\n"
        "\t3 - изменение элемента\n"
        "\t4 - удаление элемента со сдвигом\n"
        "\t5 - очистка элемента\n"
        "\t6 - вывод свободного элемента\n"
        "\t0 - сортировка массива по значениям полей\n"
        "\tESC - выход\n");
    gotoxy(10, 14);
    printf("|  №|        Фамилия И.О.|           Дата поступления|    Дата отчисления");
    showAll();                                                              // вывод всех элементов
    char choice;
    choice = _getch();
    int number,                                                             // номер элемента/"пустого" элемента
        value;
 
    switch (choice)
    {
    case '1':
        addElement();
        break;
    case '2':
        printf("Номер элемента для вывода: ");
        scanf_s("%d", &number);
        if (number < 0 || number >= gi_arrSize)
        {
            gcp_lastError = "Выход за пределы массива (show)";
            break;
        }
        if ((structArray + number)->i_isFull = 0)
        {
            gcp_lastError = "Элемент пуст (show)";
            break;
        }
        system("cls");
        gotoxy(10, 12);
        printf("Содержимое %d-го элемента маcсива: \n", number);
        gotoxy(10, 14);
        printf("|  №|        Фамилия И.О.|           Дата поступления|    Дата отчисления");
        gotoxy(10, 15 + number);
        showElement(number);
        _getch();
        break;
    case '3':
        printf("Номер элемента для изменения: ");
        scanf_s("%d", &number);
        editElement(number);
        break;
    case '4':
        printf("Номер элемента для удаления: ");
        scanf_s("%d", &number);
        deleteElement(number);
        break;
    case '5':
        printf("Номер элемента для очистки: ");
        scanf_s("%d", &number);
        cleanElem(number);
        break;
    case '6':
        number = getCleanElem();                                            // функция вернёт номер пустого
        if (number < 0)                                                     // или -1, если такого нет
        {
            system("cls");
            gotoxy(20, 10);
            printf("Пустых элементов нет!");
            _getch();
            break;
        }
        system("cls");
        gotoxy(35, 12);
        printf("Пустой элемент №: %d", number);
        gotoxy(10, 14);
        printf("|  №|        Фамилия И.О.|           Дата поступления|    Дата отчисления\n");
        gotoxy(10, 15 + number);
        showElement(number);
        _getch();
        break;
    case '0':
        gotoxy(0, 22);
        printf("\tВариант сортировки: \n"
            "\t1 - по фамилии"
            "\t2 - по дате поступления"
            "\t3 - по дате отчисления");
        sortSelect();
        break;
    case ESC:
        return FALSE;
        break;
    }
    return TRUE;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2016, 11:57
Ответы с готовыми решениями:

Работа с массивом через пользовательские функции через указатели
Не хочет работать ( Выводит только последний элемент массива ) Help! ...

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

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

Указатели на функцию. Вызов функции через указатель
Вот у меня имеется функция int *f(int *) и имеется вот такой указатель int...

Передать функции структуру из массива структур или указатель на неё
передать функции структуру из массива структур или указатель на неё в качестве...

12
magirus
Почетный модератор
Эксперт по компьютерным сетямЭксперт Windows
27954 / 15675 / 959
Регистрация: 15.09.2009
Сообщений: 67,837
Записей в блоге: 78
25.06.2016, 12:09 2
Цитата Сообщение от alexlarichkin5 Посмотреть сообщение
Я вот переписал код, но прога не работает
откуда переписал, куда, какое условие задачи?
0
alexlarichkin5
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
25.06.2016, 12:28  [ТС] 3
Определить структурированный тип, определить набор функций для работы с массивом структур. В структурированной переменной предусмотреть способ отметки ее как не содержащей данных (т.е. "пустой"). Функции должны работать с массивом структур или с отдельной структурой через указатели, а также при необходимости возвращать указатель на структуру. В перечень функций входят:
- «очистка» структурированных переменных;
- поиск свободной структурированной переменной;
- ввод элементов (полей) структуры с клавиатуры;
- вывод элементов (полей) структуры с клавиатуры;
- поиск в массиве структуры и минимальным значением заданного поля;
- сортировка массива структур в порядке возрастания заданного поля (при сортировке можно использовать тот факт, что в Си++ разрешается присваивание структурированных переменных);
- поиск в массиве структур элемента с заданным значением поля или с наиболее близким к нему по значению.
- удаление заданного элемента;
- изменение (редактирование) заданного элемента.
- вычисление с проверкой и использованием всех элементов массива по заданному условию и формуле (например, общая сумма на всех счетах) - дается индивидуально.
вариант 10. Фамилия И.О., дата поступления, дата отчисления.
Вот условие задачи. Переписал потому, что предыдущий код был неправильным.
0
easybudda
Модератор
Эксперт CЭксперт С++
10119 / 6026 / 1511
Регистрация: 25.07.2009
Сообщений: 11,418
25.06.2016, 13:15 4
Цитата Сообщение от alexlarichkin5 Посмотреть сообщение
прога не работает.
Оптимистично... У меня это и скомпилировать не получилось. Ошибок там, как у дурака махорки. Вот например:
Цитата Сообщение от alexlarichkin5 Посмотреть сообщение
C
1
2
3
4
5
6
int sortByName(const void *arg1, const void *arg2) 
{
    myType *one = (myType*)arg1; 
    myType *two = (myType*)arg2; 
    return strcmp(one->Name, two->Name); // сравнение двух строк (библ.функция) 
}
Всё правильно - сравнение объектов структуры myType (отличное, кстати, название для типа данных) по текстовому полю Name. И сразу следом:
Цитата Сообщение от alexlarichkin5 Посмотреть сообщение
C
1
2
3
4
5
6
int sortByStart(const void *arg1, const void *arg2) 
{
    myType *one = (myType*)arg1; 
    myType *two = (myType*)arg2; 
    return strcmp(one->start.d, two->start.d); // сравнение двух строк (библ.функция) <- ЧЕВО?!! 8[=] 
}
Вы точно понимаете, что делаете?
Цитата Сообщение от alexlarichkin5 Посмотреть сообщение
C
1
strcpy(tempPtr->start.d, tempPtr->start.m, tempPtr->start.y, " ");
В свете вышесказанного вот это тоже строка-загадка. Это у Вас что происходить должно?
0
alexlarichkin5
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
25.06.2016, 13:54  [ТС] 5
Ну это копирование даты. Компилятор подчеркивает красным tempPtr и one и two. Я не понимаю почему.
0
liv
553 / 474 / 143
Регистрация: 07.10.2015
Сообщений: 1,594
Завершенные тесты: 1
25.06.2016, 14:32 6
Цитата Сообщение от easybudda Посмотреть сообщение
Вы точно понимаете, что делаете?
Цитата Сообщение от alexlarichkin5 Посмотреть сообщение
Переписал потому, что предыдущий код был неправильным
Даже сложно представить, что было в прошлом варианте...
0
alexlarichkin5
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
25.06.2016, 14:41  [ТС] 7
Вместо того, чтобы судить меня, лучше помогли бы исправить ошибки в коде.
0
easybudda
Модератор
Эксперт CЭксперт С++
10119 / 6026 / 1511
Регистрация: 25.07.2009
Сообщений: 11,418
25.06.2016, 15:10 8
Цитата Сообщение от alexlarichkin5 Посмотреть сообщение
лучше помогли бы исправить ошибки в коде
Да там столько всего... Во-первых если объявляете свою структуру для хранения даты, понадобится функция сравнения двух объектов этой структуры, возвращающая отрицательное число, если первый объект "меньше", положительное число, если первый объект "больше", и 0, если объекты равны. Во-вторых глобальные переменные - это вообще не есть хорошо, но это пол-беды. Вот такое объявление:
Цитата Сообщение от alexlarichkin5 Посмотреть сообщение
C
1
int gp_sortFuncArr[3]; // массив из трех сортировок
на самом деле массив из трёх чисел типа int, а не трёх указателей на функции (пусть и возвращающие int).
В-третьих спрашивать из функции создания массива, сколько в нём должно быть элементов - тоже по сути странное занятие (это должно бы параметром передаваться), но ещё куда более странно то, как Вы эти новые элементы инициализировать пытаетесь.
Как с означенными тремя пунктами разберётесь, дальше должно попроще быть...
0
liv
553 / 474 / 143
Регистрация: 07.10.2015
Сообщений: 1,594
Завершенные тесты: 1
25.06.2016, 16:26 9
alexlarichkin5, вот, привел к более-менее приемлемому виду... Хотя, по большому счету, еще править и править...
Сравните текст самостоятельно.
Кстати, обратите внимание, что для ввода даты надо ввести три числа, разделенных пробелом.
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
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
/*
Определить структурированный тип, определить набор функций для работы с массивом структур. 
В структурированной переменной предусмотреть способ отметки ее как не содержащей данных 
(т.е. "пустой"). Функции должны работать с массивом структур или с отдельной структурой 
через указатели, а также при необходимости возвращать указатель на структуру. 
В перечень функций входят:
- «очистка» структурированных переменных;
- поиск свободной структурированной переменной;
- ввод элементов (полей) структуры с клавиатуры;
- вывод элементов (полей) структуры с клавиатуры;
- поиск в массиве структуры и минимальным значением заданного поля;
- сортировка массива структур в порядке возрастания заданного поля (при сортировке можно 
  использовать тот факт, что в Си++ разрешается присваивание структурированных переменных);
- поиск в массиве структур элемента с заданным значением поля или 
  с наиболее близким к нему по значению. 
- удаление заданного элемента;
- изменение (редактирование) заданного элемента.
- вычисление с проверкой и использованием всех элементов массива по заданному условию 
  и формуле (например, общая сумма на всех счетах) - дается индивидуально.
вариант 10. Фамилия И.О., дата поступления, дата отчисления.
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <Windows.h>
#include <string.h>
#include <locale.h>
 
#define TRUE 1
#define FALSE 0
#define ESC 27
 
struct date
{
    int d, m, y;
};
 
typedef struct Student
{
    char Name[80];
    struct date start; //дата поступления
    struct date end; //дата отчисления
    int i_isFull; // флаг: 0 - пустой, 1 - содержит данные
}myType;
 
int menu(),
getCleanElem(),
growArray(),
sortByName(const void*, const void*),
sortByStart(const void*, const void*),
sortByEnd(const void*, const void*),
addElement(),
showElement(int),
deleteElement(int),
editElement(int),
cleanElem(int),
gotoxy(int x, int y),
showAll(),
sortSelect();
myType  *createArray();
 
 
//-------------------------------------------------------------------------------------------------
char *gcp_lastError = NULL;                                                 // строка сообщений об ошибках
myType *structArray;                                                        // глобальный массив структур
int gi_arrSize;                                                             // и его размер
int gp_sortFuncArr[3];                                                      // массив из трех сортировок
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    structArray = createArray();                                            // динамическое выделение памяти для массива
    while (menu() == TRUE);                                                 // рабочий цикл программы
    free(structArray);                                                      // очистка массива
    return 0;
}
 
myType* createArray()                                                       // возвращает указатель на массив структур
{                                                                           //
    printf("Введите количество элементов массива: ");                       //
    scanf("%d", &gi_arrSize);                                             //
    return (myType*)calloc(gi_arrSize, sizeof(myType));                                                         // возвращает указатель на массив структур
}
 
int addElement()                                                           // добавить элемент
{                                                                           //
    editElement(growArray());                                               // редактировать элемент, номер которого
    return 0;
}
 
int showElement(int number)                                             // вывод выбранного элемента
{
    if (number < 0 || number >= gi_arrSize)
    {
        gcp_lastError = "Выход за пределы массива (showElement)";
        return 1;
    }
    myType *tempPtr = &structArray[number];
    printf("|%3d|%20s|         %.2d.%.2d.%.2d |        %.2d.%.2d.%.2d\n",
        number,
        tempPtr->Name,
        tempPtr->start.d,tempPtr->start.m,tempPtr->start.y,
        tempPtr->end,tempPtr->end.m,tempPtr->end.y);
    gcp_lastError = "Ошибок не было (show)";
    return 0;
}
 
int showAll()
{
    int j = 0;
    for (int i=0; i<gi_arrSize; i++)
    {
//      if (structArray[i].i_isFull)
//      {
            gotoxy(0, 15 + j++);
            showElement(i);
//      }
    }
    return 0;
}
 
int editElement(int number)                                                // 
{                                                                           // 
    if (number<0 || number >= gi_arrSize)                                       // 
    {                                                                       // 
        gcp_lastError = "Выход за пределы массива (editElement)";           // 
        return 1;                                                             // 
    }                                                                       //
    myType *tempPtr = &structArray[number];                                  // указатель ориентирую на выбранный элемент структуры
    printf("Введите ФИО: ");                                                // и запрашиваю новые данные полей
    scanf("%s", tempPtr->Name);                                         // 
    printf("Дата поступления: ");                                                   // 
    scanf("%d %d %d", &tempPtr->start.d, &tempPtr->start.m, &tempPtr->start.y);                                    // 
    printf("Дата отчисления: ");                                                        // 
    scanf("%d %d %d", &tempPtr->end.d, &tempPtr->end.m, &tempPtr->end.y);                                    // 
                                                                        
    tempPtr->i_isFull = 1;                                                  // 
    gcp_lastError = "Ошибок не было (edit)";                                // 
    return 0;                                                                 // 
}
 
int cleanElem(int number)
{
    if (number<0 || number >= gi_arrSize)                                       // 
    {                                                                       // 
        gcp_lastError = "Выход за пределы массива (clean)";                 // 
        return 1;                                                             // 
    }                                                                       //
    myType *tempPtr = &structArray[number];
    if (tempPtr->i_isFull == 0)
    {
        gcp_lastError = "Элемент пуст (clean)";
        return 2;
    }
    ZeroMemory(tempPtr, sizeof(myType));
    gcp_lastError = "Ошибок не было (clean)";
    return 0;
}
 
int getCleanElem()
{
    for (int i=0; i<gi_arrSize; i++)
    {
        if (structArray[i].i_isFull == 0)
        {
            return i;
        }
    }
    gcp_lastError = "Ошибок не было (getClean)";
    return -1;
}
 
int growArray()                                                             // вызывается при добавлении элемента в массив.
{
    myType *tempPtr = (myType*)realloc(structArray, (++gi_arrSize) * sizeof(myType));           // динамическое выделение памяти        |
    return gi_arrSize-1;
}
 
int deleteElement(int number)
{
    if (number < 0 || number >= gi_arrSize)
    {
        gcp_lastError = "Выход за пределы массива (deleteElement)";
        return 1;
    }
    int i = number;
    for (; i<gi_arrSize - 1; i++)
    {
        structArray[i] = structArray[i + 1];
    }
    cleanElem(i);                                                           // очистка последнего элемента после сдвига
    gcp_lastError = "Ошибок не было (delete)";
    return 0;
}
 
int sortSelect()                                                                // сортировка массива по полям
{
    switch (_getch())
    {
        case '1':
            qsort(structArray, gi_arrSize, sizeof(myType), sortByName);
            break   ;
        case '2':
            qsort(structArray, gi_arrSize, sizeof(myType), sortByStart);
            break   ;
        case '3':
            qsort(structArray, gi_arrSize, sizeof(myType), sortByEnd);
            break;
        default:
            gcp_lastError = "Не верный выбор (sortBy)";
            return 1;
    }
    gcp_lastError = "Ошибок не было (sortBy)";                                  // с выбранным полем сортировки
    return 0;
}
 
int sortByName(const void *arg1, const void *arg2)
{
    myType *one = (myType*)arg1;
    myType *two = (myType*)arg2;
    return strcmp(one->Name, two->Name);                                    // сравнение двух строк (библ.функция)
}
 
int datecmp(date *d1, date *d2)
{
    if (d1->y < d2->y)
        return -1;
    else if (d1->y > d2->y)
        return 1;
    else if (d1->m < d2->m)
        return -1;
    else if (d1->m > d2->m)
        return 1;
    else if (d1->d < d2->d)
        return -1;
    else if (d1->d > d2->d)
        return 1;
    else
        return 0;
}
 
int sortByStart(const void *arg1, const void *arg2)
{
    myType *one = (myType*)arg1;
    myType *two = (myType*)arg2;
    return datecmp(&one->start, &two->start);
}
 
int sortByEnd(const void *arg1, const void *arg2)
{
    myType *one = (myType*)arg1;
    myType *two = (myType*)arg2;
    return datecmp(&one->end, &two->end);
}
 
int gotoxy(int xpos, int ypos)
{
    COORD scrn;
    HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);
    scrn.X = xpos; scrn.Y = ypos;
    SetConsoleCursorPosition(hOuput, scrn);
    return 0;
}
 
int menu()
{
    system("cls");
    printf("Размер массива: %d\t"
        "Сообщения об ошибках: %s\n", gi_arrSize, gcp_lastError);
    printf("\t1 - добавить строку\n"
        "\t2 - вывод строки\n"
        "\t3 - изменение элемента\n"
        "\t4 - удаление элемента со сдвигом\n"
        "\t5 - очистка элемента\n"
        "\t6 - вывод свободного элемента\n"
        "\t0 - сортировка массива по значениям полей\n"
        "\tESC - выход\n");
    gotoxy(0, 14);
    printf("|  №|        Фамилия И.О.| Дата поступления | Дата отчисления");
    showAll();                                                              // вывод всех элементов
    gotoxy(0, 10);
    char choice;
    choice = _getch();
    int number;                                                             // номер элемента/"пустого" элемента
 
    switch (choice)
    {
    case '1':
        addElement();
        break;
    case '2':
        printf("Номер элемента для вывода: ");
        scanf("%d", &number);
        if (number < 0 || number >= gi_arrSize)
        {
            gcp_lastError = "Выход за пределы массива (show)";
            break;
        }
        if (structArray[number].i_isFull = 0)
        {
            gcp_lastError = "Элемент пуст (show)";
            break;
        }
        system("cls");
        gotoxy(0, 12);
        printf("Содержимое %d-го элемента маcсива:", number);
        gotoxy(0, 13);
        printf("|  №|        Фамилия И.О.| Дата поступления | Дата отчисления");
        gotoxy(0, 14 + number);
        showElement(number);
        _getch();
        break;
    case '3':
        printf("Номер элемента для изменения: ");
        scanf("%d", &number);
        editElement(number);
        break;
    case '4':
        printf("Номер элемента для удаления: ");
        scanf("%d", &number);
        deleteElement(number);
        break;
    case '5':
        printf("Номер элемента для очистки: ");
        scanf("%d", &number);
        cleanElem(number);
        break;
    case '6':
        number = getCleanElem();                                            // функция вернёт номер пустого
        if (number < 0)                                                     // или -1, если такого нет
        {
            system("cls");
            gotoxy(20, 10);
            printf("Пустых элементов нет!");
            _getch();
            break;
        }
        system("cls");
        gotoxy(30, 12);
        printf("Пустой элемент №: %d", number);
        gotoxy(0, 14);
        printf("|  №|        Фамилия И.О.| Дата поступления | Дата отчисления\n");
        gotoxy(0, 15 + number);
        showElement(number);
        _getch();
        break;
    case '0':
        gotoxy(0, 22);
        printf("\tВариант сортировки: \n"
            "\t1 - по фамилии"
            "\t2 - по дате поступления"
            "\t3 - по дате отчисления");
        sortSelect();
        break;
    case ESC:
        return FALSE;
        break;
    }
    return TRUE;
}
0
alexlarichkin5
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
25.06.2016, 16:58  [ТС] 10
В 178 строке непонятная ошибка. Из-за неё прога вылетает.
0
liv
553 / 474 / 143
Регистрация: 07.10.2015
Сообщений: 1,594
Завершенные тесты: 1
25.06.2016, 17:03 11
alexlarichkin5, должно быть так:
C++
1
structArray = (myType*)realloc(structArray, (++gi_arrSize) * sizeof(myType));
0
alexlarichkin5
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
25.06.2016, 17:25  [ТС] 12
Вылетает, если в графе "Введите количество элементов массива" ввести "0".

Добавлено через 11 минут
Работает. Спасибо.
0
alexlarichkin5
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
25.06.2016, 17:43  [ТС] 13
А первую лабу не поможете сделать?
Вот условие.
Вариант задания реализовать в виде функции, использующей для работы со строкой только указатели и операции вида *p++, p++ и т.д. Если функция возвращает строку или ее фрагмент, то это также необходимо сделать через указатель.
Вариант 10. Функция находит в строке самое первое (по алфавиту) слово. С ее помощью реализовать размещение слов в выходной строке в алфавитном порядке.
Вот код. Только я не пойму как отсортировать слова. Помогите, пожалуйста.
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
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define N 100
 
void sort(char A[]);
 
void main()
{
    char A[N];
    printf("String: ");
    fgets(A, N, stdin);
    sort(A);
    _getch();
}
 
void sort(char A[])
{
    char *p = A;
    p++;
    if (*(p + 1) == 'a')
    {
        char tmp;
        tmp = *(p + 1);
        *(p + 1) = *(p - 1);
        *(p - 1) = tmp;
        }
    printf("Result: ");
    p++;
    printf("%s", A);
}
Прога работает, но слова не сортирует.
http://www.cyberforum.ru/attachment....1&d=1466865761
0
Миниатюры
Функции работаты с массивом структур или с отдельной структурой через указатели  
25.06.2016, 17:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2016, 17:43

Работа с массивом, содержащим указатели на начала строк
Всем доброго времени суток! Вообщем дан массив указателей на строки char...

Массив структур. Работа с массивом через функции
Здравствуйте! Дано задание: 1) создать массив структур 2) заполнить его через...

Работа с массивом структур в функции через указатель на этот массив
Добрый вечер. Имеется следующая задача: &quot;Разработайте программу, сохраняющую...


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

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

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