Язык Си в примерах/Библиотека complex

Материал из Викиучебника — открытых книг для открытого мира
Перейти к: навигация, поиск

Язык Си в примерах


  1. Компиляция программ
  2. Простейшая программа «Hello World»
  3. Учимся складывать
  4. Максимум
  5. Таблица умножения
  6. ASCII коды символов
  7. Верхний регистр
  8. Скобочки
  9. Факториал
  10. Степень числа
  11. Треугольник Паскаля
  12. Корень уравнения
  13. Система счисления
  14. Сортировка
  15. Библиотека complex
  16. Сортировка на основе qsort
  17. RPN калькулятор
  18. RPN калькулятор на Bison
  19. Простая грамматика
  20. Задача «Расчёт сопротивления схемы»
  21. Простая реализация конечного автомата
  22. Использование аргументов командной строки
  23. Чтение и печать без использования stdio
  24. Декодирование звукозаписи в формате ADX

Создание библиотек. Библиотека для работы с комплексными числами.[править]

Создание библиотеки[править]

Библиотека у нас будет иметь два исходных файла: complex.h и complex.c

/*
   complex.h
 */
 typedef struct 
    {
     double a,b;
    } complex_t;
 complex_t mul(complex_t x, complex_t y);

 /*
    complex.c
 */
 #include "complex.h"
 complex_t mul(complex_t x, complex_t y)
 {
     complex_t t;
     t.a = x.a * y.a - x.b * y.b;
     t.b = x.a * y.b + x.b * y.a; 
     return t;
 }

Пример использования библиотеки[править]

Теперь несложно использовать эту библиотеку.

Для этого нужно:

  • добавить в заголовок c/cpp-файла строчку #include "complex.h" ;
  • сделать так, чтобы компилятор находил complex.h ;
  • сделать так, чтобы сборщик (linker) находил файл библиотеки complex .
 /*
    test_complex.c
 */
 #include <stdio.h>
 #include "complex.h"
 int main()
 {
     complex_t x = {1,2};
     complex_t y = {3,4};
     complex_t z = mul(x,y);
     printf ("z = (%lf, %lf)\n", z.a, z.b );
     return 0;
 }

Создание и использование библиотек в GNU C[править]

Подключение библиотеки в виде исходников[править]

Есть простой способ подключения библиотеки функций прямо в виде исходников:

$ gcc test_complex.c complex.c -o test_complex   


В итоге получается запускаемый файл test_complex.


Подключение библиотеки в виде динамически загружаемой библиотеки[править]

$ gcc -shared complex.c -o libcomplex.so           # создание динамически загружаемой библиотеки  
$ gcc test_complex.c -L. -lcomplex -o test_complex # компиляция тестовой программы
$ export LD_LIBRARY_PATH=.; ./test_complex         # запуск тестовой программы


  • Есть ряд стандартных путей (), где система ищет динамически загружаемые библиотеки. Текущая директория по умолчанию не является таким местом, поэтому мы явно указываем, что библиотеки могут лежать также и в текущей директории.
    Переменная LD_LIBRARY_PATH содержит дополнительный список путей (разделённых двоеточием), где система будет искать библиотеки.
  • Расширение .so соответствует shared objects, то есть библиотека объектов общего доступа.

Подключение библиотеки в виде статически загружаемой библиотеки[править]

Для компилятора Gnu C команды создания статически подключаемой библиотеки и подключения её к проекту выглядят следующим образом


$ gcc -с complex.c -o libcomplex.a                 # создание статически подключаемой библиотеки  
$ gcc test_complex.c -L. -lcomplex -o test_complex # компиляция тестовой программы
$ ./test_complex                                   # запуск тестовой программы

Задачи[править]

  • Напишите расширенную версию библиотеки функций для работы с комплексными числами. Реализуйте операции сложения, вычитания, умножения и деления, а также функции, вычисляющие аргумент и модуль комплексного числа. Реализуйте функции комплексного аргумента sinc, cosc, expc, logc, asinc , acosc. Чему равен арккосинус двух (acosc(2) = ?) ? Напишите программу, тестирующую вашу библиотеку.
  • Напишите библиотеку функций по теме "аналитическая геометрия"
    • Решать задачи на плоскости
      • вычислять расстояние для пар (точка, точка), (точка, прямая)
      • находить площадь многоугольника
      • проверять, пересекаются ли две прямые и находить точку их пересечения
      • проверять, пересекаются ли два отрезка и находить точку их пересечения
    • Решать задачи в пространстве
      • вычислять расстояние для пар (точка, точка), (точка, прямая), (прямая, прямая), (точка, плоскость)
      • находить точку пересечения трёх попарно непараллельных плоскостей
      • находить объем тетраэдра