Файл: А. Б. Шнейвайс основы программирования.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 06.12.2023

Просмотров: 311

Скачиваний: 6

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
УНИВЕРСИТЕТ
КАФЕДРА АСТРОФИЗИКИ
А.Б. Шнейвайс
ОСНОВЫ ПРОГРАММИРОВАНИЯ
(ФОРТРАН, СИ)
Второй семестр для студентов специалитета «АСТРОНОМИЯ»
САНКТ-ПЕТЕРБУРГ
2020

Рецензенты: кандидат техн. наук, доцент В.Б. Синильщиков
(БГТУ «ВОЕНМЕХ» им. Д.Ф. Устинова)
кандидат физ.-мат. наук, доцент В.Б. Титов
(СПбГУ)
Печатается по постановлению
Учебно-методической комиссии по укрупнённой группе направлений и специальностей 03.00.00”Физика и астрономия”
Шнейвайс А.Б.
Основы программирования (ФОРТРАН, СИ). Второй семестр для студентов специалитета «АСТРОНОМИЯ»: Учебное пособие
–СПб,2020.– 430 c.
Учебное пособие «Основы программирования (ФОРТРАНе, СИ)
Второй семестр» содержит информацию по дисциплине «Програм- мирование», излагаемую для студентов по специальности «АCТРО-
НОМИЯ» астрономического отделения математико-механического факультета СПбГУ во втором семестре.
Рассматриваются темы: операции над данными в языках ФОРТРАН
и СИ, использование рекурсии, краткий обзор основных структур данных (массивы, структуры, указатели в СИ и ФОРТРАНе), ис- пользование массивов в качестве формальных и фактических аргу- ментов процедур, динамические массивы, операции и функции совре- менного ФОРТРАНа по работе с массивами, форматирование дан- ных ввода/вывода и др.
Почти каждая тема завершается соответствующим домашним за- данием. Пособие содержит несколько приложений: в частности, по усовершенствованию make-файла, замеру времени работы отдельных фрагментов программы c
А.Б. Шнейвайс, 2020
c
С.-Петербургский гос. университет, 2020

Содержание
1 Выражения и операции.
14 1.1
Выражение. . . . . . . . . . . . . . . . . . . . . . . . . . . .
14 1.2
Основные операции ФОРТРАНа и CИ. . . . . . . . . . . .
15 1.2.1
Арифметические операции
15 1.2.2
Логические операции и операции отношения. . . . .
18 1.2.3
Условная (тернарная) операция СИ ? : . . . . . . . .
19 1.2.4
Операция присваивания . . . . . . . . . . . . . . . .
20 1.2.5
Операция sizeof . . . . . . . . . . . . . . . . . . . . .
21 1.2.6
Операции сдвига . . . . . . . . . . . . . . . . . . . .
26 1.2.7
Поразрядные (побитовые) логические операции. . .
28 1.2.8
Ещё один пример на побитовые . . . . . . . . . . . .
33 1.2.9
Неявное преобразование типов в выражении . . . .
40 1.2.10 Операции явного приведения типа . . . . . . . . . .
43 1.2.11 СИ-операция последовательного вычисления
,
47 1.2.12 Приоритет операций . . . . . . . . . . . . . . . . . .
49 1.3
О чем узнали из первой главы? (2-ой семестр) . . . . . . .
53 1.4
Первое домашнее задание (2-ой семестр)
54 2 Немного о рекурсии в программировании.
55 2.1
Рекурсивные процедуры (простые примеры). . . . . . . . .
58 2.1.1
Нерекурсивная и рекурсивная СИ-функции расчета n!.
58 2.1.2
Нерекурсивная и рекурсивная ФОРТРАН-функции расчета n!. . . . . . . . . . . . . . . . . . . . . . . . .
59 2.1.3
Схема вызовов при расчете f actorr1(3). . . . . . .
60 2.1.4
Достоинства и недостатки рекурсивного описания. .
61 2.2
Понятие глубины рекурсии. Алгоритм Евклида. . . . . . .
62 2.2.1
Нерекурсивная и рекурсивная СИ-функции поиска
НОД. . . . . . . . . . . . . . . . . . . . . . . . . . . .
62 2.2.2
Нерекурсивная и рекурсивная ФОРТРАН-функции поиска НОД. . . . . . . . . . . . . . . . . . . . . . .
63 2.3
Пример задачи неразрешимой без рекурсии.
64 2.3.1
СИ-решение:
64 2.3.2
ФОРТРАН-решение: . . . . . . . . . . . . . . . . . .
64 2.4
Немного о стеке. . . . . . . . . . . . . . . . . . . . . . . . .
65 2


