Ответ:
Условные логические операции:
Оценивают каждый операнд с точки зрения его эквивалентности нулю.
Если значения первого операнда достаточно, чтобы определить результат операции, то второй операнд не вычисляется.
Используются при вычислении составных логических выражений
Знак операции | Описание | Результат |
&& | Логическое «И» (AND) | Равен «1», если оба операнда имеют нулевые значения, в противном случае равен «0» |
|| | Логическое «ИЛИ» (OR) | Равен «1», если какой-либо из операндов имеет ненулевое значение, в противном случае равен «0» |
Результатом выполнения условной логической операции является числовое значение, которое равно:
· «1», если результат выполнения операции – истина;
· «0», если результата выполнения операции – ложь.
Пример:
A = 4;
B = 6;
D = 10;
C = (A>B) || (D>=A); // C равно 1
С = (A!=B) && (D>=A); // C равно 1
Операции отношения:
Знак операции | Описание | Пример |
== | Эквивалентно (проверка на равенство) | N==0 |
!= | Не равно (проверка на неравенство) | N!=8 |
< | Меньше | N<9 |
> | Больше | N>7 |
<= | Меньше или равно | N<=12 |
>= | Больше или равно | N>=11 |
! | Логическое отрицание | !A = 0 |
Результатом выполнения операций отношения является числовое значение, которое равно:
· «1», если результат выполнения операции – истина;
· «0», если результата выполнения операции – ложь.
Приоритет:
Приоритет | Операция | Название |
I-й | ! | логическое отрицание |
II-й | && | логическое умножение |
III-й | || | логическое сложение |
11.Оператор присваивания в языке Си. Совместимость и преобразование типов. Примеры.
Ответ:
В языке программирования Си присваивание также является выражением, и значением такого выражения является величина, которая присваивается.
Например: intA = 10; intB, C; C = B =A-1.
Если объекты в левой и правой части операции присваивания имеют разные типы, используется операция приведения типа.
Знак операции | Описание | Пример |
(тип) | Явное преобразование типа | int S; char T; S = (int)T; |
Преобразование (приведение) типа (typecast) – преобразование значения одного типа в значение другого типа:
· Явное (explicit) – задается программистом в теле программы с помощью конструкций языка программирования.
· Неявное (implicit) – выполняется компилятором по определенным правилам языка, например, когда в одном выражении используются переменные нескольких типов (в большинстве языков запрещены).
Явное преобразование типов:
· Унарная операция, имя типа указывается в круглых скобках перед переменной или выражением
int X;
int Y = 200;
char C = 30;
X = (int)C * 10 + Y; // переменная С приводится к типу int
· Следует быть внимательным при использовании типа char (по умолчанию может быть знаковым или беззнаковым в настройках компилятора) – лучше явно указывать знаковость char:
char C=255;
int S;
S = (int)C; // если char поумолчанию signed, то S=-1, иначе S=1
Неявное преобразование типов выполняется:
· После вычисления операндов бинарных арифметических, логических, битовых операций, операций сравнения, а также 2-го или 3-го операнда операции «?:»; значения операндов приводятся к одинаковому типу.
· Перед выполнением присваивания.
· Перед передачей аргумента функции.
· Перед возвратом функцией возвращаемого значения.
· После вычисления выражения конструкции switch значение приводится к целочисленному типу.
· После вычисления выражений в операторах ветвления и циклов (if, for, while, do-while).
· В арифметических выражениях тип меньшего размера преобразовывается в тип большего размера:
char C; | // sizeof(C) ->1 |
int I; | // sizeof(I) -> 2 |
long int L; | // sizeof(L) -> 4 |
double D; | // sizeof(D) -> 8 |
float F; | // sizeof(F) -> 4 |
r=sizeof(I+L); | // r -> 4 |
r=sizeof(I+D); | // r -> 8 |
r=sizeof(F+3.2); | // r -> 8 |
r=sizeof(C+I); | // r -> 2 |
· При выполнении операции присваивания значение правой части преобразуется к типу левой, который и является типом результата:
o Длинные целые преобразуются в более короткие целые и в переменные типа char посредством отбрасывания (!) лишних битов высокого порядка.
o float преобразуется в int отбрасыванием дробной части.
o double преобразуется во float округлением.
short int I=312; char C; long int L=54000; C=I; //C равно 56, символ ‘8’ I = L; //I равно -11536 | int I; double D=3.45678969; //D равно 3.45678968999999999 float B, F=25.97; B=D; //B равно 3.4567897 I=F; //I равно 25 |
· При выполнении логических операций, операций отношения, операторов ветвлений и циклов, условного выражения тернарной операции результат "=1", если они истинны, и "=0" в противном случае.
intr, X=2, Y=5, Z=5; | |
r=X<=Y; | //r -> 1 |
r=Z>5; | //r -> 0 |
r=Y==Z; | //r -> 1 |
Преобразование типов
· Следует с осторожностью использовать сравнения вещественных чисел.
· Рекомендуется выполнять сравнение плавающих чисел с учетом допустимой погрешности.
НЕПРАВИЛЬНО! | ПРАВИЛЬНО! |
int L; double D = 9E-25; D = D * 1E25; L = (D == 9); | #include <stdlib.h> #define EPS 0.0001 int L; double D=9E-25; D = D * 1E25; L = (abs(D-9)<=EPS); |
12.Процедуры ввода и вывода в консольном режиме в языке Си. Форматированный вывод. Примеры.
Ответ:
Консольный ввод/вывод относится к событиям, возникающим от клавиатуры или на экране. Поскольку ввод и вывод на консоль - это типичные операции, была создана подсистема файловой системы ввода/вывода ANSI С для работы исключительно с консолью. Эти функции направляют операции в стандартный ввод (stdin) и стандартный вывод (stdout) системы. Возможно перенаправить консольный ввод на другие устройства. Для простоты обсуждения предполагается, что консоль - это устройство, используемое стандартными способами.
Библиотека консольного ввода/вывода conio.h
· Заголовочный файл conio.h объявляет несколько библиотечных функций, предназначенных для ввода данных с клавиатуры и вывода данных на экран.
· Библиотека поддерживается только в MS Windows (до этого – в MS DOS), т.е. в UNIX/Linux системах отсутствует.
· Библиотека обеспечивает "низкоуровневый" ввод/вывод за счет непосредственного использования специализированных функций операционной системы (например, ввод без "эхо-отображения" на экран, вывод на консоль без буферизации, определение нажатия клавиши и т.п.).
· Не рекомендуется использование без крайней необходимости.
В языке С отсутствуют встроенные операторы ввода/вывода данных. Ввод/вывод данных выполняется путем вызова библиотечных функций.
Форматированный ввод/вывод:
Заголовочный файл <stdio.h>.
· Функция printf() – вывод в стандартный поток вывода stdout (на экран).
· Функция scanf() – ввод из стандартного потока ввода stdin (с клавиатуры).
· Функции ввода/вывода из файла (fprintf/fscanf) или области памяти (sprintf/sscanf).
Функция printf() выполняет вывод данных со следующими видами форматирования:
· Округление ПЗ-значений до указанного числа десятичных знаков.
· Выравнивание столбца чисел по положению десятичной точки в столбце.
· Выравнивание выводимых данных по правому и левому краю.
· Вставка литеральных символов (табуляция, новая строк и т.д.) в заданное место выводимой строки.
· Представление ПЗ-числа в экспоненциальном формате.
· Представление целого числа в формате СС8 и СС16.
· Вывод данных всех типов с фиксированной шириной поля и точностью представления.
Форматированный вывод
· Вывод символов:
o Вывод отдельного символа - %с. Соответствующий аргумент будет выведен на экран без изменения.
o Вывод строки - %s (выводятся символы до ‘\0’).
· Вывод целочисленных значений:
o Знаковые числа в десятичном формате – %d или %i (эквивалентны)
o Беззнаковые числа:
§ В десятичном формате - %u
§ В восьмеричном формате - %o
§ В шестнадцатеричном формате - %x или %X
· Вывод вещественных чисел:
o В научной нотации - %e или %E
o В виде числа с плавающей точкой - %f
o В виде более короткого из предыдущих вариантов - %g (выбор из %e и %f) или %G (выбор из %E и %f).
Модификаторы формата – указываются между % и спецификатором формата:
· Минимальная ширина поля и «точность» - Х.x. Здесь:
o Ширина поля – минимальная (!) ширина поля для вывода значения (т.е. если значение не помещается, то оно займет больше места).
o «Точность» - количество десятичных разрядов после «.» (для ПЗ-значений) или количество символов (для строки).
· Заполнение ведущими нулями – “0”.
· Обязательный вывод знака числа – “+”.
· Вывод пробела перед положительным значением (при отсутствии модификатора "+") – " " (пробел) - полезно для выравнивания по правому краю положительных и отрицательных целых чисел.
· Выравнивание по левому краю – “-”(по умолчанию весь вывод выравнивается по правому краю).
· Расширенная разрядность (long) – “l” и беззнаковый формат -“u”.