Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
'\n' — переход на новую строку;
'\t' — горизонтальная табуляция;
'\а' — подача звукового сигнала. Полный список управляющих символьных последовательностей будет дан позднее.
Управляющие символьные последовательности являются частным случаем эскейп-последовательностей (ESC-sequence), с помощью которых можно задать символьную константу указанием ее кода. Код символа можно указать в восьмеричном или в шестнадцатеричном представлении. Формат восьмеричного представления: '\ddd'. Здесь d — восьмеричная цифра (от 0 до 7). Формат шестнадцатеричного представления: '\xhh' (или '\xhh'), где h — шестнадцатеричная цифра (от 0 до F). Например, константа, соответствующая заглавной латинской букве А, может быть представлена тремя способами: 'А', '101', '\х41'.
Именованные константы (константные переменные). Как и в Паскале, в программе на Си/Си++ могут использоваться именованные константы. Употребляемое для их определения служебное слово const принято называть квалификатором доступа. Квалификатор const указывает на то, что данная величина не может изменяться в течение всего времени работы программы. В частности, она не может располагаться в левой части оператора присваивания. Примеры описания константных переменных:
const float pi=3.14159;
const int iMIN=l, iMAX=1000;
Определение констант на стадии препроцессорной обработки программы. Еще одной возможностью ввести именованную константу является использование препроцессорной директивы #define в следующем формате:
#define <имя константы> <значение константы>
Например:
#define iMIN I
#define iMAX 1000
Тип констант явно не указывается и определяется по форме записи. В конце директивы не ставится точка с запятой.
На стадии препроцессорной обработки указанные имена заменяются на соответствующие значения. Например, если в программе присутствует оператор
X=iMAX-iMIN;
то в результате препроцессорной обработки он примет вид:
Х=1000-1;
При этом идентификаторы iMAX и iMIN не требуют описания внутри программы.
Константы перечисляемого типа. Данное средство языка позволяет определять последовательность целочисленных именованных констант. Описание перечисляемого типа начинается со служебного слова enum, а последующий список констант заключается в фигурные скобки. Например:
enum {A, B,C, D};
В результате имени А будет сопоставлена константа 0, имени В — константа l, C — 2, D — 3. По умолчанию значение первой константы равно нулю.
Для любой константы можно явно указать значение. Например:
enum {A=10,B, C,D};
В результате будут установлены следующие соответствия: А = 10, B = 11, C = 12, D = 13.
Возможен и такой вариант определения перечисления:
enum {А=10,В=20,С=35,D=100};
Если перечисляемому типу дать имя, то его можно использовать в описании переменных. Этот вариант аналогичен использованию перечисляемого типа данных в Паскале (см. разд. 3.4). Например:
enum metal {Fe, Co, Na, Cu, Zn);
metal Metl, Met2;
Здесь идентификатор metal становится именем типа. После такого описания в программе возможны следующие операторы:
Metl=Na; Met2=Zn;
4.4. Операции и выражения
Во всех языках программирования под выражением подразумевается конструкция, составленная из констант, переменных, знаков операций, функций, скобок. Выражение определяет порядок вычисления некоторого значения. Если это числовое значение, то такое выражение называют арифметическим. Вот несколько примеров арифметических выражений, записанных по правилам языка Си:
a+b 12.5-z 2*(X+Y)
х++ х+++b --n*2 n*=1
Три первых выражения имеют традиционную форму для языков программирования высокого уровня, поэтому их смысл очевиден. Следующие четыре выражения специфичны для языка Си.
Опишем набор операций, используемых в Си, а также правила записи и вычисления выражений. Напомним, что операция, применяемая к одному операнду, называется унарной, а операция с двумя операндами — бинарной.
Арифметические операции. К арифметическим операциям относятся:
— вычитание или унарный минус;
+ сложение или унарный плюс;
* умножение;
/ деление;
% деление по модулю (аналог Mod в Паскале);
++ унарная операция увеличения на единицу (инкремент);
-- унарная операция уменьшения на единицу (декремент).
Все операции, кроме деления по модулю, применимы к любым числовым типам данных. Операция % применима только к целым числам.
Рассмотрим особенности выполнения операции деления. Если делимое и делитель — целые числа, то и результат — целое число. В этом случае операция / действует аналогично Div в Паскале. Например, значение выражения 5/3 будет равно 2, а при вычислении 1/5 получится 0.
Если хотя бы один из операндов имеет вещественный тип, то и результат будет вещественным. Например, операции 5. / 3, 5. / 3., 5/3. дадут вещественный результат 1.6666.
Операции инкремента и декремента могут применяться только к переменным и не могут — к константам и выражениям. Операция ++ увеличивает значение переменной на единицу, операция — уменьшает значение переменной на единицу. Оба знака операции могут записываться как перед операндом (префиксная форма), так и после операнда (постфиксная форма), например: ++X или X++, --а или а--. Три следующих оператора дают один и тот же результат:
х=х+1; ++х; х++
Различие проявляется при использовании префиксной и постфиксной форм в выражениях. Проиллюстрируем это на примерах. Первый пример:
а=3; b=2;
с=а++*b++;
В результате выполнения переменные получат следующие значения: а=4, b=3, c=6.
Второй пример:
а=3; b=2;
с=++а*++b;
Результаты будут такими: а = 4, b = 3, с = 12.
Объяснение следующее: при использовании постфиксной формы операции ++ и - - выполняются после того, как значение переменной было использовано в выражении, а префиксные операции — до использования. Поэтому в первом примере значение переменной с вычислялось как произведение 3 на 2, а во втором — как произведение 4 на 3.
По убыванию старшинства арифметические операции расположены в следующем порядке:
++, --
— (унарный минус)
*, /, %
+, -
Одинаковые по старшинству операции выполняются в порядке слева направо. Как и в Паскале, для изменения порядка выполнения операций в выражениях могут применяться круглые скобки.
Операции отношения. В Си используется тот же набор операций отношения, что и в Паскале. Следует лишь обратить внимание на различие в записи операций «равно» и «не равно».
< меньше,
<= меньше или равно,
> больше,
>= больше или равно,
= = равно,
! = не равно.
Как уже говорилось раньше, в стандарте Си нет логического типа данных. Поэтому результатом операции отношения является целое число: если отношение истинно — то 1, если ложно — то 0.
Примеры отношений:
а<0, 101>=105, 'а'=='А', 'а"='А'
Результатом второго и третьего отношений будет 0 — ложь; результат четвертого отношения равен 1 — истина; результат первого отношения зависит от значения переменной а.
Логические операции. Три основные логические операции в языке Си записываются иначе, чем в Паскале.
! операция отрицания (НЕ),
&& конъюнкция, логическое умножение (И),
| | дизъюнкция, логическое сложение (ИЛИ).
Правила их выполнения определяются таблицей истинности (см. табл. 3.5).
Например, логическое выражение, соответствующее системе неравенств 0 < х < 1 в программе на Си запишется в виде следующего логического выражения:
х>0 && х<1
Обратите внимание на то обстоятельство, что здесь не понадобились круглые скобки для выделения операций отношения. В отличие от Паскаля, где операции отношения имеют самый низкий приоритет, в Си операции отношения старше конъюнкции и дизъюнкции. По убыванию приоритета логические операции и операции отношения расположены в следующем порядке:
!
> < >= <=
== !=
&&
||
Помимо рассмотренных в Си имеются поразрядные логические операции. Эти операции выполняются над каждой парой соответствующих двоичных разрядов внутреннего представления операндов. Их еще называют битовыми логическими операциями. Знаки битовых логических операций:
& поразрядная конъюнкция (И),
| поразрядная дизъюнкция (ИЛИ),
^ поразрядное исключающее ИЛИ,
~ поразрядное отрицание (НЕ).
Битовые логические операции вместе с операциями поразрядного сдвига влево (<<) и вправо (>>) позволяют добраться до каждого бита внутреннего кода. Чаще всего такие действия приходится выполнять в системных программах. В данном пособии мы их рассматривать не будем.
Операция присваивания. То, что присваивание в Си является операцией, а не оператором, оказывается, наверное, самой большой неожиданностью для знатоков Паскаля. А между тем это действительно так! Знак операции присваивания =. Следствием отмеченного факта является то, что присваивание, как любой другой знак операции, может несколько раз входить в выражение. Например:
а=b=с=х+у;
Присваивание имеет самый низкий приоритет (ниже только у операции «запятая»). Кроме того, операция присваивания — правоассоциативная. Это значит, что несколько подряд расположенных присваиваний выполняются справа налево. Поэтому в приведенном выше выражении первой выполнится операция сложения, затем переменной с присвоится значение суммы, затем это значение присвоится переменной b и в конце — переменной а.
В языке Си имеются дополнительные операции присваивания, совмещающие присваивание с выполнением других операций. Среди них: +=, -=, /=, *=, %=. Приоритет у них такой же, как и у простого присваивания. Примеры использования этих операций:

