- •Содержание
- •Глава 1. Описание языка c ......................................................................... 5
- •Глава 2. Описание языка fortran ....................................................... 38
- •Глава 3. Решение задач на языках c и fortran ................................ 70
- •Глава 1. Описание языка c
- •1.1. Структура c-программы
- •1.2. Скалярные типы данных и константы, строковые константы
- •1.3. Описание скалярных переменных. Директива #define
- •1.4. Операции. Выражения
- •1.5. Стандартные математические функции
- •1.6. Ввод-вывод
- •Int printf ( строка формата [ , список вывода ] )
- •Int scanf ( строка формата , список ввода )
- •1.7. Метки, оператор goto, условные конструкции, оператор break, функция exit
- •If ( логическое выражение ) оператор/блок [ else оператор/блок ]
- •1.8. Циклические конструкции
- •1.9. Указатели, адресная арифметика
- •1.10. Массивы
- •1.11. Функции
- •1.12. Классы памяти. Общие правила описания. Оператор typedef
- •1.13. Строковые переменные, ввод-вывод строк, стандартные функции обработки строк. Функции проверки символов
- •Int sprintf(char* s,char* формат [ , список вывода ] )
- •1.14. Макроопределения
- •1.15. Внешние файлы
- •Int fclose(file* указатель на файл )
- •Int feof(file* файл )
- •1.16. Структуры, объединения, битовые поля
- •1.17. Динамическое распределение памяти
- •1.18. Графика
- •Глава 2. Описание языка fortran
- •2.1. Структура fortran-программы
- •2.2. Типы данных. Константы
- •2.3. Описание переменных, правила умолчания, операторы
- •Implicit тип ( буквы ) , ...
- •2.4. Оператор присваивания. Операции
- •2.5. Стандартные математические функции
- •2.6. Ввод-вывод
- •2.7. Оператор соntinue. Операторы перехода. Условные операторы
- •If (логическое выражение)оператор
- •If (арифметическое выражение)метка1,метка2,метка3
- •2.8. Операторы цикла
- •2.9. Функции loc, locfar, locnear
- •2.10. Массивы
- •2.11. Подпрограммы subroutine, function и interface
- •Intrinsic список имен
- •2.12. Общие области, подпрограмма block data. Оператор equivalence
- •2.13. Символьные переменные
- •2.14. Операторные функции
- •2.15. Внешние файлы
- •2.16. Структуры
- •2.17. Динамические массивы
- •2.18. Графика
- •Глава 3. Решение задач на языках c и fortran
- •Задача 1. Вывод натурального числа
- •Задача 2. Сумма ряда
- •Задача 3. Медленная сортировка
- •Задача 4. Быстрая сортировка
- •Задача 5. Слова
- •Задача 6. График
- •Задача 7. Кубическое уравнение
- •Задача 8. Собственное число
- •Комментарии к задачам
1.10. Массивы
Описание одномерного массива в языке С имеет вид:
тип имя массива [ длина ] [ = { список значений } ] ;
Здесь тип - тип элемента массива, имя массива - идентификатор, длина - количество элементов массива, заданное константным выражением, список значений - последовательность разделенных запятыми константных выражений, например:
int a[7]={-1,147/3+26/7,33,5,6,0,-11};
Индексы элементов любого массива всегда начинаются с 0, так что последний элемент имеет индекс длина-1. Так, в приведенном примере индекс последнего (седьмого по счету) элемента массива a равен 6. Инициализирующая часть оператора не обязательна; кроме того, длина списка значений может быть меньше длины массива, тогда оставшиеся элементы массива не инициализируются. Если задан полный список значений, то можно не указывать длину массива - память под массив будет распределена в соответствии с количеством инициализирующих выражений, но модификатор [ ] , означающий массив, опускать нельзя.
Имя массива считается константой-указателем, равной адресу нулевого элемента массива, т.е. a и &a[0] - это одно и то же. Обращение к элементам массива возможно либо с помощью индексов (точно так же, как в языке PASCAL) : a[i] , либо по адресу : *(a+i) - причем в последнем случае используется адресная арифметика. Фактически в программе всегда происходит обращение к элементу массива по адресу, а использование индексов допускается лишь для удобства программирования. Выход индекса за границы массива никак не отслеживается в языке С и не считается ошибкой.
Описание многомерного массива в общем случае имеет вид:
тип имя массива [ длина1 ] [ длина2 ] ... [ ={ список значений } ] ;
Например, двумерный массив b можно описать в виде
int b[3][4]={{1,2,3,4},{3,7,0,2},{3,7,4,8}};
Массив b является массивом из трех элементов, каждый из которых есть массив из четырех элементов типа int, это обстоятельство явным образом отражено в инициализирующей части оператора. Но если инициализируются все элементы массива, как в приведенном примере, внутренние {} можно опускать:
int b[3][4]={1,2,3,4,3,7,0,2,3,7,4,8};
Внутренние {} необходимы, если часть элементов не инициализируются:
int b[3][4]={{1,2},{4,3,7},{0}};
Здесь инициализированы элементы b00,b01,b10,b11,b12,b20. В случае, если задан полный список значений, можно опускать первую из длин измерений, она будет неявно определена как длина списка значений, последовательно поделенная на явно указанные длины измерений. Так, массив b можно описать как
int b[][4]={1,2,3,4,3,7,0,2,3,7,4,8};
Имя многомерного массива также является константой - указателем на самый первый элемент массива (т.е. элемент, все индексы которого - нули). Элементы многомерного массива - массивы - являются указателями на соответствующие подмножества элементов. Обращение к элементам многомерных массивов возможно с помощью индексов: b[i][j] или по адресу: *(b[i]+j) . Каждый индекс элемента многомерного массива должен быть обязательно заключен в собственные [ ] . Запись вида b[i,j] не является ошибкой (вспомним об операции “запятая”), но она определяет не элемент массива - число типа int, а адрес подмножества элементов, начинающегося с элемента bj0 .