2.5
Задача о ханойской башне. . . . . . . . . . . . . . . . . . .
66 2.5.1
Уяснение ситуации. . . . . . . . . . . . . . . . . . . .
66 2.5.2
СИ-решение:
68 2.5.3
ФОРТРАН-решение: . . . . . . . . . . . . . . . . . .
68 2.6
Время работы рекурсивной и нерекурсивной функций. . .
69 2.6.1
Расчет факториала (временные замеры для СИ). . .
69 2.6.2
Расчет факториала (временные замеры для gfortran). 70 2.6.3
C++ расчет n-го числа Фибоначчи . . . . . . . . . .
71 2.6.4
ФОРТРАН-расчет n-го числа Фибоначчи. . . . . . .
74 2.6.5
Поиск корня методом дихотомии (ФОРТРАН) . . .
76 2.6.6
Поиск корня методом дихотомии (C++) . . . . . . .
79 2.7
Понятие о хвостовой рекурсии . . . . . . . . . . . . . . . .
81 2.7.1
CИ (компилятор gcc) . . . . . . . . . . . . . . . . . .
81 2.7.2
ФОРТРАН-95 (компилятор gfortran) . . . . . . . . .
84 2.8
О чем узнали из второй главы? (2-ой семестр) . . . . . . .
86 2.9
Второе домашнее задание (2-ой семестр)
87 3 Немного о массивах, структурах и указателях
88 3.1
Массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
88 3.1.1
ФОРТРАН
88 3.1.2
CИ . . . . . . . . . . . . . . . . . . . . . . . . . . . .
89 3.2
Структуры . . . . . . . . . . . . . . . . . . . . . . . . . . .
90 3.2.1
ФОРТРАН
91 3.2.2
СИ . . . . . . . . . . . . . . . . . . . . . . . . . . . .
93 3.2.3
Об операторе typedef. . . . . . . . . . . . . . . . . .
97 3.3
Указатели в СИ
98 3.3.1
СИ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 3.3.2
Ещё раз о способе передачи аргумента Си-функции 101 3.3.3
Пример построения стека . . . . . . . . . . . . . . . 108 3.3.4
Пример добавления нового звена в вершину стека . 110 3.3.5
Пример удаление звена из вершины стека . . . . . . 120 3.3.6
Задача о считалке . . . . . . . . . . . . . . . . . . . 124 3.4
Понятие о указателях ФОРТРАНа . . . . . . . . . . . . . . 127 3.4.1
Построение и вывод простого связного списка
. . . 128 3.4.2
Cхема функционирования программы testlist . . . . 129 3.4.3
Cхема функционирования подпрограммы prtlist . . 133 3