Заметим, что вместо выражения а=а+2 предпочтительнее писать в программе а+=2, поскольку второе выражение будет вычисляться быстрее.
Операция явного преобразования типа (операция «тип»). Применение этой операции имеет следующий формат:
(имя_типа) операнд
Операндом могут быть константа, переменная, выражение. В результате значение операнда преобразуется к указанному типу. Примеры использования преобразования типа:
(long)8, (float)1, (int)x%2
По поводу последнего выражения заметим, что приоритет операции
«тип» выше деления (и других бинарных арифметических операций), поэтому сначала значение переменной х приведется к целому типу (отбросится дробная часть), а затем выполнится деление по модулю.
Следующий фрагмент программы иллюстрирует одну из практических ситуаций, в которой потребовалось использовать преобразование типа:
float с;
int a=l, b=2;
с=(float)а/b;
В результате переменная с получит значение 0,5. Без преобразования типа ее значение стало бы равно 0.
Операция sizeof. Эта операция имеет две формы записи:
sizeof(тип) и sizeof (выражение)
Результатом операции является целое число, равное количеству байтов, которое занимает в памяти величина явно указанного типа или величина, полученная в результате вычисления выражения. Последняя определяется также по типу результата выражения. Хотя по форме записи это похоже на функцию, однако sizeof является именно операцией. Ее приоритет выше, чем у бинарных арифметических операций, логических операций и отношений. Примеры использования операции:

