- •ПРОГРАММИРОВАНИЕ НА ЯЗЫКАХ С И С++
- •СОДЕРЖАНИЕ
- •ВВЕДЕНИЕ
- •1. ЛЕКСИКА ЯЗЫКА C
- •1.1. РАЗДЕЛИТЕЛИ
- •1.2. КОММЕНТАРИИ
- •2. ДАННЫЕ И ОПЕРАЦИИ
- •2.1. БАЗОВЫЕ ТИПЫ ДАННЫХ
- •Наименование
- •Диапазон
- •2.2. КОНСТАНТЫ
- •Целые константы
- •Константы с плавающей точкой
- •Символьные константы
- •2.3. ОПРЕДЕЛЕНИЕ ПЕРЕМЕННЫХ И ТИПИЗИРОВАННЫХ КОНСТАНТ
- •2.4. ОДНОМЕРНЫЙ МАССИВ
- •2.5. СТРОКИ, СТРОКОВЫЕ КОНСТАНТЫ
- •2.6. УКАЗАТЕЛИ
- •2.7. ПЕРЕИМЕНОВАНИЯ ТИПОВ
- •2.8. СТРУКТУРЫ
- •2.9. МАССИВЫ СТРУКТУР
- •2.10. МНОГОМЕРНЫЕ МАССИВЫ
- •2.11. ОБЪЕДИНЕНИЕ
- •2.12. ПЕРЕЧИСЛЕНИЕ
- •2.13. БИТОВОЕ ПОЛЕ ( ЗАПИСЬ )
- •3. ОПЕРАЦИИ И ВЫРАЖЕНИЯ
- •3.1. АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ
- •3.2. ОПЕРАЦИИ СРАВНЕНИЯ
- •3.3. ЛОГИЧЕСКИЕ ОПЕРАЦИИ
- •3.4. ПОБИТОВЫЕ (ПОРАЗРЯДНЫЕ) ОПЕРАЦИИ
- •3.5. ОПЕРАЦИИ ПРИСВАИВАНИЯ
- •3.6. АДРЕСНЫЕ ОПЕРАЦИИ
- •3.7. ДОСТУП К ПОЛЯМ СТРУКТУР, ОБЪЕДИНЕНИЙ И ЗАПИСЕЙ
- •3.8. ДРУГИЕ ОПЕРАЦИИ
- •3.9. ПОРЯДОК ВЫПОЛНЕНИЯ ОПЕРАЦИЙ В ВЫРАЖЕНИИ
- •4. ОПЕРАТОРЫ
- •4.1. ОПЕРАТОР-ВЫРАЖЕНИЕ
- •4.2. ПУСТОЙ ОПЕРАТОР
- •4.3. СОСТАВНОЙ ОПЕРАТОР
- •4.4. УСЛОВНЫЕ ОПЕРАТОРЫ
- •4.5. ОПЕРАТОРЫ ЦИКЛА
- •while( выражение) оператор;
- •do оператор while ( выражение );
- •for( выражение1; выражение2; выражение3 ) оператор;
- •4.6. ОПЕРАТОРЫ ПЕРЕХОДА
- •break;
- •switch
- •continue;
- •goto метка;
- •5. ФУНКЦИИ. КЛАССЫ ПАМЯТИ
- •5.1. ФУНКЦИИ
- •5.2. КЛАССЫ ПАМЯТИ
- •класс памяти
- •ключевое слово
- •существование
- •видимость
- •5.3. ВОЗВРАЩЕНИЕ ЗНАЧЕНИЙ
- •5.4. АРГУМЕНТЫ ФУНКЦИИ
- •6. ФУНКЦИИ ВВОДА С КЛАВИАТУРЫ И ВЫВОДА НА ДИСПЛЕЙ
- •6.1. ФОРМАТИРОВАННЫЙ ВЫВОД
- •6.2. ФОРМАТИРОВАННЫЙ ВВОД
- •6.3. ВВОД СТРОКИ
- •6.4. ВЫВОД СТРОКИ
- •6.5. ВВОД СИМВОЛА
- •6.6. ВЫВОД СИМВОЛА
- •7. ПРЕПРОЦЕССОР
- •7.1. ВКЛЮЧЕНИЕ ФАЙЛОВ
- •7.2. ВЫПОЛНЕНИЕ ПОДСТАНОВОК
- •7.3. УСЛОВНАЯ КОМПИЛЯЦИЯ
- •8. ДИНАМИЧЕСКОЕ РАСПРЕДЕЛЕНИЕ ПАМЯТИ, СПИСКИ
- •8.1. ВЫДЕЛЕНИЕ И ОСВОБОЖДЕНИЕ ДИНАМИЧЕСКОЙ ПАМЯТИ
- •8.2. СПИСКИ
- •Рис.1. Структура однонаправленного линейного списка
- •9. ФАЙЛЫ
- •9.1. ОТКРЫТИЕ И ЗАКРЫТИЕ ФАЙЛОВ
- •9.2. ЧТЕНИЕ И ЗАПИСЬ В ФАЙЛ
- •9.3. ПРОИЗВОЛЬНЫЙ ДОСТУП К ФАЙЛУ
- •10. ЛАБОРАТОРНЫЕ РАБОТЫ
- •10.1. МАССИВЫ И СИМВОЛЬНЫЕ СТРОКИ
- •Цель работы
- •Пример выполнения работы
- •Варианты заданий
- •10.2. ФУНКЦИИ
- •Цель работы
- •Пример выполнения работы
- •Варианты заданий
- •10.3. СТРУКТУРЫ И МАССИВЫ СТРУКТУР
- •Цель работы
- •Пример выполнения работы
- •Варианты заданий
- •10.4. ДИНАМИЧЕСКОЕ РАСПРЕДЕЛЕНИЕ ПАМЯТИ, СПИСКИ
- •Цель работы
- •Пример выполнения работы
- •Варианты заданий
- •10.5. РАБОТА С ФАЙЛАМИ
- •Цель работы
- •Пример выполнения работы
- •Варианты заданий
- •11. ВВЕДЕНИЕ В C++
- •12. КЛАССЫ
- •12.1. ОБЩИЕ ПОЛОЖЕНИЯ
- •12.2. КОНСТРУКТОРЫ И ДЕСТРУКТОРЫ
- •12.3. СОЗДАНИЕ И ВЫЗОВ ОБЪЕКТОВ
- •12.4. ДРУЖЕСТВЕННЫЕ ФУНКЦИИ
- •12.5. ПЕPЕГPУЖЕННЫЕ ОПЕPАЦИИ И ФУНКЦИИ
- •12.6. ПАРАМЕТРИЗИРОВАННЫЕ КЛАССЫ
- •12.7. ПРЕОБРАЗОВАНИЕ ТИПОВ
- •12.8. СТАТИЧЕСКИЕ КОМПОНЕНТЫ КЛАССА
- •13. ПРОИЗВОДНЫЕ КЛАССЫ, НАСЛЕДОВАНИЕ
- •13.1. ИЕРАРХИЯ КЛАССОВ
- •13.2. ДОСТУП К НАСЛЕДУЕМЫМ КОМПОНЕНТАМ
- •Доступ в базовом классе
- •Модификатор доступа
- •14. ВИРТУАЛЬНЫЕ ФУНКЦИИ
- •14.1. ОБЩИЕ ПОЛОЖЕНИЯ
- •14.2. ВИРТУАЛЬНЫЕ ДЕСТРУКТОРЫ
- •14.3. АБСТРАКТНЫЕ КЛАССЫ
- •15.1. ВЫВОД ДАННЫХ
- •15.2. ВВОД ДАННЫХ
- •15.3. ВВОД-ВЫВОД ДАННЫХ, ОПРЕДЕЛЕННЫХ ПОЛЬЗОВАТЕЛЕМ
- •15.4. РАБОТА С ДИСКОВЫМИ ФАЙЛАМИ
- •15.5. ОБРАБОТКА ИСКЛЮЧЕНИЙ
- •ЛИТЕРАТУРА
– 4 –
2.2. КОНСТАНТЫ
Целые константы
Десятичные – состоят из цифр от 0 до 9, первая цифра – не 0. Пример: 123, 11. Тип константы – int или long.
Восьмеричные – состоят из цифр от 0 до 7, первая цифра – 0. Пример: 030=(24)10,
011=(9)10.
Шестнадцатеричные – состоят из цифр от 0 до 9 и букв от A до F, первые два символа
0x. Пример: 0xF=(15)10, 0x11=(17)10. Тип константы – unsigned int или unsigned long.
Длинные целые – после записи константы добавляется буква l или L.
Константы с плавающей точкой
Состоят из следующих частей: знак; целая часть – последовательность цифр; десятичная точка; дробная часть – последовательность цифр; символ экспоненты – e или E; экспонента – целая константа м.б. со знаком. Любая часть (но не обе сразу) из нижеследующих пар м.б. опущена: целая или дробная часть; десятичная точка или символ экспоненты вместе с экспо-
нентой. Пример: 345.; 3.14159; 34.4E4; 457e–5. Тип константы – double.
Символьные константы
Символьная константа – символ кода ASCII, заключённый в апострофы. Пример: 'b',
'Ф', 'F', '8'. Тип константы – char.
Для непечатных символов можно применять числовое обозначение – '\вшк', где вшк – восьмеричная или шестнадцатеричная константа. Пример: '\07' – звонок; '\0' – нулевой байт.
Для некоторых непечатных символов используются специальные двухсимвольные последовательности:
•'\n' – перевод строки;
•'\t' – горизонтальная табуляция;
•'\b'– забой (возврат каретки со стиранием);
•'\f' – переход на другую страницу.
2.3.ОПРЕДЕЛЕНИЕ ПЕРЕМЕННЫХ И ТИПИЗИРОВАННЫХ КОНСТАНТ
Объявление данных в Си-программах имеет следующий вид:
[класс_памяти] тип имя1, имя2,...;
Например:
int |
numb; double pi; unsighned int numb1; |
int |
m1,m2; |
char |
simb; |
(Классы памяти будут рассмотрены ниже).
При объявлении переменные можно инициализировать: int n=10;
Для записи типизированных констант применяется ключевое слово const:
const [тип] имя=значение;
Например:
const |
a=1; |
// по умолчанию принимается тип int |
const |
float |
pi=3.14159; |
© 1998 Калачев Д.П., Лутай В.Н.
– 5 –
2.4.ОДНОМЕРНЫЙ МАССИВ
Массив объявляется следующим образом:
[класс_памяти] тип имя_массива [размер_массива];
размер_массива – целое выражение – количество элементов массива.
Например:
int array [5];
Элементы массива array расположены в памяти следующим образом:
array[0] array[1] array[2] array[3] array[4]
Массив можно инициализировать при объявлении:
[класс_памяти] тип имя_массива [размер_массива]={C1, C2, ...., Cn},
где Ci – константы соответствующего типа.
Если n<размер_массива, то оставшиеся поля будут автоматически проинициализированы: числовые - нулями, символьные – пробелами.
char str[4] = {'а', 'б', 'в', 'г'};
При инициализации в объявлении массива можно использовать пустые скобки:
int massiv [] = {1,2,3,4};
в этом случае транслятор определяет размер массива по количеству элементов инициализации.
(Вообще говоря, пустые скобки можно использовать в объявлении и без инициализации; однако делать это не рекомендуется, так как при вводе данных в массив и их обработке не гарантируется их целостность; такого рода объявления целесообразно делать только в списке аргументов функции – см. далее)
2.5. СТРОКИ, СТРОКОВЫЕ КОНСТАНТЫ
Среди одномерных массивов символьного типа выделяют строку символов. От массива строка отличается тем, что её последним символом является символьный нуль: '\0'.
char stroka[] = {'с','т','р','о','к','а','\0'};
Этот символ может заноситься и автоматически, если массив инициализируется следующим образом:
char stroka[] = "строка";
(Длина строки в памяти на 1 байт превышает количество символов в строке справа от знака присваивания). Нуль-символ существенно упрощает работу со строками. Например, несмотря на то, что для строки name в следующем объявлении отведено 25 байтов
char name[25]= "Владимир";
нуль-символ позволяет ограничиться обработкой только первых восьми.
© 1998 Калачев Д.П., Лутай В.Н.
–6 –
Вбиблиотеке языка имеется множество функций для обработки строк. Приведем некоторые из них:
int strlen(char* str); // возвращает длину строки; char* strcat(char* str1, char* str2);
//соединяет две строки; результат записывается в первую строку; например char str1[12 ]="Группа ";
char str2[ ]=" A15";
strcat(str1,str2); // в результате str1 будет равна "Группа A15"; int strcmp(строка1, строка2) // <0, если строка1<строка2,
//=0, если строка1=строка2,
//>0, если строка1>строка2.
char* strcpy(char* str1, char* str2) // копирует вторую строку в первую.
int isalpha(int c) // возвращает не ноль если С- буква и ноль если С не буква. int isdigit(int c) // цифра, не цифра.
int islower(int c) // строчная, не строчная (a/A). int isupper(int c) // заглавная, не заглавная (A/a).
Прототипы функций работы со строками находятся в заголовочных файлах string.h и ctype.h.
2.6. УКАЗАТЕЛИ
Указатели – переменные или константы, содержащие адреса переменных; адресом переменной является номер первого байта поля памяти, отведенного под эту переменную.
Указатель в программе объявляется следующим образом:
тип* имя;
Указатель может указывать на объект любого типа: целую переменную, массив, структуру:
int* ptr1; double* ptr2;
Над указателями можно проводить арифметические операции сложения и вычитания.
ptr1 = ptr1+1;
Целая единица, которая прибавляется к указателю ptr1, является адресной единицей и содержит в себе столько натуральных единиц, сколько байтов содержит в себе тип указателя. Т.к. ptr1 объявлено как целое число и соответствующее поле занимает 2 байта, то адресная единица равна 2 натуральным и после выполнения операции сложения ptr1 содержит число, равное адресу следующего поля типа int.
ptr2=ptr2+2;
Здесь адресная единица содержит 8 натуральных единиц (см. табл.1). После выполнения операции в ptr2 записан адрес второго за исходным поля типа double.
Для того чтобы записать в указатель адрес конкретной переменной используется операция вычисления адреса, обозначаемая символом &.
int number, * ptr; ptr = &number;
В результате выполнения оператора присваивания в переменной ptr запоминается адрес переменной number.
© 1998 Калачев Д.П., Лутай В.Н.
– 7 –
Если запись вида *ptr встречается среди операторов программы, то она означает обращение к значению переменной, адрес которого записан в ptr (косвенная адресация).
char |
symb1, symb2; char* ptr; |
symb1 |
= ‘1’; |
ptr |
= &symb1; |
symb2 |
= *ptr; |
В результате значения symb1 и symb2 равны.
Кроме сложения и вычитания, над указателями можно производить операции сравнения. Различают константу и переменную типа «указатель». Переменная типа «указатель» должна быть объявлена явно (см. примеры). Константа типа «указатель» не может быть за-
писана слева от знака присваивания; указателем-константой является имя массива.
2.7. ПЕРЕИМЕНОВАНИЯ ТИПОВ
Отметим, что в программах возможны переименования типов. Выполняется это оператором
typedef старый_тип новый_тип
Например:
typedef char* string;
Теперь вместо объявления char* name[25] можно записывать string name[25].
2.8. СТРУКТУРЫ
Структура объединяет логически связанные данные различных типов. Структурный тип объявляется согласно следующему шаблону:
struct имя_шаблона{ описания элементов; };
struct dinner { char *place; float cost; };
В качестве элементов структуры могут использоваться элементы любого типа, в том числе и структуры. Шаблон может быть объявлен вне функции; структурная переменная описывается на основании шаблона.
struct day { int date; char name[10]; };
void main() { struct day today;
. . .
}
Доступ к элементам структурной переменной может быть двояким:
•с помощью квалифицированного имени: имя_переменной.имя_элемента;
©1998 Калачев Д.П., Лутай В.Н.