3.4.4
Задача о считалке . . . . . . . . . . . . . . . . . . . 135 3.4.5
Cхема построения кольцевого списка . . . . . . . . . 136 3.4.6
Cхема функционирования поиска водящего . . . . . 142 3.4.7
Операторы nullify, deallocate и функция associated . 146 3.4.8
Атрибуты target и pointer . . . . . . . . . . . . . . . 148 3.4.9
Достоинство работы с указателями . . . . . . . . . . 156 3.5
О чем узнали из третьей главы? (2-ой семестр) . . . . . . . 162 3.6
Третье домашнее 3a-задание (2-ой семестр) . . . . . . . . . 164 3.7
Третье домашнее 3b-задание (2-ой семестр) . . . . . . . . . 165 4 Mассивы (введение).
167 4.1
Уяснение ситуации. . . . . . . . . . . . . . . . . . . . . . . . 167 4.2
Одномерные массивы (простые примеры) . . . . . . . . . . 174 4.2.1
Описание и вывод одномерного ФОРТРАН-массива. 174 4.2.2
Описание и вывод одномерного массива в СИ. . . . 177 4.2.3
Изменение диапазона индексов ФОРТРАН-массива. 181 4.3
Ещё несколько простых ФОРТРАН примеров. . . . . . . . 182 4.3.1
Оформление простой программой
. . . . . . . . . . 182 4.3.2
Оформление внешней функцией . . . . . . . . . . . 183 4.3.3
Оформление внутренней ФОРТРАН-функцией . . . 185 4.3.4
Чуть-чуть о встроенной ФОРТРАН-функции SUM . 186 4.4
ФОРТРАН-массив как формальный аргумент функции.
. 187 4.4.1
Явное задание формы формального аргумента . . . 187 4.4.2
Заимствование формы фактического аргумента
. . 189 4.4.3
Заимствование размера фактического аргумента . . 192 4.4.4
Выводы . . . . . . . . . . . . . . . . . . . . . . . . . 192 4.5
Массив в СИ как формальный аргумент функции . . . . . 193 4.6
О чем узнали из четвёртой главы (второй семестр). . . . . 197 4.7
Четвёртое домашнее задание (второй семестр). . . . . . . . 198 5 Одномерный динамический массив.
200 5.1
ФОРТРАН
. . . . . . . . . . . . . . . . . . . . . . . . . . . 200 5.1.1
Автоматические массивы . . . . . . . . . . . . . . . 200 5.1.2
Размещаемые массивы . . . . . . . . . . . . . . . . . 202 5.2
СИ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 5.3
О чем узнали из пятой главы? (второй семестр) . . . . . . 205 5.4
Пятое домашнее задание (второй семестр). . . . . . . . . . 207 4


6 Операции ФОРТРАНА-95 над массивами.
209 6.1
Инициализация элементов массива . . . . . . . . . . . . . . 209 6.2
Секция (сечение) массива. . . . . . . . . . . . . . . . . . . . 210 6.3
Индексный триплет (временные оценки) . . . . . . . . . . 214 6.4
Примеры использования сечений . . . . . . . . . . . . . . . 216 6.4.1
Изменение порядка следования элементов массива . 216 6.4.2
Заполнение матриц . . . . . . . . . . . . . . . . . . . 217 6.4.3
Сечение в качестве параметра процедуры . . . . . . 222 6.5
Выборочное присваивание (присваивание по маске) . . . . 224 6.6
Оператор и конструкция forall . . . . . . . . . . . . . . . . 227 6.7
О чем узнали из шестой главы? (второй семестр)
. . . . . 231 6.8
Шестое домашнее задание (второй семестр). . . . . . . . . 233 7 Функции ФОРТРАНА для работы с массивами
234 7.1
Справочные функции . . . . . . . . . . . . . . . . . . . . . 234 7.2
Функции редукции массивов . . . . . . . . . . . . . . . . . 237 7.3
Функции умножения векторов и матриц . . . . . . . . . . . 257 7.4
Транспонирование матриц . . . . . . . . . . . . . . . . . . . 264 7.5
Функция слияния массивов . . . . . . . . . . . . . . . . . . 264 7.6
Функции упаковки и распаковки массивов
. . . . . . . . . 265 7.7
Сборка массива через добавление измерения . . . . . . . . 266 7.8
Функции сдвига массива . . . . . . . . . . . . . . . . . . . . 267 7.9
Функции определения положения в массиве . . . . . . . . . 269 7.10 О чем узнали из седьмой главы? (второй семестр) . . . . . 271 7.11 Седьмое домашнее задание (второй семестр). . . . . . . . . 273 8 Форматирование данных ввода-вывода
274 8.1
Явное задание формата . . . . . . . . . . . . . . . . . . . . 275 8.1.1
Примеры
. . . . . . . . . . . . . . . . . . . . . . . . 275 8.2
Способы явного задания формата . . . . . . . . . . . . . . 277 8.2.1
Форматы данных целого типа . . . . . . . . . . . . . 278 8.2.2
Форматы данных вещественного типа . . . . . . . . 279 8.2.3
Форматы ввода данных вещественного типа
. . . . 282 8.2.4
Форматы ввода-вывода данных комплексного типа . 284 8.2.5
Форматы ввода-вывода данных логического типа
. 285 8.2.6
Формат ввода-вывода данных символьного типа . . 286 8.2.7
G — дескриптор для данных любого встроенного типа287 5