Операция «запятая». Эта необычная операция используется для связывания нескольких выражений в одно. Несколько выражений, разделенных запятыми, вычисляются последовательно слева направо. В качестве результата такого совмещенного выражения принимается значение самого правого выражения. Например, если переменная X имеет тип int, то значение выражения (X=3, 5*Х) будет равно 15, а переменная X примет значение 3.
Операция «условие?:». Это единственная операция, которая имеет три операнда. Формат операции:
выражение1 ? выражение 2 : выражение 3
Данная операция реализует алгоритмическую структуру ветвления. Алгоритм ее выполнения следующий: первым вычисляется значение выражения 1, которое обычно представляет собой некоторое условие. Если оно истинно, т. е. не равно 0, то вычисляется выражение 2 и полученный результат становится результатом операции. В противном случае в качестве результата берется значение выражения 3.
Пример 1. Вычисление абсолютной величины переменной Х можно организовать с помощью одной операции:
Х<0 ? - X : X;
Пример 2. Выбор большего значения из двух переменных а и b:
mах=(а<=b)?b:а;
Пример 3. Заменить большее значение из двух переменных а и b на единицу:
(a>b)?a:b=l;
Правила языка в данном случае позволяют ставить условную операцию слева от знака присваивания.
Операции ( ) и [ ]. В языке Си круглые и квадратные скобки рассматриваются как операции, причем эти операции имеют наивысший приоритет. Их смысл будет раскрыт позже.
Подведем итог всему разговору об операциях Си/Си++, сведя их в общую табл. 4.2 и расположив по рангам. Ранг операции — это порядковый номер в ряду приоритетов. Чем больше ранг, тем ниже приоритет. В таблице отражено еще одно свойство операций — ассоциативность. Если одна и та же операция, повторяющаяся в выражении несколько раз, выполняется в порядке расположения слева направо, то она называется левоассоциативной; если выполняется справа налево, то операция правоассоциативная. В таблице эти свойства отображены стрелками влево и вправо. Некоторые операции, присутствующие в таблице, пока не обсуждались.
Таблица 4.2
Приоритеты (ранги) операций


