Добавил:
Лабы/курсовые по программированию (С++/Verilog HDL), Теория и Практика Помехоустойчивого Кодирования Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1сем Дагаев / lectures_3.pdf
Скачиваний:
34
Добавлен:
09.03.2022
Размер:
769.01 Кб
Скачать

Прототип рассматриваемой функции имеет следующий вид:

#include<math.h>

double modf(double value, double *iptr);

Функция modf() имеет два параметра. С помощью параметра value в функцию передается исходное действительное число. Функция извлекает из переданного числа дробную и целую части. Функция modf() возвращает дробную часть, а целая часть сохраняется в переменной, на которую будет установлен указатель iptr.

Ниже приводится программый код, иллюстрирующий работу рассматриваемой функции.

#include <stdio.h> #include<math.h> #include<conio.h> int main(void)

{

double n, x;

x = modf(10.2, &n);

printf("n= %0.4g x= %0.4g", n, x); getch();

return 0;

}

В приведенном программном коде, дробная часть исходного числа, которую вернула функция modf(), сохранена функцией main() в переменной x, а целая часть оказалась записанной функцией modf() в переменную n. Протокол работы с рассматриваемой программой, который приведен ниже, подтверждает правильность выполненного анализа:

n= 10 x= 0.2

18. Принятие решений и логические величины. Операторы отношения и сравнения на равенство

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

Принцип интерпретации числовых значений в качестве логических значений

Интерпретация логических значений в качестве чисел.

В языке Си эти соглашения выглядят следующим образом:

Любое число (целое или вещественное), отличное от нуля, может интерпретироваться в соответствующем контексте как логическое значение true, а число, равное нулю – как логическое значение false.

Логическое значение true в контексте, требующем числовой интерпретации, воспринимается как целое число равное 1, логическое значение false – воспринимается как целое число равное 0.

39

При этом оказывается, что в качестве “источников” логических значений можно использовать следующие программные конструкции:

Обычные арифметические выражения (нулевое значение такого выражения соответствует логическому значению false, а любое не нулевое значение - true).

Отношения и сравнения на равенство.

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

Ближайшей нашей задачей является рассмотрение отношений и сравнений на равенство.

Как уже отмечалось ранее, отношения и сравнения на равенство используются для получения логических значений. Это обеспечивается путем оценки истинности отношений и сравнений на равенство. Причем в том случае, когда истинность имеет место, указанное выражение возвращает значение 1, в противном случае возвращается значение 0.

В таблице приводятся названия рассматриваемых операций, математические знаки операций, операторы языка Си и примеры их

применения

 

 

 

Название операции

Математический знак

Оператор Си

Пример

меньше

<

<

a < b

не меньше

³

>=

a >= b

больше

>

>

a > b

не больше

£

<=

a <= b

равно

=

==

a == b

не равно

¹

!=

a != b

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

фрагмент программного кода:

/* . . . . . . . . . . . . . . . . . . . . . . . . . . . */ int n = 3;

printf(“n > 2 = %d n < -1 = %d\n”, n > 2, n < -1);

/* . . . . . . . . . . . . . . . . . . . . . . . . . . . */

В этом фрагменте кода оцениваются значения отношений n > 2 и n < -1 для случая, когда значение переменной n равно 3. Нетрудно видеть, что первое отношение должно принимать значение true (истина), а второе отношение – значение false (ложь). Обратимся теперь к выводу, полученному

в результате выполнения данного фрагмента, который имеет следующий вид: n > 2 = 1 n < -1 = 0

С учетом принятых в языке Си относительно кодирования булевских значений соглашений в качестве значения отношения n > 2 выведено число 1, в качестве значения второго отношения – число 0.

40

18.1.Логические операторы

Логические операторы используются для повышения выразительных средств языка. В языке Си имеются три логических оператора:

! – логическое НЕ,

&& - логическое И,

|| - логическое ИЛИ.

