- •Содержание
- •Глава 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. Собственное число
- •Комментарии к задачам
Int sprintf(char* s,char* формат [ , список вывода ] )
которая работает подобно функции printf, но вместо устройства вывода использует строку s.
Для преобразования строки в число служат функции, описанные в файле stdlib.h :
double atof(char* s) - преобразует строку s в вещественное число;
int atoi(char* s) - преобразует строку s в целое число;
long atol(char* s) - преобразует строку s в длинное целое число.
Функции возвращают результат преобразования строки до первого ошибочного символа или до нуль-символа. Они не предоставляют средств контроля за правильностью записи числа в исходной строке.
Для проверки принадлежности отдельного символа некоторому множеству символов и преобразования символов используются макроопределения (см. 1.14), описанные в файле ctype.h . Макроопределения проверки символов возвращают ненулевое значение, если символ входит в множество, и 0 - в противном случае:
isalpha(c) - латинская буква
islower(c) - малая латинская буква
isupper(c) - заглавная латинская буква
isdigit(c) - цифра
isxdigit(c) - 16-ричная цифра '0'..'9','A'..'F','a'..'f'
isalnum(c) - латинская буква или цифра
isspace(c) - пробел или управляющий символ \f,\n,\r,\t,\v
iscntrl(c) - невидимые символы
ispunct(c) - печатаемый символ, кроме пробела, букв и цифр
isgraph(c) - печатаемый символ, кроме пробела
isprint(c) - печатаемый символ, включая пробел
Макроопределения преобразования символов:
toupper(c) - для малой латинской буквы возвращает соответствующую большую букву, в остальных случаях возвращает c ;
tolower(c) - для большой латинской буквы возвращает соответствующую малую букву, в остальных случаях возвращает c .
1.14. Макроопределения
Макроопределения задаются, подобно символическим константам (которые являются простейшими макроопределениями), директивой препроцессора #define в виде:
#define имя ( список параметров ) строка замещения
где имя - некоторый идентификатор, список параметров - список идентификаторов, разделенных запятыми, строка замещения - это, как правило, некоторое выражение или последовательность операторов, куда входят параметры, указанные в скобках. В программе макроопределения, подобно функциям, используются со списком аргументов (аргументами могут быть любые правильно записанные выражения). Препроцессор проделывает с встреченными им в тексте программы макроопределениями следующие манипуляции :
1) каждое вхождение параметра в строку замещения заменяется на соответствующий аргумент (если только параметр в строке замещения не находится внутри “ ”);
2) параметры, предваряемые символом # в строке замещения макроопределения, заменяются на соответствующий аргумент в “ “;
3) подготовленная таким образом строка замещения подставляется в текст программы.
В отличие от функций, предварительного вычисления значений аргументов не происходит, все операции выполняются только над текстом. В качестве примера запишем макроопределение SQR для вычисления квадрата числа :
#define SQR(x) ((x)*(x))
и макроопределение, предоставляющее удобное средство отладочной печати:
#define OUTPUT(x,f) printf("\n"#x"=%"#f,(x))
Отметим, что использование макроопределений иногда приводит к побочным эффектам, которые возникают при многократном использовании аргументов-выражений. Например, int x=2; y=SQR(x++); В результате выражение x++ * x++ установит x в 4 вместо 3, а y в 6=2*3 вместо ожидаемого значения 4. Кроме того, текстовые подстановки не позволяют применять в качестве аргументов арифметические выражения, поскольку они вычисляются в теле макроподстановки многократно, что замедляет выполнение программы. Еще один недостаток макроопределений - невозможность отличить вызовы функций от вызовов макроопределений в тексте программы.
В языке C++ существует возможность вставки фрагмента кода (а не текста) функции, чтобы не выполнять переход к коду функции при ее вызове. Для этого перед описанием функции ставится ключевое слово inline. Например, inline int sqr(int x) {return x*x;} Наиболее эффективно использовать подставляемые функции в тех случаях, когда тело функции состоит всего из нескольких операторов, хотя при многократных вызовах подставляемой функции размеры программы могут увеличиться, однако исключаются затраты на передачу управления к вызываемой функции и возврат из нее. Так как компилятор встраивает код подставляемой функции вместо ее вызова, то определение функции со спецификатором inline должно находиться в том же файле, что и обращение к ней, и размещаться до первого вызова. Функция со спецификатором inline не может быть рекурсивной и не может содержать операторов goto , switch , do , for , while.