Приведение типов при вычислении выражений. Практически во всех языках программирования высокого уровня работает ряд общих правил записи выражений:
• все символы, составляющие выражение, записываются в строку (нет надстрочных и подстрочных символов);
• в выражении проставляются все знаки операций;
• при записи выражения учитываются приоритеты операций;
• для влияния на последовательность операций используются круглые скобки.
Некоторые специфические особенности записи выражений на Си были описаны выше при рассмотрении операций языка.
В процессе вычисления выражений с разнотипными операндами производится автоматическое преобразование типов величин. Знание программистом правил, по которым происходят эти преобразования, предупреждает некоторые ошибки в записи выражений. Суть правил преобразования при выполнении бинарных операций сводится к следующему:
• преобразование не выполняется, если оба операнда имеют одинаковый тип;
• при разных типах операндов происходит приведение величины с младшим типом к старшему типу (кроме операции присваивания);
• при выполнении операции присваивания величина, полученная в правой части, преобразуется к типу переменной, стоящей слева от знака =.
Старшинство типов друг по отношению к другу определяется по следующему принципу; старший тип включает в себя все значения младшего типа как подмножество. Вещественные (плавающие) типы являются старшими по отношению к целым. В свою очередь, внутри каждой из этих групп иерархия типов устанавливается в соответствии с указанным принципом. Целые типы по возрастанию старшинства расположены в таком порядке:
char→shot→int→long
Порядок старшинства вещественных типов следующий:
float→double→long double
Следует иметь в виду, что при преобразовании целой величины к плавающему типу может произойти потеря точности (вместо 1 получится 0,999).
Следующий пример иллюстрирует порядок выполнения операций и происходящие преобразования типов при вычислении выражения (рис. 43, цифры вверху — порядок операций).
char ch; int i; float f;
double d; long double r;

