Untitled

Run Settings
LanguageC
Language Version
Run Command
#include <stdio.h> #include "array.h" int main() { //задача 6 /* Array A; init_array(A); add (A, 5); print_array(A); destroy_array(A); print_array(A);// безуспешная попытка вывести значение динамического массива */ //задача 5 /* Array A; init_array(A); add (A, 5); add(A, 6); add(A, 7); print_array(A); swap(A, 3, 2); print_array(A); */ //çàäà÷à 4 Array A; init_array(A); int B[] = {3, 6, 9}; arr2dyn(B, A, 3); print_array(A); //çàäà÷à 4 /* Array A; init_array(A); int B[] = {3, 6, 9}; arr2dyn(B, A, 3); print_array(A); */ //çàäà÷à 3 Array A; init_array(A); add(A, 55); add(A, 17); add(A, 222); int s[3]; dyn2arr(A, s); // printf("\nVALUE: %d", s[0]); //printf("\nVALUE: %d", s[1]); //printf("\nVALUE: %d", s[2]); int i = 0; while(i < 3) { printf("\nVALUE: %d", s[i]); i++; } //ТЕОРИЯ /* int* pInt; pInt = malloc(sizeof(int)); *pInt = 5; // printf("My value: %d \n", *pInt); // printf("Sizeof int: %d \n", sizeof(int)); int* pInt2; pInt = calloc(3, 4); // printf("My value: %d \n", *pInt2); *pInt2 = 41; *(pInt2 + 1) = 3;//pInt2 + 1 - указывает на следущую ячейку. в данном случае прибавляет 4 байта //printf("My value: %d \n", *pInt2); //printf("My value: %d \n", *(pInt2+1)); */ }
#include <stdio.h> #include "array.h" //pеализация //Создание динамического массива A с начальным размером size: void __init_array(Array *A, size_t size) { *A = malloc(sizeof(ArrayType));//ArrayType - структура //sizeof - возврвщвет размер структуры //malloc - просит компьютер выделить столько памяти, сколько вернет sizeof if (*A == NULL) { fprintf(stderr, "Can't allocate memory\n"); exit(1); } EType *elements = calloc(size, sizeof(EType));//calloc - просит компьютер выделить столько памяти, сколько вернет sizeof size раз if (elements == NULL) { fprintf(stderr, "Can't allocate memory\n"); exit(1); } (*A)->elements = elements; (*A)->bufferSize = size; (*A)->currentSize = 0; } //При добавлении нового элемента в массив нам необходимо проверить есть ли в нем свободное место, если есть, то добавляем элемент в массив, если нет, то увеличиваем размер массива вдвое и лишь затем добавляем новый элемент: void add(Array A, EType e) { if (A->currentSize >= A->bufferSize) resize(A); A->elements[A->currentSize++] = e; } void resize(Array A) { size_t newSize = A->bufferSize * 2; EType *newElements = (EType *)realloc(A->elements, newSize * sizeof(EType)); if (newElements == NULL) { fprintf(stderr, "Can't reallocate memory\n"); exit(1); } A->elements = newElements; A->bufferSize = newSize; } //Получить элемент массива A по индексу index (если проводить аналогию с обычными массивами, то запись вида get(A, 1) эквивалента записи A[1]): EType get(Array A, int index) { if (index >= A->currentSize || index < 0) { fprintf(stderr, "Index out of bounds\n"); exit(1); } return A->elements[index]; } //Присвоить элементу массива A по индексу index значение e (и снова, если проводить аналогию с обычными массивами, то запись вида set(A, 1, 5) эквивалента записи A[1] = 5): void set(Array A, int index, EType e) { if (index >= A->currentSize || index < 0) { fprintf(stderr, "Index out of bounds\n"); exit(1); } A->elements[index] = e; } //Получить размер динамического массива A: size_t size(Array A) { return A->currentSize; } //Для простоты работы с массивом напишем функцию multiset(A, num, ...), которая позволит заполнить массив несколькими значениями одновременно. Параметры A и num - заполняемый массив и количество элементов, которыми он будет заполнен, соответственно: #define multiset(A, num, ...) __multiset(A, num, __VA_ARGS__) void __multiset(Array A, size_t num, ...) { va_list valist; va_start(valist, num); for (int i = 0; i < num; i++) { add(A, va_arg(valist, EType)); } va_end(valist); } //Пример работы с динамическим массивом: void print_array(Array A) { for (int i = 0; i < size(A); i++) printf("%d ", get(A, i)); printf("\n"); } void destroy_array(Array A) { EType *elements = (*A).elements; free(elements); free(A);//операция, которая освобождает память, при ее применении, память, на котрую указывает указатель, освобождается } void swap(Array A, EType i, EType j) { //printf("bufferSize: %d", (*A).bufferSize); if((*A).currentSize > i && (*A).currentSize > j) { EType value = get (A, i); set (A, i, get(A, j)); set (A, j, value); } else printf("Error: Indexes are out of bound\n"); } void arr2dyn(EType B[], Array A, EType N) { int i = 0; while (i<N) { add(A, B[i]); i++; } } void dyn2arr(Array A, EType B[]) { int i = 0; while (i < (*A).currentSize) { B[i] = get(A, i); i++; } }
#ifndef __STACK_H #define __STACK_H # include <stdlib.h> # include <stdbool.h> #define INITIAL_SIZE 10 #define init_array(A) __init_array(&A, INITIAL_SIZE) typedef int EType; typedef struct { EType *elements; size_t bufferSize; size_t currentSize; } ArrayType; typedef ArrayType* Array; //__init_array(A, int ) EType get(Array A, int index); // - получить значение элемента из массива A по индексу index; void set(Array A, int index, EType e); //- в ячейку массива A с индексом index записать значение e; void add(Array A, EType e); // - добавить элемент e в массив A; //remove(A); // - удалить последний добавленный элемент из массива A; size_t size(Array A); // - получить размер массива A. void resize(Array A); //увеличивает размер массива void destroy_array(Array A); //освобождает память, выделенную под массив void swap(Array A, EType i, EType j); //меняет значения i-го и j-го эл-та местами (комбинация get и set) void arr2dyn(EType B[], Array A, EType N);//ïåðåîáðàçóåò ìàññèâ B ôèêñèðîâàííîãî ðàçìåðà N â äèíàìè÷åñêèé ìàññèâ A void dyn2arr(Array A, EType B[]);//ïåðåîáðàçóåò äèíàìè÷åñêèé ìàññèâ A â ìàññèâ ôèêñèðîâàííîãî ðàçìåðà B. #endif
Editor Settings
Theme
Key bindings
Full width
Lines