- •Материалы для подоговки к экзамену по дисциплине «основы программировния»
- •Тема №1 Основные понятия
- •Способы записи алгоритма
- •Тема №2 Переменные
- •Типы переменных
- •Типы с плавающей точкой
- •Переполнение переменных
- •Постфиксное обозначение типа
- •Шестнадцатеричный и восьмеричный формат
- •Экспоненциальная форма представления чисел
- •Объявление переменных
- •Начальное значение переменной
- •Область видимости переменной
- •Тема №3 Оператор присваивания
- •Ввод-вывод Форматированный вывод
- •Форматированный ввод
- •Непечатные символы
- •Тема №4 Ветвления и логические операторы
- •Оператор Switch
- •Логические операторы
- •Логическое отрицание
- •Логическое и
- •Логическое или
- •Пример: закон де-Моргана.
- •Порядок выполнения логических операторов
- •Тема №5 Циклы
- •Цикл с предусловием
- •Циклы с постусловием
- •Цикл for
- •Вложенные циклы
- •Тема №6 Одномерные массивы
- •Начальная инициализация массива.
- •Размер массива
- •Переполнение массива
- •Пример с одномерным массивом
- •Многомерные статические массивы
- •Пример с многомерным массивом
- •Тема №7 Строки в си. Введение
- •Чтение строк
- •Указатели
- •Определение
- •Арифметика указателей
- •Указатель на указатель
- •Указатели и приведение типов
- •Null pointer - нулевой указатель
- •Пример работы с указателями
- •Тема №8 Указатели и массивы
- •Многомерные массивы и указатели на многомерные массивы
- •Определение макросов
- •Тема №9 Тернарный оператор и оператор запятая
- •Оператор запятая.
- •Сегментация приложения на си
- •Тема №10 Динамическое выделение памяти
- •Освобождение памяти с помощью free
- •Работа с двумерными и многомерными массивами
- •Тема №11 Параметры командной строки
- •Функции
- •Параметры и аргументы
- •Передача аргументов По значению
- •По указателю (ссылке)
- •Передача массива в качестве аргумента
- •Тема №12 Битовые операции
- •Операции побитового сдвига
- •Примеры
- •Вопросы к экзамену по дисциплине «Основы программирования»
Примеры
1.
Напишем функции, которые позволяют определять и изменять определённый бит числа
Для того, чтобы узнать, какой бит (1 или 0) стоит на позиции n, воспользуемся логическим умножением.
Пусть имеется число 9
00001001
Нужно узнать, выставлен ли бит на позиции 3 (начиная с нуля). Для этого умножим его на число, у которого все биты равны нулю, кроме третьего:
00001001 & 00001000 = 00001000
Теперь узнаем значение бита в позиции 6
00001001 & 01000000 = 00000000
Таким образом, если мы получаем ответ, равный нулю, то на искомой позиции находится ноль, иначе единица. Чтобы получить число, состоящее из нулей с одним битом на нужной позиции, сдвинем 1 на нужное число бит влево.
#include <stdio.h>
#include <conio.h>
#include <limits.h>
int checkbit(const int value, const int position) {
int result;
if ((value & (1 << position)) == 0) {
result = 0;
} else {
result = 1;
}
return result;
}
void main() {
int a = 3;
size_t len = sizeof(int) * CHAR_BIT;
size_t i;
for (i = 0; i < len; i++) {
printf("%d", checkbit(a, i));
}
_getch();
}
Заметьте, что в функции условие записано так
(value & (1 << position)) == 0
Потому что без скобок сначала будет вычислено равенство нулю и только потом выполнено умножение.
value & (1 << position) == 0
Функцию можно упростить
int checkbit(const int value, const int position) {
return ((value & (1 << position)) != 0);
}
2.
Функция, которая выставляет бит на n-й позиции в единицу.
Известно, что логическое сложение любого бита с 1 будет равно 1. Так что для установки n-го бита нужно логически сложить число с таким, у которого все биты, кроме нужного, равны нулю. Как получить такое число, уже рассмотрено.
int setbit(const int value, const int position) {
return (value | (1 << position));
}
3.
Функция, которая устанавливает бит на n-й позиции в ноль.
Для этого нужно, чтобы все биты числа, кроме n-го, не изменились. Умножим число на такое, у которого все биты равны единице, кроме бита под номером n. Например
0001011 & 1110111 = 0000011
Чтобы получить такую маску, сначала создадим число с нулями и одной единицей, а потом инвертируем его.
int unsetbit(const int value, const int position) {
return (value & ~(1 << position));
}
4.
Функция, изменющая значение n-го бита на противоположное.
Для этого воспользуемся функцией исключающего или: применим операцию XOR к числу, которое состоит из одних нулей и одной единицы на месте нужного бита.
int switchbit(const int value, const int position) {
return (value ^ (1 << position));
}
Проверка
#include <stdio.h>
#include <conio.h>
#include <limits.h>
int checkbit(const int value, const int position) {
return ((value & (1 << position)) != 0);
}
int setbit(const int value, const int position) {
return (value | (1 << position));
}
int unsetbit(const int value, const int position) {
return (value & ~(1 << position));
}
int switchbit(const int value, const int position) {
return (value ^ (1 << position));
}
void printbits(int n) {
//CHAR_BIT опеределён в библиотеке limits.h
//и хранит число бит в байте для данной платформы
size_t len = sizeof(int)* CHAR_BIT;
size_t i;
for (i = 0; i < len; i++) {
printf("%d", checkbit(n, i));
}
printf("\n");
}
void main() {
int a = 3;
size_t len = sizeof(int) * CHAR_BIT;
size_t i;
printbits(a);
a = setbit(a, 5);
printbits(a);
a = unsetbit(a, 5);
printbits(a);
a = switchbit(a, 11);
printbits(a);
a = switchbit(a, 11);
printbits(a);
}
