- •Основы алгоритмизации и программирования, язык Си
- •Введение
- •Блок-схема алгоритма Общие требования к блок-схеме алгоритма
- •Линейные и разветвляющиеся процессы
- •Циклические процессы
- •Итерационные процессы
- •Комментарии
- •Типы данных
- •Данные целого типа
- •Данные вещественного типа
- •Модификатор const
- •Переменные перечисляемого типа
- •Константы
- •Операции и выражения
- •Операция присваивания
- •Арифметические операции
- •Операции поразрядной арифметики
- •Логические операции
- •Операции отношения
- •Инкрементные и декрементные операции
- •Операция sizeof
- •Порядок выполнения операций
- •Приоритет операций
- •Преобразование типов
- •Операция приведения
- •Операция запятая
- •Ввод и вывод информации
- •Директивы препроцессора Директива #include
- •Директива #define
- •Понятие пустого и составного операторов
- •Условные операторы
- •Операторы организации цикла
- •Оператор цикла for
- •Оператор цикла while
- •Оператор цикла do … while
- •Вложенные циклы
- •Операторы перехода (break, continue, return, goto)
- •Примеры программ
- •Массивы Одномерные массивы
- •Примеры программ
- •Многомерные массивы (матрицы)
- •Примеры программ
- •Указатели Понятие указателя
- •Описание указателей
- •Операции с указателями
- •Связь между указателями и массивами
- •Массивы указателей
- •Многоуровневые указатели
- •Примеры программ
- •Символьные строки
- •Ввод/вывод строк.
- •Функции работы со строками.
- •Примеры программ
- •Функции
- •Прототип функции.
- •Определение функции.
- •Параметры функции
- •Параметры по умолчанию
- •Передача массива в функцию
- •Inline функции
- •Класс памяти
- •Автоматические переменные
- •Статические переменные
- •Регистровые переменные
- •Блочная структура
- •Примеры программ
- •Указатели на функции
- •Примеры программ
- •Рекурсия
- •Примеры программ
- •Аргументы в командной строке
- •Функции с переменным числом параметров
- •Примеры программ
- •Сортировка
- •Пузырьковая сортировка.
- •Шейкер сортировка
- •Сортировка вставкой
- •Сортировка выбором
- •Метод Шелла
- •Метод Хора
- •Структуры
- •Доступ к элементам структуры
- •Инициализация структур
- •Указатели на структуры.
- •Структуры и функции
- •Примеры программ
- •Поля бит
- •Объединения
- •Переменные с изменяемой структурой
- •Примеры программ
- •Организация списков и их обработка
- •Операции со списками при связном хранении
- •Построение обратной польской записи
- •Односвязный линейный список, очередь
- •Двусвязный линейный список
- •Циклический список, кольцо
- •Двусвязный циклический список
- •Примеры программ
- •Деревья
- •Потоки и файлы
- •Файлы Основные сведения о файловой системе
- •Организация посимвольного ввода и вывода
- •Определение конца файла feof()
- •Организация ввода и вывода строк
- •Удаление файлов
- •Дозапись потока
- •Позиционирование в файле
- •Текстовые и двоичные файлы
- •Функции fread() и fwrite()
- •Примеры программ
- •Хеширование
- •Схемы хеширования
- •Метод открытой адресации с линейным опробыванием
- •Метод цепочек
- •Машинное представление графов
- •Примеры программ
- •Литература
Операции поразрядной арифметики
Поразрядные операции используются для преобразования информации, содержащейся в памяти ПЭВМ, путем изменения некоторых отдельных, либо всех разрядов (битов) памяти. К числу поразрядных операций относятся сдвиговые операции (вправо (>>) и влево (<<)) и операции конъюнкции (&), дизъюнкции (|), исключающее ИЛИ (^) и поразрядная инверсия (~). Операция ~i приводит к тому, что все разряды (биты), соответствующие переменной i, изменяют свое значение на противоположное, например:
i=j>>k; i=j<<k;
i=j&k; i=j|k;
i=j^k; j=~k;
Операнды побитовых операций должны быть целого типа, но их типы могут быть отличными (выполняются обычные арифметические преобразования). Тип результата определяется типом операндов после преобразования. Результат операции сдвига не определен, если второй операнд отрицательный.
#include <stdio.h>
void main() // демонстрация побитовых операций и сдвигов
{ int i, j, k, l, m, n;
i=0xab00; j=0xabcd; // i и j в шестнадцатиричной с/с
k=i&j;
l=i | j;
m=i ^ j;
n= ~j;
printf("\ni=%x, j=%x, k=i&j=%x, l=i|j=%x, m=i^j=%x, n=~j=%x\n",
i,j,k,l,m,n);
// выводится: i=ab00, j=abcd, k=i&j=ab00, l=i|j=abcd, m=i^j=cd,
// n=~j=5432; заметим, что abcd+5432=ffff,
// поэтому ~ ещё называют поразрядным дополнением
i=10; j=16; k=i<<2; l=j>>3;
// i<<n равносильно i * (2 в степени n); j>>n = j / (2 в степени n)
printf("\ni=%d, j=%d, k=i<<2=%d, l=j>>3=%d\n",i,j,k,l);
// выводится: i=10, j=16, k=i<<2=40, l=j>>3=2
}
Язык С(С++) дополнительно позволяет расширить возможности оперирования некоторыми стандартными операциями, рассмотренными выше. Так, выражение i=i+3 может быть записано i+=3. Сказанное выше справедливо и для некоторых других операций, т.е. вместо знака + в выражении может быть записаны символы (-, *, /, %, <<, >>, & ,| ,^).
Логические операции
Логические операции выполняют логическое отрицание (!), логическое И (&&) и логическое ИЛИ ( || ). Операнды логических операций могут быть целого, вещественного или адресного типа. Типы первого и второго операндов могут быть различными. Операнды логических выражений вычисляются слева направо. Если значения первого операнда достаточно, чтобы определить результат операции (значение первого операнда равно нулю для логического И и единице для логического ИЛИ), то второй операнд не вычисляется.
Логические операции не выполняют стандартные арифметические преобразования. Вместо этого они вычисляют каждый операнд с точки зрения его эквивалентности нулю. Указатель имеет значение 0, если это значение явно установлено путем присваивания или инициализации. Результатом логической операции является 0 или 1. Тип результата есть int.
#include <stdio.h>
void main()
{ int i, j, k, l, m, n;
i=10; j=0; k= j && (i++); // т.к. j=0, то i не инкрементируется
m=!j; l= i || (j++); // т.к. i ¹ 0, то j не инкрементируется
printf("\n i=%d, j=%d, k=j && (i++)=%d, m= !j=%d ", i, j, k, m);
printf("\n l= i||(j++)=%d, i=%d, j=%d\n", l, i, j);
}
Результатом выполнения программы будет:
i=10, j=0, k=j && (i++)=0, m=!j=1
l=i||(j++)=1, i=10, j=0