Так ли важно знать о препроцессорных директивах для успешного освоения Си? - 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; }
Объяснение кода листинга программы
- Препроцессорные директивы упрощают процесс написания кода, позволяя вставлять строки с определенными значениями, макросами и функциями.
- В данном коде используются макросы препроцессора для создания функций работы со стеками различных типов данных.
- Макросы определяются с помощью директивы #define.
- Для каждого типа данных создается свой тип стека: int, double, char, person_t.
- В функции main создаются соответствующие стеки для каждого типа данных.
- Затем происходит заполнение и разбор стеков с выводом содержимого на экран.
- Для каждого типа данных используется соответствующий макрос stack_push и stack_pop.
- Макрос stack_push создает новый узел стека, заполняет его значением и добавляет в конец стека.
- Макрос stack_pop удаляет и возвращает последний элемент стека.
- В функции main происходит обход стека по очереди с помощью цикла while и выводится значение каждого узла стека.
- После работы со стеками, программа возвращает 0, что означает успешное завершение работы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д