4.5. Линейные программы на Си/Си++
Структура программы. Общая структура программы на Си/Си++ следующая:
директивы_препроцессора
определение_функции_1
определение_функции_2
определение_функции_N
Среди функций обязательно присутствует главная функция с именем main. Простейшая программа содержит только главную функцию и имеет следующую структуру:
директивы препроцессора
void main()
{ определения_объектов;
исполняемые_операторы; }
Пока мы будем составлять только простейшие программы такого вида. Рассмотрим все необходимые средства языка для составления линейных вычислительных программ. В качестве опорного примера рассмотрим программу для вычисления площади треугольника по формуле Герона.
Пример 1. Дано: а, b, с — стороны треугольника. Вычислить S — площадь треугольника. По формуле Герона:
![]()
где р — полупериметр треугольника.
#ftinclude <stdio. h>
#include <math. h>
void main ()
{float a, b,c, p,s;
printf("\na="); scanf("%f",sa);
printf("\nb="); scanf("%f",&b);
printf("\nc="); scanf("%f",&c);
p=(a+b+c)/2;
s==sqrt (р* (p-a) * (p-b) * (p-c) ) ;
printf("\пПлощадь треугольника=%:е", s) ; }
Разберемся более подробно, чем это делалось раньше, во всех элементах данной программы. Как уже было сказано, программа состоит из одной главной функции со стандартным именем main. Слово void обозначает отсутствие какого-либо возвращаемого этой функцией результата, а пустые скобки — отсутствие у нее аргументов. Все, что следует после заголовка функции и заключено в фигурные скобки, можно назвать телом функции. Первая строка — объявление используемых переменных. Все они плавающего типа double. Обратите внимание на то, что объявление переменных заканчивается точкой с запятой.
Дальнейшая часть программы — исполняемые операторы. Среди них операторы вывода на экран, ввода данных с клавиатуры, операторы присваивания.
Понятие «оператор» в Си трактуется следующим образом: любое выражение, после которого стоит точка с запятой, воспринимается компилятором как отдельный оператор. Оператор определяет законченное действие на очередном шаге выполнения программы.
С точки зрения данного выше определения следующая конструкция в программе является оператором:
i++;
Его называют оператором-выражением
Если вычисление выражения заканчивается присваиванием, то его можно назвать оператором присваивания. В рассматриваемой программе присутствуют два оператора присваивания: вычисления полупериметра (р) и вычисления площади треугольника (S).
В выражении для вычисления площади используется библиотечная функция sqrt() — квадратный корень (как и в Паскале). Данная функция относится к библиотеке математических функций. Для подключения этой библиотеки к нашей программе используется директива препроцессора #include <math. h>. Здесь math. h — имя заголовочного файла этой библиотеки. В табл. 4.3 даны описания некоторых наиболее часто используемых функций математической библиотеки Си.
Таблица 4.3
Математические функции (заголовочный файл math. h)

В рассматриваемой программе операторы printf (...); и scanf (...) ; реализуют соответственно вывод на экран и ввод исходных данных с клавиатуры. Они осуществляют обращение к соответствующим функциям стандартной библиотеки ввода-вывода Си, заголовочный файл которой имеет имя stdio. h.
Форматированный вывод на экран. Оператор вызова функции printf() имеет следующую структуру:
printf(форматная строка, список_аргументов);
Форматная строка ограничена двойными кавычками (т. е. является текстовой константой) и может включать в себя произвольный текст, управляющие символы и спецификаторы формата. Список аргументов может отсутствовать или же состоять из выражений, значения которых выводятся на экран (в частном случае из констант и переменных).
В примере 1 оператор printf ("\nа="); содержит текст ("а=") и управляющие символы ("\n"). Текст выводится на экран в том виде, в котором он записан. Управляющие символы влияют на расположение на экране выводимых знаков. В результате выполнения этого оператора на экран с новой строки выведутся символы а=.
Признаком управляющего символа является значок \. Ниже приводится их список:

Оператор printf ("\nПлощадь треугольника=%f",s); содержит все виды параметров функции printf. Список аргументов состоит из одной переменной s. Ее значение выводится на экран. Пара символов %f является спецификацией формата выводимого значения переменной s. Значок % — признак формата, а буква f указывает на то, что выводимое число имеет вещественный (плавающий) тип и выводится на экран в форме с фиксированной точкой
Например, если в результате вычислений переменная s получит значение 32, то на экран выведется:
Площадь треугольника=32.435621
Спецификатор формата определяет форму внешнего представления выводимой величины. Вот некоторые спецификаторы формата:


Например, после выполнения следующих операторов

