printФункции и модули

printФункции-элементы, стек и очередь

В С++ структура может содержать не только поля, но и функции-элементы для их обработки. Эти функции могут обращаться к полям структуры и изменять их. Если функция-элемент не изменяет поля, то можно указать 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();
loading