Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
adelok
1 / 1 / 1
Регистрация: 23.12.2010
Сообщений: 136
1

Добавление, вставка и удаления элемента структуры

01.02.2012, 14:10. Просмотров 2793. Ответов 27
Метки нет (Все метки)

добавить операции добавление, вставка и удаления элемента с интерактивного меню

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
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
#define STR_LEN 64
typedef struct str
{
    char name[STR_LEN];
    char exp[STR_LEN];
    unsigned long size;
    int day;
    int mon;
    int year;
} str_t;
 
int name_c(const void * a, const void * b){
    return strcmp(((str_t*)a)->name, ((str_t*)b)->name);
}
 
int exp_c(const void * a, const void * b){
    return strcmp(((str_t*)a)->exp, ((str_t*)b)->exp);
}
 
int size_c(const void * a, const void * b){
    return ((str_t*)a)->size - ((str_t*)b)->size;
}
 
int day_c(const void * a, const void * b){
    return ((str_t*)a)->day - ((str_t*)b)->day;
}
 
int mon_c(const void * a, const void * b){
    return ((str_t*)a)->mon - ((str_t*)b)->mon;
}
 
int year_c(const void * a, const void * b){
    return ((str_t*)a)->year - ((str_t*)b)->year;
}
int name_d(const void * b, const void * a){
    return strcmp(((str_t*)a)->name, ((str_t*)b)->name);
}
 
int exp_d(const void * b, const void * a){
    return strcmp(((str_t*)a)->exp, ((str_t*)b)->exp);
}
 
int size_d(const void * b, const void * a){
    return ((str_t*)a)->size - ((str_t*)b)->size;
}
 
int day_d(const void * b, const void * a){
    return ((str_t*)a)->day - ((str_t*)b)->day;
}
 
int mon_d(const void * b, const void * a){
    return ((str_t*)a)->mon - ((str_t*)b)->mon;
}
 
int year_d(const void * b, const void * a){
    return ((str_t*)a)->year - ((str_t*)b)->year;
}
 
void show(const str_t * arr, size_t cnt){
        printf("Name               Exp          Size       Date \n");
    while ( cnt-- ){
        printf("%-20s%-5s%10u%10i%5i.%i.%i\n", arr->name, arr->exp, arr->size, arr->day, arr->mon, arr->year);
        ++arr;
    }
}
 
#define NUM_FILES 4
 
