- •Задание №1. Строки и функции в c.
- •В строке string1 определяет последнее вхождение в нее строки string2. Возвращает указатель на начало вхождения. В случае неуспеха возвращается -1.
- •Задание №2. Массивы и указатели.
- •Задание №3. Ввод данных из командной строки.
- •Задание №4. Побитовые операции
- •Задание №5. Шаблоны функций.
- •Задание №6. Основы ооп, перегрузка операторов
- •Задание №7. Наследование
- •Задание №8. Полиморфизм
Задание №2. Массивы и указатели.
Написать функцию для произвольного двухмерного классического (не свободного) массива с использованием индексов. Прототип функции должен выглядеть приблизительно следующим образом:
int func(int *array, int dim1, int dim2, ...).
Методические указания решения задачи приведены в лекции 4 (разработка функции print_arr).
Второй вариант функции должен являться чисто формальным преобразованием выражений с индексами в выражения с указателями (как это делает компилятор).
Необходимо ответить на вопросы, поставленные в лекции 4, а именно почему варианты обращения к функции
func((int*)m, dim1, dim2);
или
func (*m, dim1, dim2); func (m[0], dim1, dim2); func (&m[0][0], dim1, dim2); func (&**m, dim1, dim2);
эквивалентны?
Вычислить сумму всех элементов главной диагонали
Вычислить сумму элементов заданной строки
Вычислить сумму элементов заданного столбца
Найти наибольший элемент главной диагонали
Найти наибольший элемент в заданной строке
Найти первый отрицательный элемент в заданной строке
Найти наибольший элемент в заданном столбце
Найти первый отрицательный элемент в заданном столбце
Переставить заданные строки
Переставить заданные столбцы
Найти количество положительных элементов главной диагонали
Определить количество нулевых элементов главной диагонали
Определить количество отрицательных элементов в заданной строке
Определить количество элементов, превышающих некоторое значение в заданном столбце
Определить количество положительных элементов главной диагонали, превышающих заданное значение
Найти сумму абсолютных значений элементов главной диагонали
Найти сумму элементов заданных столбцов
Найти сумму элементов заданных строк
Найти сумму матриц
Найти произведение элементов главной диагонали
Найти произведение матрицы на число
Найти разность матриц
Найти произведение элементов заданной строки
Найти произведение элементов заданного столбца
Обнулить отрицательные элементы главной диагонали
Обнулить заданную строку
Обнулить заданный столбец
Найти среднее значение элементов в заданном столбце
Найти среднее значение элементов в заданной строке
Найти среднее значение элементов главной диагонали
Задание №3. Ввод данных из командной строки.
Выполнить задачу из задания 1 с вводом данных из командной строки (не с клавиатуры!). Методические указания к решению задачи - конец 4-ой лекции.
Задание №4. Побитовые операции
При написании функций можно использовать только следующее:
- целочисленные константы;
- целочисленные аргументы функций и автоматические (локальные)переменные;
- операции ~ ! * + - (тип) sizeof << >> & ^ |. Группы операций расположены в порядке убывания приоритета.
Запрещается:
- использовать такие операторы как if, do, while, for, switch и т.п. ;
- использовать макросы или какие либо функции;
- использовать другие операции такие как &&, ||, ?: ;
- использовать типы данных кроме целочисленных;
- использовать массивы, структуры и объединения.
Примеры, иллюстрирующие стиль написания функций:
//pow2plus1 - возвращает 2^x + 1, где 0 <= x <= 15 (или 31) unsigned pow2plus1(unsigned x) { return (1 << x) + 1; } //pow2plus4 - возвращает 2^x + 4, где 0 <= x <= 15 (или 31) unsigned pow2plus4(unsigned x) { unsigned result = 1 << x; result+=4; return result; } //conditional - выполняет то же, что и операция x ? y : z int conditional(int x, int y, int z) { int size = sizeof(int); int r1=!!x, r2; r1 = (r1 << (size-1)) >> (size-1); r2 = ~r1; return (y&r1) | (z&r2); }
№ 1
unsigned bitAnd(unsigned x, unsigned y);
bitAnd – возвращает x&y
Пример: bitAnd(6, 5) = 4
Допустимые операции: ~ |
Подсказка: использовать закон Де Моргана
№ 2
int nthBit(i unsigned x, int n);
nthBit – возвращает значение n-го бита x; нумерация бит начинается с 0
Пример: nthBit(4, 0) = 0, nthBit(4, 2) = 1
№ 3
int SetFirstNBits(int n);
SetFirstNBits - возвращает максимальное число, задаваемое n битами
Пример: SetFirstNBits(3) = 7, SetFirstNBits(0) = 0
№ 4
int FromNtoMBits(unsigned x, int n, int m);
FromNtoMBits - возвращает число, составленное из бит от n до m;
Нумерация бит начинается с 0
Пример: FromNtoMBits(4, 2, 4) = 1, FromNtoMBits(12, 2, 4) = 3
№5
unsigned bitXor(unsigned x, unsigned y);
bitXor возвращает x^y (исключающее или)
Пример: bitXor(4, 5) = 1
Допустимые операции: ~ & |
№ 6
unsigned MoveLeftWithAdd (unsigned x, unsigned y, int n);
MoveLeftWithAdd – возвращает х, содержимое которого сдвинуто влево на n разрядов, а освободившиеся разряды заполнены старшими разрядами y.
MoveLeftWithAdd(0x1234,0x5678,8) = 0x3456
№ 7
unsigned getByte(unsigned long x, int n);
getByte - возвращает n-ый байт из x
Байты нумеруются on 0 до 3
Пример: getByte(0x12345678,1) = 0x56
№ 8
Unsigned long logicalShift(unsigned long x, int n) ;
logicalShift - возвращает x, сдвинутое вправо на n разрядов
Пример: logicalShift(0x87654321,4) = 0x08765432
№ 9
unsigned MoveRightWithAdd (unsigned x, unsigned y, int n);
MoveRightWithAdd – возвращает х, содержимое которого сдвинуто вправо на n разрядов, а освободившиеся разряды заполнены старшими разрядами y.
MoveRightWithAdd(0x1234,0xABCD,8) = 0xAB12
№10
unsigned MoveRightWithAdd (unsigned x, unsigned y, int n);
MoveRightWithAdd – возвращает х, содержимое которого сдвинуто вправо на n разрядов, а освободившиеся разряды заполнены инвертированными младшими разрядами y.
MoveRightWithAdd(0x1234,0xABCD,8) = 0x3212
№11
unsigned MoveLeftWithAdd (unsigned x, unsigned y, int n);
MoveLeftWithAdd – возвращает х, содержимое которого сдвинуто влево на n разрядов, а освободившиеся разряды заполнены инвертированными старшими разрядами y.
MoveLeftWithAdd(0x1234,0x5678,8) = 0x34A9
№ 12
unsigned MoveRight(unsigned x, int n);
MoveRight –сдвигает х вправо на n разрядов с заполнением 1 освободившихся разрядов
Пример: MoveRight(0x123,4) = 0xF012
№13
unsigned RetGroupBits(unsigned x, int n1, int n2);
RetGroupBits – возвращает значение, представленное заданной группой бит
Разряды нумеруются с 0
Пример: RetGroupBits(0xF75A, 2, 6) = 0x16
№ 14
unsigned WriteGroupBits(unsigned x, unsigned n1, int n2, unsigned y);
WriteGroupBits – возвращает значение, полученное записью у в заданную группу разрядов x.
Разряды нумеруются с 0
Пример: WriteGroupBits(0xFFFF,4,7,0x6) = 0xFF6F
№ 15
unsigned MoveRight(unsigned x, int n, int onebit);
MoveRight - сдвигает х вправо на n разрядов с заполнением значением onebit (только 0 или 1) освободившихся разрядов
Примеры: MoveRight(0x123,4,1) = 0xF012
MoveRight(0x123,4,0) = 0x12
№ 16
unsigned EraseGroupBits(unsigned x, int n1, int n2);
EraseGroupBits – возвращает x с обнуленной группой разрядов с n1 по n2
Разряды нумеруются с 0
Пример: EraseGroupBits(0xFFFF,4,7) = 0xFF0F
№ 17
unsigned Write1toGroupBits(unsigned x, int n1, int n2);
Write1toGroupBits –заполняет группу разрядов с n1 по n2 единицами
Разряды нумеруются с 0
Пример: Write1ToGroupBits(0x1111,4,7) = 0x11F1
№ 18
unsigned MovtLeft(unsigned x, int n, int bit);
MoveLeft - сдвигает х влево на n разрядов с заполнением значением onebit (только 0 или 1) освободившихся разрядов
Примеры: MoveLeft(0x123,4,1) = 0x123F
MoveLeft(0x123,4,0) = 0x1230
№ 19
unsigned ChangeBits(unsigned x, unsigned y);
Есди в четных разрядах у стоит 1. то соответствующие разряда х инвертируются.
Разряды нумеруются с 0
Пример: ChangeBits(0xFFFF,0xF541) = 0xAABE
№ 20
unsigned CicleMoveBitsLeft(unsigned x, int n);
CicleMoveBitsLeft – осуществляет циклический сдвиг влево на n разрядов
Пример: CicleMoveBitsLeft(0xABCD,4) = 0xBCDA
№ 21
unsigned CicleMoveBitsRight(unsigned x, int n);
CicleMoveBitsRight – осуществляет циклический сдвиг вправо на n разрядов
Пример: CicleMoveBitsRight(0xABCD,4) = 0xDABC
№ 22
unsigned ChangeGroupBits(unsigned x, unsigned y, int n1, int n2);
ChangeGroupBits– возвращает х, в котором заданная группа разрядов получается исключающим или соответствующих групп х и у
Разряды нумеруются с 0
ChangeGroupBits(0xFFFF,0xFFA5,1,7) = 0xFF5B
№ 23
unsigned MoveGroupBits(unsigned x, unsigned y, int n1, int n2);
MoveGroupBits – заменяет группу разрядов х с n1 по n2 соответствующей группой разрядов из у и возвращает полученное значение
Разряды нумеруются с 0
Пример: MoveGroupBits(0xABCD,0x1234,4,7) = 0xAB3D
№ 24
unsigned char ReverseByte(unsigned char c);
ReverseByte – реверсирует (не инвертирует!) биты данного типа char
Примеры: ReverseByte(0xAB) - 0x D5
ReverseByte(0x1B) - 0x D8
Примечание: вывод осуществлять с помощью printf(), например
printf("%X\n",ReverseByte(0xAB));
№ 25
unsigned ReverseTetrads(unsigned x);
ReverseTetrads - возвращает х с реверсированными тетрадами
Пример: ReverseTetrads(0xABCD) = 0xDCBA
№ 26
unsigned InversionGroupBit(unsigned x, int n1, int n2);
InversionGroupBit - меняет значения бит на противоположные в заданной группе разрядов
Разряды нумеруются с 0
Пример: InversionGroupBit(0xABCD,4,7) = 0xAB3D
№ 27
unsigned ChangeBits(unsigned x, unsigned y);
ChangeBits – возвращает значение х, в котром занулены те нечетные биты, которые в у равны 1. Четные биты не изменяются.
Разряды нумеруются с 0
Пример: ChangeBits(0x6FFF,0x00F0) = 0x6F5F
№ 28
unsigned ChangeBits(unsigned x, unsigned y);
ChangeBits – возвращает значение х, в котром установлены в 1 те четные биты, которые в у равны 0. Нечетные биты не изменяются.
Разряды нумеруются с 0
Пример: ChangeBits(0x0003,0x04F9) = 0x5107
№ 29
unsigned EraseExceptGroupBits(unsigned x, int n1, int n2);
EraseExceptGroupBits -возвращает х с обнуленными разрядами, за исключением заданной группы
Разряды нумеруются с 0
Пример: EraseExceptGroupBits(0xABCD,4,7) = 0xC0
№30
unsigned ChangeGroupBits(unsigned x, unsigned y, int n1, int n2);
ChangeGroupBits – возвращает х, в котором заданная группа бит заменяется соответствующей инвертированной группой бит из у
Разряды нумеруются с 0
ChangeGroupBits(0xFFFF,0xFF8A,1,7) = 0xFF75
№31
int sign(int x);
sign - возвращает 1, если х>0, 0(x==0), -1(x<0)
Пример: sign(130) = 1 ; sign(-23) = -1
№ 32
int addOK(int x, int y);
addOK - возвращает 1, если x+y не дает переполнения
Пример: addOK(0x8000,0x8000) = 0,
addOK(0x8000,0x7000) = 1,
№ 33
int bang(int x);
bang - возвращает !x без использования !
Пример: bang(3) = 0, bang(0) = 1
