#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