8.2.8
Формат ввода-вывода данных производного типа . . 289 8.3
Управляющие дескрипторы . . . . . . . . . . . . . . . . . . 290 8.3.1
BN и BZ — управление интерпретацией пробелов . . 290 8.3.2
S, SP, SS —управление выводом знака . . . . . . . . 291 8.3.3
Tn, TRn, TLn и nX —управление табуляцией . . . . 292 8.3.4
Дескриптор “дробная черта” . . . . . . . . . . . . . 293 8.3.5
Дескриптор “$” . . . . . . . . . . . . . . . . . . . . . 294 8.3.6
Дескриптор “:” . . . . . . . . . . . . . . . . . . . . . 294 8.3.7
Дескриптор kP (масштабный множитель)
. . . . . 295 8.4
Ещё раз о вводе-выводе данных, управляемом списком . . 299 8.5
Ввод-вывод данных, управляемый NAMELIST-списком . . 300 9 Контрольная работа №2 301 9.1
Справочная информация
. . . . . . . . . . . . . . . . . . . 301 9.1.1
Исторический экскурс . . . . . . . . . . . . . . . . . 301 9.1.2
Математическая основа алгоритма . . . . . . . . . . 302 9.2
Возможные затрагиваемые темы программирования . . . . 305 9.3
Вариант 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306 9.3.1
Задача №1 . . . . . . . . . . . . . . . . . . . . . . . . 306 9.3.2
Задача №2 . . . . . . . . . . . . . . . . . . . . . . . . 306 9.3.3
Задача №3 . . . . . . . . . . . . . . . . . . . . . . . . 306 9.3.4
Задача №4 . . . . . . . . . . . . . . . . . . . . . . . . 306 9.4
Вариант 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307 9.4.1
Задача №1 . . . . . . . . . . . . . . . . . . . . . . . . 307 9.4.2
Задача №2 . . . . . . . . . . . . . . . . . . . . . . . . 307 9.4.3
Задача №3 . . . . . . . . . . . . . . . . . . . . . . . . 307 9.4.4
Задача №4 . . . . . . . . . . . . . . . . . . . . . . . . 307 9.5
Вариант 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308 9.5.1
Задача №1 . . . . . . . . . . . . . . . . . . . . . . . . 308 9.5.2
Задача №2 . . . . . . . . . . . . . . . . . . . . . . . . 308 9.5.3
Задача №3 . . . . . . . . . . . . . . . . . . . . . . . . 308 9.5.4
Задача №4 . . . . . . . . . . . . . . . . . . . . . . . . 308 9.6
Вариант 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309 9.6.1
Задача №1 . . . . . . . . . . . . . . . . . . . . . . . . 309 9.6.2
Задача №2 . . . . . . . . . . . . . . . . . . . . . . . . 309 9.6.3
Задача №3 . . . . . . . . . . . . . . . . . . . . . . . . 309 6