на экран выведется строка:
m=84.299999 k=-12 p=3.21500e+01
Здесь дважды используемый управляющий символ табуляции \t отделил друг от друга выводимые значения. Из этого примера видно, что соответствие между спецификаторами формата и элементами списка аргументов устанавливается в порядке их записи слева направо.
К спецификатору формата могут быть добавлены числовые параметры: ширина поля и точность. Ширина — это число позиций, отводимых на экране под величину, а точность — число позиций под дробную часть (после точки). Параметры записываются между значком % и символом формата и отделяются друг от друга точкой. Внесем изменения в оператор вывода для рассмотренного выше примера.
![]()
В результате на экране получим:
![]()
Если в пределы указанной ширины поля выводимое значение не помещается, то этот параметр игнорируется и величина будет выводиться полностью.
К спецификаторам формата могут быть добавлены модификаторы в следующих вариантах:
![]()
Форматированный ввод с клавиатуры. Оператор вызова функции scanf() имеет следующую структуру:
scanf(форматная_строка, список_аргументов);
Данная функция осуществляет чтение символов, вводимых с клавиатуры, и преобразование их во внутреннее представление в соответствии с типом величин. В функции scanf() форматная строка и список аргументов присутствуют обязательно. В программе из примера 1 имеется оператор:
scanf("%f",&a);
Здесь "%f" - форматная строка; &а — список аргументов, состоящий из одного элемента. Этот оператор производит ввод числового значения в переменную а.
Символьную последовательность, вводимую с клавиатуры и воспринимаемую функцией scanf(), принято называть входным потоком. Функция scanf() разделяет этот поток на отдельные вводимые величины, интерпретирует их в соответствии с указанным типом и форматом и присваивает переменным, содержащимся в списке аргументов.
Список аргументов — это перечень вводимых переменных, причем перед именем каждой переменной ставится значок &
. Это знак операции «взятие адреса переменной». Подробнее смысл этого действия будет объяснен позже, а пока примем это правило формально.
Форматная строка заключается в кавычки (как и для printf) и состоит из списка спецификаций. Каждая спецификация начинается со знака %, после которого могут следовать
*ширина поля модификатор спецификатор
Из них обязательным элементом является лишь спецификатор. Для ввода числовых данных используются следующие спецификаторы:
d — для целых десятичных чисел (тип int);
u — для целых десятичных чисел без знака (тип unsigned int);
f — для вещественных чисел (тип float) в форме с фиксированной точкой;
е — для вещественных чисел (тип float) в форме с плавающей точкой.
Звездочка в спецификации позволяет пропустить во входном потоке определенное количество символов. Ширина поля — целое положительное число, позволяющее определить число символов из входного потока, принадлежащих значению соответствующей вводимой переменной. Как и в спецификациях вывода для функции printf(), в спецификациях ввода функции scanf() допустимо использование модификаторов h, l, L. Они применяются при вводе значений модифицированных типов:
hd — для ввода значений типа short int;
ld — для ввода значений типа long int;
lf, le — для ввода значений типа double в форме с фиксированной и плавающей точкой;
Lf, Le — для ввода значений типа long double в форме с фиксированной и плавающей точкой.
В программе из примера 1 все три величины а, b, c можно ввести одним оператором:
scanf("%f%f%f",&a,&b,&c);
Если последовательность ввода будет такой:
5 <Enter>
то переменные получат следующие значения: а = 5,0, b = 3,2, с = 2,4. Разделителем в потоке ввода между различными значениями может быть любое количество пробелов, а также другие пробельные символы: знак табуляции, конец строки. Только после нажатия на клавишу Enter вводимые значения присвоятся соответствующим переменным. До этого входной поток помещается в буфер клавиатуры и может редактироваться.
Потоковый ввод-вывод в Си++. Программируя на языке Си++, можно пользоваться средствами ввода-вывода стандартной библиотеки Си, подключаемой с помощью заголовочного файла stdio. h, как это делалось выше. Однако в Си++ имеются свои специфические средства ввода-вывода
Это библиотека классов, подключаемая к программе с помощью файла iostream. h. В этой библиотеке определены в качестве объектов стандартные символьные потоки со следующими именами:
сin — стандартный поток ввода с клавиатуры;
cout — стандартный поток вывода на экран.
Ввод данных интерпретируется как извлечение из потока сin и присваивание значений соответствующим переменным. В Си++ определена операция извлечения из стандартного потока, знак которой >>. Например, ввод значений в переменную х реализуется оператором
cin>>x;
Вывод данных интерпретируется как помещение в стандартный поток cout выводимых значений. Выводиться могут тексты, заключенные в двойные кавычки, и значения выражений. Знак операции помещения в поток <<. Примеры использования потокового вывода:
cout<<a+b;
соut<<"\nРезультат="<<Y;
cout<<"x="<<x<<" y="<<y<<" z="<<z<<endl;
Из приведенных примеров видно, что в выходном потоке можно использовать управляющие символы, как и при использовании функции printf(); перед каждым элементом вывода нужно ставить знак операции <<. Элемент вывода endl является так называемым манипулятором, определяющим перевод курсора на новую строку (действует аналогично управляющему символу \n).
В процессе потокового ввода-вывода происходит преобразование из формы внешнего символьного представления во внутренний формат и обратно. Тип данных и необходимый формат определяются автоматически. Стандартные форматы задаются специальными флагами форматирования, которые устанавливаются с помощью функции setf(). Кроме того, на формат отдельных выводимых данных можно влиять путем применения специальных манипуляторов. Здесь мы не будем подробно разбирать эти вопросы.
Перепишем программу из примера 1 в варианте с использованием потокового ввода-вывода Си++.

