- •Основы алгоритмизации и программирования, язык Си
- •Введение
- •Блок-схема алгоритма Общие требования к блок-схеме алгоритма
- •Линейные и разветвляющиеся процессы
- •Циклические процессы
- •Итерационные процессы
- •Комментарии
- •Типы данных
- •Данные целого типа
- •Данные вещественного типа
- •Модификатор const
- •Переменные перечисляемого типа
- •Константы
- •Описание переменных
- •Локальные переменные
- •Операции и выражения
- •Операция присваивания
- •Арифметические операции
- •Операции поразрядной арифметики
- •Логические операции
- •Операции отношения
- •Инкрементные и декрементные операции
- •Операция sizeof
- •Порядок выполнения операций
- •Приоритет операций
- •Преобразование типов
- •Операция приведения
- •Операция запятая
- •Ввод и вывод информации
- •Директивы препроцессора Директива #include
- •Директива #define
- •Понятие пустого и составного операторов
- •Условные операторы
- •Операторы организации цикла
- •Оператор цикла for
- •Оператор цикла while
- •Оператор цикла do … while
- •Вложенные циклы
- •Операторы перехода (break, continue, return, goto)
- •Примеры программ
- •Массивы Одномерные массивы
- •Примеры программ
- •Многомерные массивы (матрицы)
- •Примеры программ
- •Указатели Понятие указателя
- •Описание указателей
- •Операции с указателями
- •Связь между указателями и массивами
- •Массивы указателей
- •Многоуровневые указатели
- •Примеры программ
- •Символьные строки
- •Ввод/вывод строк.
- •Функции работы со строками.
- •Примеры программ
- •Функции
- •Прототип функции.
- •Определение функции.
- •Параметры функции
- •Параметры по умолчанию
- •Передача массива в функцию
- •Inline функции
- •Класс памяти
- •Автоматические переменные
- •Статические переменные
- •Регистровые переменные
- •Блочная структура
- •Примеры программ
- •Указатели на функции
- •Примеры программ
- •Рекурсия
- •Примеры программ
- •Аргументы в командной строке
- •Функции с переменным числом параметров
- •Примеры программ
- •Сортировка
- •Пузырьковая сортировка.
- •Шейкер сортировка
- •Сортировка вставкой
- •Сортировка выбором
- •Метод Шелла
- •Метод Хора
- •Структуры
- •Доступ к элементам структуры
- •Инициализация структур
- •Указатели на структуры.
- •Структуры и функции
- •Примеры программ
- •Поля бит
- •Объединения
- •Переменные с изменяемой структурой
- •Примеры программ
- •Организация списков и их обработка
- •Операции со списками при связном хранении
- •Построение обратной польской записи
- •Односвязный линейный список, очередь
- •Двусвязный линейный список
- •Циклический список, кольцо
- •Двусвязный циклический список
- •Примеры программ
- •Деревья
- •Потоки и файлы
- •Файлы Основные сведения о файловой системе
- •Организация посимвольного ввода и вывода
- •Определение конца файла feof()
- •Организация ввода и вывода строк
- •Удаление файлов
- •Дозапись потока
- •Позиционирование в файле
- •Текстовые и двоичные файлы
- •Функции fread() и fwrite()
- •Примеры программ
- •Хеширование
- •Схемы хеширования
- •Метод открытой адресации с линейным опробыванием
- •Метод цепочек
- •Машинное представление графов
- •Примеры программ
- •Литература
Преобразование типов
Для получения верного результата выражения желательно, чтобы операнды, входящие в выражение, и результирующая переменная были одного типа. В отличие от компиляторов с других языков, например Паскаль, это не приводит к фатальной ошибке на этапе компиляции. Вместо этого компилятор использует правила автоматического преобразования типов к некоторому общему типу:
1) char и short преобразуется в int, float - в double (в С(С++) все действия с вещественными числами производятся с двойной точностью). В С(С++) наряду с модификатором unsigned существует модификатор signed. Если он используется сам по
себе, то это равносильно signed int. Имеют место следующие преобразования:
char - int (со знаком),
unsigned char - int (старший байт всегда нулевой),
signed char - int (в знаковый разряд int передается знак из char),
short - int (знаковый или беззнаковый),
float - double;
2) enum преобразуется в int;
3) если один из операндов имеет тип double (long, unsigned), то другие преобразуются к double (long, unsigned) соответственно, результат будет иметь тип double (long, unsigned);
4) последовательность имен типов, упорядоченных от "высшего" типа к "низшему", имеет следующий вид: double, float, long, int, short, и char. Применение модификатора unsigned повышает ранг соответствующего типа данных со знаком.
"Повышение" типа обычно заканчивается успешно, в то время как "понижение" может закончиться не всегда успешно. Это связано с тем, что все число может не поместиться в элементе данных низшего типа.
#include<stdio.h>
void main(void)
{ char c; /* объявление cимвольной переменной */
int i; /* объявление переменной целого типа */
float f; /* объявление переменной вещественного типа */
f=i=c='C';
printf("c= %c, i= %d, f= %2.3f \n",c,i,f);
c=c+1; /*преобразования выполнятся успешно, т. к. размер-*/
i=f+c; /*ность памяти под переменными c, i, f достаточна*/
f=i/c; /*для размещ. в них значений вычисленных выраж. */
printf("c= %c, i= %d, f= %f \n",c,i,f);
c=3.67e17; /*для числа 3.67e17 требуется > 1 байта (ошибка)*/
printf("c= %c \n",c);
}
В С(С++) при вычислении все величины типа float преобразуются в тип double, что уменьшает вероятность погрешности при округлении. Конечный результат преобразуется к типу float (если это требуется).
Операция приведения
Рассмотренные выше преобразования типов выполняются автоматически. Существует возможность точно указать тип данных, к которому необходимо привести (преобразовать) некоторое выражение (переменную). Это заключается в том, что перед приводимым к требуемому типу выражением ставится тип в круглых скобках: (тип) выражение. Например:
int i:
i=(int)3.4e-2+(int)’A’;
Вообще говоря, при разработке программ желательно не смешивать типы, во многих языках это запрещено. Однако в некоторых случаях этого избежать нельзя или это упрощает программу. В С(С++) вся ответственность за подобные преобразования ложится на программиста.
Операция запятая
В С(С++) любое выражение с оператором присваивания, заключенное в скобки, имеет значение, равное присваиваемому. Например, выражение (i=j+k) будет иметь значение суммы j+k. Использование скобок позволяет расширить смысл указанного выражения далее простого суммирования и присваивания полученного значения переменной i. Значение суммы присваивается также всему выражению, над которым здесь же может быть выполнена другая операция, например, операция сравнения ((i=j+k)<=n). Выражение в целом будет принимать значение FALSE или TRUE в зависимости от выполнения условия. Выражение в скобках может представлять собой сложное выражение, состоящее из более чем одной формулы. Для этого и используется операция запятая. Вычисления в таком выражении выполняются слева направо, и все выражение примет значение последней вычисленной формулы. Например (i=j+1,j+4), значение всего выражения будет равно 5.