9.6.4
Задача №4 . . . . . . . . . . . . . . . . . . . . . . . . 309 9.7
Вариант 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 9.7.1
Задача №1 . . . . . . . . . . . . . . . . . . . . . . . . 310 9.7.2
Задача №2 . . . . . . . . . . . . . . . . . . . . . . . . 310 9.7.3
Задача №3 . . . . . . . . . . . . . . . . . . . . . . . . 310 9.7.4
Задача №4 . . . . . . . . . . . . . . . . . . . . . . . . 310 9.8
Вариант 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 9.8.1
Задача №1 . . . . . . . . . . . . . . . . . . . . . . . . 311 9.8.2
Задача №2 . . . . . . . . . . . . . . . . . . . . . . . . 311 9.8.3
Задача №3 . . . . . . . . . . . . . . . . . . . . . . . . 311 9.8.4
Задача №4 . . . . . . . . . . . . . . . . . . . . . . . . 311 9.9
Вариант 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312 9.9.1
Задача №1 . . . . . . . . . . . . . . . . . . . . . . . . 312 9.9.2
Задача №2 . . . . . . . . . . . . . . . . . . . . . . . . 312 9.9.3
Задача №3 . . . . . . . . . . . . . . . . . . . . . . . . 312 9.9.4
Задача №4 . . . . . . . . . . . . . . . . . . . . . . . . 312 9.10 Вариант 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 9.10.1 Задача №1 . . . . . . . . . . . . . . . . . . . . . . . . 313 9.10.2 Задача №2 . . . . . . . . . . . . . . . . . . . . . . . . 313 9.10.3 Задача №3 . . . . . . . . . . . . . . . . . . . . . . . . 313 9.10.4 Задача №4 . . . . . . . . . . . . . . . . . . . . . . . . 313 9.11 Вариант 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 9.11.1 Задача №1 . . . . . . . . . . . . . . . . . . . . . . . . 314 9.11.2 Задача №2 . . . . . . . . . . . . . . . . . . . . . . . . 314 9.11.3 Задача №3 . . . . . . . . . . . . . . . . . . . . . . . . 314 9.11.4 Задача №4 . . . . . . . . . . . . . . . . . . . . . . . . 314 9.12 Вариант 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . 315 9.12.1 Задача №1 . . . . . . . . . . . . . . . . . . . . . . . . 315 9.12.2 Задача №2 . . . . . . . . . . . . . . . . . . . . . . . . 315 9.12.3 Задача №3 . . . . . . . . . . . . . . . . . . . . . . . . 315 9.12.4 Задача №4 . . . . . . . . . . . . . . . . . . . . . . . . 315 9.13 Вариант 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 9.13.1 Задача №1 . . . . . . . . . . . . . . . . . . . . . . . . 316 9.13.2 Задача №2 . . . . . . . . . . . . . . . . . . . . . . . . 316 9.13.3 Задача №3 . . . . . . . . . . . . . . . . . . . . . . . . 316 9.13.4 Задача №4 . . . . . . . . . . . . . . . . . . . . . . . . 316 7

