Алгоритмизация и программирование. Учебное пособие для студентов направления подготовки 09.03.02 Информационные системы и технологии
.pdf
Знаки логических операций:
•&& логическое И;
•|| логическое ИЛИ;
•! логическое отрицание.
Знаки операций автоинкремента и автодекремента:
•++ знак операции автоинкремента – увеличение операнда на единицу;
•– – знак операции автодекремента – уменьшение операнда на единицу.
Знаки операции присваивания:
•= операция присваивания (например, = 6);
•+= или –= присваивание со сложением или вычитанием (например, += 5 эквивалентно = + 5);
•*= или /= присваивание с умножением или делением (например, /= 2 эквивалентно = /2);
• %= присваивание с нахождением остатка (например, % = 3 эквивалентно
= %3).
Операторы делятся на четыре группы основных управляющих конструкций:
•операторы следования – операторы простой последовательности действий;
•условные конструкции – операторы ветвления;
•циклические конструкции – операторы циклов;
•безусловные конструкции – операторы перехода.
Каждому аргументу соответствует своя спецификация преобразования, которая начинается с символа процента (%), после которого стоит буква, указывающая тип данных:
•%d – десятичное целое число;
•%f – вещественное число типа float или double;
•%c – символ;
•%s – строка;
•%p – указатель;
•%u – беззнаковое целое число;
•%o – целые числа в восьмеричной системе счисления;
•%x – целые числа в шестнадцатеричной системе счисления;
•%e – вещественное число в экспоненциальной форме.
31
Управление перемещением курсора на экране и выполнение некоторых других функций при помощи управляющих кодов (escape-последовательностей) осуществляется специальным набором символов, которые начинаются с символа обратной наклонной черты (\):
•\n – перемещение курсора в начальную позицию следующей строки;
•\t – перемещение курсора в следующую позицию табуляции экрана;
•\r – перемещение курсора к началу той же строки без перехода на следующую;
•\b – передвижение курсора только на одну позицию влево.
Приведем пример программы, в которой используются простые операторы.
Задача 1. Вычислите арифметические действия (сумму, разность, произведение и частное) двух целых чисел 6 и 2.
Математическая модель и описание алгоритма решения. Пусть – первое число, / – второе число, 0 – их сумма, 1 – разность, 2 – произведение, – частное. В данной задаче переменные и / задаются (вводить их не нужно, они определены сразу), а переменные 0, 1, 2 и только объявляются. Обратите внимание, если , / – целые, то их сумма 0, разность 1 и произведение 2 тоже всегда целые величины, но частное – не обязательно.
Если / не является делителем числа , то значение частного // будет вещественным. Решение задачи состоит в поочередном выполнении четырех арифметических дейст-
вий, а затем выводе значений результата действий на экран.
Вначале составим программу с использованием директивы #include <stdio.h>.
32
Текст программы к задаче 1.
--------------------------------------------------------------------------------------------------
#include <stdio.h>
int main ()
{
int x = 6; int y = 2; /* определение переменных*/
int s, r, p; |
|
float c; |
/* объявление переменных*/ |
s = y + x; |
|
r = x - y; |
/* операторы */ |
p = x*y; |
|
c = x/y;
printf(" Sum of numbers: s = %d \n Number difference: r = %d", s, r); printf(" \n Product of numbers: p = %d \n Quotient of numbers: c = %f", p, c);
return 0;
}
--------------------------------------------------------------------------------------------------
В компиляторе языка С++ этот компьютерный код представлен на рис. 11.
Рис 11. Программный код задачи 1 с директивой #include <stdio.h>
А теперь изменим описание программы с учетом использования директивы #include
<iostream>.
33
Текст программы к задаче 1.
-------------------------------------------------------------------------------------------------
#include <iostream> using namespace std;
int main()
{
int x = 6; int y = 2; /* определение переменных*/
int s, r, p; |
|
float c; |
/* объявление переменных*/ |
s = y + x; |
|
r = x - y; |
/* операторы */ |
p = x*y; |
|
c = x/y;
cout << " Sum of numbers: s = " << s << "\n"; cout << " Number difference: r = " << r << "\n"; cout << " Product of numbers: p = " << s << "\n"; cout << " Quotient of numbers: c = " << r << "\n";
return 0;
}
-------------------------------------------------------------------------------------------------
Обратите внимание, существенное отличие в написании текста программы с учетом использования директивы #include <stdio.h> и #include <iostream> заключается в описании вывода переменных суммы s, разности r, произведения p и частного с.
Использование набора символов "\n" во втором тексте программы позволяет перемещать курсор в начальную позицию следующей строки. Это необходимо для лучшего визуального восприятия результатов вычислений.
В компиляторе языка С++ этот компьютерный код представлен на рис. 12.
Рис 12. Программный код задачи 1 с директивой #include <iostream>
34
Результат реализации программы представлен на рис. 13:
Рис 13. Результат решения задачи 1
В задаче 1 пользователь не вводит никаких данных. Переменные и / являются постоянными и определены в начале программы. Приведем случай, когда пользователю необходимо самому ввести значения переменных, по которым вычисляется значение функции.
Задача 2. Введите переменные 34, , 5 и вычислите значение функции 0 = 345 + 67. Математическая модель и описание алгоритма решения. В данной задаче переменные
34, , 5 являются вещественными и вводятся пользователем, а переменная s объявляется и вычисляется по формуле. Вывод на экран надписи «Enter the initial velocity v0, acceleration a and time t, separated by a space» с помощью функции prinf() предупреждает, что переменные необходимо ввести через пробел строго по порядку: 34, , 5.
Для вычисления значения 0 специальных математических функций не требуется, достаточно использовать операцию умножения. Составим программу с использованием директивы #include <stdio.h>.
Текст программы к задаче 2.
----------------------------------------------------------------------------------------------------
#include <stdio.h> int main ()
{float v0, a, t, s;
printf (" Enter the initial velocity v0, acceleration a and time t, separated by a space: \n");
scanf("%f%f%f", &v0, &a, &t); s = v0 * t + a * t * t / 2; printf("s=%f", s);
return 0;
}
---------------------------------------------------------------------------------------------------
35
В компиляторе языка С++ этот компьютерный код представлен на рис. 14.
Рис 14. Программный код задачи 2
Пользователю необходимо ввести значения переменных (рис. 15) в следующем порядке: вначале начальную скорость 34, затем ускорение и в конце – время 5. Каждое введённое значение должно быть разделено пробелами:
Рис 15. Введение переменных пользователем в задаче 2
Для примера работы программы пользователь ввёл значения: |
||||||
34 |
= 5, |
= 2, |
|
5 = 10. |
||
В этом случае значение |
|
|
|
2 ∙ 10 |
∙ 10 |
|
5 |
|
= 5 ∙ 10 + |
= 50 + 100 = 150. |
|||
0 = 345 + 2 |
|
2 |
|
|||
Результат реализации программы на рис. 16:
Рис 16. Результат решения задачи 2
36
Глава 4. ОПЕРАТОР ПРОСТОЙ
ПОСЛЕДОВАТЕЛЬНОСТИ ДЕЙСТВИЙ
§ 1. Функции ввода/вывода данных.
Впредыдущей главе подробно была изложена информация о переменных, типах данных, операторах и выражениях. Линейные алгоритмы реализуются с помощью операторов простой последовательности, которые выполняются один за другим по порядку. К таким операторам относятся операторы ввода и вывода данных.
Вязыке программирования С++ выделяют базовые и производные типы данных. Базовые (стандартные или основные) имеют имена, которые являются ключевыми
словами языка. Производные (определяемые) получаются на основе базовых и делятся на скалярные:
•перечисления;
•указатели;
•ссылки,
иструктурные:
•массивы;
•структуры;
•объединения;
•классы.
Вкомпьютере данные хранятся в двоичных кодах. Например, число может кодироваться 1, 2, 4 или 8 байтами, в зависимости от того, к какому типу оно относится.
Классификация базовых типов данных приведена в таблице 5.
Табл. 5 Базовые типы данных
Типы данных |
Назначение |
Размер, байт |
Диапазон значений |
|
bool |
для логического |
1 |
false, true |
|
значения |
||||
|
|
|
||
char |
для символа |
1 |
-128 … +127 |
|
wchar_t |
для символа |
2 |
-32768 … +32767 |
|
из расширенного набора |
||||
|
|
|
||
int |
для целого значения |
4 |
-2147483648 … +2147483647 |
|
float |
для значения |
4 |
±3,4·10-38 … ±3,4·10+38 (7 цифр) |
|
|
с плавающей точкой |
|
|
|
double |
для значения |
8 |
±1,7·10-308 … ±1,7·10+308 |
|
с плавающей точкой |
(15 цифр) |
|||
|
удвоенной точности |
|
||
|
|
|
37
Типы данных имеют особое значение в языке С++, так как он строго типизирован. Компилятор контролирует соответствие типов и не пропускает недопустимые операции. Поэтому строгое следование и применение необходимых типов данных позволяет исключать ошибки и повышает надежность программ. Чтобы структурировать информацию о типах данных, расположим их в виде дерева (рис. 17).
|
|
|
|
|
|
|
|
|
|
|
|
Типы данных |
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Базовые |
|
|
|
|
|
|
|
|
|
|
|
|
Производные |
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
пустой (void) |
|
|
|
|
скалярные |
|
|
|
скалярные |
|
|
структурные |
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
перечисления |
|
|
массивы |
||||
|
|
|
|
|
|
|
|
|
|
вещественный |
|
|
|
|
|
||||||||||
|
|
целочисленный |
|
|
|
|
|
|
|
(enum) |
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
(float, double) |
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
указатели (*) |
|
|
структуры |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(struct) |
|||||
логический |
|
|
|
символьный |
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
объединения |
|||||||||||||||||
|
|
(bool) |
|
|
(char, wchar_t) |
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ссылки (&) |
|
|
(union) |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
целый |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
классы (class) |
|||||||||
|
|
|
|
(short, int, long) |
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 17 Дерево классификации типов данных
Основными операторами простой последовательности являются операторывыражения, действие которых состоит в вычислении заданных выражений. Для обозначения конца оператора используют точку с запятой «;». Это пустой оператор, не производящий никаких действий. Он просто передает управление следующему оператору.
Любая последовательность операторов, заключенная в фигурные скобки ({ }), представляет собой составной оператор (блок).
Операции ввода-вывода реализуются с помощью функций библиотеки языка С++. Ввод-вывод данных – это процесс обмена информацией между оперативной памятью и
внешними устройствами: ввод (с внешних устройств в оперативную память) и вывод (из оперативной памяти на внешние устройства).
Напомним, что обмен данными реализуется с помощью библиотек функций ввода/вывода в #include<stdio.h> или #include<iostream>.
Для библиотеки <stdio.h> основными функциями форматного ввода/вывода являются
38
scanf() и printf().
Любая операция ввода-вывода – это операция обмена с файлами: чтение информации из файла или запись в файл. Аналогом внутреннего файла является поток – байтовая последовательность, передаваемая в процессе ввода-вывода. Поток должен быть связан с внешним устройством или файлом на диске.
Библиотека <iostream> определяет три стандартных потока:
–входной поток cin;
–выходной поток cout;
–стандартный поток вывода сообщений об ошибках cerr.
Чтобы использовать эти потоки, необходимо в заголовке программы до функции main() прописать строку:
using namespace std;
Для выполнения ввода-вывода переопределены две операции поразрядного сдвига:
•>> получить из входного потока
•<< поместить в выходной поток
Для вывода информации используют cout. Значение преобразуется в последовательность символов и выводится в выходной поток.
cout << значение; cout << n;
Возможно использование данных объектов многократно.
cout << "значение_1" << "значение_2" << ... << "значение_n";
Для ввода информации используют cin. Из входного потока читается последовательность символов до пробела, затем эта последовательность преобразуется к типу идентификатора, и получаемое значение помещается в идентификатор.
39
cin >> идентификатор; int n;
cin >> n;
Возможно использование данных объектов многократно.
cin >> переменная_1 >> переменная_2 >> ... >> переменная_n;
Набирая данные на клавиатуре, значения для такого оператора должны быть разделены символами (пробел, \n, \t).
§ 2. Преобразование типов.
Обобщенный формат спецификации преобразования имеет вид:
% ширина_поля.точность спецификатор; Обязательными являются только два параметра:
% и спецификатор.
В языке программирования С++ используют следующие символы для преобразования типов данных:
•для целых чисел:
d – считывается значение аргумента в десятичной форме, преобразуется в тип int;
u – значение аргумента в десятичной форме без знака, в тип unsignedint;
o – значение аргумента в восьмеричной форме без знака, в тип unsignedint;
x – значение аргумента в шестнадцатеричной форме без знака, в тип unsignedint;
•для вещественных чисел:
f – значение аргумента в форме с десятичной точкой, в тип float;
e – значение аргумента в экспоненциальной форме, в тип float;
•для символьных данных:
c – значение аргумента символ;
s – значение аргумента строка символов;
•для номера ячейки памяти (адреса):
p – значение аргумента указатель, т.е. адрес.
40
