- •Приложение г Лекция 1. Элементы Языка си Используемые символы
- •Константы
- •Идентификаторы
- •Ключевые слова
- •Использование комментариев в тексте программы
- •Лекция 2. Типы данных и их объявление
- •Категории типов данных
- •Целый тип данных
- •Данные вещественного типа
- •Указатели
- •Операции разадресации и адреса
- •Переменные перечислимого типа
- •Лекция 3. Выражения и присваивания Операнды и операции
- •Преобразования при вычислении выражений
- •Операции отрицания и дополнения
- •Операция sizeof
- •Мультипликативные операции
- •Аддитивные операции
- •Операции сдвига
- •Поразрядные операции
- •Логические операции
- •Операция последовательного вычисления
- •Условная (тернарная) операция
- •Операции увеличения и уменьшения
- •Простое присваивание
- •Составное присваивание
- •Приоритеты операций и порядок вычислений
- •Побочные эффекты
- •Преобразование типов
- •Лекция 3. Операторы
- •Оператор выражение
- •Пустой оператор
- •Составной оператор
- •Оператор if
- •Оператор switch
- •Оператор break
- •Оператор while
- •Оператор do while
- •Оператор for
- •Сумма чисел от 1 до 100
- •Микрожизнь
- •Оператор continue
- •Оператор return
- •Оператор goto
- •Лекция 4. Массивы
- •Поиск минимума, сортировка
- •Ввод-вывод, обнуление
- •Двумерный массив
- •Лекция 5. Структуры
- •Объединения (смеси)
- •Поля битов
- •Переменные с изменяемой структурой
- •Определение объектов и типов
- •Лекция 6. Инициализация данных
- •Определение и вызов функций
- •Ссылки как псевдонимы переменных
- •Ссылки в качестве параметров функции
- •Ссылка в качестве возвращаемого значения
- •Передача массивов
- •Прототип
- •Указатели на функцию
- •Рекурсия
- •Предварительная инициализация параметров функции
- •Функции с переменным числом параметров
- •Передача параметров функции main
- •Исходные файлы и объявление переменных
- •Объявления функций
- •Время жизни и область видимости программных объектов
- •Лекция 7. Инициализация глобальных и локальных переменных
- •Методы доступа к элементам массивов
- •Указатели на многомерные массивы
- •Операции с указателями
- •Массивы указателей
- •Лекция 8. Динамические объекты
- •1. Выделение памяти в соответствие с типом указателя
- •2. Выделение памяти под нетипизированный указатель
- •Лекция 9. Динамическое создание и уничтожение массивов
- •Директивы Препроцессора
- •Директива #include
- •Директива #define
- •Директива #undef
- •Лекция 10. Условные директивы препроцессора
- •Линейный односвязный список
- •Лекция 11. Объектно-ориентированный подход к программированию
- •Ссылки на Себя
- •Инициализация
- •Копирующий конструктор
- •Очистка
- •Законченный Класс
- •Доступ к членам
- •Статические Члены
- •Лекция 12. Наследование
- •Перегрузка Операций
- •Операции Преобразования
- •Стандартный ввод/вывод
- •Форматируемый вывод
- •Манипуляторы
- •Ввод-вывод двоичных данных
- •Ввод/вывод с диска
- •Ввод/вывод для типов данных, определенных пользователем
- •Шаблоны функций
- •Шаблоны классов
- •Лекция 14. Библиотека stl
- •Итераторы
- •Алгоритмы
- •Контейнеры
- •Функциональные объекты
- •Пример. Работа с контейнером vector
- •Пример 2. Алгоритмы и функциональные объекты
- •Лекция 15. Обработка исключительных ситуаций
- •Лекция 16. Rtti и приведение типов
- •Операция typeid
Директива #undef
Директива #undef используется для отмены действия директивы #define. Синтаксис этой директивы следующий #undef идентификатор
Директива отменяет действие текущего определения #define для указанного идентификатора. Не является ошибкой использование директивы #undef для идентификатора, который не был определен директивой #define.
Пример:
#undef WIDTH
#undef MAX
Эти директивы отменяют определение именованной константы WIDTH и макроопределения MAX.
Лекция 10. Условные директивы препроцессора
Заголовочный файл также может содержать директивы #include. Поэтому иногда трудно понять, какие же конкретно заголовочные файлы включены в данный исходный текст, и некоторые заголовочные файлы могут оказаться включенными несколько раз. Избежать этого позволяютусловные директивы препроцессора. Рассмотрим пример:
Файл main.cpp
#include <stdio.h>
#include "fm.h"
int main(int argc, char* argv[])
{
int a=1, b=2;
printf("Min from %d and %d is %d\n", a, b, fm(a,b));
getchar();
return 0;
}
Файл fm.h
#ifndef __FM_H
#define __FM_H
int fm(int, int);
#endif
Файл fm.cpp
#include "fm.h"
int fm(int x, int y)
{
return x<y?x:y;
}
Данный проект состоит из трех файлов main.cpp— основной,fm.h — содержащий прототип функцииfm(поиск минимума двух целых чисел),fm.cpp — содержащий определение функцииfm.
В файле fm.hусловная директива#ifndefпроверяет, не было ли значение __FM_Hопределено ранее. (__FM_H– это константа препроцессора; такие константы принято писать заглавными буквами.) Препроцессор обрабатывает следующие строки вплоть до директивы#endif. В противном случае он пропускает строки от#ifndefдо#endif.
Директива #define__FM_Hопределяет константу препроцессора __FM_H. Поместив эту директиву непосредственно после директивы#ifndef, мы можем гарантировать, что содержательная часть заголовочного файлаfm.hбудет включена в исходный текст только один раз, сколько бы раз ни включался в текст сам этот файл.
Примечание: нужно обязательно включить fm.cpp в проект через менеджер проекта (View-Project manager или Ctrl-Alt-F11) или File-New-C_File.
Другие условные директивы — #if, #elif, #else, #ifdef — самостоятельно.
Линейный односвязный список
Если тип определен следующим образом
typedef struct List_Item *List;
struct List_Item
{ int key;
List next;
};
то получается следующая структура данных
Такая структура называется линейным односвязным списком.
Определим некоторые операции с линейными списками.
Файл list.h
#ifndef __LIST_H
#define __LIST_H
typedef struct List_Item *List;
struct List_Item
{ int key;
List next;
};
void PrintList(List); //Печать списка
List InsertBegin(List, int); //Вставка элемента в начало списка
List FindItem(List, int); //Поиск элемента по ключу
void InsertAfter(List, int); //Вставка элемента после заданного
void DeleteAfter(List); //Удаление элемента после заданного
void FreeList(List); //Освобождение памяти
#endif
Реализация (list.cpp)
#include "list.h"
#include "stdio.h"
#include "stdlib.h"
void PrintList(List p)
{
while (p)
{
printf("%d ", p->key);
p=p->next;
}
printf("\n");
};
List InsertBegin(List p, int x)
{
//List q=(List)malloc(sizeof(List_Item));
List q=new List_Item;
q->key=x;
q->next=p;
return q;
};
List FindItem(List p, int x)
{
while (p && p->key!=x)
p=p->next;
return p;
};
void InsertAfter(List p, int x)
{
//List q=(List)malloc(sizeof(List_Item));
List q=new List_Item;
q->key=x;
q->next=p->next;
p->next=q;
};
void DeleteAfter(List p)
{
List q=p->next;
p->next=q->next;
delete q; //free(q);
};
void FreeList(List p)
{
List q;
while (p)
{
q=p;
p=p->next;
delete q; //free(q);
}
};
Тестирование (main.cpp)
#include "list.h"
#include <stddef.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
List p=NULL;
for (int i=1;i<=5;i++)
p=InsertBegin(p,i);
PrintList(p);
List q=FindItem(p, 3);
InsertAfter(q,10);
PrintList(p);
q=FindItem(p, 2);
DeleteAfter(q);
PrintList(p);
FreeList(p);
getchar();
return 0;
}
Результат работы программы:
5 4 3 2 1
5 4 3 10 2 1
5 4 3 10 2