учебное пособие. Часть1. Информатика
.pdfДля управления потоковым вводом-выводом можно использовать фор- матирование. Часто бывает необходимо вывести строку или число в опреде- ленном формате. Для этого используются так называемые манипуляторы
(табл. 7).
|
Таблица 5 |
Основные манипуляторы потового ввода-вывода |
|
|
|
Манипулятор |
Назначение |
|
|
endl |
Вывод символа новой строки и очистка буфера потока |
ends |
Вывод нуля NULL(признак конца строки символов) |
flush |
Очистка буфера потока |
setw (int n) |
Устанавливает ширину поля вывода в n символов |
setfill(int n) |
Устанавливает символ-заполнитель (этим символом выво- |
|
димое значение будет дополняться до необходимой шири- |
|
ны) |
setprecision(int n) |
Устанавливает количество цифр после запятой при выводе |
|
вещественных чисел |
scientific |
научный формат представляет число десятичной дробью с |
|
одной цифрой перед точкой с показателем степени |
Использовать манипуляторы просто – их надо вывести в выходной по- ток. Для доступа к манипуляторам необходимо включить файл iomanip.h. Пример pr5a демонстрирует использование манипуляторов для вывода чисел с разной шириной поля и разным количеством цифр после запятой:
//Пример pr5a #include <iostream> #include <iomanip> using namespace std; int main ()
{
cout<<setw(10)<<10<<endl;
cout<<setw(5)<<10<<endl; cout<<setfill('#')<<setw(10) <<10<<endl; cout<<setfill(' '); cout<<setw(7)<<setprecision(4)<<1.2789<<endl; cout<<setw(7)<<setprecision(2)<<1.2789<<endl; return 0;
}
171
Результат работы будет выглядеть следующим образом: 10
10
########10
1.2789
1.28
Контрольные вопросы
1.Какая структура у программы на языке С++?
2.Чем управляющая строка функции scanf отличается от управляю-
щей строки функции printf?
3.Для чего предназначена спецификация преобразования?
4.Как будет выведено число 12345.6789, если для него использова- лась спецификация преобразования %7.2f?
5.Что значит описать переменную?
6.Для чего предназначен символ ’\n’?
7. Как записать на языке С++ выражение e2x + |
x +1 |
? |
||
x(x2 |
−10) |
|||
|
|
8.Для чего используется оператор присваивания?
9.Чем отличается постфиксная операция увеличения от префиксной?
10.Какое значение х будет выведено в результате работы следующей программы:
int main ()
{
float x = 1, y = 2; int a = 3, b = 4;
x = x/a+ y / x +a/b; printf ( "x= %5.3f ", x );
return 0;
}
3.2.Разветвляющиеся программы
Кразветвляющимся программам приводят задачи, в которых, в зави- симости от некоторого условия, выбирается путь решения задачи. Пусть нам
необходимо вычислить значение y по формуле
y= ìíx3 + 3, если x > 0
îx ×sin x, если x £ 0.
172
×
Рис. 9. Алгоритм PR6
На рис. 9 приведена графиче- ская схема алгоритма, программа
представлена в примере pr6. //Пример pr6
#include <cstdio> #include <cmath> using namespace std; int main ()
{
float x, y;
printf ( "Введите x:" ); scanf ( "%f", &x );
if ( x>0 )
y = x*x*x+3; else
y = x*sin(x);
printf ( "y = %4.2f \n", y);
return 0;
}
В этой программе используется условный оператор, который служит для выбора формулы вычисления y в зависимости от введенного значения x.
3.2.1. Условный оператор
Условный оператор служит для ветвлений в программе и имеет сле- дующий синтаксис:
if(<условие>) <оператор1>; else <оператор2>.
Здесь if, else − ключевые слова (пер. с англ. если, иначе соответст- венно); <условие> − это условное выражение типа сравнения (например, a>b, c<=d, f==1); <оператор1> и <оператор2> − любые опера-
торы C++.
Оператор работает следующим образом: если условие истинно, то вы- полняется <оператор1> и управление передается на следующий за услов- ным оператор; если условие ложно, то выполняется <оператор2> и управ- ление передается на следующий за условным оператор. Таким образом, все- гда выполняется один из двух операторов: либо <оператор1>, либо <опе-
ратор2>.
173
Существует сокращенная форма условного оператора, в которой отсут-
ствует ветвь else:
if <условие> <оператор1>.
Оператор работает следующим образом: если условие истинно, то вы- полняется <оператор1> и управление передается на следующий за услов- ным оператор; если условие ложно, то управление сразу передается на сле- дующий за условным оператор. Таким образом, в зависимости от условия, <оператор1> либо выполняется, либо не выполняется.
Ниже приведены фрагменты схем алгоритмов и соответствующие им фрагменты программ.
|
Hет |
|
|
|
Да |
|
||
a>b |
if ( a>b ) |
|||||||
|
|
|
|
|||||
|
|
|
|
|||||
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
max = a; |
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
||
max:=b |
|
|
|
max:=a |
else |
|||
|
|
|
|
|
|
|
max = b; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Нет |
||
k>0 |
|||||
|
if ( k>0 ) |
||||
|
|
Да |
|
||
|
|
|
|||
|
|
|
|
s = s+k; |
|
s:=s+k |
|||||
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (a > |
b) |
|
if (a |
> c) |
|
max |
= |
a; |
else |
= |
c; |
max |
174
|
|
|
Нет |
|
|
if (a > |
b) |
|||||
a>b |
|
|
||||||||||
|
|
|
|
|
|
|
|
if (a |
> c) |
|||
|
|
|
|
|
|
|
|
|||||
Да |
|
|
Нет |
|
|
|
|
max = a; |
||||
|
|
|
|
|
||||||||
|
|
|
|
|
Да |
else |
|
|||||
a>c |
|
|
|
b>c |
|
|||||||
|
|
|
|
|
max = c; |
|||||||
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
||
Да |
|
|
|
|
|
|
|
Нет |
|
|
else |
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
if (b > c) |
|
|
|
|
|
|
|
|
|
|
|
|
||
max:=a |
|
|
|
max:=c |
|
max:=b |
max = b; |
|||||
|
|
|
|
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
|
|
|
|
|
max = c; |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
В первом фрагменте программы приведена полная форма условного оператора, во втором – сокращенная, в третьем – сокращенная с вложенным условным оператором и в четвертом – полная форма с вложенными в каждой ветви условными операторами. Вложенные условные операторы уменьшают число необходимых проверок, обеспечивают большую эффективность, но ухудшают читаемость программы, поэтому не рекомендуется слишком увле- каться вложением условных операторов.
При определении последовательности выполнения вложенных услов- ных операторов каждое else соответствует тому if, которое ему непо- средственно предшествует. Таким образом, исключается всякая двусмыслен- ность.
Подробнее остановимся на понятии условное выражение. В С++ ис- пользуются следующие операции отношения:
<меньше;
<= меньше равно;
>больше;
>= больше равно; == равно; != не равно.
В языке С++ нет логического типа, но любое выражение имеет значе- ние, в том числе и условное. "Истина" – это все ненулевые значения, и только 0 – "ложь" [6]. В программе pr7 это иллюстрируется:
//Пример pr7 #include <cstdio> using namespace std; int main ()
{
int true1, false1; true1 = 10 > 2; false1 = 10 == 2;
175
printf (" true1 = %d; false1 = %d\n", true1, false1 ); if (200)
printf ( " 200 – это истина \n" ); if (-200)
printf ("-200 – это истина \n"); if (0);
else
printf("0 – это ложь \n"); return 0;
}
В результате работы этой программы будут выведены сообщения:
true1 = 1; false1 = 0; 200 – это истина
−200 – это истина
0 – это ложь
В последнем условном операторе после условного выражения сто- ит так называемый пустой оператор, о чем свидетельствует знак точка с запятой при отсутствии какого-либо оператора.
Если нужно проверить несколько условий, то можно воспользоваться булевыми операциями. Эти операции образуют инструментальный фунда- мент булевой логики, алгебры логики, разработанной в ХIХв. математиком Джорджем Булем. Рассмотрим три основные булевы операции.
Операция && – логическое пересечение (умножение, операция "и"). Ес- ли а и b – условные выражения, например a=k>l или b=d==5, то выраже- ние a&&b дает значение истина только в том случае, если a и b имеют значе- ния истина, в остальных случаях – ложь.
Операция || – логическое сложение (объединение, операция "или"). Выражение a||b дает ложь значение в том и только в том случае, если a и b имеют значения ложь, в остальных случаях – результат истина.
Операция !– отрицание (операция "не"). Выражение !a имеет значе- ние, противоположное значению a.
Нет
a>b
Да
Нет
a>c
Да
max:=a
if ( a > b && a > c ) max = a;
176
Нет
x=y
Нет
Да x=z
Да
z:=y z:=y
if ( x == y || x == z ) z = y;
Cамый высокий приоритет имеют операции сравнения, затем идет операция логического отрицания, далее – логическое умножение, а только потом – логическое сложение.
Условный оператор может оказаться негибким, так как выполняемые действия могут быть описаны только одним оператором. Если необходимо выполнить в ветви условного оператора несколько операторов, то в этом случае можно использовать составной оператор.
3.2.2. Составной оператор
Чтобы последовательность операторов работала как единый оператор, можно помещать эту последовательность между открывающейся и закры- вающейся фигурными скобками. Такая конструкция называется составным оператором, или операторными скобками. Каждый оператор, входящий в со- став составного оператора, заканчивается точкой с запятой. Рассмотрим при- меры:
|
Нет |
|
|
Да |
||
c>0 |
||||||
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
c:=c-1 |
|
|
s:=s+c |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
k:=k+1
if ( c > 0 )
{s = s + c; k = k + 1;
}
else c = c - 1;
177
|
Нет |
|
|
|
Да |
||
n<m |
|||||||
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
n:=n-1 |
|
|
|
n:=n+1 |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m:=m+1 |
|
|
|
m:=m-1 |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ( n < m )
{n = n + 1; m = m - 1;
}
else
{n = n - 1; m = m + 1;
}
3.2.3. Операция условия
Операция условия – это короткий способ записи условного оператора. В общем случае синтаксис этого оператора следующий:
<выражение1>?<выражение2>:<выражение3>
Здесь <выражение1> – условное выражение и, если оно истинно, то вычисляется <выражение2>, которое становится результатом. Если <выражение1> – ложно, то результатом будет <выражение3>. Классический пример:
x = ( y<0 ) ? –y: y;
Выражение возвращает абсолютное значение переменной y.
3.2.4. Оператор выбора
Оператор выбора предназначен для организации ветвлений в програм- ме, когда возникает необходимость избрания одного из множества различных вариантов дальнейшего хода программы. В общем случае оператор выбора записывается следующим образом:
switch (<выражение>)
{
case <выражение_1>: <операторы>; case <выражение_2>: <операторы>;
. . .
case <выражение_n>: <операторы>; [default: <операторы>;]
}
Здесь switch, case, default – ключевые слова (пер. с англ.: пе- реключатель, случай, невыполнение обязательств); <выражение> – выра-
жение любого целого типа; <выражение_1>, <выражение_2>, <выра-
178
жение_n> – константа или константное выражение того же типа, что и <выражение> ; <операторы> – один или несколько операторов С++.
Работа оператора начинается с вычисления <выражения>. Значение этого выражения является критерием для выбора из нескольких вариантов. Если полученное значение выражения совпадает с одной из констант, то вы- полняется та группа операторов, которой предшествует эта константа, а по- том все группы операторов, расположенные ниже. Но так как часто програм- мист использует этот оператор, чтобы выполнить только одну группу, то в конце каждой группы используется специальный оператор break, осущест- вляющий выход из оператора switch (а также из всех операторов цикла). Если такой константы не обнаруживается, то выполняется оператор, сле- дующий за ключевым словом default. Ветвь default может отсутство- вать, и в этом случае управление передается оператору, следующему за опе- ратором switch.
Рассмотрим примеры, демонстрирующие работу оператора выбора. В примере pr8 по номеру месяца определяется время года:
//Пример pr8 #include <cstdio> using namespace std; int main ()
{
int month;
printf ( |
"Введите число - номеp месяца:" ); |
|
scanf |
( "%d",&month); |
|
switch (month) |
||
{case |
12: |
|
case |
1: |
|
case |
2: printf (" %d- зимний месяц",month); break; |
|
case |
3: |
|
case |
4: |
|
case |
5: printf ("%d - весенний месяц",month); break; |
|
case |
6: |
|
case |
7: |
|
case |
8: printf ("%d - летний месяц",month);break; |
|
case |
9: |
|
case |
10: |
|
case |
11: printf ("%d - осенний месяц",month);break; |
|
default: printf ("Пpо это мне неизвестно!"); |
||
} |
0; |
|
return |
|
|
} |
|
|
179
Составим программу pr9, имитирующую работу простейшего кальку- лятора, выполняющего четыре арифметических действия.
//Пример pr9 #include <iostream> using namespace std; int main ()
{
char op; //Знак арифметической операции float x, y, z; //Операнды и результат cout<<"\n Введите операнды x, y:"; cin>>x>>y;
cout<< " Введите знак аpифметической опеpации:"<<endl; cin>>op;
switch (op)
{
case '*': z = x* y; cout<<"z="<<z; break;
case '/': if (y) {z = x/ y; printf("z=%f", z);} else cout<<"Деление на ноль"; break;
case '+': z = x+y; cout<<"z="<<z;break; case '-': z = x- y; cout<<"z="<<z; break;
default: cout<<"Увы! Это не аpифметическая опеpация!";
}
return 0;
}
3.2.5.Оператор перехода
Вязыке C++ достаточно управляющих операторов, позволяющих на- писать любую программу. Тем не менее, имеется оператор безусловного пе- рехода. Безусловный переход приводит к передаче управления из одного места в программе в другое. Структура оператора перехода следующая:
goto <метка>
Здесь goto − ключевое слово (англ.: перейти на [метку]).
Метка − это произвольный идентификатор. Метка ставится перед опе- ратором, получающим управление, и отделяется от него двоеточием. Метки в языке С++ не требуют предварительного описания. Перемещаться с помо- щью оператора перехода можно только внутри текущей функции.
180