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

Динамическая структура данных(контейнер) типа "Вектор" - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Проверьте пожалуйста код на правильность ! http://www.cyberforum.ru/cpp-beginners/thread683962.html
2. Даны два вектора и найти угол между ними и модуль векторного произведения векторов X и Y. При вычислении использовать формулу:c=abs(x)*(y)*sin(f) , где с - векторное произведение. векторов X и...
C++ Создать массив из различных элементов исходного Кто чем может.Новичок ,только учусь 2. Дан целочисленный массив А, среди элементов которого есть одинаковые. Создать массив из различных элементов А. http://www.cyberforum.ru/cpp-beginners/thread683958.html
В двумерном массиве поменять местами столбцы, симметричные относительно середины массива C++
Кто чем может.Новичок ,только учусь 3.В двумерном массиве целых чисел поменять местами столбцы, симметричные относительно середины массива (верти-кальной линии).
C++ Программа с использованием дружественной функции и классов
Я в С++ новичок. Нужна программа с использованием дружественной функции и классов. Можете привести пожалуйста пару примеров? Заранее огромное Вам спасибо.
C++ Вывести на экран изображение летящей ракеты http://www.cyberforum.ru/cpp-beginners/thread683955.html
Кто чем может.Новичок ,только учусь 4. Написать программу, выводящую на экран изображение летящей ракеты. Фоном может быть изображение неба, поверхности земли, облаков.
C++ Данная целочисленная прямоугольная матрица. Определить количество строк, не содержащих ни одного нулевого элемента. Данная целочисленная прямоугольная матрица. Определить количество строк, не содержащих ни одного нулевого элемента. подробнее

Показать сообщение отдельно
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.10.2012, 23:42
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
/*
 * Представляет вектор. Хранит массив строк с данными и длину этого массива.
 */
struct vector {
    char **data;
    size_t size;
};
 
/* Инциализация @vec.
 * Естественно, это не обнуление; просто чтоб мусор убрать.
 */
inline void INIT_VECTOR(struct vector *vec)
{
    vec->data = NULL;
    vec->size = 0;
}
 
/* А вот это обнуление @vec.
 * Сначала удаляем каждую строку, затем весь массив строк,
 * затем затираем данные NULL на всякий пожарный.
 * И размер в ноль, естессно.
 */
void clean_vector(struct vector *vec)
{
    size_t i;
    for (i = 0; i < vec->size; ++i) {
        free(vec->data[i]);
    }
    free(vec->data);
    vec->data = NULL;
    vec->size = 0;
}
 
/* Для удобства. Обнулить @vec и удалить из кучи.
 * Не стоит это применять для векторов созданных *не* create_vector().
 */
inline void delete_vector(struct vector *vec)
{
    clean_vector(vec);
    free(vec);
}
 
/* Динамически создать новый пустой вектор.
 *
 * Если какие-то проблемы с выделением, возвращаем NULL.
 *
 * INIT_VECTOR() вызывается как раз для того, чтобы убрать мусор,
 * который возможно был в памяти. После неё у нас чистый опрятный вектор.
 */
struct vector* create_empty_vector(void)
{
    struct vector *res = malloc(sizeof(*res));
    if (!res) {
        return NULL;
    }
    INIT_VECTOR(res);
    return res;
}
 
 
/* Динамически создать новый вектор размер @size, заполненный строками @init.
 *
 * Пытаемся создать сначала пустой вектор. Проблемы - NULL.
 * Потом выделяем место под указатели на строки. Проблемы - пустой вектор.
 * Потом выделяем место под сами строки. Проблемы - удаляем всё, что
 * навыделяли и возвращаем пустой вектор.
 * 
 * Если всё окей, копирум строку @init во все новые элементы вектора,
 * устанавливаем новый размер вектора и выходим, вернув созданный вектор.
 */
struct vector* create_vector(size_t size, const char *init)
{
    size_t i;
    size_t init_len;
    struct vector *res = create_empty_vector();
    if (!res) {
        return NULL;
    }
    
    res->data = malloc(size * sizeof(*res->data));
    if (!res->data) {
        return res;
    }
    init_len = strlen(init) + 1;
    for (i = 0; i < size; ++i) {
        if (!(res->data[i] = malloc(init_len))) {
            res->size = i;
            goto cleanup;
        }
        strcpy(res->data[i], init);
    }
    res->size = size;
    goto out;
cleanup:
    clean_vector(res);
out:
    return res;
}
 
 
/* Установить элемент @vec с индексом @index равным @data.
 *
 * Выход за границы - вернуть -1 и ничего не трогаем.
 *
 * Изменяем размеры строки, которую мы будем менять, чтобы в неё влезли
 * новые данные. Проблемы - возвращаем -1 и ничего не трогаем.
 * 
 * Если всё окей, копирум строку @data, обновляем элемент и выходим.
 */
int vector_set(struct vector *vec, size_t index, const char *data)
{
    char *new_el;
    
    if (index >= vec->size) return -1;
 
    new_el = realloc(vec->data[index], strlen(data) + 1);
    if (!new_el) {
        return -1;
    }
    strcpy(new_el, data);
    vec->data[index] = new_el;
    return 0;
}
 
/* Устраивает цикл для обхода вектора @vector в прямом порядке. Итератор -
 * указатель @ptr (типа char**), который должен быть создан и макросу заранее.
 *
 * Раскрывается это всё, очевидно, в цикл for. В нём можно использовать *ptr,
 * чтобы добраться до текущего просматриваемого элемента вектора.
 */
#define vector_foreach_forward(ptr, vector)       \
    for ((ptr) = (vector)->data;                  \
         (ptr) < (vector)->data + (vector)->size; \
         ++(ptr))
 
int main(void)
{
    struct vector *vec = create_vector(5, "1");
    
    char **str;
    vector_foreach_forward(str, vec) {
        printf("%s ", *str);
    }
    printf("\n");
    
    vector_set(vec, 3, "42");
    
    vector_foreach_forward(str, vec) {
        printf("%s ", *str);
    }
    delete_vector(vec);
    return 0;
}
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru