- •ПРОГРАММИРОВАНИЕ НА ЯЗЫКАХ С И С++
- •СОДЕРЖАНИЕ
- •ВВЕДЕНИЕ
- •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. ОБРАБОТКА ИСКЛЮЧЕНИЙ
- •ЛИТЕРАТУРА
–10 –
Вобъединение table типа trans включены три элемента различных типов. В обычной
структуре под эти элементы выделяется три поля. Здесь отводится одно, причем его размер определятся максимальным размером элемента из заданного списка. Это значит, что под переменную table отводится 8 байтов. В разных местах программы в table можно записывать данные, описанные в объединении типов char, int, double.
Например: table.n1=35; или gets(table.str);
2.12. ПЕРЕЧИСЛЕНИЕ
Перечисление объявляется следующим образом
enum имя_пречислимого_типа{ список констант } имя_переменной;
Например,
enum color{ red, green,yellow } suite[3];
Константам автоматически присваиваются возрастающие целые значения в порядке слева направо. Значения константам, причем произвольные, можно присвоить и при объявлении.
2.13. БИТОВОЕ ПОЛЕ ( ЗАПИСЬ )
Поле – последовательность двоичных разрядов, целого или целого беззнакового типа. Поле объявляется как структура, в которой каждая составляющая именуется с указанием ее длины в битах. Например:
struct { unsigned n1:2; unsigned n2:6; unsigned n3:3; } MyPole;
Здесь задаются три поля: на два, шесть и три разряда соответственно.
Битовые поля располагаются в памяти от меньших полей к большим. Память выделяется
так:
|
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
имя поля |
– |
|
|
|
|
n3 |
|
|
n2 |
|
|
|
|
|
n1 |
|
Операции присваивания над полями выполняются следующим образом:
MyPole.n1=1;
MyPole.n2=7;
MyPole.n3=3;
После выполнения этих операций значения полей в памяти будут такими:
бит |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
значение |
– |
– |
– |
– |
– |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
Над полями можно выполнять операции над битами: &, ^, |.
3. ОПЕРАЦИИ И ВЫРАЖЕНИЯ
Выражение состоит из одного или нескольких операндов и символов операций. Ниже используются следующие обозначения операндов:
•e – любое выражение;
•v – любое выражение, ссылающееся на переменную, которой может быть присвоено
значение (такое выражение называют адресным (L-value) выражением).
Префикс указывает тип операнда. Например, ie обозначает произвольное целое выражение:
© 1998 Калачев Д.П., Лутай В.Н.
– 11 –
•i – целое или символ;
•a – арифметическое, т.е. целое, символ или вещественное;
•p – указатель;
•s – структура или объединение;
•sp – указатель на структуру или объединение;
•f – функция;
•pf – указатель на функцию;
•smem – имя поля структуры или объединения.
3.1.АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ
• ae1 + ae2 – сложение, результат – сумма двух значений;
•pe + ie – результат – указатель, отстоящий от pe на ie объектов, того же типа что и pe. Например: aptr = array + 5, если array – это массив, а aptr – указатель того же типа, то aptr будет указывать на пятый элемент массива. Обратите внимание – к указателю добавляется не ie байт, а ie*sizeof(тип pe);
• ae1 – ae2 – вычитание, результат – разность двух значений;
•pe – ie – результат – указатель, отстоящий влево (в сторону уменьшения адресов) от pe на ie объектов, того же типа что и pe. Например: aptr = aptr – 1, aptr после операции будет указывать на элемент, предшествующий в памяти тому, на который указывал до операции;
•pe1 – pe2 – вычитание указателей, результат – количество переменных того же типа, что и pe, в диапазоне от pe1 до pe2;
•–ae – изменение знака выражения;
•ae1 * ae2 – произведение;
•ae1 / ae2 – частное от деления, если операнды целого типа, то деление с отбрасыванием остатка;
•ie1 % ie2 – остаток от деления ie1 на ie2.
3.2.ОПЕРАЦИИ СРАВНЕНИЯ
Операндами операций сравнения могут быть любые арифметические или адресные вы-
ражения. Результатом операций сравнения всегда является целое выражение со значением 0, обозначающим ЛОЖЬ, и – 1, обозначающим ИСТИНУ.
•e1 == e2 – равно; результат равен 1, если значения операндов равны, в противном случае результат равен 0;
•e1 != e2 – не равно; результат равен 1, если значения операндов не равны, в противном случае результат равен 0;
•e1 < e2 – меньше; результат равен 1, если значение первого операнда меньше значения второго, в противном случае результат равен 0;
•e1 > e2 – больше; результат равен 1, если значение первого операнда больше значения второго, в противном случае результат равен 0;
•e1 <= e2 – меньше или равно; результат равен 1, если значение первого операнда меньше или равно значению второго, в противном случае результат равен 0;
•e1 >= e2 – больше или равно; результат равен 1, если значение первого операнда
больше или равно значению второго, в противном случае результат равен 0.
Следует обратить внимание, что правильность выполнения операций сравнения на больше/меньше для указателей не гарантируются.
© 1998 Калачев Д.П., Лутай В.Н.
– 12 –
3.3. ЛОГИЧЕСКИЕ ОПЕРАЦИИ
Операндами логических операций могут быть любые арифметические или адресные выражения; операнд считается ЛОЖЬЮ, если он содержит нулевое значение, и ИСТИНОЙ в противном случае. Результатом логических операций всегда является целое выражение со значением 0, обозначающим ЛОЖЬ, и – 1, обозначающим ИСТИНУ.
•!e – инверсия (НЕ), т.е. не нулевое значение даст в результате 0, а нулевое – 1; например: если aa=5, то !aa будет равно 0;
•ae1 || ae2 – дизъюнкция или логическое сложение (ИЛИ); например: если aa=5, bb=0, cc=2, то результат aa||bb равен 1, а результат aa||cc – 1;
•ae1 && ae2 – конъюнкция или логическое умножение (И); например: если aa=5,
bb=0, cc=2, то результат aa&&bb равен 0, а результат aa&&cc – 1;
При логических вычислениях применяется т.н. сокращенная схема, т.е. если первый операнд определяет результат, то второй не вычисляется. Например: выражение ch!='\t' && ch!='\n' && ch!='\0' состоит из 3-х логических операций (ИСТИНА, если ch не символ табуляции и не символ перевода строки и не символ конца строки); если первая возвращает ЛОЖЬ, то остальные не проверяются.
3.4.ПОБИТОВЫЕ (ПОРАЗРЯДНЫЕ) ОПЕРАЦИИ
•~ie – инверсия или дополнение до единицы (НЕ); значение каждого разряда изменяется с 0 на 1, или с 1 на 0. Например: пусть aa=5 и aa типа unsigned short( 5 в двоичной системе – 101); результат ~aa равен 1111111111111010 или 65530;
•ie1 | ie2 – дизъюнкция или логическое сложение над каждой парой разрядов операндов (ИЛИ); например, если aa=5, bb=0, cc=2, то результат aa|bb будет равен 0 и результат aa|ccb будет – 7, т.к. двоичные представления aa=101, bb=0, cc=10;
•ie1 & ie2 – конъюнкция или логическое умножение над каждой парой разрядов операндов (И); например, если aa=13, bb=0, cc=7, то результат aa&bb будет равен 0 и результат aa&cc будет – 5, т.к. двоичные представления aa=1101, bb=0, cc=111;
•ie1 ^ ie2 – сумма по модулю два (исключающее или) над каждой парой разрядов операндов; например, если aa=5, bb=0, cc=3, то результат aa^bb будет равен 5 и результат aa^cc будет – 6, т.к. двоичные представления aa=101, bb=0, cc=11;
•ie1 << ie2 и ie1 >> ie2 – сдвиг первого операнда на число двоичных разрядов, заданных вторым операндом; при сдвиге влево разряды теряются, при сдвиге вправо – заменяются знаковым разрядом, если первый операнд знаковое целое, или нулем, ес-
ли беззнаковое. Например, пусть unsigned short aa=0FF01x и unsigned short bb=FF01x, тогда результат aa<<2 и bb<<2 будет – FC04x а, aa>>2 будет – 3FC0x, bb>2 будет – FFC0x.
3.5.ОПЕРАЦИИ ПРИСВАИВАНИЯ
v= e – в языке Си символ = обозначает не оператор, а операцию присваивания. Это значит, что выражение a=b имеет значение, и это значение равно значению правой части операции присваивания, т.е. в данном случае значению b.
Например:
•a = b + ( c=d ); в соответствии с приоритетами операций, вначале вычисляется c=d, потом результат присваивания прибавляется к b, и, наконец , a получает значение этой суммы;
•if(( ch = getchar()) == 'A' ) { ... }; ch получает значение, возвращаемое
функцией getchar и это значение сравнивается с символом 'A'.
Коперациям присваивания также относят следующие:
•av += ae – добавить ae к av, это эквивалентно выражению av = av + ae;
•av –= ae – уменьшить ae на av, это эквивалентно выражению av = av - ae;
© 1998 Калачев Д.П., Лутай В.Н.
– 13 –
• av *= ae – умножить ae на av, это эквивалентно выражению av = av * ae;
•av /= ae – разделить ae на av, это эквивалентно выражению av = av / ae;
•av %= ae – взять остаток от деления ae на av, это эквивалентно выражению av = av % ae;
•и т.д. почти для всех арифметических, логических и поразрядных операций;
•iv++ или ++iv – постфиксная и префиксная операция увеличения на единицу (ин-
кремента) значения переменной. С точки зрения результата эти операции эквивалентны iv = iv + 1, однако разница проявляется в использовании значения выражения в целом. Например: int m[5]={1,2,3,4,5}, i = 2, j = 2, a, b; a = m[i++]; b = m[++j];
•значения переменных будут следующими: a=3, b=4, i=3, j=3. Это объясняется тем, что значением выражения i++ является значение переменной i до выполнения инкремента, а значением выражения ++i является значение переменной i после выполнения инкремента;
•iv–– или ––iv – постфиксная и префиксная операция уменьшения на единицу (декремента) значения переменной;
•pv++ или ++pv – постфиксная и префиксная операция увеличения на единицу значения указателя. Обратить внимание не на один байт, а на один элемент соответствующего типа;
•pv–– или ––pv – постфиксная и префиксная операция уменьшения на единицу значения указателя.
3.6.АДРЕСНЫЕ ОПЕРАЦИИ
•&v – значением выражения будет адрес переменной v;
•*pe – значением выражения будет переменная, адресуемая указателем pe;
•pe[ie] – значением выражения будет переменная (элемент массива), отстоящая на ie элементов от адреса, заданного pe. Это значение эквивалентно значению выраже-
ния *(pe+ie). Например:
int m[5]={1,2,3,4,5}, *pi, a, b ,c;
pi = &m[3]; // pi будет содержать адрес элемента m[3] a = *(pi+1); // a будет равно 5
b = m[4]; |
// b будет равно 5 |
c = *(m+2); |
// c будет равно 3 |
•*fpe – значением выражения будет функция, адресуемая указателем fpe. Например: fpe=&strcmp; i=(*fpe)(s1,s2);
3.7.ДОСТУП К ПОЛЯМ СТРУКТУР, ОБЪЕДИНЕНИЙ И ЗАПИСЕЙ
sv.smem – значением выражения будет элемент smem структуры (объединения) sv, тип
выражения будет соответствовать типу элемента;
spe->smem – значением выражения будет элемент smem структуры (объединения), на которую указывает spe.
3.8.ДРУГИЕ ОПЕРАЦИИ
•ae ? e1 : e2 – условное выражение, значением выражения будет e1, если выражение ae ИСТИННО (в смысле подраздела «Логические операции»), и – e2, если выраже-
ние ae ЛОЖНО; Например:
abs = c < 0 ? –c : c; // вычисление модуля числа c
max = a > b ? a : b; // вычисление максимума двух чисел
•e1, e2 – операция запятая, значением выражения будет e2. Назначение этой операции – обеспечить возможность использования нескольких выражений, в тех местах,
©1998 Калачев Д.П., Лутай В.Н.