- •Основы алгоритмизации и программирования, язык Си
- •Введение
- •Блок-схема алгоритма Общие требования к блок-схеме алгоритма
- •Линейные и разветвляющиеся процессы
- •Циклические процессы
- •Итерационные процессы
- •Комментарии
- •Типы данных
- •Данные целого типа
- •Данные вещественного типа
- •Модификатор const
- •Переменные перечисляемого типа
- •Константы
- •Описание переменных
- •Локальные переменные
- •Операции и выражения
- •Операция присваивания
- •Арифметические операции
- •Операции поразрядной арифметики
- •Логические операции
- •Операции отношения
- •Инкрементные и декрементные операции
- •Операция sizeof
- •Порядок выполнения операций
- •Приоритет операций
- •Преобразование типов
- •Операция приведения
- •Операция запятая
- •Ввод и вывод информации
- •Директивы препроцессора Директива #include
- •Директива #define
- •Понятие пустого и составного операторов
- •Условные операторы
- •Операторы организации цикла
- •Оператор цикла for
- •Оператор цикла while
- •Оператор цикла do … while
- •Вложенные циклы
- •Операторы перехода (break, continue, return, goto)
- •Примеры программ
- •Массивы Одномерные массивы
- •Примеры программ
- •Многомерные массивы (матрицы)
- •Примеры программ
- •Указатели Понятие указателя
- •Описание указателей
- •Операции с указателями
- •Связь между указателями и массивами
- •Массивы указателей
- •Многоуровневые указатели
- •Примеры программ
- •Символьные строки
- •Ввод/вывод строк.
- •Функции работы со строками.
- •Примеры программ
- •Функции
- •Прототип функции.
- •Определение функции.
- •Параметры функции
- •Параметры по умолчанию
- •Передача массива в функцию
- •Inline функции
- •Класс памяти
- •Автоматические переменные
- •Статические переменные
- •Регистровые переменные
- •Блочная структура
- •Примеры программ
- •Указатели на функции
- •Примеры программ
- •Рекурсия
- •Примеры программ
- •Аргументы в командной строке
- •Функции с переменным числом параметров
- •Примеры программ
- •Сортировка
- •Пузырьковая сортировка.
- •Шейкер сортировка
- •Сортировка вставкой
- •Сортировка выбором
- •Метод Шелла
- •Метод Хора
- •Структуры
- •Доступ к элементам структуры
- •Инициализация структур
- •Указатели на структуры.
- •Структуры и функции
- •Примеры программ
- •Поля бит
- •Объединения
- •Переменные с изменяемой структурой
- •Примеры программ
- •Организация списков и их обработка
- •Операции со списками при связном хранении
- •Построение обратной польской записи
- •Односвязный линейный список, очередь
- •Двусвязный линейный список
- •Циклический список, кольцо
- •Двусвязный циклический список
- •Примеры программ
- •Деревья
- •Потоки и файлы
- •Файлы Основные сведения о файловой системе
- •Организация посимвольного ввода и вывода
- •Определение конца файла feof()
- •Организация ввода и вывода строк
- •Удаление файлов
- •Дозапись потока
- •Позиционирование в файле
- •Текстовые и двоичные файлы
- •Функции fread() и fwrite()
- •Примеры программ
- •Хеширование
- •Схемы хеширования
- •Метод открытой адресации с линейным опробыванием
- •Метод цепочек
- •Машинное представление графов
- •Примеры программ
- •Литература
Переменные перечисляемого типа
Ключевое слово enum в С(С++) используется для объявления еще одного типа данных – перечисляемого. Он предназначен для описания целых констант (типа int) из некоторого заданного множества, например:
enum months {jan,feb,mar,apr,may,jun};
enum number {one,two,four,nine};
Здесь определены два типа months и days. Для определения переменной типа months запишем:
enum months ms;
Переменная ms может принимать любое значение из списка констант перечисленных в фигурных скобках. Каждому значению из списка соответствует целое десятичное число, начиная с нуля. Каждая следующая имеет значение на единицу больше, чем предыдущая:
jan=1, feb=2, mar=3 и так далее.
enum number i1,i2;
Каждая из переменных i1 и i2 может принимать одно из четырех значений: one, two, four или nine. Определение переменных можно выполнить и при объявлении типа, например:
enum number {one,two,four,nine} i1=one, i2=four;
Перечисление может быть описано и без задания имени типа. Имена в различных перечислениях должны отличаться друг от друга. Значения внутри одного перечисления могут совпадать:
enum number {one,two=one,four=4,six=4,nine} i1=one, i2=two;
В этом случае переменные i1 и i2 будут равны обе нулю и ассоциироваться с константой one. Константы four и six будут равны четырем .
В перечислении константам можно задавать значения не по порядку, при этом если не все значения констант явно специфицированы, то они продолжают прогрессию, начиная от последнего специфицированного значения:
enum number{one= 2,two,four= two+one-1,six= two+3} i1=two, i2= four;
В этом случае значения именованных констант будут следующими:
one= 2, two=3, four= 4, six= 6.
Переменные типа enum могут использоваться в индексных выражениях, как операнды в арифметических выражениях и в операциях отношения. Имя константы из списка перечисление эквивалентно её числовому значению. Именованным константам можно устанавливать как положительные, так и отрицательные значения.
Константы
В отличие от переменных, константы не изменяют своего значения в процессе выполнения всей функции (группы взаимосвязанных функций). Аналогично переменным константы могут быть следующих основных типов:
- целые;
- беззнаковые (символ U);
- вещественные;
- символьные;
- константное выражение, состоящее из констант объединенных знаками операций.
Константа целого типа. Примером константы целого типа является, например, число 241. Если требуется ввести константу типа long, то для этого надо в конце числа указать признак L или l, например, 143L. Признак L гарантирует, что для константы 143 в памяти будет отведено соответствующее число (4) байт. Это может быть важным для достижения совместимости при использовании константы с другими переменными и константами типа long.
Кроме десятичной формы представления, константы целого типа могут быть записаны в виде
- восьмеричного числа (если запись константы начинается с цифры 0), например 016, что соответствует десятичному числу 14.
- шестнадцатеричного числа (если число начинается с символов 0x или 0X), например 0x16, что соответствует десятичному числу 22.
Ниже приведены примеры целочисленных констант:
4356; - десятичная константа,
431L; - десятичная константа типа long,
0427; - восьмеричная константа,
0x136; - шестнадцатеричная константа.
Символьная константа. Символьные константы представляют собой одиночные символы, заключенные в апострофы, например:
simv=’S’;
Если в апострофы заключено более одного символа, то компилятор трактует это как ошибку:
simv=’SS’;
При описании символьной константы вместо символа может быть использован его ASCII код, например:
simv=’\123’; /* 123 - ASCII код символа S*/
В качестве символьных переменных могут использоваться управляющие символы (табл. 3).
Таблица 3.
-
Управляющий знак
Наименование Код
\n
Переход на новую строку \х0A
\t
Горизонтальная табуляция \x09
\v
Вертикальная табуляция \x0B
\b
Возврат на одну позицию \x08
\r
Перевод курсора в начало строки \x0C
\f
Новая страница \x0D
\a
Звонок ( сигнал ) \x07
\’
Одиночная кавычка \x27
\”
Двойная кавычка \x22
\\
Наклонная черта влево(обратный слэш) \x5C
\ddd
ASCII символ в восьмеричном представлении
\xdd
ASCII символ в шестнадцатеричном представлении
При присваивании символьной переменной эти символы должны быть заключены также в апострофы:
simv=’\n’; simb=’\f’;
Вещественные константы. В языке С(С++) допустимо несколько способов описания вещественных чисел. Наиболее общим является способ, при котором последовательность цифр включает в себя десятичную точку и символ e(E): 3.142е-2, -1.732Е+4. Знак + не обязателен в записи числа. Можно пускать либо десятичную точку, либо экспоненциальную часть, но не обе одновременно: 2.5348, .34е-2, 34е-2,, .34, 34. Использование пробелов в записи константы недопустимо.
В процессе работы константы с плавающей точкой представляются в формате double, то есть им отводится по 8 байт памяти.
main()
{ float sm;
sm=3.45*3.5;
}
Результат операции умножения 3.45*3.5 имеет двойную точность. При выполнении присваивания происходит усечение результата до размера float. Это позволит достичь максимальной точности.
В заключение отметим, что использование модификатора const запрещает любые переопределения константы. Например:
const char s[]=”БГУИР”;
const float ff=23.527;
const i=341;
Применение модификатора без указания типа константы подразумевает по умолчанию тип int.
Использование препроцессора (директивы препроцессора #define, будет рассмотрено далее) является еще одним механизмом, позволяющим существенно упростить процедуру определения и изменения значения констант.
Структура программы на языке С(С++)
Любая программа на С(С++) состоит из одной или нескольких функций. Обязательно должна быть определена единственная главная функция main(), именно с нее всегда начинается выполнение программы. В процессе выполнения функция main обращается к другим функциям, находящимся в той же программе, либо в библиотеках, содержащих ранее написанные функции. В хорошем исходном тексте программы главная функция всегда содержит операторы, отражающие сущность решаемой задачи, чаще всего это вызовы функций. Хотя main() и не является ключевым словом, относиться к нему следует как к ключевому. Например, не следует использовать main как имя переменной, так как это может нарушить работу транслятора.
Структура программы С изображена ниже. Здесь f1()…fn() означают функции, написанные программистом.
директивы препроцессора
определение типов пользователя (используется typedef)
прототипы функций
определение глобальных переменных
int main(список параметров)
{ определение локальных переменных функции main
последовательность операторов
}
тип_возвращаемого_значения f1(список параметров) // функция f1
{ определение локальных переменных функции f1
последовательность операторов функции f1
}
.
.
.
тип_возвращаемого_значения fn(список параметров) // функция fn
{ определение локальных переменных функции fn
последовательность операторов функции fn
}
Ниже приведен пример простой программы .
#include<stdio.h> // подключение системной библиотеки
#include "file.cpp" // подключение личного файла
int fun(int,int); // прототип функции fun
main() // описание функции main
{ int a, b, c; // раздел описания данных
scanf("%d%d",&a,&b); // функция ввода нанных i и j
printf(" a+b= %d",a+b ); // вывод результатов
c=fun(a,b); // обращение к функции fun
funk(); // обращение к функции из файла file.cpp
return; //
}
int fun(int aa,int bb) // тело функции fun
{ return aa-bb; }