9.14 Вариант 12 . . . . . . . . . . . . . . . . . . . . . . . . . . . 317 9.14.1 Задача №1 . . . . . . . . . . . . . . . . . . . . . . . . 317 9.14.2 Задача №2 . . . . . . . . . . . . . . . . . . . . . . . . 317 9.14.3 Задача №3 . . . . . . . . . . . . . . . . . . . . . . . . 317 9.14.4 Задача №4 . . . . . . . . . . . . . . . . . . . . . . . . 317 10 Приложение I. Функция передачи типа transfer
318 11 Приложение II. Азы GNU-make (часть 2)
325 11.1 Дальнейшие усовершенствования . . . . . . . . . . . . . . . 328 11.1.1 Простые переменных утилиты make . . . . . . . . . 328 11.1.2 Операторы присваивания утилиты make . . . . . . . 329 11.1.3 Автоматические переменные утилиты make . . . . . 330 11.1.4 Уяснение выгоды простых make-переменных . . . . 335 11.2 Автоматическая генерация списка объектных файлов . . . 337 11.2.1 Плохое решение . . . . . . . . . . . . . . . . . . . . . 338 11.2.2 Приемлемое решение . . . . . . . . . . . . . . . . . . 340 11.2.3 Тестирование приемлемого make-файла . . . . . . . 344 11.3 Make-файл для программы, использующей модуль . . . . . 346 11.3.1 Кустарный «ручной» пропуск задачи с модулем. . . 348 11.3.2 Попытка использования make-файла из 11.2.2
. . . 348 11.3.3 1-ая попытка коррекции make-файла . . . . . . . . . 350 11.3.4 2-ая попытка коррекции make-файла . . . . . . . . . 353 11.3.5 Выяснение причины сбоя 2-ой коррекции . . . . . . 355 11.3.6 3-я попытка коррекции make-файла . . . . . . . . . 356 11.4 Информация к размышлению . . . . . . . . . . . . . . . . . 357 11.4.1 О чем узнали из приложения N II ? . . . . . . . . . 359 12 Приложение III. О подсчете времени.
361 12.1 Утилита time. . . . . . . . . . . . . . . . . . . . . . . . . . . 361 12.2 C-функция clock() и макрос CLOCKS_PER_SEC. . . . . . 362 12.3 ФОРТРАН-подпрограмма CPU_TIME. . . . . . . . . . . . 363 12.4 ФОРТРАН-подпрограмма DATA_AND_TIME.
. . . . . . 364 12.5 ФОРТРАН-подпрограмма SYSTEM_CLOCK . . . . . . . . 367 12.6 GFORTRAN-подпрограмма ETIME. . . . . . . . . . . . . . 368 12.7 Чуть-чуть о профилировании.
. . . . . . . . . . . . . . . . 369 8


13 Приложение IV. Операторы ввода-вывода
373 13.1 Спецификатор [unit=]u
. . . . . . . . . . . . . . . . . . . . 374 13.2 Спецификатор формата [fmt=]f . . . . . . . . . . . . . . . . 376 13.3 Спецификатор именованного списка [nml=]q . . . . . . . . 377 13.4 Спецификатор номера записи rec=n . . . . . . . . . . . . . 378 13.5 Спецификатор типа ошибки iostat=ios . . . . . . . . . . . . 381 13.6 Спецификаторы перехода err=l и end=l . . . . . . . . . . . 385 13.7 Спецификатор advance=e продвижения по файлу . . . . . 386 13.8 Спецификаторы eor=l и size=k для режима advance=’no’ . 388 14 Приложение V. Простые поэлементные функции
391 14.1 Примеры работы с функцией abs . . . . . . . . . . . . . . . 392 14.2 Примеры работы с функцией aimag . . . . . . . . . . . . . 393 14.3 Примеры работы с функцией conjg . . . . . . . . . . . . . . 394 14.4 Примеры работы с функцией aint
. . . . . . . . . . . . . . 395 14.5 Примеры работы с функцией anint . . . . . . . . . . . . . . 396 14.6 Примеры работы с функцией nint . . . . . . . . . . . . . . 396 14.7 Примеры работы с функцией ceiling . . . . . . . . . . . . . 397 14.8 Примеры работы с функцией floor . . . . . . . . . . . . . . 397 14.9 Примеры работы с функцией dim
. . . . . . . . . . . . . . 398 14.10Примеры работы с функцией dprod . . . . . . . . . . . . . 399 14.11Примеры работы с функциями max и min . . . . . . . . . . 400 14.12Примеры работы функции mod . . . . . . . . . . . . . . . . 401 14.13 Примеры работы функции modulo . . . . . . . . . . . . . . 402 14.14Примеры работы функции sign . . . . . . . . . . . . . . . . 403 15 Приложение VI. Функции запроса характеристик пред- ставления числовых данных
404 15.1 Функция radix(x) . . . . . . . . . . . . . . . . . . . . . . . . 405 15.2 Функция digits(x) . . . . . . . . . . . . . . . . . . . . . . . . 406 15.3 Функция epsilon(x) . . . . . . . . . . . . . . . . . . . . . . . 407 15.4 Функции maxexponent, minexponent . . . . . . . . . . . . . 408 15.5 Функция tiny . . . . . . . . . . . . . . . . . . . . . . . . . . 409 15.6 Функция huge(x) . . . . . . . . . . . . . . . . . . . . . . . . 410 15.6.1 Семейство integer . . . . . . . . . . . . . . . . . . . . 410 15.6.2 Семейство real
. . . . . . . . . . . . . . . . . . . . . 414 15.7 Функция precision(x) . . . . . . . . . . . . . . . . . . . . . . 415 9