4.6. Программирование ветвлений
Для программирования ветвящихся алгоритмов в языке Си имеется несколько различных средств. К ним относятся рассмотренная выше операция условия?:, условный оператор if и оператор выбора switch.
Условный оператор. Формат условного оператора следующий:
if (выражение) оператор!; else оператор2;
Это полная форма оператора, программирующая структуру полного ветвления. Обычно выражение — это некоторое условие, содержащее операции отношения и логические операции. Значение выражения приводится к целому и интерпретируется в соответствии с правилом: равно нулю — ложь, не равно нулю — истина. Если выражение истинно, выполняется оператор1, если ложно — оператор2.
Необходимо обратить внимание на следующие особенности синтаксиса условного оператора:
• выражение записывается в круглых скобках;
• точка с запятой после оператора 1 ставится обязательно. Последнее обозначает, что правило Паскаля — не ставить точку с запятой перед else — здесь не работает.
Возможно использование неполной формы условного оператора
if (выражение) оператор;
Вот пример использования полной формы условного оператора для нахождения большего значения из двух переменных а и b:
if(a>b) max=a; else max=b;
Та же самая задача может быть решена с использованием неполного ветвления следующим образом:
max=a; if(b>a) max=b;
Напомним, что эту же задачу можно решить с помощью операции «условие» (см. разд. 4.4).
Теперь рассмотрим примеры программирования вложенных ветвящихся структур. Требуется вычислить функцию sign(x) — знак х, которая определена следующим образом:

Пример 1. Алгоритм с полными вложенными ветвлениями:

Пример 2. Алгоритм с неполным ветвлением:

Пример 3. Упорядочить по возрастанию значения в двух переменных а, b:

В данном примере использован составной оператор — последовательность операторов, заключенная в фигурные скобки. В Си фигурные скобки выполняют роль операторных скобок по аналогии с Begin, End в Паскале.
Обратите внимание на то, что перед закрывающей фигурной скобкой точку с запятой надо ставить обязательно, а после скобки точка с запятой не ставится.
В следующем примере вернемся к задаче вычисления площади треугольника по длинам трех сторон. Добавим в программу проверку условия правильности исходных данных: a, b, с должны быть положительными,
а сумма длин каждой пары сторон треугольника должна быть больше длины третьей стороны (аналогичную программу на Паскале см. в разд. 3.10, пример 1).
Пример 4.

