Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЯВУ - методичка1.doc
Скачиваний:
8
Добавлен:
08.11.2019
Размер:
683.52 Кб
Скачать

Директивы препроцессора

Исходный файл обычно включает директивы препроцессора – это указания для предварительной обработки текста исходного файла перед его компиляцией. Директивой является строка, начинающаяся с символа #.

Директивы включения файлов позволяют подключить общие файлы заголовков с расширением “.h”, через которые осуществляется доступ к стандартным библиотекам, например,

#include <stdio.h> /* функции стандартного ввода-вывода */

#include <conio.h> /* функции консольного ввода-вывода */

#include <math.h> /* стандартные математические функции */

Директивы подстановки имен позволяют программисту создавать собственные символические константы и макроопределения для фрагментов исходного текста программы по формату

#define идентификатор текст

при этом в конце директивы не ставится точка с запятой (;), поскольку это не оператор, а текст подстановки, например,

#define PI 3.14159 /* символическая константа */

#define AREA (PI*r*r) /* макроопределение формулы */

#define AREA1(r) (PI*(r)*(r)) /* макроопределение функции */

Круглые скобки в макроопределении позволяют избежать побочных эффектов, связанных с порядком вычисления выражений с применением макрокоманд. Например, применение макроопределений без скобок при подстановке в выражение 2/AREA примет вид 2/PI*r*r , что неверно, а подстановка 2/(PI*r*r) верна. Аналогично, выражение 2/AREA1(r+5) с макроопределением без скобок имеет ошибочный вид 2/PI*r+5*r+5 , а верной является подстановка 2/(PI*(r+5)*(r+5)).

Выражения и операции

Выражение – это комбинация операндов, знаков операций и круглых скобок, используемая для получения значения определенного типа. Операндом (участником операции) может быть константа, переменная, функция или другое выражение. Знаки операции определяют действия (элементарные операции) над операндами в порядке, заданном приоритетами операций и круглыми скобками, которые образуют вложенные подвыражения. Вычисление выражения начинается с самых внутренних скобок.

Унарные операции (с одним операндом) имеют приоритет над бинарными (с двумя операндами). Мультипликативные операции (умножение (*), деление (/), в том числе и деление нацело, деление по модулю (%)) старше аддитивных (сложение (+), вычитание (–) ), за которыми идут операции отношения и логические операции [1, c.40].

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

#include<math.h> .

Для аргументов функций, которые имеют тип: int i; unsigned int u; double x, y; наиболее используемы в выражениях следующие функции [1, c.48]: sin(x) ~ sin x; cos(x) ~ cos x; tan(x) ~ tg x; acos(x) ~ arccos x; asin (x) ~ arcsin x ; atan(x) ~ arctg x; fabs(x) ~ | x | для вещественного x (результат double); abs(i) ~ | i | - для целого i (результат int); log(x) ~ ln x; log10(x) ~ lg x; exp(x) ~ ex, где e – основание натурального логарифма (2.7); floor(x) ~ наибольшее целое число <= x (результат double); ceil(x) ~ наименьшее целое число >= x (результат double); srand(u) ~ инициализация генератора случайных чисел (результат double); rand ~ равномерное псевдослучайное число от 0 до 232-1 (результат int).

Общее правило вычисления выражения: перед вычислением все входящие в него переменные должны быть определены, то есть должны иметь численные значения.

По роли выполняемой в программе выражения можно разделить на арифметические и логические.

Арифметические выражения представляют собой запись на языке Си в одну строку математической формулы с учетом порядка вычисления выражения и старшинства операций с целью получения числового значения (целого или вещественного). Например,

математическая формула:

арифметическое выражение:

a*sin(x)/sqrt(x*x+fabs(x-a))

(a+b)/(2*p-q)

a/(-2)

Выражение можно переносить на другую строку без повторения знака операций в отличие от записи математической формулы, но нельзя опускать знаки операций, аргумент функции заключается в круглые скобки:

a+bsin t –

2cos t

a+b*sin(t) –

2*cos(t)

Результат выражения определяется выполняемыми операциями с учетом преобразования типов операндов неявного (автоматического) и явного.

Неявное преобразование типов операндов осуществляет изменение типа участвующих в операциях операндов к типу операнда с наибольшим размером (“старший тип”). Перечислим типы данных, начиная со старшего:

long double – длинный вещественный с двойной точностью;

double – вещественный с двойной точностью;

float – вещественный;

unsigned long – длинный беззнаковый целый;

long int – длинный целый;

unsigned – беззнаковый целый;

int – целый;

char – символьный.

Пример. Для заданных описаний:

double p; unsigned char ch; unsigned long m; int i;

при вычислении выражения p*(i+ch/m) операнд сh преобразуется к типу unsigned long, к которому преобразуется также операнд i и результат в скобках, затем последний преобразуется к типу double и результат выражения будет иметь тип double.

Явное преобразование типа операнда осуществляется программистом с помощью операции вида

(тип) выражение , если без такого преобразования результат выражения будет неверный.

Деление целых операндов дает результат целого типа, что может привести к неожиданным результатам.

Пример. Пусть описана переменная int k=7, тогда при вычислении выражения

k / 2 получим в результате 3, вместо ожидаемого 3.5 . Применив преобразование типа переменной k

(float) k / 2, получим результат 3.5. Этот же результат можно получить, применяя смешанные (разного типа) операнды:

k / 2.0 .