15.8 Функция range(x) . . . . . . . . . . . . . . . . . . . . . . . . 416 15.9 Функция bit_size(i)
. . . . . . . . . . . . . . . . . . . . . . 418 16 Приложение VII. Некоторые опции gfortran
419 16.1 Опции изменения правила умолчания . . . . . . . . . . . . 419 16.1.1 Опция -fdefault-real-8 . . . . . . . . . . . . . . . . . . 419 16.1.2 Опции -fdefault-real-8 и -fdefault-double-8
. . . . . . 423 16.2 Опции изменения явно указанных разновидностей . . . . . 424 16.3 Опция -fimplicit-none . . . . . . . . . . . . . . . . . . . . . . 427 16.4 Опции -ffixed-line-length-N и -ffree-line-length-N . . . . . . . 428 10

ПРЕДИСЛОВИЕ
Учебное пособие «Основы программирования на ФОРТРАНе и СИ»
(второй семестр) является продолжением изложения материала, кото- рый осваивался студентами первого курса астрономического отделения математико-механического факультета в первом семестре на основе посо- бия «Основы программирования на ФОРТРАНе и СИ» (первый семестр)
(www.astro.spbu.ru: образование — учебные материалы — программиро- вание — 1-ый семестр; (см. также http://hdl.handle.net/11701/15400 —
репозиторий СПбГУ).
Первый раздел настоящего пособия представляет собой обзор элемен- тарных операций, многими из которых студенты активно пользовались во время практических занятий. Раздел насыщен короткими программа- ми, соответствующими теме. Некоторые операции языка CИ реализова- ны в ФОРТРАНе встроенными функциями, которые так же рассмотрены в первом разделе.
Содержание второго раздела «Рекурсия в программировании».
Первоначальные версии ФОРТРАНа не допускали рекурсии. В данном пособии на простых примерах поясняется как описываются рекурсив- ные процедуры в современном ФОРТРАНе. Отмечаются достоинства и недостатки рекурсивного описания. Рассмотрена ФОРТРАН-версия ре- шения известной задачи о Ханойской башне. На элементарном уравне проводится сравнение затрат времени при решении одной и той же за- дачи рекурсивной и нерекурсивной процедурами. (в частности, задачи о расчёте N-го числа Фибоначчи и задачи о поиске изолированного корня уравнения методом деления отрезка пополам).
Третий раздел — обзор тем «Массивы», «Структуры», «Указатели».
Поясняется, что в программировании, как правило, часто бывают вос- требованы не только простые переменные, но и более сложные составные структуры данных: массивы, как именованный набор данных одинако- вого типа; структуры, как именнованный набор данных, который может состоять из элементов разных типов. В CИ имя массива трактуется как указатель на его начальный элемент. Поэтому в разделе затронута те- ма «Указатели». Как показывает опыт эта тема труднее для восприятия первокурсникам нежели темы «Массивы» и «Структуры». Поэтому соот- ветствующие примеры и пояснения в данном разделе довольно объёмны.
Рассмотрены задачи построения стека и кольцевого списка
11