Так ли важно знать о препроцессорных директивах для успешного освоения Си? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Сабж ясен из заголовка

Решение задачи: «Так ли важно знать о препроцессорных директивах для успешного освоения Си?»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <malloc.h>
 
#define tpl_push(t, pfx) \
int pfx##stack_push(pfx##stack_t** st, t val){\
    pfx##stack_t* p = (pfx##stack_t*)malloc(sizeof(pfx##stack_t));\
    if(p != NULL){\
        p->val  = val;\
        p->next = *st;\
        *st = p;\
    }\
    return (p != NULL);\
}
 
#define tpl_pop(pfx) \
void pfx##stack_pop(pfx##stack_t** st){\
    pfx##stack_t* t = *st;\
    if(t != NULL){\
        *st = (*st)->next;\
        free(t);\
    }\
}
 
#define tpl_stack(t, pfx) \
typedef struct pfx##stack {\
    t val;\
    struct pfx##stack* next;\
} pfx##stack_t;\
tpl_push(t, pfx)\
tpl_pop(pfx)
 
 
//создали стек с типом int(istack_t)
tpl_stack(int, i)
//создали стек с типом double(dstack_t)
tpl_stack(double, d)
//создали стек с типом char(cstack_t)
tpl_stack(char, c)
 
typedef struct  {
    char name[16];
    int  age;
} person_t;
//создали стек с типом person_t(pstack_t)
tpl_stack(person_t, p)
 
 
int main(void){
    int  i;
    char c;
    person_t  p;
    istack_t* si = NULL;
    dstack_t* sd = NULL;
    cstack_t* sc = NULL;
    pstack_t* sp = NULL;
 
    //int
    for(i = 0; i < 10; ++i)
        istack_push(&si, i);
    while(si != NULL){
        printf("%d ", si->val);
        istack_pop(&si);
    }
    putchar('\n');
 
    //double
    for(i = 1; i <= 7; ++i)
        dstack_push(&sd, (double)i*0.5);
    while(sd != NULL){
        printf("%.1f ", sd->val);
        dstack_pop(&sd);
    }
    putchar('\n');
 
    //char
    for(c = 'A'; c <= 'Z'; ++c)
        cstack_push(&sc, c);
    while(sc != NULL){
        printf("%c ", sc->val);
        cstack_pop(&sc);
    }
    putchar('\n');
 
    //person_t
    strcpy(p.name, "Петя");
    p.age = 43;
    pstack_push(&sp, p);
 
    strcpy(p.name, "Вася");
    p.age = 50;
    pstack_push(&sp, p);
 
    strcpy(p.name, "Михаил");
    p.age = 37;
    pstack_push(&sp, p);
 
    while(sp != NULL){
        printf("имя: %s\tвозраст: %d\n", sp->val.name, sp->val.age);
        pstack_pop(&sp);
    }
    return 0;
}

Объяснение кода листинга программы

  1. Препроцессорные директивы упрощают процесс написания кода, позволяя вставлять строки с определенными значениями, макросами и функциями.
  2. В данном коде используются макросы препроцессора для создания функций работы со стеками различных типов данных.
  3. Макросы определяются с помощью директивы #define.
  4. Для каждого типа данных создается свой тип стека: int, double, char, person_t.
  5. В функции main создаются соответствующие стеки для каждого типа данных.
  6. Затем происходит заполнение и разбор стеков с выводом содержимого на экран.
  7. Для каждого типа данных используется соответствующий макрос stack_push и stack_pop.
  8. Макрос stack_push создает новый узел стека, заполняет его значением и добавляет в конец стека.
  9. Макрос stack_pop удаляет и возвращает последний элемент стека.
  10. В функции main происходит обход стека по очереди с помощью цикла while и выводится значение каждого узла стека.
  11. После работы со стеками, программа возвращает 0, что означает успешное завершение работы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.333 из 5
Похожие ответы