int main(void)
{
    str_t a[NUM_FILES];
    int i,s;
    int j=0;
 
    for(i=0; i < NUM_FILES; i++)
    {
    printf("file #%i\n", i+1);
    printf("enter name: ");
    scanf("%s", &a[i].name);
    printf("enter expansion: ");
    scanf("%s", &a[i].exp);
    printf("enter size: ");
    scanf("%lu", &a[i].size);
    printf("date: ");
    printf("enter day:");
    scanf("%i", &a[i].day);
    printf("enter month:");
    scanf("%i", &a[i].mon);
    printf("enter year:");
    scanf("%i", &a[i].year);
    }
    printf("\n Unsorted \n");
    show(a, NUM_FILES);
    printf("\n Choose function:\n ");
    printf("\n 1. To sort by name.\n ");
    printf("\n 2. To sort by expansion. \n ");
    printf("\n 3. To sort by size. \n ");
    printf("\n 4. To sort by date. \n ");
    printf("\n 5. To sort by name (rev).\n ");
    printf("\n 6. To sort by expansion (rev). \n ");
    printf("\n 7. To sort by size (rev). \n ");
    printf("\n 8. To sort by date (rev). \n ");
    printf("\n 9. To show common size. \n ");
    printf("\n 0. To close. \n ");
    do
    {
    scanf("%i", &s);
    switch(s)
    {
    case 1:
    printf("\n Sorted by name: \n");
    qsort(a, NUM_FILES, sizeof(str_t), name_c);
    show(a, NUM_FILES);
    break;
    case 2:
    printf("\n Sorted by expansion: \n");
    qsort(a, NUM_FILES, sizeof(str_t), exp_c);
    show(a, NUM_FILES);
    break;
    case 3:
    printf("\n Sorted by size: \n");
    qsort(a, NUM_FILES, sizeof(str_t), size_c);
    show(a, NUM_FILES);
    break;
    case 4:
    printf("\n Sorted by date: \n");
    qsort(a, NUM_FILES, sizeof(str_t), day_c);
    qsort(a, NUM_FILES, sizeof(str_t), mon_c);
    qsort(a, NUM_FILES, sizeof(str_t), year_c);
    show(a, NUM_FILES);
    break;
    case 5:
    printf("\n Sorted by name (reverse): \n");
    qsort(a, NUM_FILES, sizeof(str_t), name_d);
    show(a, NUM_FILES);
    break;
    case 6:
    printf("\n Sorted by expansion (reverse): \n");
    qsort(a, NUM_FILES, sizeof(str_t), exp_d);
    show(a, NUM_FILES);
    break;
    case 7:
    printf("\n Sorted by size (reverse): \n");
    qsort(a, NUM_FILES, sizeof(str_t), size_d);
    show(a, NUM_FILES);
    break;
    case 8:
    printf("\n Sorted by date (reverse): \n");
    qsort(a, NUM_FILES, sizeof(str_t), day_d);
    qsort(a, NUM_FILES, sizeof(str_t), mon_d);
    qsort(a, NUM_FILES, sizeof(str_t), year_d);
    show(a, NUM_FILES);
    break;
    case 9:
    for(i=0; i < NUM_FILES; i++)
    j=j+a[i].size;
    printf("common size %i",j);
    case 0:
    break;
    }
    }while(s != 0);
    
        getch();
        return 0;
}
Добавлено через 2 часа 31 минуту
вот попытка добавления, но ругается на NUM_FILES=NUM_FILES+1;

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
case 10:
    NUM_FILES=NUM_FILES+1;
    printf("file #%i\n", NUM_FILES);
    printf("enter name: ");
    scanf("%s", &a[NUM_FILES].name);
    printf("enter expansion: ");
    scanf("%s", &a[NUM_FILES].exp);
    printf("enter size: ");
    scanf("%lu", &a[NUM_FILES].size);
    printf("date: ");
    printf("enter day:");
    scanf("%i", &a[NUM_FILES].day);
    printf("enter month:");
    scanf("%i", &a[NUM_FILES].mon);
    printf("enter year:");
    scanf("%i", &a[NUM_FILES].year);
    break;

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.02.2012, 14:10
Ответы с готовыми решениями:

Функция удаления элемента структуры
Здравствуйте, в этой функции может удаляться любой элемент, кроме первого, как...

