- •Содержание
- •Глава 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.8. Циклические конструкции
В языке С существует три вида циклов : while , do while и for , являющихся аналогами циклов WHILE, REPEAT и FOR (не вполне) в языке PASCAL.
Оператор цикла while записывается в виде:
while ( логическое выражение ) оператор/блок
- и выполняется до тех пор, пока логическое выражение в скобках истинно, т.е. не равно нулю.
Оператор цикла do while записывается в виде:
do оператор/блок while ( логическое выражение );
- и выполняется, пока истинно логическое выражение в скобках, но в отличие от цикла while логическое выражение вычисляется после выполнения тела цикла.
Цикл for является наиболее сложным из трех видов циклических операторов языка С :
for( [ инициализирующее выражение ] ; [ логическое выражение ] ;
[ корректирующее выражение ] ) [ оператор/блок ]
Цикл for выполняется следующим образом: перед началом цикла (только один раз) вычисляется инициализирующее выражение, затем вычисляется логическое выражение и, если оно истинно, выполняется тело цикла, и после каждого шага цикла вычисляется корректирующее выражение. В цикле for все три выражения могут отсутствовать, но два символа “ ; ” должны быть записаны в скобках. При отсутствии логического выражения предполагается, что его значение всегда истинно. Никаких специальных требований к выражениям, используемым в цикле for, не предъявляется, это совершенно произвольные выражения, а их названия лишь обозначают порядок записи этих выражений в скобках.
Запишем, используя три типа цикла, алгоритм вычисления суммы квадратов натуральных чисел от 1 до n :
s=0; i=1; while (i<=n) {s+=i*i; i++;}
s=0; i=1; do s+=i*i; i++; while(i<=n);
s=0; for(i=1; i<=n; i++) s+=i*i;
Третий вариант записи можно упростить, если в инициализирующем и в корректирующем выражениях использовать операцию “запятая”.
for(i=1,s=0; i<=n; s+=i*i,i++);
Таким образом, тело цикла оказалось пустым (но ; должна остаться).
Для немедленного выхода из цикла любого типа можно использовать оператор break. Для пропуска части операторов тела цикла используется оператор continue; , полностью аналогичный процедуре Continue в языке PASCAL.
1.9. Указатели, адресная арифметика
Указателями называются переменные и константы, значениями которых являются адреса участков памяти, выделенных для объектов конкретных типов. В языке C так же, как в языке PASCAL, существуют типизированные и обобщенные указатели. Типизированные указатели описываются в виде:
базовый тип * имя указателя , * имя указателя , ... ;
* относится только к тому имени, непосредственно перед которым она стоит. В одном операторе описания можно описать как переменные некоторого типа, так и указатели на такой тип. Символ * , меняющий тип переменной, называется в таком контексте модификатором. Переменные типа «указатель» можно инициализировать так же, как и числовые переменные, например :
int a=0, *b=&a, **c=&b;
Обобщенный указатель имеет тип void* , в нем можно хранить адреса любых объектов, но его использование ограничено по сравнению с типизированными указателями. Отметим, что любой адрес можно проверить на равенство или неравенство со специальным значением NULL (аналогичным константе NIL в языке PASCAL), которое записывается вместо нуля. Слово NULL позволяет определить указатель, который ничего не адресует.
Для указателей определены следующие операции.
1. Операция “значение”, записывающаяся в виде * указатель , результат операции есть значение, записанное по адресу, хранящемуся в данном указателе. В языке PASCAL такая операция записывается в виде указатель^ . Операция “значение” применима только к типизированным указателям. Она имеет такой же приоритет, как и все другие унарные операции.
2. К указателям применима операция явного преобразования типа, причем указатель можно преобразовать не только в указатель другого типа, но и в число, и число можно преобразовать в указатель.
3. Операция присваивания = , при этом оба операнда должны быть указателями одного типа, либо один из них должен иметь тип void* , либо правый операнд должен быть числом 0.
4. Операции сравнения == , != , < , <= , > , >= , при этом оба операнда должны быть указателями одного типа, либо один из них должен иметь тип void* , либо один из операндов должен быть числом 0.
5. Операция вычитания - , оба операнда должны быть указателями одного типа, либо второй операнд должен быть целым числом.
6. Операция сложения + , при этом второй операнд должен быть целым числом.
7. Увеличение и уменьшение указателя ++ , -- .
8. Операции присваивания += и -= , второй операнд в этом случае должен быть целым числом.
9. Операция “адрес” & .
При выполнении операций 5-8 используется так называемая адресная арифметика, т.е. за 1 принимается размер в байтах типа данных, базового для этого указателя. Это свойство арифметических операций с указателями особенно часто используется при работе с массивами.
