Форум программистов, компьютерный форум, киберфорум
Наши страницы

C для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.70
adelok
1 / 1 / 1
Регистрация: 23.12.2010
Сообщений: 136
#1

Добавление, вставка и удаления элемента структуры - C (СИ)

01.02.2012, 14:10. Просмотров 2618. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Добавление, вставка и удаления элемента структуры (C (СИ)):

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

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

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

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

Разобрать код удаления элемента списка - C (СИ)
есть структура: struct Book{ char title; char author; short pages; double price; }; и функция которая удаляет этот...

Процедура удаления элемента из списка выдает ошибку - C (СИ)
Процедура удаления элемента из списка, в первой же строке ошибка &quot;Необработанное исключение по адресу 0x0FFA4280 (msvcr120d.dll) в...

27
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
Том Ардер
Модератор
Эксперт по математике/физике
3776 / 2389 / 304
Регистрация: 15.06.2009
Сообщений: 4,310
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
Том Ардер
Модератор
Эксперт по математике/физике
3776 / 2389 / 304
Регистрация: 15.06.2009
Сообщений: 4,310
07.02.2012, 13:01 #21
Цитата Сообщение от adelok Посмотреть сообщение
printf("enter position to paste:");
d++;
scanf("%i",&m);
for(i=d-1; i > m; i--)
Нечётко. Если здесь m - номер позиции (1, 2, ...), на которую нужно вставить элемент, то соответствующий индекс m - 1 (0, 1, ...). И заголовок цикла надо так:
C
1
for(i=d-1; i >= m - 1; i--)
1
adelok
1 / 1 / 1
Регистрация: 23.12.2010
Сообщений: 136
07.02.2012, 19:39  [ТС] #22
а если ругается на name и exp(видимо потому что они char) Lvalue required, что сделать?
0
Том Ардер
Модератор
Эксперт по математике/физике
3776 / 2389 / 304
Регистрация: 15.06.2009
Сообщений: 4,310
07.02.2012, 20:03 #23
Цитата Сообщение от adelok Посмотреть сообщение
a[i+1].name=a[i].name;
a[i+1].exp=a[i].exp;


В левой части оператора = массивы запрещены. (Lvalue !)
C
1
2
strcpy( a[i+1].name, a[i].name );
strcpy( a[i+1].exp, a[i].exp );
1
adelok
1 / 1 / 1
Регистрация: 23.12.2010
Сообщений: 136
07.02.2012, 21:01  [ТС] #24
а удаление как сделать?обнулить элементы номера и в конец массива кинуть?
0
Том Ардер
Модератор
Эксперт по математике/физике
3776 / 2389 / 304
Регистрация: 15.06.2009
Сообщений: 4,310
07.02.2012, 23:40 #25
Цитата Сообщение от adelok Посмотреть сообщение
а удаление как сделать?
Аналогично вставке, только сдвиг части массива в другую сторону, потом уменьшить размер массива на 1

Добавлено через 16 минут
Если m - номер элемента, который надо удалить, то так:

C
1
2
3
4
5
for( i = m-1; i < d; i++ )
{
  a[i] = a[i+1]; /* это расписать подробно */
}
d--;
1
adelok
1 / 1 / 1
Регистрация: 23.12.2010
Сообщений: 136
08.02.2012, 17:55  [ТС] #26
удаление

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
case 12:
    printf("\n enter position to delete:");
    scanf("%i",m);
    for( i = m-1; i < d; i++ )
    {
    a[i].num=a[i+1].num;
    strcpy( a[i].name, a[i+1].name );
    strcpy( a[i].exp, a[i+1].exp );
    a[i].size=a[i+1].size;
    a[i].day=a[i+1].day;
    a[i].mon=a[i+1].mon;
    a[i].year=a[i+1].year;
    }
    d--;
    show(a,d);
    break;
компилируется, но иногда зацикливается. проверьте, всё верно?

Добавлено через 50 минут
иногда до show вылетает
0
Том Ардер
Модератор
Эксперт по математике/физике
3776 / 2389 / 304
Регистрация: 15.06.2009
Сообщений: 4,310
08.02.2012, 18:05 #27
Цитата Сообщение от adelok Посмотреть сообщение
for( i = m-1; i < d; i++ )
Да, здесь у меня ошибка. Поскольку d - размер массива, то индекс последнего элемента = d - 1. Заголовок цикла так ( i + 1 < d, зн. i < d - 1) :

C
1
for( i = m-1; i < d - 1; i++ )
1
adelok
1 / 1 / 1
Регистрация: 23.12.2010
Сообщений: 136
08.02.2012, 18:22  [ТС] #28
плюс ещё в scanf импеданс забыл.всё спс работает
0
08.02.2012, 18:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2012, 18:22
Привет! Вот еще темы с ответами:

Вставка элемента в список - C (СИ)
Здравствуйте.Пишу код #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;math.h&gt; //НЕ УПОРЯДОЧЕННЫЙ СПИСОК ...

Вставка элемента в строку матрицы - C (СИ)
есть функция, которая вставляет в одномерный упорядоченный массив число не нарушая упорядоченность написать программу, используя эту...

Добавление в конец списка новой структуры - C (СИ)
Всем привет! Задание следующее Разработать программу для создания и работы с двусвязным списком, состоящим из структур. Для работы со...

Вставка/удаление элемента в массиве, вывод результата - C (СИ)
Нужно сделать 3 задачки с масивами : 1.Print которая распечатывает элементы массива 2.Insert Value - вставляет новый элемент по...


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

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

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