Функция удаления элемента структуры
Здравствуйте, не могли бы подсказать, где я ошибся?( функция никак не хочет...

Структуры: добавление в бинарное дерево нового элемента
У меня возникло непонимание, как работают структуры. Ниже пример кода...

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

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

27
NoMasters
Псевдослучайный
1909 / 1120 / 90
Регистрация: 13.09.2011
Сообщений: 3,178
01.02.2012, 18:37 2
Это же макрос, как ты собираешься ему что-то присвоить? После обработки препроцессором твой код будет выглядеть как
C
1
4 = 4 + 1;
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
01.02.2012, 18:46 3
C
1
2
3
const temp = NUM_FILES + 1;
#undef NUM_FILES
#define NUM_FILES temp
0
adelok
1 / 1 / 1
Регистрация: 23.12.2010
Сообщений: 136
02.02.2012, 10:27  [ТС] 4
так лучше?

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
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
#define STR_LEN 64
typedef struct str
{
    char name[STR_LEN];
    char exp[STR_LEN];
    unsigned long size;
    int day;
    int mon;
    int year;
} str_t;
 
int name_c(const void * a, const void * b){
    return strcmp(((str_t*)a)->name, ((str_t*)b)->name);
}
 
int exp_c(const void * a, const void * b){
    return strcmp(((str_t*)a)->exp, ((str_t*)b)->exp);
}
 
int size_c(const void * a, const void * b){
    return ((str_t*)a)->size - ((str_t*)b)->size;
}
 
int day_c(const void * a, const void * b){
    return ((str_t*)a)->day - ((str_t*)b)->day;
}
 
int mon_c(const void * a, const void * b){
    return ((str_t*)a)->mon - ((str_t*)b)->mon;
}
 
int year_c(const void * a, const void * b){
    return ((str_t*)a)->year - ((str_t*)b)->year;
}
int name_d(const void * b, const void * a){
    return strcmp(((str_t*)a)->name, ((str_t*)b)->name);
}
 
int exp_d(const void * b, const void * a){
    return strcmp(((str_t*)a)->exp, ((str_t*)b)->exp);
}
 
int size_d(const void * b, const void * a){
    return ((str_t*)a)->size - ((str_t*)b)->size;
}
 
int day_d(const void * b, const void * a){
    return ((str_t*)a)->day - ((str_t*)b)->day;
}
 
int mon_d(const void * b, const void * a){
    return ((str_t*)a)->mon - ((str_t*)b)->mon;
}
 
int year_d(const void * b, const void * a){
    return ((str_t*)a)->year - ((str_t*)b)->year;
}
 
void show(const str_t * arr, size_t cnt){
        printf("File Name               Exp         Size       Date \n");
    while ( cnt-- ){
        printf("%i.%-20s%-5s%10u%10i%5i.%i.%i\n", arr, arr->name, arr->exp, arr->size, arr->day, arr->mon, arr->year);
        ++arr;
    }
}
 
#define NUM_FILES 4
 
int main(void)
{
    str_t a[NUM_FILES];
    int i,s,d;
    int j=0;
    d=NUM_FILES;
 
    for(i=0; i < NUM_FILES; i++)
    {
    printf("file #%i\n", i+1);
    printf("enter name: ");
    scanf("%s", &a[i].name);
    printf("enter expansion: ");
    scanf("%s", &a[i].exp);
    printf("enter size: ");
    scanf("%lu", &a[i].size);
    printf("date: ");
    printf("enter day:");
    scanf("%i", &a[i].day);
    printf("enter month:");
    scanf("%i", &a[i].mon);
    printf("enter year:");
    scanf("%i", &a[i].year);
    }
    printf("\n Unsorted \n");
    show(a, NUM_FILES);
    printf("\n Choose function:\n ");
    printf("\n 1. To sort by name.\n ");
    printf("\n 2. To sort by expansion. \n ");
    printf("\n 3. To sort by size. \n ");
    printf("\n 4. To sort by date. \n ");
    printf("\n 5. To sort by name (rev).\n ");
    printf("\n 6. To sort by expansion (rev). \n ");
    printf("\n 7. To sort by size (rev). \n ");
    printf("\n 8. To sort by date (rev). \n ");
    printf("\n 9. To show common size. \n ");
    printf("\n 10. To add file. \n ");
    printf("\n 0. To close. \n ");
    do
    {
    scanf("%i", &s);
    switch(s)
    {
    case 1:
    printf("\n Sorted by name: \n");
    qsort(a, d, sizeof(str_t), name_c);
    show(a, d);
    break;
    case 2:
    printf("\n Sorted by expansion: \n");
    qsort(a, d, sizeof(str_t), exp_c);
    show(a, d);
    break;
    case 3:
    printf("\n Sorted by size: \n");
    qsort(a, d, sizeof(str_t), size_c);
    show(a, d);
    break;
    case 4:
    printf("\n Sorted by date: \n");
    qsort(a, d, sizeof(str_t), day_c);
    qsort(a, d, sizeof(str_t), mon_c);
    qsort(a, d, sizeof(str_t), year_c);
    show(a, d);
    break;
    case 5:
    printf("\n Sorted by name (reverse): \n");
    qsort(a, d, sizeof(str_t), name_d);
    show(a, d);
    break;
    case 6:
    printf("\n Sorted by expansion (reverse): \n");
    qsort(a, d, sizeof(str_t), exp_d);
    show(a, d);
    break;
    case 7:
    printf("\n Sorted by size (reverse): \n");
    qsort(a, d, sizeof(str_t), size_d);
    show(a, d);
    break;
    case 8:
    printf("\n Sorted by date (reverse): \n");
    qsort(a, d, sizeof(str_t), day_d);
    qsort(a, d, sizeof(str_t), mon_d);
    qsort(a, d, sizeof(str_t), year_d);
    show(a, d);
    break;
    case 9:
    for(i=0; i < d; i++)
    j=j+a[i].size;
    printf("common size %i",j);
    break;
    case 10:
    d++;
    printf("file #%i\n", d);
    printf("enter name: ");
    scanf("%s", &a[d].name);
    printf("enter expansion: ");
    scanf("%s", &a[d].exp);
    printf("enter size: ");
    scanf("%lu", &a[d].size);
    printf("date: ");
    printf("enter day:");
    scanf("%i", &a[d].day);
    printf("enter month:");
    scanf("%i", &a[d].mon);
    printf("enter year:");
    scanf("%i", &a[d].year);
    break;
    case 0:
    break;
    }
    }while(s != 0);
 
        getch();
        return 0;
}
но после добавления элемента при сортировках бяку выводит

Добавлено через 14 часов 8 минут
вот эту строку можно без пробелов записать

C
1
        printf("File Name               Exp         Size       Date \n");
думаю в этом проблема
0
silent_1991
Эксперт С++
5011 / 3071 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
Завершенные тесты: 1
02.02.2012, 10:47 5
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Раз уж речь зашла о меню, предложу такой вариант: писалось всё это давненько, несколько спонтанно и исключительно в качестве болванки реального кода.
menu.h
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
#ifndef MENU_H
#define MENU_H
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
void check_ptr(void *ptr);
 
struct MenuNode;
 
typedef void (*item_type)(struct MenuNode *);
 
struct MenuNode
{
    char *title;
    item_type item;
    
    size_t submenus_count;
    struct MenuNode **submenus;
};
 
struct MenuNode *create_menu_node(const char *title, item_type item);
void free_menu_node(struct MenuNode *menu);
void free_menu(struct MenuNode *menu);
 
struct MenuNode *add_submenu(struct MenuNode *menu, const char *title, item_type item);
 
void print_menu(struct MenuNode *menu);
void menu_handler(struct MenuNode *menu);
 
#endif
menu.c
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
#include "menu.h"
 
void check_ptr(void *ptr)
{
    if (ptr == NULL)
    {
        fprintf(stderr, "Out of memory!\n");
        
        exit(-1);
    }
}
 
struct MenuNode *create_menu_node(const char *title, item_type item)
{
    struct MenuNode *menu;
    
    check_ptr((void *)(menu = (struct MenuNode *)malloc(sizeof(struct MenuNode))));
    
    check_ptr((void *)(menu->title = (char *)malloc((strlen(title) + 1) * sizeof(char))));
    strcpy(menu->title, title);
    
    menu->item = item;
    
    menu->submenus_count = 0;
    menu->submenus = NULL;
    
    return menu;
}
 
void free_menu_node(struct MenuNode *menu)
{
    free(menu->title);
    free(menu->submenus);
    free(menu);
}
 
void free_menu(struct MenuNode *menu)
{
    int i;
    
    for (i = 0; i < menu->submenus_count; ++i)
        free_menu(menu->submenus[i]);
    
    free_menu_node(menu);
}
 
struct MenuNode *add_submenu(struct MenuNode *menu, const char *title, item_type item)
{
    struct MenuNode *submenu = create_menu_node(title, item);
    
    if (menu->submenus_count == 0)
        check_ptr((void *)(menu->submenus = (struct MenuNode **)malloc(sizeof(struct MenuNode *))));
    else
        check_ptr((void *)(menu->submenus = (struct MenuNode **)realloc(menu->submenus, (menu->submenus_count + 1) * sizeof(struct MenuNode *))));
    
    menu->submenus[menu->submenus_count++] = submenu;
    
    return submenu;
}
 
void print_menu(struct MenuNode *menu)
{
    int i;
    
    printf("%s:\n", menu->title);
    
    for (i = 0; i < menu->submenus_count; ++i)
        printf("%d. %s\n", i + 1, menu->submenus[i]->title);
}
 
void menu_handler(struct MenuNode *menu)
{
    int c;
    
    if (menu->submenus_count == 0)
        menu->item(NULL);
    
    while (1)
    {
        print_menu(menu);
        printf("%d. Exit\n", menu->submenus_count + 1);
        printf("> ");
        scanf("%d", &c);
        
        if (!(c > 0 && c <= menu->submenus_count + 1))
        {
            printf("Invalid input! Try again\n");
            
            continue;
        }
        
        if (c == menu->submenus_count + 1)
            return;
        
        menu->submenus[c - 1]->item(menu->submenus[c - 1]);
    }
}
main.c
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
#include <stdio.h>
 
#include "menu.h"
 
void option11(struct MenuNode *dummy)
{
    printf("You have chosen option 1.1\n");
}
 
void option12(struct MenuNode *dummy)
{
    printf("You have chosen option 1.2\n");
}
 
void option21(struct MenuNode *dummy)
{
    printf("You have chosen option 2.1\n");
}
 
void option31(struct MenuNode *dummy)
{
    printf("You have chosen option 3.1\n");
}
 
void option32(struct MenuNode *dummy)
{
    printf("You have chosen option 3.2\n");
}
 
void option33(struct MenuNode *dummy)
{
    printf("You have chosen option 3.3\n");
}
 
int main(void)
{
    struct MenuNode *main_menu = create_menu_node("Main Menu", menu_handler);
    struct MenuNode *submenu = NULL;
    
    submenu = add_submenu(main_menu, "Option 1", menu_handler);
        add_submenu(submenu, "Option 1.1", option11);
        add_submenu(submenu, "Option 1.2", option12);
    submenu = add_submenu(main_menu, "Option 2", menu_handler);
        add_submenu(submenu, "Option 2.1", option21);
    submenu = add_submenu(main_menu, "Option 3", menu_handler);
        add_submenu(submenu, "Option 3.1", option31);
        add_submenu(submenu, "Option 3.2", option32);
        add_submenu(submenu, "Option 3.3", option33);
    
    main_menu->item(main_menu);
    
    free_menu(main_menu);
 
    return 0;
}
1
adelok
1 / 1 / 1
Регистрация: 23.12.2010
Сообщений: 136
02.02.2012, 11:35  [ТС] 6
case мне больше нравится
0
silent_1991
Эксперт С++
5011 / 3071 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
Завершенные тесты: 1
02.02.2012, 11:48 7
adelok, метод с деревьями куда гибче (и он, кстати, интуитивнее, хотя это кажется несколько парадоксальным на первый взгляд).
0
adelok
1 / 1 / 1
Регистрация: 23.12.2010
Сообщений: 136
03.02.2012, 09:46  [ТС] 8
у меня же проблема не в методе

Добавлено через 3 часа 28 минут
вывод со смещением идёт.... + какие смайлики и тд

Добавлено через 1 час 6 минут
есть у каво нить похожие примеры с добавлением, вставкой и удалением элемента структуры

Добавлено через 17 часов 6 минут
abnormal program termination как исправить?
0
adelok
1 / 1 / 1
Регистрация: 23.12.2010
Сообщений: 136
04.02.2012, 10:00  [ТС] 9
divide error ещё
помогите плз
0
adelok
1 / 1 / 1
Регистрация: 23.12.2010
Сообщений: 136
05.02.2012, 12:50  [ТС] 10
вот что пишет
0
Миниатюры
Добавление, вставка и удаления элемента структуры  
Том Ардер
Модератор
Эксперт по математике/физике
3835 / 2447 / 327
Регистрация: 15.06.2009
Сообщений: 4,471
05.02.2012, 16:28 11
Портится память:

Цитата Сообщение от adelok Посмотреть сообщение
void show(const str_t * arr, size_t cnt)
{ printf("File Name Exp Size Date \n");
while ( cnt-- )
{
printf("%i.%-20s%-5s%10u%10i%5i.%i.%i\n", arr, arr->name, arr->exp, arr->size, arr->day, arr->mon, arr->year);
++arr;
}
В параметре константа(макрос) при вызове

Цитата Сообщение от adelok Посмотреть сообщение
show(a, NUM_FILES);
Добавлено через 22 минуты
Только сейчас заметил:

Цитата Сообщение от adelok Посмотреть сообщение
str_t a[NUM_FILES];
int i,s,d;
int j=0;
d=NUM_FILES;
а потом при добавлении:
Цитата Сообщение от adelok Посмотреть сообщение
case 10:
d++;
printf("file #%i\n", d);
printf("enter name: ");
scanf("%s", &a[d].name);
Пишется в несуществующий элемент массива a[d]
0
adelok
1 / 1 / 1
Регистрация: 23.12.2010
Сообщений: 136
05.02.2012, 19:03  [ТС] 12
макрос можно прекратить использовать после присваивания d или даже вообще убрать

сдублировать массив рационально будет?
0
Том Ардер
Модератор
Эксперт по математике/физике
3835 / 2447 / 327
Регистрация: 15.06.2009
Сообщений: 4,471
05.02.2012, 19:43 13
Цитата Сообщение от adelok Посмотреть сообщение
сдублировать массив рационально будет?
Дело не в макросе. В массив надо добавлять элементы динамически, вместо статического определения. Варианты: массив указателей, или список. Второе лучше, ИМХО
0
adelok
1 / 1 / 1
Регистрация: 23.12.2010
Сообщений: 136
05.02.2012, 19:59  [ТС] 14
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
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
 
#define STR_LEN 64
typedef struct str
{
    int num;
    char name[STR_LEN];
    char exp[STR_LEN];
    int size;
    int day;
    int mon;
    int year;
} str_t;
 
int name_c(const void * a, const void * b){
    return strcmp(((str_t*)a)->name, ((str_t*)b)->name);
}
 
int exp_c(const void * a, const void * b){
    return strcmp(((str_t*)a)->exp, ((str_t*)b)->exp);
}
 
int size_c(const void * a, const void * b){
    return ((str_t*)a)->size - ((str_t*)b)->size;
}
 
int day_c(const void * a, const void * b){
    return ((str_t*)a)->day - ((str_t*)b)->day;
}
 
int mon_c(const void * a, const void * b){
    return ((str_t*)a)->mon - ((str_t*)b)->mon;
}
 
int year_c(const void * a, const void * b){
    return ((str_t*)a)->year - ((str_t*)b)->year;
}
int name_d(const void * b, const void * a){
    return strcmp(((str_t*)a)->name, ((str_t*)b)->name);
}
 
int exp_d(const void * b, const void * a){
    return strcmp(((str_t*)a)->exp, ((str_t*)b)->exp);
}
 
int size_d(const void * b, const void * a){
    return ((str_t*)a)->size - ((str_t*)b)->size;
}
 
int day_d(const void * b, const void * a){
    return ((str_t*)a)->day - ((str_t*)b)->day;
}
 
int mon_d(const void * b, const void * a){
    return ((str_t*)a)->mon - ((str_t*)b)->mon;
}
 
int year_d(const void * b, const void * a){
    return ((str_t*)a)->year - ((str_t*)b)->year;
}
 
void show(const str_t * arr, size_t cnt){
        printf("File Name                Exp           Size           Date \n");
    while ( cnt-- ){
        printf("%-5i%-20s%-5s%10i", arr->num, arr->name, arr->exp, arr->size);
        printf("%15i.%i.%i\n", arr->day, arr->mon, arr->year);
        ++arr;
    }
}
 
#define NUM_FILES 4
 
int main(void)
{
    str_t a[64];
    int i,s,d;
    int j=0;
    d=NUM_FILES;
 
    for(i=0; i < d; i++)
    {
    printf("file #%i\n", i+1);
    a[i].num=i+1;
    printf("enter name: ");
    scanf("%s", &a[i].name);
    printf("enter expansion: ");
    scanf("%s", &a[i].exp);
    printf("enter size: ");
    scanf("%i", &a[i].size);
    printf("date: ");
    printf("enter day:");
    scanf("%i", &a[i].day);
    printf("enter month:");
    scanf("%i", &a[i].mon);
    printf("enter year:");
    scanf("%i", &a[i].year);
    }
    printf("\n Unsorted \n");
    show(a, d);
    printf("\n Choose function:\n ");
    printf("\n 1. To sort by name.\n ");
    printf("\n 2. To sort by expansion. \n ");
    printf("\n 3. To sort by size. \n ");
    printf("\n 4. To sort by date. \n ");
    printf("\n 5. To sort by name (rev).\n ");
    printf("\n 6. To sort by expansion (rev). \n ");
    printf("\n 7. To sort by size (rev). \n ");
    printf("\n 8. To sort by date (rev). \n ");
    printf("\n 9. To show common size. \n ");
    printf("\n 10. To add file. \n ");
    printf("\n 0. To close. \n ");
    do
    {
    scanf("%i", &s);
    switch(s)
    {
    case 1:
    printf("\n Sorted by name: \n");
    qsort(a, d, sizeof(str_t), name_c);
    show(a, d);
    break;
    case 2:
    printf("\n Sorted by expansion: \n");
    qsort(a, d, sizeof(str_t), exp_c);
    show(a, d);
    break;
    case 3:
    printf("\n Sorted by size: \n");
    qsort(a, d, sizeof(str_t), size_c);
    show(a, d);
    break;
    case 4:
    printf("\n Sorted by date: \n");
    qsort(a, d, sizeof(str_t), day_c);
    qsort(a, d, sizeof(str_t), mon_c);
    qsort(a, d, sizeof(str_t), year_c);
    show(a, d);
    break;
    case 5:
    printf("\n Sorted by name (reverse): \n");
    qsort(a, d, sizeof(str_t), name_d);
    show(a, d);
    break;
    case 6:
    printf("\n Sorted by expansion (reverse): \n");
    qsort(a, d, sizeof(str_t), exp_d);
    show(a, d);
    break;
    case 7:
    printf("\n Sorted by size (reverse): \n");
    qsort(a, d, sizeof(str_t), size_d);
    show(a, d);
    break;
    case 8:
    printf("\n Sorted by date (reverse): \n");
    qsort(a, d, sizeof(str_t), day_d);
    qsort(a, d, sizeof(str_t), mon_d);
    qsort(a, d, sizeof(str_t), year_d);
    show(a, d);
    break;
    case 9:
    for(i=0; i < d; i++)
    j=j+a[i].size;
    printf("common size %i",j);
    break;
    case 10:
    d++;
    i=d;
    printf("file #%i\n", d);
    a[d].num=d+1;
    printf("enter name: ");
    scanf("%s", &a[i].name);
    printf("enter expansion: ");
    scanf("%s", &a[i].exp);
    printf("enter size: ");
    scanf("%lu", &a[i].size);
    printf("date: ");
    printf("enter day:");
    scanf("%i", &a[i].day);
    printf("enter month:");
    scanf("%i", &a[i].mon);
    printf("enter year:");
    scanf("%i", &a[i].year);
    break;
    case 0:
    break;
    }
    }while(s != 0);
 
        getch();
        return 0;
}
вот переделал немного. сделал незаполненный до конца массив. на выходе показывает файл с номером 0,а 5ого нет.
0
Том Ардер
Модератор
Эксперт по математике/физике
3835 / 2447 / 327
Регистрация: 15.06.2009
Сообщений: 4,471
05.02.2012, 21:10 15
Добавить
C
1
show(a, d);
в конец case 10: ( перед break)
1
adelok
1 / 1 / 1
Регистрация: 23.12.2010
Сообщений: 136
06.02.2012, 09:01  [ТС] 16
всё равно появляется файл с номером 0, который вообще не задавался
0
Миниатюры
Добавление, вставка и удаления элемента структуры  
adelok
1 / 1 / 1
Регистрация: 23.12.2010
Сообщений: 136
06.02.2012, 18:32  [ТС] 17
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
case 10:
    d++;
    i=d;
    printf("file #%i\n", d);
    a[d].num=d;
    printf("enter name: ");
    scanf("%s", &a[i].name);
    printf("enter expansion: ");
    scanf("%s", &a[i].exp);
    printf("enter size: ");
    scanf("%lu", &a[i].size);
    printf("date: ");
    printf("enter day:");
    scanf("%i", &a[i].day);
    printf("enter month:");
    scanf("%i", &a[i].mon);
    printf("enter year:");
    scanf("%i", &a[i].year);
    d++;
    show(a,d);
    break;
тут есть 5 файл, но появляется нулевой файл. массивы в си начинаются с нуля. может быть в show надо (cnt+1)-- или что то подобное

Добавлено через 7 часов 36 минут
может отдельную переменную завести на номер файла?

Добавлено через 1 час 2 минуты
попытки вставки и вызова по номеру. подправте

вставка:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
case 11:
    printf("enter position to paste:");
    d++;
    a[i].num=d;
    scanf("%i",&i);
    printf("enter name: ");
    scanf("%s", &a[i].name);
    printf("enter expansion: ");
    scanf("%s", &a[i].exp);
    printf("enter size: ");
    scanf("%lu", &a[i].size);
    printf("date: ");
    printf("enter day:");
    scanf("%i", &a[i].day);
    printf("enter month:");
    scanf("%i", &a[i].mon);
    printf("enter year:");
    scanf("%i", &a[i].year);
    show(a,d);
    break;
вызов по номеру
C
1
2
3
4
5
6
7
8
case 13:
    printf("enter number of file:");
    scanf("%i",&i);
    printf("File Name                Exp           Size           Date \n");
    printf("%-5i%-20s%-5s%10i", a[i].num, a[i].name, a[i].exp, a[i].size);
    printf("%15i.%i.%i\n", a[i].day, a[i].mon, a[i].year);
    break;
    case 0:
0
Том Ардер
Модератор
Эксперт по математике/физике
3835 / 2447 / 327
Регистрация: 15.06.2009
Сообщений: 4,471
06.02.2012, 21:26 18
Цитата Сообщение от adelok Посмотреть сообщение
case 10:
d++;
i=d;
printf("file #%i\n", d);
a[d].num=d;
Здесь обрабатывается a[5], а должно быть a[4]. Ошибка в логике действий. Надо:

C
1
2
3
 i=d++;
 printf("file #%i\n", d);
 a[i].num=d;  // i = 4, d = 5
Повторение
C
1
d++;
перед выводом массива убрать.

Добавлено через 59 минут
Цитата Сообщение от adelok Посмотреть сообщение
вставка:
Если под термином "вставка" понимается добавление элемента "внутрь" массива, то получилось не это, а затирание уже существующего элемента новыми данными, без увеличения размера массива. Для вставки элемента нужно часть массива сдвинуть на 1 к концу, чтобы освободилось место для нового элемента. И указать при этом как вставлять - после выбранного элемента или перед ним.

В коде уже много повторяющихся блоков - пора вводить новые функции, а не копировать код из одного места в другое.
1
adelok
1 / 1 / 1
Регистрация: 23.12.2010
Сообщений: 136
07.02.2012, 09:16  [ТС] 19
Цитата Сообщение от Том Ардер Посмотреть сообщение
Здесь обрабатывается a[5], а должно быть a[4]. Ошибка в логике действий. Надо:
Код C
1
2
3
*i=d++;
*printf("file #%i\n", d);
*a[i].num=d; *// i = 4, d = 5
Повторение
Код C
1
d++;
перед выводом массива убрать.
всё равно что то не то
0
Миниатюры
Добавление, вставка и удаления элемента структуры  
adelok
1 / 1 / 1
Регистрация: 23.12.2010
Сообщений: 136
07.02.2012, 11:44  [ТС] 20
вставка. не компилирует имя, расширение.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
case 11:
    printf("enter position to paste:");
    d++;
    scanf("%i",&m);
    for(i=d-1; i > m; i--)
    a[i+1].num=a[i].num;
    a[i+1].name=a[i].name;
    a[i+1].exp=a[i].exp;
    a[i+1].size=a[i].size;
    a[i+1].day=a[i].day;
    a[i+1].mon=a[i].mon;
    a[i+1].year=a[i].year;
    enter(a, m);
    show(a,d);
    break;
Добавлено через 2 часа 15 минут
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void enter(const str_t * arr, int i){
    printf("enter name: ");
    scanf("%s", &arr[i].name);
    printf("enter expansion: ");
    scanf("%s", &arr[i].exp);
    printf("enter size: ");
    scanf("%i", &arr[i].size);
    printf("date: ");
    printf("enter day:");
    scanf("%i", &arr[i].day);
    printf("enter month:");
    scanf("%i", &arr[i].mon);
    printf("enter year:");
    scanf("%i", &arr[i].year);
    }
добавление сделал и вроде норм

C
1
2
3
4
5
6
7
case 10:
    i=d++;
    printf("\n file #%i\n", d);
    a[i].num=d;
    enter(a, i);
    show(a,d);
    break;
показ файла тоже вроде

C
1
2
3
4
5
6
7
8
case 13:
    printf("\n enter number of file:");
    scanf("%i",&i);
    i--;
    printf("File Name                Exp           Size           Date \n");
    printf("%-5i%-20s%-5s%10i", a[i].num, a[i].name, a[i].exp, a[i].size);
    printf("%15i.%i.%i\n", a[i].day, a[i].mon, a[i].year);
    break;
0
07.02.2012, 11:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2012, 11:44

Добавление элемента после элемента с заданным ключом в однонаправленном списке
Здравствуйте! У меня неправильно работает функция insert, которая должна...

Разобрать код удаления элемента списка
есть структура: struct Book{ char title; char author; short pages;...

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


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

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

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