Оператор выбора (переключатель). Формат оператора выбора:
switch (целочисленное выражение) { case константа!: список_операторов;
case константа2: список_операторов;
default: список операторов; }
Последняя строка (default) может отсутствовать. Выполнение оператора происходит в следующем порядке:
1. Вычисляется выражение.
2. Полученное значение последовательно сравнивается с константами, помещенными после служебного слова case; при первом совпадении значений выполняются операторы, стоящие после двоеточия.
3. Если ни с одной из констант совпадения не произошло, то выполнятся операторы после слова default.
Для того чтобы «обойти» выполнение операторов на последующих ветвях, нужно принять специальные меры, используя операторы выхода или перехода.
Рассмотрим фрагмент программы, который переводит числовую оценку знаний ученика в ее словесный эквивалент. Согласно вузовской системе: 5 — «отлично», 4 — «хорошо», 3 — «удовлетворительно», 2 — «неудовлетворительно».
Пример 5.

Здесь используется еще один новый для нас оператор break — оператор выхода. Его исполнение завершает работу оператора выбора, т. е. происходит «обход» других ветвей. Вот два варианта результатов выполнения этой программы:
Введите оценку: 3 Это удовлетворительно!
Введите оценку: 7 Нет такой оценки!
Если на всех ветвях убрать оператор break, то результат может выглядеть следующим образом:
Введите оценку: 3 Это удовлетворительно!
Это хорошо!
Это отлично!
Нет такой оценки!
В этом случае выполнились операторы на всех ветвях, начиная с той, которая помечена константой 3.
Возможны задачи, в которых такой порядок выполнения ветвей оператора выбора может оказаться полезным. В следующем фрагменте программы происходит возведение вещественного числа х в целую степень п, где п изменяется в диапазоне от 1 до 5.

4.7. Программирование циклов
В Си, как и в Паскале, существуют все три типа операторов цикла: цикл с предусловием, цикл с постусловием и цикл с параметром.
Цикл с предусловием. Формат оператора цикла с предусловием:
while (выражение) оператор;
Цикл повторяет свое выполнение, пока значение выражения отлично от нуля, т. е. заключенное в нем условие цикла истинно.
В качестве примера использования оператора цикла рассмотрим программу вычисления факториала целого положительного числа N!. Сопоставим программу решения этой задачи, написанную на Паскале, с программой на Си.
Пример 1.

Обратите внимание на операторы в теле цикла. Конечно, и в Си-программе можно было написать два оператора присваивания, объединив их фигурными скобками. Однако использованный способ записи более лаконичен и более характерен для Си. Этот же самый оператор можно было записать еще короче: F*=i++.
При практическом использовании этой программы не следует забывать, что факториал — очень быстро растущая функция, и поэтому при определенных значениях N выйдет из диапазона, соответствующего типу long int. Задав для переменной F тип unsigned long, можно сдвинуть эту границу, но этого может оказаться недостаточно.
Интересно свойство следующего оператора:
while(1);
Это бесконечный пустой цикл. Использование в качестве выражения константы 1 приводит к тому, что условие повторения цикла все время остается истинным и работа цикла никогда не заканчивается. Тело в этом цикле представляет собой пустой оператор. При исполнении такого оператора программа будет «топтаться на месте».
Рассмотрим еще один пример использования оператора цикла while. Вернемся к задаче итерационного вычисления суммы гармонического ряда: 1+1/2+1/3+... с заданной точностью ε (см. разд. 3.10, пример 2). Снова сопоставим программу на Си с программой на Паскале.
Пример 2.

Файл limits. h, подключаемый препроцессором, содержит определения предельных констант для целых типов данных. В частности, константа с именем INT_MAX равна максимальному значению типа int в данной реализации компилятора. Если для типа int используется двухбайтовое представление, то INT_MAX=32767. В этом же заголовочном файле определены и другие константы: INT_MIN=-32768; LONG_MAX= и т. д.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 |


