- •1. Основные понятия информатики
- •1.1. Понятие и задачи информатики
- •1.2. Системы счисления
- •1.2.1. Двоичная система счисления
- •1.2.2. Восьмеричная система счисления
- •1.2.3. Шестнадцатеричная система
- •1.3. Обобщенная структура и состав персонального компьютера
- •1.4. Организация вычислительных процессов при решении инженерных задач
- •1.5.1. Алгоритм: основные свойства и способы представления
- •1.5.2. Базовые элементы и структуры программирования
- •1.5. Алгоритмы
- •1.5.3. Представление линейных, разветвленных и циклических структур
- •2. ОБщие сведения об операционных системах
- •2.1. Общие сведения об операционных системах
- •2.1.1. Предпосылки создания и краткая история операционных систем ms-dos и Windows
- •2.1.1.1. Операционная система ms-dos
- •2.1.1.2. История создания операционной системы Windows
- •2.1.2. Основные отличия версий операционных систем
- •2.1.2.1. Операционная система Mac os
- •2.1.1.2. Операционная система Linux
- •2.1.1.3. Операционная система Windows
- •2.1.3. Основные команды операционной системы ms-dos
- •2.2. Основные элементы интерфейса операционной системы Windows
- •2.2.1. Элементы интерфейса ос Windows
- •2.2.2. Работа с файловыми системами операционной системы
- •3.2. Элементы языка с
- •3.2.1. Алфавит языка с (используемые символы)
- •3.2.2. Идентификаторы
- •3.2.3. Константы
- •3.2.4. Ключевые слова
- •3.2.5. Знаки операций
- •3.2.6. Комментарии
- •3.3. Лекция 6. Типы данных и их объявление
- •3.3.1. Основные типы данных
- •3.3.2. Объявление типов данных
- •3.4. Лекция 7. Указатели и массивы
- •3.4.1. Объявление указателей
- •3.4.2. Инициализация указателей
- •3.4.3. Составные указатели
- •3.4.4. Операции над указателями
- •3.4.5. Ссылки
- •3.5. Лекция 8. Массивы
- •3.5.1. Одномерные массивы
- •3.5.2. Многомерные массивы
- •3.5.3. Динамические массивы
- •3.5.3.1. Одномерные динамические массивы
- •3.5.3.2. Динамический многомерный массив
- •3.5.4. Символьные массивы (строки)
- •3.6. Лекция 9. Выражения и присваивания
- •3.6.1. Операции инкремента и декремента (увеличения и уменьшения на 1)
- •3.6.2. Операция определения размера типа
- •3.6.4. Операции деления ( / ) и нахождения остатка от деления ( % )
- •3.6.7. Поразрядные операции
- •3.6.8. Логические операции
- •3.6.9. Операции присваивания
- •3.6.10. Условная операция
- •3.6.11. Приоритеты выполнения операций
- •3.6.12. Преобразование типов
- •3.7. Лекция 10. Операторы
- •3.7.1. Операторы ветвления
- •3.7.1.1. Условный оператор if
- •If (выражение) [оператор_1]; [ else оператор_2 ; ]
- •3.7.1.2. Оператор switch
- •3.7.2. Операторы цикла
- •3.7.2.1. Цикл с предусловием (while)
- •3.7.2.2. Цикл с постусловием (do while)
- •3.7.2.3. Цикл с параметрами ( for )
- •3.7.3. Операторы передачи управления
- •3.7.3.1. Оператор безусловного перехода goto
- •3.7.3.2. Оператор прерывания break
- •3.7.3.3. Оператор пропуска continue
- •3.7.3.4. Оператор возврата из функции return
- •4. Модульное программирование
- •4.1. Лекция 11. Функции
- •4.1.1. Объявление функций
- •4.1.2. Определение функций
- •4.1.3. Вызов функций
- •4.1.4. Передача параметров в функцию
- •4.1.5. Передача массивов в функцию
- •В примере:
- •4.1.6. Функции с переменным числом параметров
- •4.1.7. Рекурсивные функции
- •4.1.8. Функция main()
- •4.1.9. Перегрузка функций
- •4.1.10. Шаблоны функций
- •4.2. Лекция 12. Директивы препроцессора
- •4.2.1. Директива #include
- •4.2.1. Директива # define
- •4.2.3. Директивы условной компиляции
- •4.2.4. Директивы #undef
- •4.3. Лекция 13. Пользовательские типы данных
- •4.3.1. Переименование типов
- •4.3.2. Перечисления
- •4.3.3. Структуры
- •4.3.4. Битовые поля
- •4.3.5. Объединения
- •5. Программирование графических изображений в языке с
- •5.1. Лекция 14. Программирование графических изображений
- •5.1.1. Графический режим видеоадаптера
- •5.1.2. Функции управления графическим окном
- •5.1.3. Управление цветом и стилем заполнения фигур
- •5.1.4. Рисование простейших графических фигур
- •5.1.5. Отображение текстовой информации в графическом режиме
- •5.1.7. Преобразование координат и анимационные эффекты
- •6.1.1.3. Функция gets()
- •6.1.1.4. Функция puts()
- •6.1.1.5. Функции printf() и scanf()
- •Потоковые объекты ввода/вывода (форматируемые):
- •6.1.2.1 Форматирование данных с помощью флагов и методов
- •6.2. Функции файлового ввода и вывода
- •6.2.1. Файловый ввод и вывод средствами с
- •6.3. Строки: операции с текстовыми файлами
- •6.3.1. Операции над строками
- •6.3.2. Методы и функции ввода и вывода строк
- •6.4. Лекция 18. Операции со структурами и бинарными файлами
- •6.5. Лекция 19. Списки: операции с динамическими структурами данных; организация списков и их обработка
- •6.5.1. Линейные списки
- •6.5.2. Стеки
- •6.5.3. Очередь
- •6.5.4. Бинарные деревья
6.4. Лекция 18. Операции со структурами и бинарными файлами
Самым простейшим вариантом бинарного файла является файл, хранящий структуры, которые не ссылаются друг на друга, т.е. не образуют линейный список.
Примечание.
Для изучения данной темы необходимо ознакомиться с принципами операций со структурами (см. пункт 4.3.3, лекция 13) и операциями над строками и принципами работы с текстовыми файлами (см. пункт 6.3, лекция 17), поскольку принципы работы с бинарными файлами, содержащими структуры основываются на ранее изложенном материале.
Рассмотрим отличия текстового и простейшего бинарного файла.
Формат текстового файла изображен на рис. 6.4.
Рис. 6.4 — Формат текстового файла
Пример текстового файла:
Alfimov V.V. 1981 2000.00
Esaulko A.I. 1981 1000.00
Shandrigin D.V. 1981 100.00
Формат текстового файла изображен на рис. 6.5.
Рисунок 6.5 — Формат бинарного файла
Пример бинарного файла изображен на рис. 6.6.
Рисунок 6.6 — Принтскрин примера бинарного файла
Примечание:
Для получения дополнительной информации смотрите методические указания к выполнению лабораторной работы №12 по дисциплине «Информатика и вычислительная техника» для студентов дневной формы обучения направления 6.050901 «Радиотехника». В 2 ч. Ч.2. Работа с файлами и структурами данных на языке С/С++ /СевНТУ; сост. С.Н. Бердышев, А.В. Лукьянчиков — Севастополь: Изд-во СевНТУ, 2008. — 16 с.
6.5. Лекция 19. Списки: операции с динамическими структурами данных; организация списков и их обработка
В случае, когда память под структуры данных в программе выделяется по мере необходимости отдельными блоками, связанными друг с другом с помощью указателей, то такую организацию памяти называют динамическими структурами данных.
Наиболее часто используют следующие динамические структуры, способные изменять размер во время выполнения программы:
— линейные списки;
— стеки;
— очереди;
— бинарные деревья.
6.5.1. Линейные списки
Линейным списком называется структура данных, при которой логический порядок следования элементов задается с помощью указателей.
Линейные списки могут быть:
— односвязными линейными списками;
— двусвязными линейными списками;
— односвязными линейными кольцевыми списками.
Примечания:
— элементы любой динамической структуры данных представляют собой структуры;
— каждый элемент списка содержит ключ;
— ключом может выступать любое из полей данных.
Односвязным (однонаправленным) линейным списком называют список, в котором каждый элемент ссылается на следующий элемент.
Диаграмма связей односвязного линейного списка представлена на рис. 6.7.
Рисунок 6.7 — Диаграмма связей в односвязном линейном списке
Двусвязным (двунаправленным) линейным списком называют список, в котором каждый элемент ссылается на предыдущий и следующий элементы.
Диаграмма связей двусвязного линейного списка представлена на рис. 6.8.
Рисунок 6.8 — Диаграмма связей в двусвязном линейном списке
Кольцевым списком называют список, у которого первый и последний элементы связаны указателями.
Диаграмма связей односвязного кольцевого списка представлена на рис. 6.9.
Рисунок 6.9 — Диаграмма связей в односвязном кольцевом списке
Примеры:
1. Элемент односвязного списка:
struct node
{
int data1;
char data2[15] ;
…
node *next;
} ;
2. Элемент двусвязного списка:
struct node
{
int data1;
char data2[15];
…
node *next;
node *prev;
} ;
Над списками можно выполнять следующие операции:
— начальное формирование списка (создание 1-го элемента);
— добавление элемента в конец списка;
— чтение элемента с заданным ключом;
— вставка элемента в заданное место списка (до или после элемента с заданным ключом);
— удаление элемента с заданным ключом;
— упорядочивание списка по ключу.
Вставку элемента в список можно описать диаграммой, представленной на рис. 6.10.
Рисунок 6.10 — Диаграмма связей элементов двумерного списка при вставке элемента в заданное место
Примеры:
1. Формирование первого элемента двусвязного списка:
node *first(int d)
{
node *pv=new node; // – выделение памяти под элемент
pv–>d = d; // – присваивание значения полю данных
pv–>next = NULL; // – обнуление указателей на следующий
pv–>prev = NULL; // – и предыдущий элементы (их еще нет)
return pv; // – передача в программу указателя на
} // – первый элемент списка
2. Добавление элемента в конец двусвязного списка:
void append(node **pend, int d)
{ node *pv=new node; // – выделение памяти под элемент
pv–>=d; // – присваивание значения полю данных
pv–>next=NULL; // – обнуление (следующего эл-та еще нет)
pv–>prev=*pend; // – указывает конец списка
// (куда добавляется элемент)
(*pend)–>next=pv; // – в предыдущем эл-те устанавливается
// – указатель на добавляемый эл-т
*pend=pv; // – обновление указателя на конец списка
}
3. Поиск элемента двусвязного списка по ключу:
node *find(node *const pbeg, int d)
{
node *pv=pbeg; // – указатель на первый эл-т списка
while(pv)
{
if(pv–>d == d) break;// – если значение совпало, то выход
pv=pv–>next; // – выбор следующего эл-та списка
}
return pv; // – передача в программу указателя
// на найденный элемент списка
}
4. Вставка элемента двусвязного списка в заданное место списка:
node insert (node *const pbeg, node **pend, int key, int d)
{
if(node *pkey=find(pbeg, key))
{ node*pv=new node;
pv–>d=d;
// 1 – установка связи нового эл-та с последующим:
pv–>next=pkey–>next;
// 2 – установка связи нового эл-та с предыдущим:
pv–>prev=pkey;
// 3 – установка связи предыдущего эл-та с новым:
pkey–>next=pv;
// 4 – установка связи последующего эл-та с новым:
(pv–>next)–>prev=pv; }
return pv;
}
5. Удаление элемента двусвязного списка:
bool remove (node **pbeg, node **pend, int key)
{ if (node *pkey=find(pbeg, key)) // выдел. памяти под указ. на эл-т
{ if (pkey==*pbeg) // если в начале списка
{ *pbeg=(*pbeg)–>next;
(*pbeg)–>prev=0; }
else if (pkey==*pend) // если в конце списка
{ *pend=(*pend)–>prev;
(*pend–>next=0) }
else // если в середине списка
{ (pkey–>prev)–>next=pkey–>next;
(pkey–>next)–>prev=pkey–>prev; }
delete pkey; // освобождение памяти (удаление)
return true; } // выход : эл-т найден и удален
return false; } // выход : эл-т не найден
