Введение |
Массивы, строки и структуры |
Операторы |
Операции |
Переменные и типы |
Пояснения к курсовой работе |
Препроцессор |
Работа с файлами |
Стандарты безопасного кодирования |
Указатели и динамическая память |
Ввод-вывод |
В С++ структура может содержать не только поля, но и функции-элементы для их обработки. Эти функции могут обращаться к полям структуры и изменять их. Если функция-элемент не изменяет поля, то можно указать const
после списка параметров. Также можно указать начальные значения для тех полей, значение которых не указано в списке инициализации.
struct point {
double x=0, y=0;
double len() const { return hypot(x,y); }
double phi() const { return atan2(y,x); }
void add(point p) { x+=p.x; y+=p.y; }
void turn(double a) {
double ca=cos(a),sa=sin(a);
double nx=x*ca-y*sa, ny=-x*sa+y*ca;
x=nx;
y=ny;
}
};
Для вызова такой функции нужно написать имя_структуры.имя_функции(список_аргументов)
const double pi=3.141592653589793;
point p1, p2={3.5,2};
printf("%lf %lf\n",p2.len(),p2.phi());
p1.add(p2);
p1.turn(pi/3);
p1.add({1.1,2.7}); // (point){1.1,2.7}
Стек – это последовательность элементов, в которой добавление новых элементов и удаление существующих производится с одного конца. Отличия от массива – стек имеет переменный размер, можно получить значение только последнего элемента. Примером стека в реальной жизни может являться стопка тарелок: когда мы хотим вытащить тарелку, мы должны снять все тарелки выше.
Визуализатор операций со стеком
struct Stack {
int top=-1; // индекс вершины стека
int data[100]; // значения в стеке
void Init() { top=-1; }
bool IsEmpty() const { return top==-1; }
void Push(int v) {
if(top==99) {
printf("Переполнение\n");
exit(1);
}
data[++top]=v;
}
void Pop() {
if(top>=0) --top;
}
int Top() const {
if(top==-1) {
printf("Стек пуст\n");
exit(1);
}
return data[top];
}
};
...
// использование
Stack s1;
s1.Push(10);
s1.Push(20);
printf("%d\n",s1.Top());
s1.Pop();
Очередь – это последовательность элементов, в которой добавление новых элементов выполняется в конец последовательности, а удаление – из начала последовательности. Можно получить значение только первого элемента. Примером стека в реальной жизни может являться очередь к кассе. Так как у элементов в последовательности нет ног как у людей, в программировании эффективнее передвигать кассу (индекс первого элемента), чем все элементы последовательности. Чтобы ограничить размер памяти для хранения элементов, все действия с индексами будет выполнять по модулю 100.
Визуализатор операций с очередью
struct Queue {
int first=0; // индекс первого элемента
int size=0; // текущее количество
int data[100]; // значения в стеке
void Init() { first=0; size=0; }
bool IsEmpty() const { return size==0; }
void Add(int v) {
if(size==100) {
printf("Переполнение\n");
exit(1);
}
data[(first+size++)%100]=v;
}
void Drop() {
if(size>0) {
first=(first+1)%100;
--size;
}
}
int Front() const {
if(size==0) {
printf("Очередь пуста\n");
exit(1);
}
return data[first];
}
};
...
// использование
Queue q1;
q1.Add(10);
q1.Add(20);
printf("%d\n",s1.First());
q1.Drop();