- •Н. А. Аленский основы программирования
- •§ 1. Структура простой программы. Ввод, вывод
- •1.1. Пример первой программы
- •1.2. Директива препроцессора #include
- •1.3. Структура программы
- •1.4. Комментарии
- •1.5. Ключевые слова и идентификаторы
- •1.6. Простой ввод, вывод
- •§ 2. Оператор if
- •2.1. Полная форма
- •2.2. Сокращённая форма
- •2.3. Особенности оператора
- •Задачи и упражнения
- •§ 3. Выражения
- •3.1. Константы
- •Непосредственно записать в выражении;
- •3.2. Операции и их приоритет
- •3.3. Операции отношения и логические операции
- •3.4. Особенности операции присваивания
- •3.5. Тернарная операция (?)
- •Задачи и упражнения
- •§ 4. Оператор выбора switch
- •Задачи и упражнения
- •§ 5. Операторы цикла
- •5.1. Оператор while c предусловием
- •Правила использования и особенности оператора while
- •5.2. Оператор цикла do … while c постусловием
- •5.3. Оператор for
- •5.4. Операторы continue и break
- •Задачи и упражнения
- •§ 6. Введение в одномерные массивы
- •6.1. Что такое массив. Объявление одномерного массива
- •6.2. Способы определения массивов
- •6.3. Вывод одномерного массива. Функции printf и сprintf
- •6.4. Некоторые типы простых задач при работе с массивами
- •Задачи и упражнения
- •§ 1. Функции без результатов. Передача параметров по значению
- •1.1. Примеры. Правила оформления и вызова функций
- •Void line2(int Len, y, char ch) // ошибка,
- •1.2. Формальные и фактические параметры
- •1.3. Передача параметров по значению
- •§ 2. Функции типа void с несколькими результатами
- •2.1. Пример
- •2.2. Что такое ссылочный тип
- •2.3. Возврат значений из функции с помощью ссылочного типа
- •Задачи и упражнения
- •§ 3. Функции с одним результатом. Оператор return
- •Задачи и упражнения
- •§ 4. Одномерные массивы в функциях. Сортировка массива
- •Задачи и упражнения.
- •§ 5. Область действия имён. Локальные и глобальные имена
- •§ 6. Дополнительные возможности функций
- •Встраиваемые функции (inlineфункции)
- •6.2. Параметры по умолчанию
- •6.3. Перегрузка функций
- •§ 1. Примеры
- •§ 2. Класс. Поля и методы класса
- •§ 3. Создание объектов. Конструктор
- •Задачи и упражнения.
- •Глава 4 простые типы данных § 1. Целый тип
- •1.1. Битовые операции
- •1.2. Использование битовых операций
- •1.3. Упаковка и распаковка информации
- •Задачи и упражнения.
- •§ 2. Логический тип
- •§ 3. Символьный тип
- •Глава 5 матрицы (двухмерные массивы) § 1. Объявление, способы определения
- •§ 2. Вывод матриц
- •§ 3. Типы алгоритмов на обработку матриц
- •3.1. Построчная обработка
- •3.2. Обработка матрицы по столбцам
- •3.3. Обработка всей матрицы
- •3.4. Обработка части матрицы
- •3.5. Преобразование матрицы
- •Упражнения.
- •3.6. Построение матриц
- •§ 4. Передача матрицы в качестве параметра функции
- •Задачи и упражнения.
- •Б. Обработка матрицы по столбцам.
- •Даны две матрицы a и b одинаковой размерности. Построить матрицу с, каждый элемент которой определяется по правилу:
- •Список рекомендуемой литературы
- •Сборники задач по программированию
- •Оглавление
- •Задачи и упражнения …….……………………………………...12
- •3.1. Константы ………………………………………………...…14
§ 3. Символьный тип
В предыдущих разделах мы изучили:
-
объявление переменных и массивов символьного типа;
-
правила записи символьных констант (п. 3.1 гл. 1);
-
ввод, вывод символьных переменных (§ 4 гл. 2);
-
передачу символьной переменной в функцию (§ 1 гл. 2);
-
анализ символов(§ 4 гл. 2);
-
вывод кодов всех символов, т. е. кодовую таблицу (задача 8, § 2 гл. 2);
Среди символов есть такие, которые нельзя ввести обычным способом, т. е. с помощью соответствующих клавиш, так как их нет на алфавитно–цифровой клавиатуре. Они называются символами псевдографики. Для их ввода курсор подводим в нужное место и нажимаем “Alt”. При включённом цифровом режиме (клавиша NumLock) соответствующий код символа набираем справа на клавиатуре, а не в верхнем ряду. Во время набора ничего не отображается, но когда отпустим клавишу “Alt”, в соответствующем месте появится символ псевдографики с набранным кодом. Такие символы в функцию в качестве фактических параметров можно передать, как и обычные символы, двумя способами: можно указать числовой код символа или вышеописанным способом набрать такой символ.
Анализ кодовой таблицы позволяет отметить следующие особенности, которые необходимо учитывать при программировании:
-
цифры в таблице располагаются подряд, цифра 0 имеет код 48, у цифры 1 код 49, и т. д., цифра 9 имеет код 57;
-
как прописные, так и строчные латинские буквы располагаются в алфавитном порядке с кодами 65—90 для больших и 97—122 для маленьких букв;
-
русские прописные буквы располагаются также подряд (коды 128—159);
-
маленькие русские буквы терпят разрыв, буквы от ‘а’ (код 160) до ‘п’ (175) следуют подряд. После буквы ‘п’ размещаются символы псевдографики, а затем русский алфавит продолжается с буквы ‘р’ (224) до ‘я’(239).
Другие особенности символьной кодовой таблицы можно увидеть, выполнив вышеприведённую программу (задача 8, § 2 гл. 2).
Рассмотрим совместимость символьного и целого типов, что характерно для языка С++. В переменной типа char можно хранить как символы (точнее, их коды), так и целые однобайтные числа. Для переменных типа char определены те же операции, что и для типа int, например, целочисленное деление (/), получение остатка от целочисленного деления (%) и другие. Поэтому в языке С++, в отличие от Pascal, можно выполнить следующий фрагмент:
char a='5', b=5;
cout<<a<<”, “<<b<<”, “<<a%b<<", "<<a/b<<'\n';
В результате получим 5, символ с кодом 5(см. кодовую таблицу), 3, 10. Почему? В переменной a хранится код символа ‘5’, т. е. целое число 53, а в переменной b — обычное целое число 5, а 53 % 5 = 3, 53 / 5 = 10. Заметим, что если объявим int a=53, b=5; то выведем 53, 5, 3, 10. Если, что интереснее, int a=’5’, b=5; то получим то же, что и в предыдущем варианте, т. е. 53, 5, 3, 10, так как значением целочисленной переменной a будет код символа 5, т. е. целое число 53.
При вводе с помощью cin результат зависит от того, как переменная объявлена и что набираем при вводе.
Пусть char a, b; cin>>a>>b; При выполнении введём 5 и 3. Тогда с помощью того же cout получим 5, 3, 2, 1. Здесь число 2 получено не как остаток от деления 5 на 3, а как результат операции % для кодов этих символов, т. е. 53 % 51 = 2. Для этих же чисел получено и число 1. В этом можно убедиться, если вместо частного вывести произведение cout << a*b. На экране мы увидим не 15 (5*3), а 2703, т. е. произведение кодов символов 5 и 3 (51* 53 = 2703).
Пусть по–прежнему char a, b; cin>>a>>b; При выполнении наберем два символа, например, a и с, коды которых 97 и 99. Тогда по той же причине будет выведено: a, c, 97, 9603, где 97=97%99, а 9603=97*99. “Числа”, которые больше, чем 9, при таком объявлении ввести не сможем. Если введём, например, 123, то a примет значение символа ‘1’, b= ‘2’, а символ 3 игнорируется. Получим 1, 2, 49, 2450, где 49=49 % 50, 2450 = 49*50.
Если объявлено int a, b; и вводим целые числа, то значениями этих переменных будут введённые числа. При вводе символов ничего хорошего не получим, хотя программа будет выполняться.
Символы лучше вводить с помощью специальных функций getch, getchar или getche (см. § 4 гл. 2).
Вывод символов или их кодов удобнее выполнять не с помощью cout, а используя функции printf или cprintf (см. вывод кодовой таблицы).
Задачи и упражнения.
-
Пусть b1, b2, b3 — переменные логического типа. Записать оператор if и операторы присваивания, которые выполняют те же действия, что и оператор
b1= b2 || b3.
Решение: if (b2) b1=true; else b1=b3;
-
Нарисовать область плоскости, в которой и только в которой для вещественных величин x и y следующее логическое выражение истинно:
а) (fabs(x) < 1) > (fabs(y) < 1);
б) ! (fabs(x) < 1 ) = = (fabs(y) < 1);
в) ! (( fabs(x) < 1 ) = = (fabs(y) < 1)).
Указания к решению. Для величин логического типа следующие выражения истинны: true > false, true = = true, false = = false, ! true = = false, true = = ! false.
a) Надо найти область плоскости, в которой и только в которой одновременно первое неравенство истинно, а второе ложно, т. е. такие точки, для которых выражение (fabs(x)<1) && (fabs(y)>=1) истинно.
б) !(fabs(x) < 1) равносильно неравенству (fabs(x) >= 1). Поэтому надо найти область плоскости, в которой и только в которой выражение (fabs(x)>=1) &&( fabs(y)<1) ||( fabs(x)<1) &&( fabs(y)>=1) истинно.
в) Сначала определяем область, в которой и только в которой выражение (fabs(x)<1) && ( fabs(y)<1) ||( fabs(x)>=1) && (fabs(y)>=1) истиннo. Это был бы ответ, если бы не было операции отрицания. Операция отрицания в качестве ответа оставит точки, не вошедшие в эту область.
3. Записать следующее логическое выражение, используя операции логического умножения и сложения (&& , || ) и не используя сравнение логических величин:
а) (y>x) = = (x>0);
б) (y > x) > !(x > 0).
Решение: a) (y > x) && ( x> 0) || (y <= x) && (x <= 0);
б) y>x && x>0.
-
Не используя логических операций, записать выражение, принимающее значение true тогда и только тогда, когда точка плоскости с координатами (x, y) принадлежит первой четверти, включая и оси координат, или третьей четверти, не включая оси координат.
Решение: (x>=0) = = (y>=0).
-
Пусть bool b1, b2, b3, b4; Записать оператор if и операторы присваивания, которые выполняют те же действия, что и следующий оператор:
а) b1= b2 && b3;
б) b1=b2 || b3 && b4;
в) b1=(b2 || b3) && b4;
г) b1= !(b2 && b3 || b4).
6. Записать с помощью логических операций и оператора присваивания, не используя оператор if:
bool b1, b2, b3,r;
if (!b1) r=false;
else if (!b2) r=false;
else r=b3;
7. Объяснить работу следующей программы:
float x,y; bool lg; cin>>x>>y;
while (!(x==100 && y==100))
{ lg=x>0; cout<<"x>0 "<<lg<<" y>0 "<<(y>0)<<" "<<(lg > (y>0));
if (lg > (y>0)) cout<<" YES ";
else cout<<" NO";
cin>>x>>y;
}
8. Записать следующее логическое выражение, используя логические операции и не используя сравнение логических величин:
-
!((y > x) > (x>0));
б) (y > x) != (x > 0) ;
в) ! (y > x) > (x > 0).
Нарисовать область плоскости, в которой и только в которой записанное логическое выражение истинно.
9. Записать логическое выражение с помощью сравнения логических величин, не используя операций && и ||:
а) x*x+y*y > 1 && y <= x;
б) x*x+y* y> 1 && y <= x || x*x+y*y <= 1 && y > x;
в) x>0 && y > 0 || x <= 0 && y <= 0.
Нарисовать область плоскости, в которой и только в которой записанное логическое выражение истинно.
10. Пусть B1= x*x – y*y < 4; B2= y>0;
а) Записать логическое выражение B1 && B2, используя сравнение булевских величин и не используя логических операций.
б) Записать выражение B1<B2, не используя сравнение булевских величин.
11. Нарисовать область плоскости, в которой и только в которой для вещественных x и y следующее логическое выражение истинно:
а) (fabs(x) > 1) > (fabs(y)> 1);
б) ! (fabs(x) > 1 ) = = (fabs(y)> 1);
в) ! (( fabs(x) > 1 ) = = (fabs(y) > 1)).
12. Операторы
int x=8, y=4;
cout <<(x&y)<<", "<<(x&&y)<<", "<<(x|y)<<", "<<(x||y)
<<", "<<(y<x<1)<<", "<<(x<y<1)<<endl;
выведут 0, 1, 12, 1, 0, 1. Объяснить результат.
13. Объяснить выполнение printf("%c %d %c %d\n", a, a, b, b); Результат, как и раньше, зависит от объявления и от введенных величин.
Вариант 1. Переменные объявлены int a, b; и вводим два числа — 97 и 120. Тогда будет выведено a 97 x 120, т. е. по формату %c выводятся символы, коды которых хранятся в переменных a и b, а по формату %d — эти целые числа, которые интерпретируются как коды символов.
Вариант 2. Этот же результат получим, если объявим char a, b; и введём два символа — a и x.
14. Что будет выведено и почему:
а) char ch; cin>>ch; cout<< (ch*2); если введём 1? d?:
б) char CH=1; cout<<” “<<(CH*2);
в) char ch2=’1’; cout<<” “<<(ch2*2);
г) printf (“ \n %c %d %c %d %c %d”, ch, ch, CH, CH, ch2, ch2);
Объявление и инициализация такие, как в а), б), в).
д) int ci; cin>>ci; printf(“\n %c %d”, ci,ci); если введём 40?