Оператор ! является унарным оператором, а операторы && и || - бинарными. В качестве операндов логических операторов могут использоваться арифметические выражения, отношения и сравнения на равенство. Логические операции задаются с помощью так называемых таблиц истинности. Предположим, что имеются две логические величины a, b. Тогда таблицы истинности для рассматриваемых операторов можно представить в следующем виде:

ab Логическая операция

false

false

!a

!b

a && b

a || b

true

true

false

false

false

true

true

false

false

true

true

false

false

true

false

true

true

true

false

false

true

true

Значение результата выполнения оператора ! является обратным по отношению к его операнду. Значение, полученное в результате выполнения оператора &&, истинно только в том случае, когда истинны его оба операнда. Значение результата выполнения оператора || истинно в том случае, когда истинен хотя бы один операнд. Отметим, что бинарные операторы относятся к немногочисленной категории операторов, для которых фиксирован порядок вычисления операндов. Этот порядок выполнения состоит в следующем. Вначале всегда вычисляется левый операнд. Если после его вычисления значение выражения становится очевидным, то правый операнд не вычисляется. Например, если при вычислении выражения, содержащего оператор &&, значение левого операнда оказалось равным false, то из этого заведомо следует, что значением всего выражения будет логическое значение false. При этом необходимость в вычислении правого операнда отпадает.

18.2.Поразрядные операторы

Эти операторы могут быть полезными в тех случаях, когда программисту требуется непосредственно взаимодействовать с аппаратурными компонентами компьютера. В языке Си имеется шесть поразрядных операторов:

~ поразрядное НЕ,

& поразрядное И,

| поразрядное ИЛИ,

^ поразрядное ИСКЛЮЧАЮЩЕЕ ИЛИ,

<< сдвиг влево,

>> сдвиг вправо.

41

Отметим, что поразрядные операторы применимы только к целочисленным операндам.

Краткое описание поразрядных операторов содержится в таблице, приведенной ниже.

Оператор

Название

Описание

операнда,

равные

0,

~

Поразрядное НЕ

Все

биты

 

 

устанавливаются в 1, а все

биты,

 

 

значения

которых

равны

 

1,

 

 

устанавливаются в 0.

 

 

 

&Поразрядное И Бит результата устанавливается в 1

 

 

только

в

том

 

случае,

когда

 

 

соответствующие

биты

обоих

операндов

 

 

установлены в 1, во всех других

 

 

случаях

этот

бит

устанавливается

в

|

Поразрядное ИЛИ

0.

результата

устанавливается в 1

в

Бит

 

 

том случае, когда хотя бы один из

 

 

соответствующих

и

битов

операндов

 

 

установлен в

1

устанавливается

в

 

 

0, если оба соответствующих бита,

^

Поразрядное

установлены в 0.

 

 

 

 

1,

Бит

результата

устанавливается в

 

ИСКЛЮЧАЮЩЕЕ ИЛИ

если

соответствующий

бит

одного

и

 

 

только одного операнда установлен в

 

 

1, во всех других случаях этот бит

<<

Сдвиг влево

устанавливается в 0.

левого

операнда

Сдвигает

влево

биты

 

 

на

количество

 

позиций,

 

которое

 

 

определяется

 

правым

операндом.

 

 

Правые

освобождающиеся

 

позиции

>>

Сдвиг вправо

заполняются нулями.

левого

операнда

Сдвигает

вправо

биты

 

 

на

количество

 

позиций,

 

которое

 

 

определяется

 

правым

операндом.

 

 

Способ

заполнения

освобождающихся

 

 

позиций

является

аппаратно

 

 

зависимым.

 

 

 

 

 

 

 

Пусть имеется следующий фрагмент программы, содержащий

выражения, использующие поразрядные операции.

/* .....................*/ unsigned char n = 0x2A; unsigned char m = 0x71; unsigned char r;

r = ~n;

printf("~n = %X\n", r);

r = ~m;

printf("~m = %X\n", r);

42

Соседние файлы в папке 1сем Дагаев