Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

учебное пособие. Часть1. Информатика

.pdf
Скачиваний:
42
Добавлен:
04.06.2015
Размер:
2.87 Mб
Скачать

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

(табл. 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