- •Н. А. Аленский основы программирования
- •§ 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
Задачи и упражнения.
1. Пусть int a=170. Определить результат:
а) r = a & 15;
б) r = a | 8;
в) if (a & 8 = = 8) cout<<” Yes”; else cout<<”No”;
Решение. Число 170 переводим в шестнадцатеричную систему счисления делением на 16. Получим 17010=AA16. Каждую шестнадцатеричную цифру запишем в виде двоичной тетрады и добавим необходимое количество незначащих нулей. Получим 00000000000000000000000010101010.
a) 1510 = 11112. Учитывая правила выполнения операции &, получим десятичное число 10 или шестнадцатеричное A, т. е. с помощью этой операции всегда выделяется последняя шестнадцатеричная цифра числа.
б) Так как 810=10002 и принимая во внимание правила выполнения операции | (битовое или), получим то же число 170.
в) Так как в двоичном представлении числа 8 есть всего одна единица, то результатом операции a & 8 будет либо 0, либо 8 =10002 в зависимости от того, что находится в 3–м справа бите числа a (нумерация битов с нуля). В нашем примере получим 8, и будет выведено “YES”, что означает, что в 3–м справа бите исходного числа a была единица.
-
2. Определить результат:
unsigned short a; cin>>a;
a=a & 0xFFF7; cout<<a;
Решение. Введем, например, число 26. В двоичной системе счисления это 0000000000011010.
Так как FFF716=11111111111101112, то операция & (битовое и) оставит без изменения все биты, кроме третьего справа. Независимо от того, что было в этом бите (0 или 1), получится нуль, т. е. мы “выключили” третий справа бит. В результате получим 00000000000100102=18, т. е. будет выведено число 18. Если введем, например, число 23, то это число не изменится, так как в третьем бите был 0.
3. Упаковка информации. Пусть по условию задачи известно, что числа массива находятся в диапазоне от 0 до 15, т. е. каждое число занимает четыре бита. Надо обработать 20 таких чисел. Нет типа данных для хранения четырех битов. В каждом элементе массива типа unsigned short размером два байта (16 битов) можно разместить 16/4=4 числа из указанного диапазона. Поэтому для хранения 20 таких чисел понадобится массив из 20/4=5 элементов. 20 введенных чисел из диапазона 0..15 записать в массив типа unsigned short размерности 5.
unsigned short MyINP( unsigned short myMAX);
int main()
{ const int k=4, // размерность числа 0..15 4 бита
n=20, // количество чисел
size=n*k/(sizeof(unsigned short)*8); // размерность массива
unsigned short number, array[size];
for (int i=0;i<size;i++)
for(int j=1;j<=k;j++)
{ number=MyINP(15);
array[i]=(array[i]<<k) | number;
}
for (int i=0; i<size;i++)
// вывод в шестнадцатеричной системе счисления пяти
// шестнадцатеричных цифр
printf("%X ",array[i]);
getch(); return 0; }
unsigned short MyINP( unsigned short myMAX)
{ unsigned short x;
while (true) { cin>>x; if (x<=myMAX) return x;
textcolor(4); cprintf("ERROR Repeat");
} }
Функция MyINP вводит целое положительное число, меньшее или равное myMAX. При попытке ввести неположительное или большее myMAX число, красным цветом выводится сообщение об ошибке и приглашение повторить ввод.
-
Пусть int a=-8, b=23. Что получится в результате выполнения следующей части программы:
printf (“%d %X %d %X”, a & b, a | b, a ^ b, ~a).
5. Найти значение переменной r, объявленной как int r, если:
а) r= ~(100>>2) & ~(–10) | 0x10;
б) r=162 | 0x10A & 111;
в) r= –10 & 1|4;
г) r=(123<<4)& 123.
6. Найти значение этого же выражения из предыдущего упражнения, если переменная объявлена как unsigned short r.
7. Пусть в ячейке, объявленной short a, хранится следующая двоичная последовательность:
а) 0000001001001001; б) 1100000000001000;
в) 1111111111111000; г) 1000000000000000.
Что это за число в десятичной системе счисления? шестнадцатеричной системе счисления?
8. Выполнить предыдущее упражнение, если переменная объявлена как unsigned short a.
9. Как включить 4-й справа бит, т. е. поместить туда единицу независимо от того, какое там было значение, нуль или единица? Нумерация битов с нуля.
10. Как заменить значение 2–го справа бита на противоположное значение, т. е. нуль на единицу, а единицу на нуль? Нумерация битов с нуля.
-
С помощью битовых операций вывести на экран:
а) значение k–го справа бита;
б) i–ю справа шестнадцатеричную цифру.
-
Решить задачу упаковки (см. задачу 3) и распаковки, если диапазон чисел следующий: a) 0..1; б) 0..3; в) 0..7. Рассмотреть несколько вариантов объявления массива (unsigned short, char и др.).
-
Используя битовые операции, вывести шестнадцатеричное представление без знакового двухбайтного целого числа.
Указание. Последнюю шестнадцатеричную цифру получаем с помощью операции number & 0xF, или number & 15. Кроме того, на каждом шаге число сдвигаем на четыре разряда. Выделенную шестнадцатеричную цифру с помощью if и switch анализируем и выводим либо цифры от 0 до 9, либо буквы A, B, C, D, E, F.
-
В массиве целых положительных чисел найти все числа с наибольшим количеством единиц в двоичном представлении. Составить и использовать функцию, которая с помощью битовых операций находит количество единиц в двоичном представлении одного числа.