Читаем Программирование. Принципы и практика использования C++ Исправленное издание полностью

5. Как обнаружить переполнение?

6. Как определить пределы изменения чисел, например наибольшее число типа int?

7. Что такое массив, строка и столбец?

8. Что такое многомерный массив в стиле языка C?

9. Какими свойствами должен обладать язык программирования (например, должна существовать библиотека) для матричных вычислений?

10. Что такое размерность матрицы?

11. Сколько размерностей может иметь матрица?

12. Что такое срезка?

13. Что такое пересылка? Приведите пример.

14. В чем заключается разница между индексированием в стиле языков Fortran и C?

15. Как применить операцию к каждому элементу матрицы? Приведите примеры.

16. Что такое объединенное умножение и сложение (fused operation)?

17. Дайте определение скалярного произведения.

18. Что такое линейная алгебра?

19. Опишите метод исключения Гаусса.

20. Что такое опорный элемент (в линейной алгебре и реальной жизни)?

21. Что делает число случайным?

22. Что такое равномерное распределение?

23. Где найти стандартные математические функции? Для каких типов аргументов они определены?

24. Что такое мнимая часть комплексного числа?

25. Чему равен корень квадратный из –1?

Термины

Упражнения

1. Аргументы функции f в выражениях a.apply(f) и apply(f,a) являются разными. Напишите функцию triple() для каждого варианта и примените их для удвоения элементов массива { 1 2 3 4 5 }. Определите отдельную функцию triple(), которую можно было бы использовать как в выражении a.apply(triple), так и в выражении apply(triple,a). Объясните, почему нецелесообразно писать все функции именно так для использования в качестве аргумента функции apply().

2. Повторите упр. 1, используя не функции, а объекты-функции. Подсказка: примеры можно найти в заголовке Matrix.h.

3. Только для экспертов (средствами, описанными в книге эту задачу решить невозможно). Напишите функцию apply(f,a), принимающую в качестве аргумента функции void (T&), T (const T&), а также эквивалентные им объекты-функции. Подсказка: Boost::bind.

4. Выполните программу исключения методом Гаусса, т.е. завершите ее, скомпилируйте и протестируйте на простом примере.

5. Примените программу исключения методом Гаусса к системе A=={{0 1}{1 0}} и b=={5 6} и убедитесь, что программа завершится крахом. Затем попробуйте вызвать функцию elim_with_partial_pivot().

6. Замените циклами векторные операции dot_product() и scale_and_add() в программе исключения методом Гаусса. Протестируйте и прокомментируйте эту программу.

7. Перепишите программу исключения методом Гаусса без помощи библиотеки Matrix. Иначе говоря, используйте встроенные массивы или класс vector, а не класс Matrix.

8. Проиллюстрируйте метод исключения методом Гаусса.

9. Перепишите функцию apply(), не являющуюся членом класса Matrix, так, чтобы она возвращала объект класса Matrix, содержащий объекты, имеющие тип примененной функции. Иначе говоря, функция apply(f,a) должна возвращать объект класса Matrix, где R — тип значения, возвращаемого функцией f. Предупреждение: это решение требует информации о шаблонах, которая не излагалась в этой книге.

10. Насколько случайной является функция rand()? Напишите программу, принимающую два целых числа n и d из потока ввода, d раз вызывающую функцию randint(n) и записывающую результат. Выведите на экран количество выпавших чисел из каждого диапазона [0:n] и оцените, насколько постоянным является их количество. Выполните программу с небольшими значениями n и небольшими значениями d, чтобы убедиться в том, что очевидные смещения возникают только при небольшом количестве испытаний.

11. Напишите функцию swap_columns(), аналогичную функции swap_rows() из раздела 24.5.3. Очевидно, что для этого необходимо изучить код библиотеки Matrix. Не беспокойтесь об эффективности своей программы: быстродействие функции swap_columns() в принципе не может превышать быстродействие функции swap_rows().

12. Реализуйте операторы

Matrix operator*(Matrix&, Matrix&);

и

Matrix operator+(Matrix&, Matrix&).

При необходимости посмотрите их математические определения в учебниках.

Послесловие

Если вы не любите математику, то, возможно, вам не понравилась эта глава и вы выберете для себя область приложений, в которой изложенная выше информация не понадобится. С другой стороны, если вы любите математику, то мы надеемся, что вы оцените точность выражения математических понятий в представленном нами коде.

<p id="AutBody_Root480"><strong>Глава 25</strong></p><p>Программирование встроенных систем</p>

“Слово “опасный ” означает, что кто-то может умереть”.

Сотрудник службы безопасности

Перейти на страницу:

Похожие книги

Programming with POSIX® Threads
Programming with POSIX® Threads

With this practical book, you will attain a solid understanding of threads and will discover how to put this powerful mode of programming to work in real-world applications. The primary advantage of threaded programming is that it enables your applications to accomplish more than one task at the same time by using the number-crunching power of multiprocessor parallelism and by automatically exploiting I/O concurrency in your code, even on a single processor machine. The result: applications that are faster, more responsive to users, and often easier to maintain. Threaded programming is particularly well suited to network programming where it helps alleviate the bottleneck of slow network I/O. This book offers an in-depth description of the IEEE operating system interface standard, POSIX (Portable Operating System Interface) threads, commonly called Pthreads. Written for experienced C programmers, but assuming no previous knowledge of threads, the book explains basic concepts such as asynchronous programming, the lifecycle of a thread, and synchronization. You then move to more advanced topics such as attributes objects, thread-specific data, and realtime scheduling. An entire chapter is devoted to "real code," with a look at barriers, read/write locks, the work queue manager, and how to utilize existing libraries. In addition, the book tackles one of the thorniest problems faced by thread programmers-debugging-with valuable suggestions on how to avoid code errors and performance problems from the outset. Numerous annotated examples are used to illustrate real-world concepts. A Pthreads mini-reference and a look at future standardization are also included.

David Butenhof

Программирование, программы, базы данных