- •ПРОГРАММИРОВАНИЕ НА ЯЗЫКАХ С И С++
- •СОДЕРЖАНИЕ
- •ВВЕДЕНИЕ
- •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. ОБРАБОТКА ИСКЛЮЧЕНИЙ
- •ЛИТЕРАТУРА
– 28 –
#ifdef M
...
#else
...
#endif
мы не получим в тексте программы строк, начиная с #else.
#undef M отменяет последнюю по порядку директиву определения M.
8. ДИНАМИЧЕСКОЕ РАСПРЕДЕЛЕНИЕ ПАМЯТИ, СПИСКИ
8.1.ВЫДЕЛЕНИЕ И ОСВОБОЖДЕНИЕ ДИНАМИЧЕСКОЙ ПАМЯТИ
Для выделения динамической памяти в С используются функции malloc и calloc.
Эти функции выделяют из пула свободной памяти поля, размер которых задается программистом, и возвращают указатель на эти поля. Например:
char *ptr;
ptr = malloc( 100 );
Согласно этому оператору во время выполнения программы будет выделено 100 байтов памяти. Аргумент функции malloc – целое выражение.
char str[10], *ptr;
ptr = malloc( sizeof( str )); // выделяется 10 байтов
Тип возвращаемого функцией значения – указатель на char, т.е. *char. Поэтому при формировании памяти с другим типом указателя целесообразно использовать операцию приведения типа:
float mas[10], *ptr1; struct rec week, *ptr2;
ptr1 = (float*)malloc( sizeof( mas ));
ptr2 = (struct rec*)malloc( sizeof( week ));
Функция calloc имеет два аргумента: 1-ый – количество выделяемых полей, 2-ой – размер поля;
long *ptr;
ptr = (long*)calloc( 100, sizeof( long ));// Выделяется 100 4-х байтовых полей
Функция calloc очищает выделяемые поля.
Память, выделенная функциями malloc и calloc, возвращается в пул свободной памяти функцией free( указатель ).
Функции работы с динамической памятью описаны в файле alloc.h.
8.2. СПИСКИ
Списком называется динамическая структура памяти, изменяющая количество занятых полей в процессе выполнения программы. Списки бывают однонаправленными, двунаправленными, линейными, ветвящимися.
Элемент списка обычно определяется в виде структуры, составляющими которой являются информационная часть и адресная часть. В последней содержатся ссылки (адреса) на смежные элементы.
Рассмотрим программу формирования однонаправленного линейного списка путем включения нового элемента в его начало. Список имеет следующую структуру.
© 1998 Калачев Д.П., Лутай В.Н.
– 29 –
Head → I1 A2 → I2 A3 → ... → In NULL
Рис.1. Структура однонаправленного линейного списка
На рис. 1 Head – указатель на начало списка (адрес первого элемента), Ii – информационные части элементов, Ai – указатели на i-e элементы, NULL – пустой адрес, обозначающий конец списка.
Для каждого нового элемента необходимо:
•выделить память;
•заполнить информационную часть;
•занести в его адресную часть адрес предыдущего элемента;
•зафиксировать его адрес как адрес начала списка.
Вприведенной ниже программе формируется список из 5 элементов; информационная часть – один символ.
#include <stdio.h> #include <alloc.h>
//Описание одного элемента списка struct elem{
char Inf;
struct elem* adr; };
void main(){
struct elem *head, // указатель на начало *t;
struct elem *insert(struct *elem, char);
//Функция вставки; первый аргумент-значение адресной части элемента, 2-й- информационной
void print(struct elem*); // Функция вывода списка на экран char ch;
int i, j, k;
head=NULL; // Начальное значение указателя на начало списка for (i=0; i<5; i++) {
ch=getchar(); // Ввод информационной части if( t=insert(head, ch)) head=t;
else break;
}
print(head); } //main
struct elem *insert( struct elem *head, char symb) {
struct elem *buf, sp; // дополнительный указатель и структура
if((buf = (struct elem*)malloc(sizeof sp))==NULL) // Выделение памяти под новый элемент
return( NULL ): |
//возвращает NULL, если недостаточно памяти |
buf->Inf = symb; |
// Занесение информационной части |
buf->adr= head; |
// Занесение адреса предыдущего элемента |
return( buf ); |
// Фиксация адреса нового элемента как указателя на начало |
} //insert |
|
void print (struct elem *head) { // Функция выводит элементы, начиная с первого while(head!=NULL) {
putchar(head->inf); head=head->adr;
}
© 1998 Калачев Д.П., Лутай В.Н.