1-й СЕМЕСТР - Чувашский государственный университет имени

advertisement
Федеральное агентство по образованию
Федеральное государственное образовательное учреждение
высшего профессионального образования
«Чувашский государственный университет имени И.Н. Ульянова»
Технический институт
Факультет дизайна и компьютерных технологий
Кафедра компьютерных технологий
УТВЕРЖДАЮ
Проректор по учебной работе
проф. ____________ А.Ю. Александров
«____» ___________________ 2010 г.
РАБОЧАЯ ПРОГРАММА
Дисциплина ОПД.Ф.07 – ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ВЫСОКОГО
УРОВНЯ
Направление 654600 – Информатика и вычислительная техника
Специальность 230102 – Автоматизированные системы обработки
информации и управления
БЮДЖЕТ ВРЕМЕНИ (ЧАС.)
Срок
обучения
4,5 г.об.
6 лет
3,5 г.об.
5 лет
Аудиторные занятия
Сем
Всего
1
2
1
2
1
2
3
1
2
130
130
130
130
260
Всего
ауд
16
14
16
14
136
119
130
130
68
85
Сам.
раб.
Итоговый контроль
Контр.
раб.
+
+
+
+
Лек
Прак
Лаб
Зач.
Экз.
10
10
10
10
68
51
-
6
4
6
4
68
68
114
116
114
116
5
+
+
+
+
+
34
34
-
34
51
62
45
+
+
+
+
+
Курс. пр
(раб)
+
+
+
+
+
+
+
+
Рабочая программа составлена в соответствии с государственным образовательным стандартом высшего
профессионального образования направления подготовки дипломированного специалиста 654600 –
Информатика и вычислительная техника, специальности 230102 – Автоматизированные системы обработки
информации и управления, утвержденным 27 марта 2000г. (Регистрационный номер 224 тех/дс).
Составитель: ст.пр. кафедры КТ
Н.А. Кузнецова
Рабочая программа обсуждена, одобрена и рекомендована к использованию на заседании кафедры
компьютерных технологий, «___» ___________ 2010 г., протокол №___
Зав. кафедрой компьютерных технологий,
профессор
В.П. Желтов
Рассмотрена и одобрена методическим советом ФДиКТ
Декан, председатель методсовета факультета ДиКТ
Чебоксары 2010
В.П. Желтов
1. ЦЕЛИ И ЗАДАЧИ ДИСЦИПЛИНЫ, ЕЕ МЕСТО В УЧЕБНОМ ПРОЦЕССЕ
ЦЕЛЬ ПРЕПОДАВАНИЯ ДИСЦИПЛИНЫ
Предмет изучения дисциплины:
- программирование на языке Паскаль;
- основы вычислительной математики;
- программирование на языке Си
- обьектно-ориентированное программирование на Си++;
- основы математического и программного моделирования;
- элементы теории графов и методов оптимизации;
- элементы теории систем.
Цели и задачи дисциплины.
Цель дисциплины - научить студентов алгоритмизовывать и реализовывать на компьютере в
виде программы достаточно сложные задачи на языках программирования Си,Пас. К их числу
относятся избранные задачи обработки информации, математического и программного
моделирования, компьютерной графики, обьектно-ориентированного программирования. Итогом
изучения должно быть знание соответствующих методов и алгоритмов и умение составлять
программы для их реализации, включая отладку и тестирование.
В результате изучения дисциплины студенты 1 семестра должны
знать и уметь использовать:
- технологию работы на персональной ЭВМ,
- способы постановки задач для решения на ПЭВМ,
- основные современные методы и средства разработки алгоритмов и программ,
- основные приемы структурного программирования,
- способы записи алгоритмов на процедурном языке программирования,
- способы документирования алгоритмов и программ,
- методы и приемы отладки и испытания программ;
иметь опыт:
- самостоятельной разработки, отладки, тестирования и документирования программы на
языке Паскаль персональных ЭВМ для задач обработки числовой и текстовой информации;
иметь представление:
- о совокупности современных языков программирования, их областях применения,
особенностях и тенденциях развития, способах и средствах автоматизированного конструирования
программ;
студенты 2 семестра должны:
знать
- методы и приемы компьютерного моделирования (численные, структурные, стохастические
и имитационные модели; установление и проверка условий существования решения и сходимости
моделируемого процесса к реальному);
- алгоритмы решения типовых задач;
- основные структуры данных и их представление в памяти;
- основы обьектно-ориентированного программирования;
- элементы компьютерной графики;
- выбранные алгоритмы решения переборных и оптимизационных задач;
- сферы применения рассматриваемых алгоритмов и методов.
уметь:
- по имеющейся математической, прикладной, имитационной или игровой задаче построить
ее алгоритмическую модель;
- реализовать модель в виде программы;
- отладить и протестировать программу;
получить решение для имеющихся данных и в заданном виде.
2. СОДЕРЖАНИЕ ДИСЦИПЛИНЫ
Содержание дисциплины по государственному образовательному стандарту.
Основные этапы решения задач на ЭВМ; критерии качества программы; жизненный цикл программы;
постановка задачи и спецификация программы; способы записи алгоритма; программа на языке высокого
уровня; стандартные типы данных; представление основных управляющих структур программирования;
теорема структуры и структурное программирование; анализ программ; утверждения о программах;
корректность программ; правила вывода для основных структур программирования; инвариантные
утверждения; процедуры и функции; массивы; утверждения о массивах; записи;; программирование
рекурсивных алгоритмов; способы конструирования и верификации программ. файлы; индуктивные
функции на последовательностях (файлах, массивах); динамические структуры данных; линейные списки:
основные виды и способы реализации; линейный список как абстрактный тип данных; модульные
программы; рекурсивные определения и алгоритмы
1-Й СЕМЕСТР
Введение
Программирование: сущность и назначение.
Предмет дисциплины и ее задачи.
Структура, содержание дисциплины, ее связь с другими дисциплинами учебного плана
специальности.
1. Основы алгоритмизации.
1.1. Алгоритмы и величины. Этапы решения задач на ЭВМ. Понятие алгоритма.
Данные и велеичины. Типы величин. Способы записи алгоритмов.
1.2. Линейные алгоритмы. Линейные вычислительные алгоритмы. Алгоритм
линейной структуры. Присваивание.
1.3. Ветвления и циклы в алгоритмах. Ветвление и циклы в вычислительных
алгоритмах. Команда ветвления в блок-схемах и на алгоритмическом языке.
Трассировка алгоритма. Алгоритмы циклической структуры: с предусловием, с
постусловием
1.4. Вспомогательные алгоритмы и процедуры.
2. Введение в языки программирования.
2.1. История и классификация языков программирования.
2.2. Структура и способы описания языков программирования высокого уровня.
3. Программирование на Паскале.
3.1. Первое знакомство с Паскалем. Структура пограммы на Паскале. Раздел
описаний. Раздел операторов. Синтаксис, служебные слова. Элементы языка Турбо
Паскаль.
3.2. Типы данных. Основные стандартные типы данных: целый, вещественный,
логический. Идентификаторы типов. Порядковые типы. Описания переменных.
Константы. Типы пользователя. Перечисляемый тип. Переменные.
3.3. Арифметические операции, функции, выражения. Арифметический оператор
присваивания. Операции над данными.
3.4. Ввод с клавиатуры и вывод на экран. Устройства ввода-вывода.
3.5. Управление символьным выводом на экран. Модуль CRT. Координаты
позиции. Текстовое окно. Управление цветом.
3.6. Логические величины, операции, выражения. Логический оператор
присваивания
Логические выражения. Операции отношения.
3.6. Функции, связывающие различные типы данных.
3.7. Логические выражения в управляющих операторах. Условный оператор.
3.8. Цикл по параметру.
3.9. Подпрограммы. Процедуры. Параметры. Область действия .Функции.
Рекурсивные функции.
3.10. Вычисление рекуррентных последовательностей.
3.11. Основные понятия и средства компьютерной графики в Турбо Паскале.
Модуль Graph. Графический режим экрана. Цвет фона и цвет рисунка. Графические
координаты. Графический курсор. Графические примитивы. Построение графиков
функций.
3.12. Строковый тип данных. Строка, символы. Операции над строками.
3.13. Массивы. Табличные данные и массивы. Одномерные и многомерные массивы.
3.14. Множества. Операции над множествами.
3.15. Файлы. Запись в файл и чтение из файла. Внешние файлы. Текстовые файлы.
3.16. Комбинированный тип данных (записи). Организация данных. Работа с
файлами записей. Доступ к записям файла.
3.17. Указатели и динамические структуры. Адрес величины. Динамическая память
и величины. Связанные списки. Ссылки.
3.18. Внешние подпрограммы и модули.
3.19. Объектно-ориентированное программирование. Наследование, инкапсуляция,
полиморфизм. Объекты в Турбо Паскале. Реализация методов, вызов методов.
3.20. Виртуальные методы. Конструкторы и деструкторы. Объекты в динамической
памяти. Механизмы связывания.
Заключение
Основные направления и тенденции развития языков программирования и технологии
конструирования программ. Основные направления автоматизации конструирования программ.
2-Й СЕМЕСТР
1. Программирование на Си и Си++.
1.1. Введение в Си и Си++. Простейшая программа Этапы работы с программой на
Си++.
1.2.Элементы языка Си++. Алфавит, специальные символы, ключевые слова,
идентификаторы.
1.3. Типы данных.
1.4. Операции и выражения. Арифметические операции. Операции инкремента и
декремента. Операции отношения. Логические операции. Поразрядные логические
операции. Операция присваивания. Дополнительные операции присваивания. Операция
преобразования типа. Операция sizeof. Операция «запятая». Операция «условие ?:».
Операции ( ) и [ ]. Приоритет операций. Свойства операций. Приведение типов при
вычислении выражений. процесс вычисления выражений с разнотипными операндами
Старшинство типов.
1.5. Линейные программы на Си и Си++. Общая структура программы. Простейшие
программы. Главная функция.Операторы. Библиотечные функции. Форматированный
ввод и вывод на экран: Форматная строка (управляющие символы и спецификаторы
формата), Список аргументов. Потоковый ввод-вывод в Си++.
1.6. Программирование ветвлений. Условный оператор. Оператор выбора.Оператор
выхода.
1.7. Программирование циклов. Цикл с предусловием. Цикл с постусловием. Цикл с
параметром. Оператор continue. Метки и оператор goto.
1.8. Функции. Определение функции. Оператор возврата. Обращение к функции.
Параметры функции. Прототип функции. Использование библиотечных функций.
Рекурсивные определения функций. Передача значений. Классы памяти.
1.9. Массивы. Описание массивов. Размер массива. Алгоритмы сортировки массивов.
Многомерные массивы. Манипуляторы.
1.8. Указатели. Описание указателей. Операции над указателями. Использование
указателей для передачи параметров функции. Указатели и массивы. Массив как
параметр функции.
1.9. Обработка символьных строк. Строка как символьный массив. Ввод и вывод
строк, стандартные библиотеки. Строка как параметр функции.
1.10. Структуры и объедиенения. Структура, элементы структуры. Элемент структуры
типа поля битов. Объединения.
1.11. Потоковый ввод-вывод в стандарте Си. Потоки: стандартные и объявляемые в
программе. Работа с файлами на диске. Режимы открытия потока. Форматный обмен с
файлами.
1.12. Объектно-ориентированное программирование в Си++. Классы, их
объявления. Режимы доступа. Объекты класса. Наследование. Конструкторы и
деструкторы.Полиморфизм. Перегрузка операций.
1.13. Форматированный ввод и вывод в Си++. Стандартная библиотека классов.
3. ТЕМЫ ЛЕКЦИЙ
1-Й СЕМЕСТР
№ Темы лекций
1
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Введение. Основы алгоритмизации.
Введение. Алгоритмы и величины. Способы записи
алгоритмов. Основные алгоритмические структуры.
Введение в языки программирования.
История и классификация языков программирования.
Структура и способы описания языков
программирования высокого уровня.
Программирование на Паскале.
Общие сведения о языке Паскаль.
Основные стандартные типы данных. Константы,
переменные.
Арифметические операции, функции, выражения.
Ввод с клавиатуры и вывод на экран.
Управление символьным выводом на экран.
Логические величины, операции, выражения.
Функции, связывающие различные типы данных.
Условный оператор.
Программирование циклов.
Подпрограммы.
Вычисление рекуррентных последовательностей.
Основные понятия и средства компьютерной графики
в Турбо Паскале.
Строковый тип данных.
Массивы.
Множества.
Файлы.
Записи.
Указатели и динамические структуры.
Внешние подпрограммы и модули.
Объектно-ориентированное программирование.
Виртуальные методы. Конструкторы и деструкторы.
Заключение
5
лет
3.5
г.об.
6
лет
4,5
г.об
2
4
1
1
1
2
0.5
0.5
1
2
0.5
0.5
1
2
1
1
1
2
2
2
2
1
1
2
2
4
4
1
1
2
4
2
1
2
2
2
2
2
2
4
2
2
1
1
2
1
1
2
1
1
4
4
2
2
4
2
2
4
2
4
5
лет
3.5
г.об.
2
4
0,5
0,5
0,5
0,5
6
лет
0,5
4,5
г.об
0,5
2-Й СЕМЕСТР
№ Темы лекций
1
Введение в Си и Си++. Элементы языка Си++. Типы
данных.
2
2
3
Операции и выражения.
Линейные программы на Си и Си++.
4
6
3
1
0,5
1
0,5
3
0,5
0,5
6
4
1
1
1
1
4
1
1
4
0,5
0,5
4
4
2
0,5
1
0,5
0,5
1
0,5
6
1
1
2
1
0,5
0,5
0,5
0,5
2
4
5.
6
Программирование ветвлений.
2
4
Программирование циклов.
Функции.
4
7
Массивы.
2
8
9
10
11
Указатели.
2
2
2
Обработка символьных строк.
Структуры и объедиенения.
Потоковый ввод-вывод в стандарте Си.
2
12
13
14
Объектно-ориентированное программирование в
Си++.
Форматированный ввод и вывод в Си++.
Заключение
3
2
1
4. ТЕМЫ ЛАБОРАТОРНЫХ РАБОТ
1-Й СЕМЕСТР
№ Темы лабораторных работ
3.5
г.об.
6 лет
4,5
г.об
2
8
1
1
4
8
1
1
2.
Диалоговая
работа
на
персональной
Программирование линейных алгоритмов.
Программирование ветвящихся алгоритмов.
3.
Программирование циклических алгоритмов.
4
8
4.
Программирование операций обработки одномерных
массивов.
Программирование операций обработки двумерных
массивов.
Программирование с использованием процедур и
функций.
Программирование операций обработки строк
2
4
1
1
4
8
1
1
2
4
1
1
4
8
1
1
Программирование операций обработки данных типа
запись.
Программирование операций обработки файлов.
4
8
2
4
12 Программирование действий с динамическими
объектами
14 Программирование с использованием рекурсивных
процедур
2
4
4
4
1.
5.
6.
7.
8.
9.
ЭВМ.
5 лет
Зачет ставится студенту, если он сдал и защитил все лабораторные работы,
предусмотренные курсом.
2-Й СЕМЕСТР
№ Темы лабораторных работ
5 лет
3.5
г.об.
1
Знакомство с интегрированной средой языка С.
2
3
2.
Программирование линейных алгоритмов.
2
3
6 лет
1
4,5
г.об
1
3.
Программы разветвляющихся структур.
2
3
4
Программы циклических структур.
2
3
5
Упорядочивание элементов массива.
4
6
6
Функции.
4
6
7.
Алгоритмы сортировки ипоиска.
4
6
8.
Составной тип данных.
4
6
9.
Перегрузка функций
4
10 Шаблоны функций.
11 Завершение выполнения
курсовой работы
заданий
сдача
зачета,
1
1
6
1
1
4
6
1
1
2
4
Зачет ставится студенту, если он сдал и защитил все лабораторные работы,
предусмотренные курсом.
Основной целью лабораторного практикума является:
- овладение одним из наиболее распространенных и популярных языков программирования
C/C++;
- изучение и освоение основных методов и приемов программирования;
- получение практических навыков работы на ЭВМ, по отладке и тестированию программ.
5. ТЕМЫ КУРСОВЫХ ПРОЕКТОВ
1-Й СЕМЕСТР
Целью курсовой работы является углубление и закрепление у студентов знаний об основных
приемах, методах и принципах работы при решении на ЭВМ задач с использованием языка
Паскаль.
Дополнительно студенты должны самостоятельно ознакомиться с правилами оформления
программной документации (ЕСПД и ГОСТ) и применить их при оформлении курсовой работы.
Тема: Обработка графических и символьных данных.
Задание № 1 «Обработка символьных данных»
1. Выполнить на ЭВМ программу обработки символьных данных в соответствии с вариантом,
указанным в таблице. Предусмотреть ввод исходных данных как с клавиатуры, так и из файла.
2. Проверить правильность выполнения программы с помощью тестового варианта.
Варианты
1 часть. Обработка текста.
1. Дано предложение. В зависимости от знака препинания, которым оно оканчивается, определить
тип этого предложения.
2. Дан список из N четырехбуквенных слов. Подсчитать количество слов, содержащих хотя бы одну
букву "А".
3. Задано местоимение третьего лица единственного числа. Составить алгоритм для определения его
рода:
4. Дан список из N четырехбуквенных слов. Составить новый список, включив в него слова,
содержащие хотя бы одну букву "А".
5. Составить алгоритм для определения падежа по вопросу.
6. Составить алгоритм для определения части речи по вопросу.
7. Текст состоит из 200 символов. Подсчитать, сколько в нем запятых, точек, точек с запятой.
8. Даны два слова. Сколько раз во втором слове встречается первая буква первого слова.
9. Даны два слова одинаковой длины. Присвоить переменной К число, равное количеству попарно
одинаковых букв.
10. Даны два слова разной длины. Присвоить переменной М число, равное количеству попарно
различных букв.
11. Из двух восьмибуквенных слов образовать последовательность букв, в которой должны
чередоваться буквы первого и второго слова.
12. Имеется текст, содержащий 120 символов. Образовать новый текст из последних N символов
заданного текста.
13. Имеется некоторый текст. Образовать из него новый, в который включить информацию,
заключенную между пробелом и запятой.
14. Задан текст из 120 символов. Подсчитать в нем количество гласных.
15. В тексте из 200 символов подсчитать количества гласных "О" и "Э" отдельно для каждой буквы.
16. Дан текст, состоящий из последовательности 20 букв. Проверить, можно ли, из заданной
последовательности символов составить слово БЭ-СИК и присвоить его переменной т. В противном
случае переменной- Т присвоить текст СБО-.
17. Задан список из 10 буквенных имен девочек. Получить на месте этого списка новый список,
состоящий из тех же ласкательных имен.
18. Задан список из N слов мужского рода единственного числа. Вместо каждого слова поставить в
эту таблицу соответствующее уменьшительное.
19. Задан текст, состоящий из слов, которые разделены одним иди несколькими пробелами.
Сформировать новый текст, включив в него слова заданного, разделенные только одним пробелом.
Признак конца текста - точка.
20. Задан текст, оканчивающийся точкой. Слова текста разделены пробелом. Сформировать новый
текст, включив в него слова заданного текста и разделив их двумя пробелами.
21. Задан список городов. Присвоить переменной Т название города с максимальным числом букв.
22. Задан список городов."Присвоить переменной Т название первого из городов, название которого
содержит 5 букв.
23. Задан список городов. Присвоить переменной Т название последнего из городов, название
которого содержит более 4 букв.
24. Задан список городов. Поменять местами названия первого города и любого другого, которое
содержит более семи букв.
25. Задан список городов. Поменять местами названия любых двух городов, заканчивающихся буквой
"а".
26. Задан список городов. Поменять местами названия последнего города и любого из городов,
название которого оканчивается буквой "К".
II часть. Работа с файлами.
А. Дана последовательность, содержащая от 2 до 10 слов, в каждом из которых от 2 до 6 латинских
букв; между соседними словами - не менее одного пробела, за последним словом точка. Напечатать
все слова, отличные от последнего слова, предварительно преобразовав каждое из них по следующему
правилу:
1) перенести первую букву в конец слова;
2) перенести последнюю букву в начало слова;
3) удалить из слова первую букву;
4) удалить из слова последнюю букву;
5) удалить из слова все последующие вхождения первой буквы;
6) удалить из слова все предыдущие вхождения последней буквы;
7) оставить в слове только первые вхождения каждой буквы;
8) если слово нечетной длины, то удалить его среднюю букву.
Б. Дана последовательность, содержащая от 1 до 10 слов, в каждом из которых от 1 до 5 строчных
латинских букв; между соседними словами - запятая, за последним словом — точка. Напечатать:
9) эту же последовательность, но в обратном порядке;
10) те слова, перед которыми в последовательности находятся только меньшие (по алфавиту) слова, а
за ним — только большие;
11) все слова, которые встречаются в последовательности по одному разу;
12) эту же последовательность слов, но удалив из нее повторные вхождения слов;
13) все различные слова, указав для каждого из них число его вхождений в последовательность;
14) все слова в алфавитном порядке.
В. Дан текст, каждый символ которого может быть малой буквой латинского/русского алфавита,
цифрой или одним из знаков "+"•, "-", "*". Группой букв будем называть такую совокупность
последовательно расположенных букв, которой непосредственно не предшествует и за которой
непосредственно не следует буква. Аналогично определим группу цифр и группу знаков.
15) Выяснить, встречается ли в данном тексте группа букв "one";
16) выяснить, верно ли, что в данном тексте больше групп букв, чем групп знаков;
17) если в данном тексте имеется не менее двух групп букв, то каждый знак "+", встречающийся
между двумя первыми по порядку группами букв, заменить цифрой 1, знак "-" заменить цифрой 2, а
знак "*" - цифрой 3. Иначе оставить текст без изменений.
18) подсчитать число вхождений буквы "f' в первые три группы букв (в предположении, что текст
содержит не менее трех групп букв);
19) найти число таких групп букв, которые начинаются и кончаются одной и той же буквой;
20) найти все такие группы букв, в которые буква «а» входит не менее двух раз;
Задание № 2 «Обработка графических данных»
Задание к работе.
1 часть.
Напишите процедуру рисования графика функции в соответствии с вариантом, указанным в таблице.
Предусмотреть вывод оцифрованных координатных осей соответственно области построения,
подписей к графику. Рационально расположить элементы рисунка (график, оси, цифры и штрихи
масштабирования, подписи) на экране.
Варианты
1. y  cos x
x2
 2x
2
3. y  arccos x
4. y  arcsin x
2. y  
5. y  sin 2 x
x2
 8x  1
2
7. y  e x
6. y 
x3
3
9. y  ln x
8. y 
10. y  e x
11. y  x4  x2  8
12. y  x
13. y  cos 2 x
2
14. y  3 x
15. y  lg x
16. y  x 2  10 x
17. y  arctan
x
2
18. y  2x
19. y  tan x
20. y  tan 2 x
II часть
Напишите программу для отображения движения многоугольника (плоской фигуры) по
экрану по принципу «угол падения равен углу отражения», поверхностями считать границы
экрана. Предусмотреть изменение цвета многоугольника (плоской фигуры) при смене
направления движения.
Варианты.
Придумать оригинальную плоскую фигуру.
Основная литература.
Немнюгин С.А. Turbo Pascal. Программирование на языке высокого уровня: Учебник для
вузов. 2-е изд. – СПб.: Питер, 2007. – 544 с.: ил.
2-Й СЕМЕСТР
Тема: Разработка программного приложения в С++Builder 6
Варианты индивидуальных заданий:
1. Электронный калькулятор.
2. Модель справочной службы «Аэрофлота».
3. Модель электронного справочника.
4. Модель склада продовольственных товаров.
5. Телефонный справочник.
6. Модель «записная книжка».
7. Программа «Переводчик».
10
8.Модель работы городской справочной службы 09.
9.Семестровый табель успеваемости студентов группы.
10.Моделирование электронных схем.
При выполнении курсовой работы следует придерживаться следующей структуры:
1. Оглавление.
2. Введение. В данном разделе, помимо основных сведений, должна быть точно
определена цель курсовой работы.
3. Постановка задачи. Исходя из полученного задания на курсовой проект, здесь
необходимо выполнить его конкретизацию и описание предметной области.
4. Выбор метода, способа решения поставленной задачи и обоснование выбора. В
этом разделе необходимо определить возможные способы, описать их положительные и
отрицательные стороны. Выбор конкретного способа осуществить на основе подробного
анализа всех возможных вариантов.
5. Теоретический раздел. В данном разделе должно присутствовать подробное
описание выбранного метода.
6. Выводы по работе.
7. Список используемой литературы. В разделе используемой литературы должны
присутствовать только официальные издания, можно делать ссылки на сайты в Интернете.
8. Приложения. В качестве приложения приводятся тексты программ на исходном
языке.
Правила оформления текста, рисунков и таблиц.
Пояснительная записка к курсовой работе оформляется на листах формата А4
(210Х297). Каждый лист должен иметь поля: левое - 30 мм, правое – не менее 10 мм,
верхнее и нижнее – по 25 мм.
Структурными элементами текста являются разделы, подразделы, пункты,
подпункты и перечисления. Номера структурных элементов образуются по десятичному
принципу: разделы нумеруются 1, 2, 3 и т.д., номера подразделов составляются из двух
чисел: 3.1, 3.2 и т.д. Разделы и подразделы должны иметь заголовок. Заголовки разделов
записывают прописными буквами, а заголовки подразделов – строчными, кроме первого
символа. Точка в конце названия раздела не ставится. Каждый раздел рекомендуется
начинать с нового листа.
Сокращать слова в тексте нельзя, кроме общепринятых сокращений и случая, когда
составляется перечень принятых сокращений на отдельной странице перед списком
литературы.
Рисунки нумеруются либо в пределах всей работы, либо в пределах раздела. В
последнем случае номером рисунка может быть, например, 3.1, что означает первый
рисунок в третьем разделе. То же относится к таблицам.
Рисунки и таблицы должны иметь тематический заголовок, располагаемый сверху.
Рисунки могут иметь подрисуночный текст. Номер рисунка располагается ниже
подрисуночного текста.
Номера страниц проставляются в правом верхнем углу страницы. Первой
страницей отчета является титульный лист, номер на котором не ставится. Лист
содержания должен иметь заголовок «ОГЛАВЛЕНИЕ», он не нумеруется как раздел.
Оформление текста программы.
Требования по оформлению текста программы включают в себя:
– правила размещения текста программы, т.е. разбивки программы на строки и
относительного расположения содержимого строк;
– использование мнемонических имен для всех программных объектов и объединение
всех объектов в некоторую систему;
– правила по составлению и размещению комментариев.
11
Следует помнить, что любая программа является коммерческим продуктом,
поэтому правила оформления текста программы являются обязательными.
Размещение операторов относительно друг друга – дело вкуса программиста,
единственное требование – удобство чтения программы.
Мнемонические имена объектов программы должны иметь определённый смысл,
как можно точнее отражать внутреннее содержание объекта. Например, идентификатор
String в достаточной степени отражает смысл объекта класса строка, а идентификатор
Integer – объект класса целых чисел.
Программа должна сопровождаться комментариями, основная цель - которых
сделать программу «самодокументированной», т.е. обеспечить возможность работы с ее
текстом без привлечения каких-либо дополнительных сопровождающих документов.
Библиографический список.
1. Павловская Т.А. C/C++: программирование на языках высокого уровня. – СПб.:
Питер, 2002. – 464 с.
2. Керниган Б., Ритчи Д. Язык программирования Си. - СПб.: Невский Диалект, 2001
– 352 с.
3. Подбельский В.В., Фомин С.С. Программирование на языке Си. М.: Фин.и стат.,
2004, 600с.
4. Трофимов С.П. Программирование в Си. Организация ввода-вывода:
метод.указания. Екатеринбург: Изд-во УГТУ, 1998, 14с.
5. Трофимов С.П. Программирование в Си. Динамическое распределение памяти.
Екатеринбург: Изд-во УГТУ, 1998, 13с.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ(1,2 семестры)
Тurbo Pascal, Delphi, C, С++ ,С++Builder – системы программирования.
6. ТЕМЫ САМОСТОЯТЕЛЬНЫХ РАБОТ
1. Проверка ошибок при выполнении файловых операций.
1. Дополнительные возможности cin и cout.
2. Частные и общие данные. Сокрытие информации.
3. Объединения. Хранение объединений в С++. Представление об анонимных
объединениях.
4. Перегрузка операторов. Операторы, которые нельзя перегрузить.
5. Трехмерная графика.
6. Моделирование динамических систем.
8. ВОПРОСЫ К ЗАЧЕТУ И ЭКЗАМЕНУ
1-Й СЕМЕСТР
Зачет ставится студенту, если он сдал и защитил все лабораторные работы,
предусмотренные курсом.
Экзаменационные вопросы состоят из трех частей. Первые две соответствуют
темам лекционных занятий, последняя представляет собой типовую задачу, схожую с
одной из лабораторных работ. Студент должен письменно ответить на первые два вопроса
и написать программу, выполняющую поставленную в третьей части билета задачу.
Вопросы к экзамену.
1. Алгоритмы и величины.
2. Этапы решения задач на ЭВМ.
3. Основные типы данных.
4. Основные алгоритмические структуры.
5. История и классификация языков программирования.
12
6. Структура пограммы на Паскале.
7. Операции.
8. Выражения. Логические выражения.
8. Ввод с клавиатуры и вывод на экран.
9. Функции, связывающие различные типы данных.
10. Циклические операторы.
11. Подпрограммы.
12. Рекурсивные функции.
13. Графики в Турбо Паскале.
14.Строковый тип данных.
15. Массивы.
16. Множества.
17. Файлы.
18. Записи.
19. Указатели и динамические структуры.
20. Внешние подпрограммы и модули.
21. Объектно-ориентированное программирование.
22. Конструкторы и деструкторы.
Задачи к экзамену.
Задача 1.
Составить программу, которая расшифровывала бы введенную дату. Например, после
ввода информации «05.11.1996» машина должна выдать сообщение «5 ноября 1996 года».
Задача 2.
Нарисовать таблицу вида
кот кот кот
кошка кошка кот
кот кот кошка кошка кот ...
Где идет последовательность
кот, кот, кот, кошка, кошка...
повторяющаяся много раз и располагаемая по 6 зверей в строку.
Задача 3.
Напечатать корни из чисел от 1 до 100.
Задача 4.
Дан массив, состоящий из К целых чисел.
Вывести на печать совершенные числа этого массива.
Совершенные числа – это числа, которые равны сумме своих делителей.
Задача 5.
С клавиатуры вводится массив, состоящий из 11 элементов. Вывести сумму элементов
этого массива, порядковые номера которых - простые числа.
Задача 6.
Дан массив В, состоящий из К целых чисел (0<K<85;0<B[I]<10000).
Найти и напечатать индексы тех элементов массива, сумма цифр которых кратна 5.
Задача 7.
Дан массив Y, состоящий из N целых чисел (0<N<100; 0<Y[i]<100).
Опредилить НОК его простых чисел.
Задача 8.
Написать программу, которая копирует содержимое из файла 1.txt в файл 2.txt ,
меняя при этом регистр букв.
Задача 9.
Написать программу, которая подсчитывает буквы, содержащиеся в тексте файла 1.txt
Задача 10.
Написать программу, которая подсчитывает количество слов, содержащихся в тексте
файла 1.txt
13
Задача 11.
Перевод числа из 10-ой в 2-ую систему счисления и обратно.
Для перевода целого числа из десятичной системы счисления в двоичную нужно
десятичное число последовательно делить на два, получая остатки. Затем эти остатки
записываются в порядке, начиная с последнего, и получается двоичное число, равное
данному десятичному.
Для перевода двоичного числа в десятичное нужно цифры двоичного числа, начиная с
самой правой, умножать на степени числа 2 и получившиеся числа складывать.
Задача 12.
В матрицу из m строк и n столбцов (m = 5, n =3) ввести целые числа. В каждой строке
найти наибольшее число, а среди них определить наименьшее. Вывести найденное число и
его координаты в матрице (номер строки и номер столбца). Дополнительных массивов
использовать нельзя.
2-Й СЕМЕСТР
Вопросы к экзамену.
1. Этапы работы с программой на Си++.
2.Элементы языка Си++.
3. Типы данных.
4. Операции и выражения.
5. Линейные программы на Си и Си++.
6. Программирование ветвлений.
7. Программирование циклов.
8. Функции.
9. Классы памяти.
10. Массивы.
11. Алгоритмы сортировки массивов.
12. Указатели.
13. Обработка символьных строк.
14. Структуры и объедиенения.
15. Потоковый ввод-вывод в стандарте Си.
16. Работа с файлами.
17. Классы и объекты.
18. Конструкторы и деструкторы.
19. Перегрузка операций.
20. Стандартные библиотеки.
.Задачи к экзамену.
Задача 1.
Дана строка произвольной длины. Группы символов, разделенные пробелами (одним
или несколькими) будем называть словами. Определить количество слов в строке, а также
самое длинное слово (если несколько слов имеют максимальную длину, то взять первое из
них). Результаты решения выдать на экран.
Пример:
Дано: «programmiruem na С++»
Результат: 3 слова, самое длинное – «programmiruem».
Задача 2.
Напишите программу, которая выбрасывает комментарии из C++ программы. То есть,
читает из cin, удаляет // и /* */ комментарии и пишет результат в cout.
Задача 3.
14
Написать программу, которая открывает два файла, заданные как параметры
командной строки, и копирует первый во второй.
Задача 4.
Написать программу, которая ищет в файле 1.txt нужное слово и записывает его в файл
2.txt , а также указывает, сколько раз оно встретилось.
Задача 5.
Даны целые числа m, ai, aj. Найти два натуральных числа i и j , каждое из которых не
превосходит 20, такие, что ai+aj=m. Если таких чисел нет, то сообщить об этом.
Задача 6.
Даны действительные числа X, Y1, Y2, ..., Y25. В последовательности {Y} найти два члена,
среднее арифметическое которых ближе всего к Х.
Задача 7.
Заданы три матрицы А(2х2), В(ЗхЗ), С(ЗхЗ). Решить уравнение ax2+bx + c = 0, где а, Ь, с средние арифметические значения элементов матриц А, В, С соответственно. Поиск
среднего арифметического оформить в виде подпрограммы - функции.
Задача 8.
Даны три точки А(x1,y1), В(х2,y2), С(x3,y3) – вершины треугольника. Выяснить, является
ли данный треугольник равнобедренным. Нахождение длин сторон оформить в виде
подпрограммы.
Задача 9.
Дана целочисленная квадратная матрица порядка 8. Вывести на экран столбец,
который обладает наибольшей суммой модулей элементов. Определение заданного
столбца оформить в виде функции.
Задача 10.
Даны пять различных целых чисел. Найти среди них два числа, модуль разности которых
имеет наибольшее значение.
Задача 11.
Даны целое число k, матрица размером nхm, состоящая из нулей и единиц. Подсчитать
количество нулей в каждом столбце, и, если это количество больше значения k,
вычеркнуть весь столбец. Напечатать исходную и конечную матрицы. Подсчет
количества нулевых элементов столбца оформить с помощью подпрограммы-функции.
Задача 12.

xk
Вычислить сумму 
с точностью 10-6.
k 1 2k!
Задача 13.

( x) n
Вычислить сумму 
с точностью 10-6.
n 1 ( 2n)!
Задача 14.
Дано целое число N (1<=N<=1000000). Если оно является простым, то есть не имеет
положительных делителей, кроме 1 и самого себя, то вывести True, иначе вывести False.
Ввести одно число N.
Вывести слово True, если число простое или False, если число не простое.
Задача 15.
Найдите наибольший общий делитель двух целых чисел А и В (1<=А<=
В<=1000000000).
9. ТЕМЫ КОНТРОЛЬНЫХ РАБОТ
1-Й СЕМЕСТР
15
Выполнить задания контрольной работы. Создать файл отчета в Microsoft Word 2003,
содержащий:
- задание и номер варианта,
- код выполнения,
- скриншоты окна выполнения,
- выводы по работе.
Номером своего варианта считать свой номер в списке студентов (1, 2, 3, 4...).
Если вариантовв не хватает, то № варианта начинается сначала (1, 2, 3, 4...).
Задание 1. Функции и файлы.
Вариант 1.
Для хранения данных о цветных планшетных сканерах описать запись вида:
type scan_info=record
model: array[1..25]of Char; { наименование модели }
price: Integer;
{ цена }
x_size: Real;
{ гор-ый размер области скан. }
y_size: Real;
{ вер-ый размер области скан. }
optr: Integer;
{ оптическое разрешение }
grey: Integer
{ число градаций серого }
end;
Написать функцию (процедуру), которая записывает в бинарный файл данные о
сканере из приведенной записи. Структура файла: в первых 2-х байтах размещается
значение типа integer, определяющее кол-во сделанных в файл записей; далее без
пропусков размещаются записи о сканерах.
Написать функцию, которая извлекает из этого файла данные о сканере в запись
типа scan_info. Обязательный параметр – номер требуемой записи. Функция должна
возвращать нулевое значение, если чтение прошло успешно, и 1 – иначе.
Привести примеры программы, создающей файл с данными о сканерах (данные
вводятся с клавиатуры) – 6-8 записей и выводящей на дисплей данные о запрошенной
записи.
Все необходимые данные для функций (процедур) должны передаваться им в
качестве параметров. Использование глобальных переменных в функциях не допускается.
Вариант 2.
Для хранения данных о цветных планшетных сканерах описать запись вида,
описанного в варианте 1.
Написать функцию (процедуру), которая записывает в бинарный файл данные о
сканере из приведенной записи. Структура файла: в первых 2-х байтах размещается
значение типа integer, определяющее кол-во сделанных в файл записей; далее без
пропусков размещаются записи о сканерах.
Написать функцию (процедуру), которая сортирует записи в описанном выше
бинарном файле по одной из следующих характеристик: цена либо число градаций серого.
Обязательный параметр – признак, задающий критерий сортировки.
Привести пример готовой программы с не менее 8 записями.
Все необходимые данные для функций (процедур) должны передаваться им в
качестве параметров. Использование глобальных переменных в функциях не допускается.
Вариант 3.
Для хранения данных о цветных планшетных сканерах описать запись вида,
описанного в варианте 1.
16
Написать функцию (процедуру), записывающую в бинарный файл данные о
сканере из приведенной структуры. Структура файла: в первых 4-х байтах размещается
значение типа long, определяющее кол-во сделанных в файл записей; далее без пропусков
размещаются записи о сканерах.
Написать функцию (процедуру), сортирующую записи в описанном выше
бинарном файле по наименованию модели сканера.
Привести пример готовой программы с не менее 8 записями.
Все необходимые данные для функций (процедур) должны передаваться им в
качестве параметров. Использование глобальных переменных в функциях не допускается.
Вариант 4.
Для хранения данных о цветных планшетных сканерах описать запись вида,
описанного в варианте 1.
Написать функцию (процедуру), динамически выделяющую память под массив
записей, не менее 6 элементов, заполняет его данными в режиме диалога и записывает его
в бинарный файл. Структура файла: в первых 2-х байтах размещается значение типа
integer, определяющее кол-во сделанных в файл записей; далее без пропусков
размещаются записи о сканерах.
Написать функцию, извлекающую данные о сканере из описанного выше
бинарного файла в запись типа scan_info. Обязательный параметр – номер требуемой
записи. Функция должна возвращать нулевое значение если чтение прошло успешно, и 1 –
иначе.
Привести пример готовой программы с не менее 8 записями.
Все необходимые данные для функций (процедур) должны передаваться им в
качестве параметров. Использование глобальных переменных в функциях не допускается.
Вариант 5.
Для хранения данных о цветных планшетных сканерах описать запись вида,
описанного в варианте 1.
Написать функцию (процедуру) , записывающую данные о сканере из приведенной
записи в требуемую позицию в бинарном файле. Структура файла: в первых 2-х байтах
размещается значение типа integer, определяющее кол-во сделанных в файл записей; далее
без пропусков размещаются записи о сканерах. Запись может осуществляться в любую
позицию, причем если между вводимой записью и последней (или началом файла)
имеются пропуски, то они заполняются нулями.
Написать функцию (процедуру), уплотняющую описанный выше бинарный файл
путем удаления из него записей содержащие все нули.
Привести пример готовой программы с не менее 8 записями.
Все необходимые данные для функций (процедур) должны передаваться им в
качестве параметров. Использование глобальных переменных в функциях не допускается.
Вариант 6.
Для хранения данных о цветных планшетных сканерах описать запись вида,
описанного в варианте 1.
Написать функцию (процедуру), динамически выделяющую память под массив
записей, не менее 6 элементов, заполняет его данными в режиме диалога и записывает его
в бинарный файл. Структура файла: в первых 2-х байтах размещается значение типа
integer, определяющее кол-во сделанных в файл записей; далее без пропусков
размещаются записи о сканерах.
Написать функцию, запрашивающую данные о сканере в режиме диалога и
замещает в бинарном файле по заданному номеру. Обязательный параметр – номер
замещаемой записи. Функция должна возвращать 0 – если запись прошла успешно и 1 –
иначе.
17
Привести пример готовой программы с не менее 8 записями.
Все необходимые данные для функций (процедур) должны передаваться им в
качестве параметров. Использование глобальных переменных в функциях не допускается.
Вариант 7.
Для хранения данных о цветных планшетных сканерах описать запись вида,
описанного в варианте 1.
Написать функцию (процедуру), записывающую в бинарный файл данные о
сканере из приведенной записи. Структура файла: в первых 2-х байтах размещается
значение типа integer, определяющее кол-во сделанных в файл записей; далее без
пропусков размещаются записи о сканерах.
Написать функцию (процедуру), вводящую данные с клавиатуры в структуру, и
если данные об этом файле отсутствуют в файле – добавляет данные в конец файла, иначе
выдает соответствующее сообщение.
Привести пример готовой программы с не менее 8 записями.
Все необходимые данные для функций (процедур) должны передаваться им в
качестве параметров. Использование глобальных переменных в функциях не допускается.
Вариант 8.
Для хранения данных о цветных планшетных сканерах описать запись вида,
описанного в варианте 1.
Написать функцию (процедуру), записывающую в бинарный файл данные о
сканере из приведенной записи. Структура файла: в первых 2-х байтах размещается
значение типа integer, определяющее кол-во сделанных в файл записей; далее без
пропусков размещаются записи о сканерах.
Написать функцию (процедуру), которая вводит данные с клавиатуры в запись типа
scan_info и помещает ее содержимое на место первой записи в файле. Файл должен
существовать. При этом все остальные записи в файле сдвигаются ниже.
Привести пример готовой программы с не менее 8 записями, дополняющей файл 12 новыми записями.
Все необходимые данные для функций (процедур) должны передаваться им в
качестве параметров. Использование глобальных переменных в функциях не допускается.
Вариант 9.
Для хранения данных о цветных планшетных сканерах описать запись вида,
описанного в варианте 1.
Написать функцию (процедуру), которая запрашивает кол-во сканеров,
информация о которых будет вводиться, динамически выделяет память под массив
записей соответствующего размера и заполняет его данными в режиме диалога (с клавы).
При этом имя сканера может содержать пробелы.
Написать функцию (процедуру), записывающую данный массив в создаваемый
бинарный файл. Если цена сканера меньше 200, то данные об этом сканере в файл не
записываются. Информация об остальных сканерах помещается в бинарный файл, причем
сначала пишутся данные о всех сканерах имя которых начинается с заглавной буквы, а
затем – с прописной.
Структура файла: в первых 4-х байтах размещается значение типа long,
определяющее кол-во сделанных в файл записей; далее без пропусков размещаются
записи о сканерах.
Привести пример готовой программы с не менее 8 записями. (вывод на дисплей
данных о требуемой записи, либо всех либо по номеру).
18
Все необходимые данные для функций (процедур) должны передаваться им в
качестве параметров. Использование глобальных переменных в функциях не допускается.
Вариант 10.
Для хранения данных о ноутбуках описать запись вида:
type NOTEBOOK=record
model: array[1..21] of Char;
{наименование}
{ габаритные размеры }
x: Real;
y: Real;
z: Real;
w: Real;
{ вес }
price: Integer
{ цена }
end;
Написать функцию (процедуру), читающую данные о ноутбуках из файла note.txt в
запись приведенного вида. Написать функцию (процедуру), записывающую содержимое
записи в конец бинарного файла. Структура бинарного файла: первые 2 байта(целое) –
число записей в файле; далее записи в формате NOTEBOOK.
Написать программу, которая на основе разработанных функций (процедур)
осуществляет чтение данных лишь для тех ноутбуков, частота процессора которых
больше 120MHz, и запись в бинарный файл по убыванию цены.
Вариант 11.
Для хранения данных о ноутбуках описать запись вида, описанного в варианте 10.
Написать функцию (процедуру), которая читает данные о ноутбуках из файла
note.txt
в структуру записи приведенного вида. Написать функцию (процедуру)
записывающую запись в конец бинарного файла. Структура бинарного файла: первые 2
байта(целое) – число записей в файле; далее записи в формате NOTEBOOK.
Написать программу, которая осуществляет чтение данных лишь для тех
ноутбуков, об]ем HDD которых не меньше 1Гбайт, и запись считанных данных в
бинарный файл в алфавитном порядке по наименованию.
Вариант 12.
Для хранения данных о ноутбуках описать запись вида, описанного в варианте 10.
Написать функцию (процедуру), которая читает данные о ноутбуках из файла
note.txt
в структуру записи приведенного вида. Написать функцию (процедуру)
записывающую данные из записи в конец бинарного файла. Структура бинарного файла:
первые 2 байта(целое) – число записей в файле; далее записи в формате NOTEBOOK.
Написать программу, осуществляющую запись в двоичный файл данных лишь о
тех ноутбуках, целое кол-во которых в одном кубическом метре не превышает 285 штук.
Вариант 13.
Для хранения данных о ноутбуках описать запись вида, описанного в варианте 10.
Написать функцию (процедуру), которая читает данные о ноутбуках из файла
note.txt в структуру записи приведенного вида. Написать функцию (процедуру),
записывающую данные из записи в конец бинарного файла. Структура бинарного файла:
первые 2 байта(целое) – число записей в файле; далее записи в формате NOTEBOOK.
Написать программу, осуществляющую запись в файл данных о тех ноутбуках
максимальный объем ОЗУ которых не менее 40Мбайт, отсортированных по объему.
Вариант 14.
19
Для хранения данных о ноутбуках описать запись вида, описанного в варианте 10.
Написать функцию (процедуру), которая читает данные о ноутбуках из файла
note.txt
в структуру записи приведенного вида. Написать функцию (процедуру)
записывающую данные из структуры в конец бинарного файла. Структура бинарного
файла: первые 2 байта(целое) – число записей в файле; далее записи в формате
NOTEBOOK.
Написать программу, записывающую в файл данные лишь о тех ноутбуках,
диагональ дисплея которых больше 11 дюймов.
Вариант 15.
Для хранения данных о ноутбуках описать запись вида:
type NOTEBOOK=record
x: Integer;
{ горизонталь }
y: Integer;
{ вертикаль }
f: Real;
{ частота регенерации }
d: Real;
{ размер диаг. дисплея }
price: Integer;
{ цена }
model: array[1..21] of Char { наименование}
end;
Написать функцию (процедуру), которая читает данные о ноутбуках из файла
note.txt в структуру записи приведенного вида. Написать функцию (процедуру)
записывающую данные из записи в конец бинарного файла. Структура бинарного файла:
первые 2 байта(целое) – число записей в файле; далее записи в формате NOTEBOOK.
Написать программу, осуществляющую запись в файл данных о тех ноутбуках, вес
которых менее 7 кг, отсортированных в порядке возрастания цены.
Вариант 16.
Для хранения данных о ноутбуках описать запись вида, описанного в варианте 15.
Написать функцию (процедуру), которая читает данные о ноутбуках из файла
note.txt
в структуру записи приведенного вида. Написать функцию (процедуру)
записывающую данные из записи в конец бинарного файла. Структура бинарного файла:
первые 2 байта(целое) – число записей в файле; далее записи в формате NOTEBOOK.
Написать программу осуществляющую запись данных в файл лишь о тех
ноутбуках объем видеопамяти которых не менее 2Мбайт, отсортированных в порядке
уменьшения тактовой частоты процессора.
Вариант 17.
Для хранения данных о ноутбуках описать запись вида, описанного в варианте 15.
Написать функцию (процедуру), которая читает данные о ноутбуках из файла
note.txt
в структуру записи приведенного вида. Написать функцию (процедуру)
записывающую данные из записи в конец бинарного файла. Структура бинарного файла:
первые 2 байта(целое) – число записей в файле; далее записи в формате NOTEBOOK.
Написать программу осуществляющую запись данных в файл лишь о тех
ноутбуках, объем HDD которых больше 1Гбайт, отсортированных в порядке возрастания
диагонали дисплея.
Вариант 18.
Для хранения данных о ноутбуках описать запись вида, описанного в варианте 15.
Написать функцию (процедуру), которая читает данные о ноутбуках из файла
note.txt в структуру приведенного вида. Написать функцию (процедуру) записывающую
20
данные из структуры в конец бинарного файла. Структура бинарного файла: первые 2
байта(целое) – число записей в файле; далее записи в формате NOTEBOOK.
Написать программу осуществляющую запись данных в файл лишь о тех
ноутбуках тактовая частота процессора которых больше 120 Мгц, отсортированных в
порядке уменьшения веса.
Вариант 19.
Для хранения данных о ноутбуках описать структуру вида:
type NOTEBOOK=record
{ разрешение дисплея }
x: Integer;
{ горизонталь }
y: Integer ;
{ вертикаль }
f: Integer;
{ частота регенерации }
d: Real;
{ диагональ дисплея }
hdd: Real;
{ объем диска }
model: array[1..21] of Char { наименование}
end;
Написать функцию, которая читает данные о ноутбуках из файла note.txt в
структуру записи приведенного вида. Написать функцию записывающую данные из
записи в конец бинарного файла. Структура бинарного файла: первые 2 байта(целое) –
число записей в файле; далее записи в формате NOTEBOOK.
Написать программу осуществляющую запись данных в файл лишь о тех
ноутбуках, тактовая частота которых больше 120 МГц, отсортированных в порядке
возрастания цены.
Вариант 20.
Для хранения данных о ноутбуках описать запись вида, описанного в варианте 19.
Написать функцию (процедуру), которая читает данные о ноутбуках из файла
note.txt
в структуру записи приведенного вида. Написать функцию (процедуру)
записывающую данные из записи в конец бинарного файла. Структура бинарного файла:
первые 2 байта(целое) – число записей в файле; далее записи в формате NOTEBOOK.
Написать программу осуществляющую запись данных в файл лишь о тех
ноутбуках, цена которых больше $3500, отсортированных в порядке возрастания тактовой
частоты процессора.
Пример файла note.txt.
Aser Note Light
ASW ND5123T
ARMNote TS80CD
AST Ascentia P50
BSI NP8657D
BSI NP5265A
Dell Xpi P100SD
Digital HiNote
Gateway Solo S5
Hert Z-Optima NB
HP OmniBook 5500
IBM ThinkPad 560
NEC Versa 4080H
Polywell Poly 500
Samsung SENS 810
2699 5.6 02.0x11.8x08.3 100 40 10.4 1 1024x0768 60 0.774
3489 7.2 02.3x11.8x10.1 133 32 12.1 2 1024x0768 70 1.300
3699 7.2 02.3x11.5x08.8 133 64 11.3 1 1024x0768 75 1.300
4499 7.5 02.3x11.3x09.0 133 40 11.3 1 0800x0600 70 0.774
2605 8.0 02.3x11.8x09.3 133 40 11.3 1 1024x0768 60 0.810
3765 8.2 02.5x12.0x09.0 150 32 12.1 2 1024x0768 70 1.300
3459 6.0 02.3x11.0x08.0 100 40 10.3 1 1024x0768 60 0.773
7799 4.0 01.3x11.0x08.8 120 40 10.4 1 0800x0600 56 1.000
4499 5.6 02.0x11.9x08.8 133 40 11.3 2 1024x0768 60 0.686
3995 8.0 02.3x11.9x09.0 150 40 11.2 2 1024x0768 75 1.000
6120 7.1 02.0x11.5x09.0 133 64 11.4 1 1024x0768 75 1.300
3749 4.1 01.3x11.8x08.8 120 40 12.1 2 1024x0768 85 0.774
4180 6.6 02.3x11.8x09.5 120 48 10.4 1 0800x0600 70 0.776
3300 7.9 02.3x11.9x09.0 120 40 10.4 1 1024x0768 72 1.000
3667 8.7 02.3x11.5x09.5 100 32 11.4 2 1024x0768 75 0.773
21
Twinhead Slimnote 2965 7.4 02.0x11.5x08.0 075 64 10.4 1 1024x0768 70 0.772
*
*
*
*
* * * *
*
*
*
Наименование
цена вес габариты МГц * * * разрешение* HDD
* * *
*
ОЗУ * *
частота регене* *
рации
диагональ*
*
видеопамять
Все параметры разделены пробелами.
Задание 2. Модульное программирование.
Выполнить упражнения из задания 1, разместив описание записи в отдельном
модуле, и определение функций и главную программу – в двух отдельных модулях.
2-Й СЕМЕСТР
10. ЛИТЕРАТУРА
1-Й СЕМЕСТР
Основная
1. Вирт Н. Систематическое программирование. Введение / Пер. с англ. - М.: Мир,
1977.
2. Джонстон Г. Учитесь программировать / Пер. с англ. - М.: Финансы и статистика,
1989.
3. Иенсен К., Вирт Н. Паскаль: Руководство для пользователя / Пер. с англ. - М.:
Финансы и статистика, 1989.
4. Абрамов В.Г., Трифонов Н.П., Трифонова Г.Н. Введение в язык Паскаль /
Учебн.пособие. - М.: Наука. Гл.ред. физ.-мат.лит., 1988.
5. Пильщиков В.Н. Сборник упражнений по языку Паскаль. - М.: Наука. Гл.ред. физ.мат.лит., 1989.
6. Симпсон Г. Профессиональная работа на персональном компьютере .Пер. с англ. М.: Финансы и статистика, 1988.
7. Хьюз Дж., Мичтом. Дж. Структурный подход к программированию .Пер. с англ. - М.:
Мир, 1980.
8. Вирт Н. Алгоритмы + структуры данных = программы / Пер. с англ. - М.: Мир, 1985 (
Математическое обеспечение ЭВМ ).
9. Андерсон Р. Доказательство правильности программ / Пер. с англ. - М.: Мир, 1982.
Дополнительная
10. Грогоно П. Программирование на языке Паскаль / Пер. с англ. - М.: Мир, 1982.
11. Турский В. Методология программирования / Пер. с англ. - М.: Мир, 1981
( Математическое обеспечение ЭВМ ).
12. Ван Тассел Д. Стиль, разработка, эффективность, отладка и испытания программ /
Пер. с англ. - М.: Мир, 1981.
13. Практическое руководство по программированию. Под ред. Б.Мика, П.Хит, Н.Ратби
/ Пер. с англ. - М.: Радио и связь, 1986.
22
14. Керниган Б., Плоджер Ф. Элементы стиля программирования Пер. с англ. - М.:
Радио и связь, 1984.
15. Форсайт Дж., Малькольм М., Моулер К. Машинные методы математических
вычислений / Пер. с англ. - М.: Мир, 1980.
2-Й СЕМЕСТР
Основная литература
1. Артемьев И.Т., Новикова С.В. Программирование на языке TURBO PASCAL:
Лаб. практикум. - Чебоксары: ЧГУ, 2000. - 160 с.
2. Истомин Е.П., Неклюдов С.Ю. Программирование на алгоритмических языках
высокого уровня. Учебник. СПб:, 2003. -719 с.
3. Комаров Н.А. Программирование на персональном компьютере. Практическое
руководство с примерами по языкам программирования высокого уровня. М.: АльянсПресс, 2003. -688 с.
4. Лэйси Джеймс М. Visual C++6 Distributed: Экзамен 70-015 / Лэйси Джеймс М.;
Пер. с англ. Жарков И. - СПб. и др.: Питер, 2001. - 614с.: ил.
5. Матросов А.В., Чаунин М.П. Perl. Программирование на языке высокого уровня.
Учебник для вузов. (ГРИФ). СПб: Питер, 2003. -608 с.
6. Моделирование машины Фон-Неймана: Метод. указания к лаб. Работе/ Cост.
Симаков А. Л. – Чебоксары: ЧГУ, 2001.-23с.
7. Обломов И.А. Объектно-ориентированное программирование: Конспект лекций /
И.А. Обломов. – Чебоксары: ЧГУ, 2001. – 70 с.
8. Павловская Т.А. Паскаль. Программирование на языке высокого уровня.
Учебник для вузов. (ГРИФ). СПб: Питер, 2004. -393 с.
9. Павловская Т.А. С/С++. Программирование на языке высокого уровня. Учебник
для вузов. (ГРИФ). СПб: Питер, 2004. -461 с.
10. Фаронов В.В. Delphi. Программирование на языке высокого уровня. Учебник
для вузов. (ГРИФ). СПб: Питер, 2004. -640 с.
Дополнительная литература
1. Бруно Бабэ. Просто и ясно о Си++.
2. Болски М. Язык программирования Си. Справочник С. Гудман, С. Хидетниеми.
Введение в разработку и анализ алгоритмов. Пер. с англ. - М., Мир, 1981.
3. Гулд Х., Тобочник Я.. Компьютерное моделирование в физике. Пер. с англ., М.,
Мир, 1990.
4. Демидович Б.П. Основы численных методов.
5. Демидович Б.П. и др. Численные методы анализа.
6. Калмыков Б.М., Гаврилов В.Л., Прокопьев А.П. Язык программирования TURBO
Си. Методические указания к лабораторным работам. - Чебоксары, Изд-во Чуваш. ун-та,
1994.
7. Квиттнер П.. Задачи, программы, вычисления, результаты. Пер. с англ. - М.: Мир,
1980.
8. Кнут Д.. Искусство программирования для ЭВМ. В 3-х томах. Пер. с англ. - М.: Мир,
1976-1978.
9. Мак-Кракен Д., Дорн У. Численные методы и программирование на Фортране. Пер.
с англ. - М.: Мир, 1982.
10. Мейер Б., Бодуен К. Методы программирования. - М.: Мир, 1982.
11. Столяров А., Столярова В. «Шпаргалка» по Excel 7.0. «ВЕРБО», 1997.
12. Тимофеев В.В. Программирование в среде С/С++ Builder 5. - М.: Бином, 2000.
13. Тондо К., Гимпел С.. Язык Си. Книга ответов. Пер. с англ. - М.: Финансы и
статистика, 1994.
23
14. Уилкинсон Райнш. Справочник алгоритмов на языке «Алгол». Линейная алгебра.
Пер. с англ. - М.: Машиностроение, 1976.
15. Уэзерелл Ч. Этюды для программистов. Пер. с англ. - М.: Мир, 1982.
16. Форсайт Дж., Малькольм М., Моулер К. Машинные методы математических
вычислений. Пер. с англ.- М.: Мир, 1980.
17. Язык Си для профессионалов. Пер. с англ. - М.: ИВК СОФТ, 1992.
24
Методические указания к лабораторным работам
2-Й СЕМЕСТР
Лабораторная работа №1
Тема: Знакомство с интегрированной средой языка С.
Интегрированная среда С ( а именно язык Turbo C++ version 1.0-. и выше) является
частью системы программирования С. Основным достоинством среды С является
интеграция необходимых средств разработки С-программ в единую среду
программирования-интегрированную среду (ИС). Не выходя из среды, мы имеем
возможность создавать, компилировать, выполнять, отлаживать, корректировать
программу.
Интегрированная среда С является удобным средством для быстрой разработки
программ на языке С. Работа пользователя в среде С базируется на использовании
техники меню и окон. К тому же в среде имеется контекстно-чувствительное средство
получения справочной информации. Все это делает интерфейс с компилятором легким в
изучении.
Предположим, что основные файлы С расположены в каталоге C:\TC. Тогда для
запуска интегрированной среды укажите путь C:\TC\BIN\tc.exe, или просто: C\TC\BIN\tc
Когда программа запустится, мы увидим, что .вид экрана изменился. Верхняя
строка будет содержать меню основных режимов работы ИС. Нижняя строка коротко
описывает основные «горячие» клавиши.(см. рис 1.)
E
File
Fl Help
Edit
Search
F2 Save
Run
F3 Open
Compile
Debug
Options
Window
ALT-F9 Compile
F9 Make F10 Menu
Рис. l. Интегрированная среда С.
Для того, чтобы войти в главное меню среды, достаточно нажать клавишу «F10»
(обратите внимание на соответствующую подсказку в нижней строке). При этом в одном
из пунктов меню в верхней строке появится подсвеченный прямоугольник, который
можно передвигать, нажимая на клавиши «→»и «←».
Если установить этот прямоугольник на какой-либо пункт меню и нажать клавишу
«Enter», то раскроется подменю этого пункта, то есть список конкретных действий,
которые можно совершать, находясь в данном пункте меню.
По этому списку так же можно передвигать подсвеченный прямоугольник
(нажимая клавиши «↑» и «↓»). Пункт подменю, выбирается нажатием клавиши «Enter»,
(см. рис 2.)
E
File
Edit
Search
Run
Compile
Debug
Options
Window
Open F3
New
Save F2
Save as...
Save all
Change dir
Print
Get Info
Dos shell
Exit Alt-X
Fl Help
F2 Save
F3 Open
ALT-F9 Compile
F9 Make F10 Menu
Рис. 2. Работа с пунктом меню «File»
Можно легко передвигаться из одного пункта меню в другое. Для этого
используются клавиши «→ » , « ← », « ↑ » , « ↓ » и еще клавиша « Esc ». Клавиша «Esc»
нужна, чтобы выйти из данного подменю во «внешнее».
Режим редактирования.
25
В этом режиме создаются и редактируются тексты программы. Для того, чтобы
попасть в режим редактирования, достаточно загрузить файл (или создать новый).
Первым действием при разработке программ является создание (нажмите клавишу
«F3») и сохранение (нажмите клавишу «F2») программы. Для создания новых программ и
редактирования уже существующих, в среде С есть встроенный текстовый редактор,
содержащий богатый набор операций редактирования. Эти операции дают возможность
создавать, сохранять и редактировать программы в среде С.
Встроенный текстовый редактор среды С позволяет быстро выполнять такие
операции редактирования, как перемещение курсора, вставка, выбор, копирование и
удаление текста.
После набора текста программы сохраните (с помощью «F2») а для запуска
программы выполните один из следующих вариантов:
1) Нажмите комбинации клавиш «All»+ «F9» (для компиляции) или «Ctrl» + «F9»
(для выполнения программы).
2) В верхней строке меню выберите меню « Run» и выполните действие «Run»,
для этого нажмите «Enter». После этого на экранпоявится результат.
Компиляция, выполнение и отладка программ.
После создания и сохранения программы следующими этапами разработки
являются компиляция, выполнение и отладка этой программы. Для этих целей в среде Си
имеются встроенный компилятор и отладчик. Для управления компиляцией, выполнением
и отладкой в среде Си используются команды меню «Run (запуск)» , «Compile
(компиляция)», «Debug (отладка)».
1. Меню «Compile» (Компиляция).
Команды меню «Compile» создают объектный файл из текущего сходного файла.
Действиями команд из меню ознакомьтесь самостоятельно, для этого используйте
клавиши «↓», «↑». После выбора нужного подменю нажмите «Enter» и выполняется
действия.
2. Меню «Run» (Запуск).
Команды меню «Run» (Запуск) начинают или продолжают выполнение программы.
Здесь можно осуществлять трассировку и пошаговое выполнение команд программы.
3.Меню «» (Отладка).
Команды меню «Отладка» в сочетании с командами меню «Запуск» управляют отладкой в
среде Си.
Постановка задачи.
Разработать программу, которая выводит на экран геометрическую фигуру,
заполняя ее символом ‘*’ или пробелом. Размер фигуры (n) определяется при вводе.
Варианты заданий приведены в табл. 1.
Таблица 1
Варианты заданий
№ Фигура
Расположение на
экране
1
Заполненный прямоугольный треугольник. Размер
катетов – n
2
Пустой прямоугольный треугольник. Размер катетов – n
3
Заполненный равнобедренный треугольник. Основание
- n, высота - n/2+1 (n - нечетное)
Пустой равнобедренный треугольник. Основание - n,
высота - n/2+1 (n – нечетное)
4
26
5
Заполненный параллелограмм. Основание и высота - n
6
Заполненный параллелограмм.
Основание и высота - n
7
Пустой равнобедренный треугольник. Основание n,
высота - n/2+1 (n – нечетное)
8
Заполненный равнобедренный треугольник. Основание
- n, высота - n/2+1(n - нечетное)
Пустой прямоугольный треугольник. Размер катетов – n
9
10 Заполненный прямоугольный треугольник. Размер
катетов – n
11 Пустой прямоугольный треугольник. Размер катетов – n
12 Заполненный прямоугольный треугольник. Размер
катетов – n
13 Заполненный равнобедренный треугольник. Основание
– n, высота - n/2+1 (n - нечетное)
14 Пустой равнобедренный треугольник. Основание – n,
высота - n/2+1 (n – нечетное)
15 Пустой параллелограмм. Основание n и высота n
16
Пустой параллелограмм. Основание и высота - n
17 Пустой равнобедренный треугольник.
Основание - n, высота - n/2+1 (n – нечетное)
18
Заполненный равнобедренный треугольник. Основание n строк, высота - n/2+1 (n – нечетное)
19 Пустой прямоугольный треугольник. Размер катетов –
n.
20 Пустой прямоугольный треугольник. Размер катетов –
n.
Пример программы (вариант 13)
Задание: Разработать программу, которая выводит на экран геометрическую фигуру,
заполняя ее символом ‘*’ или пробелом. Размер фигуры (n) определяется при вводе.
Заполненный равнобедренный треугольник. Основание – n, высота - n/2+1 (n - нечетное)
Текст программы:
#pragma hdrstop
#pragma argsused
#include <iostream.h>
#include <conio.h>
//Основная программа
void main(void)
{ int i,j,n;
cout<<"n >"; cin>>n;
cout<<endl;
for (j=1;j<=n;j++)
27
cout<<'*';
cout<<endl;
for (i=2;i<=n/2+1;i++)
{ for (j=1;j<=i-1;j++)
cout<<' ';
for (j=1;j<=(n-((i-1)*2));j++)
cout<<'*';
cout<<endl;
}
getch();
}
Тестовый пример:
n >15
***************
*************
***********
*********
*******
*****
***
*
Лабораторная работа № 2
Программирование линейных алгоритмов.
Стандартные подпрограммы (функции Printf, Scanf).
Цель работы: научить студентов использовать стандартных функций для решений всяких
задач. Овладение практическими навыками разработки и программирования
вычислительного процесса.
Задания для самостоятельной подготовки
1. Изучить:
─ запись констант, переменных, стандартных функций;
─ правила записи арифметических выражений;
─ арифметический оператор присваивания;
─ организацию простейшего ввода-вывода данных.
2. Разработать алгоритм решения в соответствии с заданием.
3.Составить программу решения задачи.
К наиболее интересным и важным функциям языка относится printf . Она
предназначена для форматного вывода данных. Например, чтобы вывести некоторое
сообщение на экран дисплея, достаточно использовать вызов функции:
printf ("Интересное сообщение \n");
Одним из механизмов взаимодействия являются параметры. Список параметров
(аргументов) идет вслед за именем функции в круглых скобках. В данном случае
аргументом служит строковая константа - любая последовательность символов, в
кавычках. Комбинация " \n " означает переход на новую строку. Первый пример можно
заменить вот на такую строчку:
printf ("Интересное сообщение "); prin tf(" \n ");
- результат будет точно таким же, как и в первом случае!
Первым аргументом служит строка форматов, а вторым, если они есть, - выводимые
объекты. Строка форматов может включать обычные символы, которые начинаются со
знака %, за ним следует символ преобразования. Каждая спецификация преобразования
соответствует одному из аргументов, которые следуют за форматной строкой. Буква d в
28
спецификации преобразования указывает, что значение аргумента должно быть
напечатано как десятичное целое число. Из других символов отметим : c - для вывода
отдельного символа; s - для печати символьной строки; x и o - для вывода
шестнадцатеричных и восьмеричных чисел соответственно; f - для вывода чисел с
плавающей точкой. В следующем примере
printf(" %c = %d \n",g,g);
значение переменной g выводиться как символ алфавита, а после знака равенства - как
числовое значение, соответствующее внутреннему (машинному) коду этого символа.
Перед символом преобразования может стоять, явно указывающий количество позиций в
выводимой строке, отведенных для элемента вывода.
printf(" %c = %5d \n",g,g);
Наша первая программа вводит два числа, вычисляет их сумму и печатает
результат с поясняющим текстом "Cумма".
#include
<stdio.h>
{
int a,b,c;
a=5; b=7;
c=a+b;
printf("Cумма = %d \n",c)
}
Строка int a,b,c; объявляет a,b,c переменными целого типа. Все используемые в
программе переменные должны быть объявлены. Далее идут операторы присваивания к a
значение 5, а к b - 7, с - значение их суммы. Значения переменных типа int лежат в
диапазоне [-32768; 32767]. Функция printf выводит на экран: СУММА = 12.
Рассмотрим теперь функцию scanf предназначенную для форматного ввода данных.
Функция scanf в качестве фактических параметров использует адреса переменных, а не их
значения. Для этого перед соответствующим параметром ставят знак & - символ взятия
адреса. Например, &XL означает
"адрес переменной XL", а не значение, которое
переменная имеет в данный момент.
Строка форматов функции scanf указывает, какие данные ожидаются на входе. Если
функция встречает в форматной строке знак % , за которым следует символ
преобразования, то она будет пропускать на входе символы до тех пор, пока не встретит
какой-нибудь не пустой символ.
Предыдущая программа страдает одним недостатком: программа вычисления суммы
годится только для одного конкретного случая, когда a=5, b=7. Улучшим ее, заменив
соответствующие операторы присваивания вызовом функции scanf:
/* Ввод двух чисел, вычисление суммы и печать
результата*/
#include
<stdio.h>
{
int a,b,c;
scanf(" %d %d",&a,&b);
c=a+b;
printf("Cумма = %d \n",c)
}
Форматная строка предписывает функции scanf ввести десятичное число, которое
надо поместить в переменную a, затем через пробел ввести второе десятичное число,
которое надо присвоить переменной b. Обратите внимание, что программа начинается со
строки комментарием : /* .. */ , транслятор пропускает любые символы между /* и */ и их
можно использовать для пояснений.
Варианты задач.
Вычислить значение функции.
29
x2  5  a
 ( x  1)
5ax
3
2. 2,19  y  7
4
х у х
3.

x
у
x3  у
x
х 1
( x  1) 2
12. 2
x 1
1.
4.
5.
6.
7.
8.
11.
13. x 4  ( x 3  y 2 )
x 2 1
x y
1,234  z

z  y3
(9,84  a)(6,54  b)
3,21c  x 5
(a 2  b)( 2a  ab  c 3 )
a 3  b3
у  x 2  ( x  1)
14. 3 у  x 3
15. х 3  у 2
16. 7 х 2  у 4
17. 2n  4 х 7
18. a 2  а 3
( x 2  2)  x 3
x4
ab  (a  b)
10.
x
9.
19.
у3  х2
x2 1
20. x 2  2ab
Лабораторная работа № 3
Тема: Программы разветвляющихся структур.
Цель работы - овладение практическими навыками разработки и
программирования вычислительного процесса разветвляющейся структур.
Задания для самостоятельной подготовки
1. Изучить возможности языка программирования для реализации:
─ условной и безусловной передачи управления;
─ вычислительного процесса разветвляющейся структуры
2. Разработать алгоритм решения в соответствии с заданием.
3. Составить программу решения задачи.
Рассмотрим организацию ввода- вывода и реализацию основных управляющих
структур. Любой конкретный алгоритм может быть записан на языке программирования,
использующем только три управляющий структуры: последовательное выполнение,
ветвление и повторение.
Последовательность операторов выполняется в порядке их естественного
расположения в программе, с возможным отклонением для вызова внешнего фрагмента
(функции), но с обязательным возвратом в точку вызова.
Ветвление в простейшем случае описывается в языке Си с помощью условного
оператора. имеющего вид:
if ( выражение )
оператор_1;
else
оператор_2;
где часть else может и отсутствовать. Сначала вычисляется "выражение" в скобках; если
оно истинно то выполняется оператор_1. Если "выражение" ложно (равно нулю NULL), то оператор_1 пропускается, а выполняется оператор_2. Если на месте условно
30
выполняемых операторов должна располагаться группа из нескольких операторов языка,
то они заключаются в фигурные скобки - { }. Часто "выражение" в скобках представляет
условие, заданное с помощью операций отношений и логических операций. Операции
отношения обозначаются в Си следующим образом:
= = равно; ! =
не равно; <
меньше; >
больше;
< = меньше или равно; > = больше или равно.
Символ ! в языке Си обозначает логическое отрицание. Есть еще две логические
операции: || означает или, а && - логическое И. Операции отношения имеют приоритет
ниже арифметических операций, так что выражение вида k > n%i вычисляется как k >
(n%i). Приоритет && выше, чем у ||, но обе логические операции выполняются после
операций отношения и арифметических. В сомнительных случаях лучше расставлять
скобки.
Для иллюстрации применения условного оператора рассмотрим программу
определения большего из трех чисел.
Пример.
#include <stdio.h>
main()
/* главная функция*/
{
int x, y, z, max ;
/* описание переменных*/
printf(" Введите три числа :\n ");
scanf(" %d %d %d ", &x, &y, &z); /*ввод трех чисел*/
if( x > y)
/*операции сравнивания*/
max=x;
else
max=y;
if ( z>max)
max=z;
printf(" Максимальное из (%d, %d, %d)= %d \n",x, y, z, max);
}
Рассмотрим пример программы, в которой применяются несколько вложенных друг в
друга условных операторов. В этой программе строка
float A, B, X объявляет эти
три переменные как величины вещественного типа. Форматная строка функции scanf
предписывает ввести два вещественные числа, которые станут значениями переменных A
и B соответственно.
Пример 1.4
/*РЕШЕНИЕ УРАВНЕНИЯ AX=B*/
#include <stdio.h>
main()
{
float A,B,X;
printf("ВВЕДИ А, В\n");
scanf("%f %f",&A, &B);
if(A!=0)
printf("РЕШЕНИЕ:%f\n", B/A);
else
if(B==0)
printf("X-ЛЮБОЕ ЧИСЛО\n");
else
printf("РЕШЕНИЙ НЕТ\n");
}
Посмотрите, как выглядит ветвление, когда глубина вложенности условных операторов
равна трем (пример 1.5). Если хоть одно условие истинно, то все оставшиеся, разумеется,
пропускаются. При глубине вложенности условных операторов свыше трех ветвление
теряет
наглядность
и
понятность.
Для реализации многозадачного ветвления обычно прибегают к управляющей
структуре выбор (переключатель) (см. п.9.4). Когда управляющая структура ветвления
31
становится особенно запутанной, определенную ясность могут внести фигурные скобки.
Они обязательны, когда в условном операторе содержится более одного оператора или
функции, например
if(a_0)
{
printf("...");
scanf("...")
другие операторы ...
}
Пример 1.5
/* Программа определяет поведение ракеты,
стартующей на экваторе, в зависимости
от ее начальной скорости*/
#include <stdio.h>
main()
{
float V;
printf("ВВЕДИ V\n");
scanf("%f",&V);
if(V<7.9)
printf("РАКЕТА УПАДЕТ НА ЗЕМЛЮ\n");
if(V<11.2)
printf("РАКЕТА СТАНЕТ СПУТНИКОМ ЗЕМЛИ\n ");
if(V<16.4)
printf("РАКЕТА СТАНЕТ СПУТНИКОМ СОЛНЦА\n");
else
printf("РАКЕТА ПОКИНЕТ СОЛНЕЧНУЮ СИСТЕМУ\n");
}
Варианты задач для лабораторной работы №5
1.M=max {a,b,c}
 x 2  3 x, 2  x  6

2. y   x 3  4, x  2
4( x  3), x  1

1

2
x   x , x  0
3. z  
x
(1  x)  x 2 , x  0

1  x,1  x  1

4. p   x 2 , x  1
0, x  1

( x  5) 2  10, x  1
5. M   2
 x  9, x  1
1  x3 ,3  x  1

6. z  4 x 4  5, x  3
 x, x  1

0.5 x, x  2
7. y  
 x,x  2
( x  1) 2 , x  1
11. M   2
 x  3x  4, x  1
0,2  х 2 , x  0
12. y  
0,3  x, x  0
 x 3  x 2  x  1, x  0

13. y   1
1
 2  3  2, x  0
x
x
 x , 2  x  2

14. z   x 2  1, x  2
 x 3  4, x  2

15. U=min {x,y,z}
 x 2  2 x  1,1  x  2

16. u  3x 3  4 x  3, x  1
0.7 x  8.9, x  2

 x 2  x, x  1
17. z   2
 x  4 x  8, x  1
32
 x  4,x 1

18. y   x 3  7 x  3, x  0
 x, x  5

0.7 х,0  x  5

8. M   x 3  7 x  3, x  0
 x  5, x  5

 x 2  3, x  0
9. u  
 х, x  0
2

х  x  8 , x  8
19. u  
3

 x  4 x  5, x  8
( x 2  5)  x, x  x
10. y   4
 х  4, x  2
20. T  min{max{ a, b}, c}
Лабораторная работа № 4
Тема: Программы циклической структуры.
Цель работы - овладение практическими навыками разработки и
программирования вычислительного процесса циклической структуры.
Задания для самостоятельной подготовки
1. Изучить:
─ организацию алгоритмов циклической структуры с заданным числом
повторений;
─ возможности языка программирования для построения таких циклов;
2. Разработать алгоритм решения в соответствии с заданием.
3. Составить программу решения задачи.
В языке Си основной структурой, управляющей повторением, служит цикл с
предусловием while (пока). Он имеет следующий формат
while (условие) оператор;
Условие всегда заключено в скобки, оно может быть произвольным выражением.
Оператор while повторяет выполнение оператора следующего условия, до тех пор, пока
это условие истинно. Если это условие не истинно с самого начала или становится не
истинным в процессе выполнения данного оператора, то управление передается
оператору, следующему за оператором цикла. Если повторяемая часть оператора
содержит более одного оператора, то повторяемая группа операторов должна быть
заключена в фигурные скобки, например:
while(условие)
{
оператор_1;
оператор_2;
....
оператор
}
Для описания условий в операторе while используются операции условия такие же, как
и в операторе if . Приведенная ниже программа подсчитывает сумму цифр введенного
числа N. Цикл while последовательно выделяет и суммирует цифру исходного числа,
начиная с последней; для выделения применяется операция взятия остатка от деления - %.
При делении целых чисел любая дробная часть отбрасывается, поэтому после операции
N=N/10; исходное число уменьшается в 10 раз при каждом "обороте" цикла, пока,
наконец, не станет равным нулю, после чего цикл завершается и на экран дисплея
выдается значение переменной S, в котором содержится сумма цифр числа N.
Пример 1.6
#include <stdio.h>
main()
{
33
int N,S,Z;
S=0;
printf("ВВЕДИ N\n");
scanf("%d",&N)
while(N!=0)
{
Z=N%10
N=N/10
S=S+Z;
}
printf("СУММА ЦИФР=%d\n",S);
}
Рассмотрим еще один пример. Здесь приведена программа, которая реализует
алгоритм разложения числа на простые множители. Для сокращения времени счета
отдельно рассматривается случай множителя, равного двум, чтобы в последующем
рассматривать только нечетные множители.
Пример 1.7
/*РАЗЛОЖИТЬ ЧИСЛО НА МНОЖИТЕЛИ */
#include <stdio.h>
main()
{
int M,i=3;
printf("ВВЕДИ M\n");
scanf("%d",&M);
printf("%d=1",M);
while(M%2==0)
{
printf("*%d",2);
M=M/2;
}
while(i <=M)
{
if(M%i==0)
{
printf("*%d",i);
M=M/i;
}
else
i=i+2
}
}
Иногда структуры со вложенными друг в друга операторами повторения называются
циклами. Следующая программа простая, хотя и содержит вложенные циклы. Она
выводит на экран заполненный символом * треугольник, высота которого равна N.
Во внешнем цикле устанавливается очередная строка вывода (параметр i ), а во
внутреннем (параметр j ) в очередную строку вводится ровно i символов " * " Вызов
функции printf("\n") обеспечивает в нужный момент переход на новую строку.
Обратите внимание, что для вывода одного символа в форматной строке функции printf
используется спецификация %c.
Пример 1.8
#include <stdio.h>
main()
{
int i,j,N;
printf("ВВЕДИ N \n");
scanf("%d",&N);
i=1;
while(i <=N)
{
j=1;
while(j <=i)
34
{
printf("%c",'*');
j=j+1;
}
i=i+1;
printf("\n");
}
}
Рассмотрим еще один пример, в котором используется сложный цикл. Программа
позволяет найти в заданном интервале все совершенные числа. Напомним, что
натуральное число называется совершенным, если оно равно сумме всех своих делителей,
считая его самого. Известно, что все совершенные числа - четные и что первое
совершенное число из натурального ряда чисел равно 6. Этим объясняется начальное
значение параметра внешнего цикла. Так как все натуральные числа имеют своим
делителем единицу, полагаем начальное значение суммы делителей числа S=1. Во
внутреннем цикле организуется перебор всех множителей текущего значения N. Из
теории чисел известно, что такому испытанию имеет подвергать числа от 2 до N/2, либо
даже до корень из N. Это очень несовершенный алгоритм и если вы захотите его
выполнить на ЭВМ, имейте ввиду, что программа работает слишком долго. Более
эффективно алгоритм будет реализован попозже.
Пример 1.9
#include <stdio.h>
main()
{
int j,N,M,S;
printf("ВВЕДИ M\n");
scanf("%d",&M);
N=4;
while(N<=M)
{ S=1;j=2;
while(j<=N/2)
{
if(N%j==0) S=S+j;
j=j+1;
}
if(N==S)
printf("%d- СОВЕРШЕННОЕ ЧИСЛО\n",N);
N=N+2;
}
}
Варианты задач для лабораторной работы №6
1. z=2n, n  N
2. p= n!; n  N
1
1
1
)(1  2 )...(1  2 ); n  N
2
1
2
n
y  a n ; a  R; n  N
3. (1 
4.
5. M=a(a+1)…(a+n-1); a  R; n  N
1
a
6. z  
7.
1

1
4
 ... 
1
; a  R; n  N
a
a
a 2n
x 3 x 5 x 7 x9 x11 x13
s  x





;x R
3
5
7
9
11 13
2
35
5
8. s  
9n
n  n 1
2
n1
10
9.
p
n 1
n
n1
10
10. s  
i 1
2
1
i
(i  1) 2
10
11. s   (i 2  1)
i 1
5
12. p  a  b  c   n 2
n1
5
13. p   (n 2  n)
14. s 
n 1
5
1
 (n  5)
3 n 1
15. y  x  ( x  1) 2 , x  1;10
16. y  x 2 
x2 1
, x  1;5
2
4
17. s   ( 2k  1) 2
k 1
k 1
10
18. s   (n3  1)( n  1)
n 1
5
19. p   e i  1
2
i 1
4
2
20. s   i  2i  1
i 1
i
Лабораторная работа №5
Тема: Упорядочивание элементов массива.
Постановка задачи
Разработать программу, которая вводит целочисленную матрицу из n строк и m
столбцов (1<n<=100, 1<m<=50) и упорядочивает элементы матрицы. Правило
упорядочивания определяется вариантом. Варианты заданий приведены в табл. 2.
Таблица 2.
Варианты заданий
№
Правило упорядочивания элементов матрицы
1
Упорядочить каждую строку по возрастанию элементов
2
Упорядочить строки по возрастанию последних элементов строк
3
Переместить в каждой строке все отрицательные элементы в начало
строки, а неотрицательные – в конец
4
Разместить все положительные элементы в верхнюю левую область
матрицы (заполняя ими матрицу по строкам слева направо), а
неположительные – в нижнюю правую область
5
Разместить все максимальные элементы в верхнюю левую область
матрицы (заполняя ими матицу построчно), а остальные – в нижнюю
правую область
36
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Упорядочить столбцы по убыванию первых элементов столбцов
Упорядочить все элементы матрицы таким образом, чтобы при чтении
матрицы по строкам ее элементы образовывали отсортированный по
убыванию массив
Упорядочить каждую строку по убыванию элементов
Разместить все минимальные элементы в нижнюю правую область
матрицы (заполняя ими матицу построчно), а остальные – в верхнюю
левую область
Упорядочить каждый столбец по возрастанию элементов
Упорядочить столбцы по возрастанию последних элементов столбцов
Переместить в каждом столбце все отрицательные элементы в начало
столбца, а неотрицательные – в конец
Разместить все положительные элементы в левую верхнюю область
матрицы (заполняя ими матрицу по столбцам сверху вниз), а
неположительные – в правую нижнюю область.
Упорядочить все элементы матрицы таким образом, чтобы при чтении
матрицы по столбцам ее элементы образовывали отсортированный по
возрастанию массив
Упорядочить каждый столбец по убыванию элементов
Упорядочить столбцы по убыванию последних элементов столбцов
Упорядочить строки по возрастанию первых элементов строк
Упорядочить все элементы матрицы таким образом, чтобы при чтении
матрицы по строкам ее элементы образовывали отсортированный по
возрастанию массив
Разместить все максимальные элементы в верхнюю правую область
матрицы (заполняя ими матицу по столбцам), а остальные – в
нижнюю левую область
Разместить все отрицательные элементы в верхнюю левую область
матрицы (заполняя ими матицу по строкам), а неотрицательные – в
нижнюю правую область
Пример решения (вариант 13).
Задание: Разработать программу, которая вводит целочисленную матрицу из n строк и m
столбцов (1<n<=100, 1<m<=50) и упорядочивает элементы матрицы. Правило
упорядочивания: Разместить все положительные элементы в левую верхнюю область
матрицы (заполняя ими матрицу по столбцам сверху вниз), а неположительные – в правую
нижнюю область.
Текст программы:
//Упорядочивание матрицы
#pragma hdrstop
#pragma argsused
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <iomanip.h>
//Функция упорядочивания матрицы
/* Программа начинает просматривать матрицу по столюбцам из левого верхнего угла,
находя неположительный элемент, она меняет его местом с последним на данном
проходе элементом, и сдвигает индекс последнего элемента на единицу влево (вверх
37
по столбцам из правого нижнего угла), начиная новый проход с начала матрицы.
Проходы прекращаются при совпадении индекса просматриваемого элемента и индекса
последнего на данном проходе элемента (если до этого не было найдено ни одного
неположительного элемента*/
void sort(int a[][50], int n, int m)
{
int count=0,i=0,k,b; bool p;
do
{
p=false;
for (k=0;k<(n*m-1);k++)
{
if ((((n-1)-count%n)==k%n) && (((m-1)-count/n)==k/n))
{
p=true;
break;
}
if (a[k%n][k/n]<0)
{
b=a[k%n][k/n];
a[k%n][k/n]=a[(n-1)-count%n][(m-1)-count/n];
a[(n-1)-count%n][(m-1)-count/n]=b;
count++;
break;
}
}
i++;
}
while (p!=true);
}
//Функция заполнения матрицы
void fill(int a[][50], int n, int m)
{
int i,j;
randomize();
for (i=0;i<n;i++)
for (j=0;j<m;j++)
{
//cout<<"a["<<(i+1)<<','<<(j+1)<<"]=";
//cin>>a[i][j];
a[i][j]=random(100)-50;
}
}
//Функция вывода матрицы на экран
void print(int a[][50], int n, int m)
{
int i,j;
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
cout<<setw(4)<<a[i][j];
38
cout<<endl;
}
cout<<endl;
}
//Основная программа
void main(void)
{
//объявление переменных
int a[100][50],i,j,n,m;
//ввод числа строк и столбцов
cout<<"Rows (from 1 to 100) >"; cin>>n;
cout<<"Cols (from 1 to 50) >"; cin>>m;
cout<<endl;
//заполнение матрицы
fill(a,n,m);
//вывод матрицы на экран
print(a,n,m);
//упорядочивание
sort(a,n,m);
//вывод упорядоченной матрицы на экран
print(a,n,m);
//задержка
getch();
}
Тестовый пример:
Rows (from 1 to 100) >10
Cols (from 1 to 50) >10
-3
49
-43
0
39
44
16
-48
15
-15
35
-16
37
-44
-32
-35
5
-43
40
5
7
-43
26
18
-23
-43
41
-37
20
-47
6
49
29
0
39
44
16
17
15
7
35
0
37
1
35
13
5
16
40
5
7
26
26
18
13
26
41
23
20
36
11
-23
29
-40
-35
10
38
-45
26
-12
-8
37
18
35
-28
-45
-20
-28
-49
11
-23
35
-36
39
-33
31
28
48
16
-44
9
-16
-7
-35
-24
-45
-12
-39
-27
-4
-42 36 35
-36 23
1
-12 -44
0
20 26 -45
-7 -47 -34
-47 13
7
-42 26 -40
-31 16 17
-29 -2 29
5 13
6
11 28 -28
5 37 -36
29 18 -20
20 35 -33
9 31 -45
10 39 -28
38 35 -8
16 11 -12
26 -49 -44
48 -23 -45
-16
-7
-35
-24
-45
-12
-39
-27
-4
-42
-36
-12
-35
-7
-47
-42
-31
-29
-40
-23
-47
-44
-37
-47
-43
-23
-43
-2
-43
-35
-32
-44
-45
-34
-16
-40
-15
-48
-43
-3
39
Лабораторная работа № 6
Тема: Функции.
Мощность языка Си во многом объясняется легкостью и гибкостью в определении
и использовании функций в Си-программах. В отличие от других языков
программирования высокого уровня в языке Си нет деления на процедуры, подпрограммы
и функции.
В языке Си программа строится только из функций.
Функция - это независимая совокупность объявлений и операторов, обычно
предназначенная для выполнения определенной задачи. Каждая функция должна иметь
имя, которое используется для вызова функции. Имя одной из функций, main , которая
должна присутствовать, в каждой Си программе зарезервировано. В программе могут
содержатся и другие функции, причем функция main необязательна должна быть первой,
хотя с нее всегда начинается выполнение Си-программы.
При вызове функции ей могут быть переданы данные посредством аргументов функции.
Функция может возвращать значение. Это возвращаемое значение и есть основной
результат выполнения функции, который при выполнении программы подставляется на
место вызова функции, где бы этот вызов ни встретился в программе. Однако могут быть
определены функции, которые не имеют никаких параметров и не возвращают никакого
значения. Тем не менее действие таких функций может состоять в изменении внешних
или статических переменных или выполнении каких-либо других действий, не связанных
с данными.
С использованием функций в языке Си связаны три понятия:
-определение функции;
-объявление функции;
-вызов функции;
Определение функции.
Определение функции имеет следующий формат:
[спеццфикатор-класса-памяти\ [спецификатор-типа]
описатель( [спис --формальпых-параметров] )
тело функции
Определение функции задает имя, формальные параметры (типы и число ее
формальных параметров), объявления и операторы, которые определяют действие
функции. Последовательность объявлений и операторов называется телом функции. В
определении функции также может быть задан тип значения, возвращаемого функцией
(тип возврата) и класс памяти.
Функция возвращает значение, если ее выполнение заканчивается выполнением
оператора return в теле функции следующего формата:
return выражение;
Выражение вычисляется, преобразуется, если необходимо, к типу возвращаемого
значения в определении (объявлении) функции, и управление возвращается в точку
вызова.
Если оператор return не задан или не содержит выражения, функция не возвращает
никакого значения. В этом случае спецификатор типа возвращаемого значения должен
быть задан ключевым словом void, означающим отсутствие возвращаемого значения.
Тело функции -это составной оператор, содержащий операторы, определяющие
действия функции. Он также может содержать объявления переменных, используемых в
этих операторах.
Все переменные, объявленные в теле функции, имеют класс памяти auto, если они не
объявлены иначе, и являются локальными. Когда вызывается функция, то для локальных
переменных отводится память в стеке и производится их инициализация (если она
задана).
40
Параметры функции передаются по значению и могут рассматриваться как
локальные переменные, место для которых распределяется при вызове функции, они
инициализируются значениями переданных аргументов и теряются при выходе из
функции. Поэтому в теле функции нельзя изменять значение параметра, так как функция
работает с копиями аргументов.
Объявление функции (прототип)
Если нужно вызвать функцию до ее определения в этом файле или определение
функции находится в другом исходном файле, вызов функции следует предварить
объявлением функции, т.е.. задать прототип функции, который позволит компилятору
выполнить проверку аргументов и возвращаемого значения. Прототип функции имеет
следующий формат:
[спецификатор - класса-памяти][спецификатор- типа]
описатель ( [список- формальных -параметров])
[, список - описателей]',
В отличие от формата определения функции в формате прототипа за заголовком
функции следует точка с запятой (т.е. прототип функции не имеет тела), и заголовок
функции может заканчиваться списком - описателей.
Правила использования остальных элементов формата прототипа те же, что и в
определении функции.
Прототип - это явное объявление функции, которое предшествует определению функцию.
Тип возврата, заданный в прототипе, должен согласовываться с типом возврата, заданным
в определении.
Вызов функций.
Вызов функции имеет следующий формат:
выражение ( [список - выражении]);
Выражение вычисляется как адрес функции. Список - выражений представляет
собой список фактических аргументов, передаваемых в функцию. Он может быть пустым.
Фактический аргумент может быть любой величиной основного типа, структурой,
перечислением, смесью или указателем.
Выполнение вызова функции происходит следующим образом:
-1. Вычисляются выражения в списке выражений и производятся обычные
арифметические преобразования. Затем, если известен прототип функции, тип
результирующего аргумента сравнивается с типом соответствующего формального
параметра. Если они не совпадаю то либо производится преобразование типов, либо
выдается диагностическое сообщение. Число выражений в списке выражений должно
совпадать с числом формальных параметров.
Если в прототипе функции вместо спецификатора - формальных - параметров
задано ключевое слово void, это значит, что в функцию не передается никаких аргументов
и в определении функции не должно быть формальных параметров. Если это не так, то
выдается диагностическое сообщение.
-2. Происходит замена формальных параметров на фактические. Первое выражение в
списке всегда соответствует первому формальному параметру, второе - второму и т.д. .
-3. Управление передается на первый оператор функции.
-4. Выполнение оператора return в ' теле функции возвращает управление и,
возможно, значение в вызывающую функцию. Если оператор return не задан, то
управление возвращается после выполнения последнего оператора тела функции.
При
этом возвращаемое значение не определено.
Рассмотрим программу, которая,печатает квадрат числа от 2 до 25 используя функцию.
#include<stdio.h>
#include<inath.h>
square (int i); // Идет объявление функции
main()
{ clrscrf);
41
inti=2;
while(i++<25) // Вызывается функция
printf(« Квадрат(%d) числа =%d\n», i, square(i));
getch();
}.
// Идет определение функции
square(int x)
// Пишется тело функции
{ return (x*x); }
Варианты задач
1: Составить программу для определения среднего балла группы по результатам сессии.
Оценки групп сведены в матрицы А(25,5), В(23,5), С(22,5), D(24,5). Средний балл
вычислять в функции.
2: Составить программу для нахождения наименьших элементов матриц А(10,12),
В(15,10) и номеров строк и столбцов, в которых они находятся, используя функцию.
3: Составить программу для записи в массив Z положительных элементов массивов А(40),
В(50),С(30) подряд, используя функцию.
4: Составить программу для вычисления значения функции
Z=(xi + yi)/(x: + у2), где Xi.xi - корни уравнения ax2+bx+c=0; yi и у-> -корни уравнения
dy2+ey+f=0. Если корни хотя бы одного уравнения комплексные, то вычисляется
функция. Zk - (xi + V2j/(yi + уз), Для вычисления корней использовать функцию.
5: Составить программу для нахождения средних значений результатов экспериментов
Х(5,6), Y(7,4), Z(5,7). Результаты записать в массив Р(3). Для нахождения максимального
элемента матрицы использовать функцию.
6: Составить программу для нахождения элементов целочисленных массивов А(40), В(30),
С(60), кратных 3, используя функцию.
7: Составить программу для нахождения сумм элементов каждой строки матриц А(15,20)
и В(17,10), используя функцию.
8: Составить программу для вычисления и запоминания в массиве D(3) наибольших
элементов массивов A(n), B(m), C(k), используя функцию. Значения n, m, k не
превосходят 30.
9: Составить программу с использованием функции для вычисления суммы и количества
положительных элементов массивов А(7())„ В(80), С(65).
10: Чего больше: всех возможных трехзначных чисел, записываемых цифрами 1, 2, 3, 4, 5;
всех двухзначных чисел, записываемых цифрами 2, 4, 6, 8; всех четырехзначных чисел,
записываемых цифрами i. 3, 7, 8. 9 '?. Подсчет количества соответствующих чисел
оформить в виде функции.
11: В порт в среднем приходит 3 корабля в день. Какова вероятность того, что в порт в
день придет 2 корабля; 4 корабля?. Вычисление вероятности оформить в виде функции.
12: Два спортсмена одновременно начинают движение из одной точки. Первый спортсмен
начинает движение со скоростью 10 км/час и равномерно (линейно) за каждый
42
следующий час увеличивает скорость на 1 км. Второй начинает движение со скоростью 9
км/час и равномерно за каждый следующий час увеличивает скорость на 1,6 км/час.
Выяснить, какой спортсмен преодолеет больший путь через I час; через 4 час. Вычисление
путей оформить с помощью функций.
13: В задаче 12 определить когда второй спортсмен догонит первого. Решение
квадратного уравнения оформить в виде функции.
14: Футболист ударом ноги посылает мяч вертикально вверх с высоты 1 м с начальной
скоростью 20 м/с. На какой высоте мяч будет через 1с; Зс; 4с? Вычисление высоты
оформить с помощью функции.
15: В задаче 14 определить, когда мяч будет на высоте 5м; 10м. Решение квадратного
уравнения оформить в виде функции.
Лабораторная работа №7
Алгоритмы сортировки и поиска
Постановка задачи
Выполнить сортировку целочисленного массива (поиск в массиве) из n элементов.
Алгоритм сортировки (поиска) оформить в виде функции. Варианты заданий приведены в
табл. 3.
Таблица 3
Варианты заданий
№.
Метод сортировки (поиска)
1
Сортировка простой (линейной) вставкой
2
Бинарный поиск
3
Сортировка слиянием (метод фон Неймана)
4
Сортировка методом бинарной вставки без использования рабочего
массива
5
Сортировка Шелла (слияние с обменом)
6
Быстрая сортировка (метод Хоара)
7
Комбинированный метод быстрой сортировки с методом «пузырька»
8
Внешняя двухфазная сортировка прямым слиянием
9
Челночная сортировка (сортировка с просеиванием)
10
Интерполяционный поиск
11
Сортировка методом центрированной вставки (нахождение медианы)
12
Шейкер – сортировка
13
Сортировка методом бинарной вставки с использованием рабочего
массива
14
Обменная сортировка
15
Внешняя однофазная сортировка прямым слиянием
16
Внешняя сортировка естественным слиянием
17
Сортировка Шелла (слияние с обменом)
18
Внешняя сортировка сбалансированным слиянием
19
Сортировка простой (линейной) вставкой
20
Бинарный поиск
Методические указания
43
Алгоритмы сортировки и поиска приведены ниже. В приведенных алгоритмах
массивы упорядочиваются по возрастанию. Пример программы, выполняющей
сортировку массива методом «пузырька», приведен на рис.2.
Обменная сортировка.
Последовательно сравнивается элемент а0 с каждым последующим ai и, если ai<
а0, то эти два элемента меняются местами; таким образом наименьший элемент
оказывается на своем месте в начале массива. Затем этот метод применяется к элементу
а1 и т. д.
Шейкер – сортировка
В этом методе проходы массива выполняются поочередно: слева направо, а потом
справа налево. Последовательно сравниваются пары соседних элементов (а0 и а1, а1 и а2, и
т.д.) и, если надо, переставляются. Запоминается индекс последнего переставляемого
элемента (right). Далее массив просматривается справа налево, начиная с индекса right. В
этом проходе массива также выполняются сравнения соседних элементов и их
перестановка. Запоминается индекс последнего переставляемого элемента (left). Далее
опять выполняется проход слева направо от индекса left до индекса right и т.д.
Сортировка Шелла.
Выбирается интервал d между сравниваемыми элементами, и выполняется
сортировка массива методом «пузырька», но с шагом d. После этапа сортировки массива
с выбранным интервалом, этот интервал уменьшается и опять выполняется сортировка
массива методом «пузырька». Рекомендуется следующая последовательность значений d:
1, 3, 7, 15, 31, … ,т.е.
dk=(dk-1-1)/2
Максимальное значение d не должно превышать длину массива. Таким образом, в
этом алгоритме вначале сравниваются и, если надо переставляются далеко стоящие
элементы, а на последнем проходе – соседние.
Челночная сортировка
Последовательно сравниваются пары соседних элементов а0 и а1, а1 и а2, и т.д. и
если аi>ai+1, то элемент ai+1 продвигается влево насколько это возможно: он сравнивается
со своим предшественником и, если он меньше предшественника, то выполняется обмен
и начинается очередное сравнение. Когда передвигаемый влево элемент встречает
меньшего предшественника, то процесс передвижения влево прекращается и
возобновляется просмотр массива слева направо с той позиции, с которой выполнялся
обмен при продвижении слева направо.
Быстрая сортировка (метод Хоара)
Идея метода заключается в том, что вначале переставляются элементы, которые
находятся друг от друга на больших расстояниях. Выбирается элемент массива
(например, центральный), который разбивает массив на два подмножества. Пусть
значение этого элемента х. Элементы массива переставляются таким образом, чтобы
слева от x находились элементы аi<=x, а справа aj>=x. После перестановок элемент x
будет находиться на своем месте. Далее этот алгоритм разделения массива на левую и
правую части применяется к левой, а затем к правой частям, затем к частям частей и так
до тех пор, пока каждая из частей не будет состоять из единственного элемента. Таким
образом, в этой сортировке используется рекурсия. Алгоритм разделения элементов
массива начиная с элемента с индексом left до элемента с индексом right относительно
«центрального» элемента x: вводятся два индекса i и j, i=left; j=right. Элементы
просматриваются слева направо до тех пор, пока не обнаружится элемент ai>=x, затем
массив просматривается справа налево, пока не обнаружится элемент aj<=x. После этого
элементы меняются местами. Далее процесс просмотра и перестановки повторяется до
тех пор, пока не станет i>j.
Комбинированный метод быстрой сортировки с методом «пузырька»
В этом методе
рекурсивный алгоритм разделения массива быстрой сортировки
применяется только для подпоследовательностей массива, длина которых не менее
44
определенного размера m (m<=n). Для сортировки коротких подпоследовательностей
используется метод «пузырька».
Линейная вставка
Элементы массива делятся на уже упорядоченную последовательность а0, а1, …, аi1 и неупорядоченную аi, ai+1, …,an-1. В каждом проходе из неупорядоченной
последовательности извлекается элемент аi (в первом проходе i=1) и вставляется в
упорядоченную последовательность из i элементов без нарушения упорядоченности в
ней. Этот алгоритм повторяется для i=2,3,…,n-1. Алгоритм вставки аi в упорядоченную
последовательность из i элементов заключается в продвижении вставляемого элемента в
начало последовательности, сравнивая его с аi-1, ai-2 и т.д. Продвижение заканчивается на
элементе аj<=ai или при прохождении всей последовательности.
Бинарная вставка
В этом методе, в отличие от линейной вставки, для отыскания места для вставки
элемента ai в упорядоченную последовательность используется алгоритм бинарного
поиска, при котором элемент ai сравнивается со средним элементом упорядоченной
последовательности, а затем процесс деления пополам продолжается до тех пор, пока не
будет найдена точка включения.
Центрированная вставка
Алгоритм использует дополнительный рабочий массив. В позицию,
расположенную в центре рабочего массива помещается элемент а0. Он будет медианой.
Слева от медианы надо расположить все элемент, меньшие медианы, а справа – большие
или равные. Из сортируемого массива последовательно выбирается
элемент,
сравнивается с медианой и вставляется без нарушения упорядоченности в левую или
правую части массива. Если область памяти, выделенная для одной из частей, будет
исчерпана, то все элементы рабочего массива сдвигаются в противоположном
направлении и значение медианы изменяется. В конце алгоритма упорядоченные
элементы должны быть скопированы в исходный массив.
Метод фон Неймана
Упорядочить пары соседних элементов массива а (а0 и а1, а2 и а3 и т.д.) и перенести
их во вспомогательный массив b. Затем взять по две соседние пары из b и, слив их в
упорядоченные четверки, снова записать в а; затем каждые две четверки из b слить в
упорядоченные восьмерки и переписать в а и т.д. Упорядоченный массив должен
оказаться в массиве а.
Внешняя двухфазная сортировка прямым слиянием
Внешняя сортировка используется для сортировки файлов, размеры которых не
позволяют записать их во временные массивы в оперативной памяти. Для сортировки
используются три файла: c (исходный файл), a и b (вспомогательные файлы). Элементы
исходного файла с попеременно записываются то в а, то в файл b (фаза разделения).
Таким образом, в каждом файле создаются одноэлементные последовательности. Далее
формируются двухэлементные упорядоченные последовательности, в которых один
элемент берется из а, а другой из b (фаза слияния). Эти двухэлементные
последовательности записываются в файл с. Далее двухэлементные последовательности
попеременно записываются то в а, то в файл b (фаза разделения). Затем двухэлементные
последовательности из файлов a и b сливаются в упорядоченные четверки и
записываются в файл с (фаза слияния). Алгоритм разбиения файла с пополам и
формирование
упорядоченных
последовательностей
путем
слияния
пар
последовательностей из файлов a и b повторяется до тех пор, пока в файлах a и b не
образуется по одной упорядоченной последовательности,
которые окончательно
сливаются в отсортированный файл с.
В задании реализовать «внутреннюю» версию алгоритма для сортировки массива
из n элементов.
Внешняя однофазная сортировка прямым слиянием
45
Для сортировки используются четыре файла: c (исходный файл), a, b и d
(вспомогательные файлы). При первом проходе элементы исходного файла с
попеременно записываются то в а, то в файл b. Далее формируются двухэлементные
упорядоченные последовательности, в которых один элемент берется из а, а другой из b.
Эти двухэлементные последовательности попеременно записываются в файлы с и d.
Затем сливаются пары двухэлементных последовательностей из файлов c и d в
упорядоченные четверки, которые записываются попеременно в файлы a и b и т.д. В
конце алгоритма единая упорядоченная последовательность должна оказаться в файле с.
В задании реализовать «внутреннюю» версию алгоритма для сортировки массива
из n элементов.
Внешняя сортировка естественным слиянием
Сортировка, при которой сливаются две самые длинные из возможных
упорядоченных последовательностей, называется естественным слиянием. В алгоритме
используется исходный файл с и два вспомогательных файла a и b. В алгоритме при
первом проходе определяются как
можно более длинные упорядоченные
последовательности файла с. Далее эти последовательности попеременно записываются в
файлы a и b. На каждом следующем проходе пары i-х упорядоченных
последовательностей файлов a и b (i=1,2,3,…) сливаются в более длинные упорядоченные
последовательности и переносятся в файл с, после чего наступает фаза разделения:
последовательности попеременно записываются в файлы a. В конце алгоритма единая
упорядоченная последовательность должна оказаться в файле с.
В задании реализовать «внутреннюю» версию алгоритма для сортировки массива
из n элементов.
Внешняя сортировка сбалансированным слиянием
В алгоритме используется исходный файл с и три вспомогательных файла a, b, d.
В данном алгоритме при первом проходе определяются как можно более длинные
упорядоченные участки файла с. Далее эти участки попеременно записываются в файлы a
и b. На следующем этапе пары i-х упорядоченных последовательностей файлов a и b
(i=1,2,3,…) сливаются в более длинные упорядоченные последовательности и
попеременно переносятся в файлы с и d. Затем сливаются пары последовательностей
файлов с и d и попеременно переносятся в файлы a и b и т.д. В конце алгоритма единая
упорядоченная последовательность должна оказаться в файле с.
В задании реализовать «внутреннюю» версию алгоритма для сортировки массива
из n элементов.
Бинарный поиск
Алгоритм применяется к упорядоченному массиву, в котором надо найти номер
элемента с заданным значением x. Сначала х сравнивается со средним элементом
массива. Если совпадение найдено, то возвращается индекс среднего элемента, иначе
определяется, в какой половине массива следует выполнять поиск, применяя к ней
алгоритм бинарного поиска.
Интерполяционный поиск
Алгоритм применяется к упорядоченному массиву, в котором надо найти номер элемента
с заданным значением x. Если известно, что х находится между элементами al и ar, то
номер очередного элемента для сравнения вычисляется по формуле
m=l+(r-l)*(x-al)/(ar-al)
Если совпадение найдено, то возвращается индекс элемента (m), иначе определяется, в
какой части массива следует выполнять поиск, применяя к ней алгоритм
интерполяционного поиска.
#include <iostream.h>
#include <conio.h>
void sort(int a[], int n)
{
46
int i,j;
int c;
for(j=1;j<=n-1;j++)
for(i=0;i<n-j;i++)
if(a[i]>a[i+1])
{c=a[i];a[i]=a[i+1];a[i+1]=c;}
}
void main(void)
{
int a[10];
int n;
int i;
cout<<"n? ";
cin>>n;
cout<<"a?";
for(i=0;i<n;i++)
cin>>a[i];
sort(a,n);
//вызов функции сортировки
cout<<"a: ";
for(i=0;i<n;i++)
cout<<a[i]<<' ';
getch();
}
Рис. 2. Сортировка массива методом «пузырька»
Лабораторная работа № 8
Тема: Составной тип данных: структуры.
В отличие от массивов, все элементы которых должны быть одного типа,
структуры объединяют в одной переменной элементы
разных, типов.
Объявления структуры начинается с ключевого слова struct и имеет
два формата записи.
Формат 1:
struct [имя типа-структуры ]
{список-объявлений-элементов}
[ [описатель]…];
Формат 2:
struct наш типа-структуры описатель [описатель]
где имя типа-структуры - это идентификатор, который именует тип структуры.
Описатель - именует переменную структурного типа. Список-объявлений-элеменатов
содержит одно или несколько объявлений переменных или полей битов.
Квадратные скобки ([ ]) означает необязательный формат записи и могут быть опущены.
Объявление структуры задает имя структурной переменной и последовательность
переменных величин, называемых элементами структуры, которые могут иметь
различные типы. Элементы структуры могут быть любого основного типа, массивом,
указателем, смесью или структурой. Пример объявление структуры:
struct Teacher {
char fio[40];
int tab_nom;
float oklad; }
spisok[20],*tt;
struct Teacher_sc();
47
В этом примере объявляется структура типа Teacher из 20 элементов, указатель на
структуру типа Teacher и функция, возвращающая структуру типа Teacher.
Элементы структуры запоминаются последовательно в том же порядке, в котором они
объявляются: первому элементу соответствует самый младший адрес памяти, а
последнему - самый старший.
Память каждому элементу выделяется на границе, соответствующей его типу.
Для определения действительного размера структурной переменной надо
использовать операцию sizeof.
// Пример решения задачи с использованием струюyp (struct):
#include<stdio.h>
#tnclude<conio.h>
int main(void)
.
{ char nom _ tab[20];
char fam [20];
int vvod=0;
int loop, vozr;
double zarp;
struct kol _ struct
{char fam[20];
int vozr;
float zarp;
} kol[20];
printf («\n\n Введите номер таблицы (ведомости) ?: »);
scanf («%20s» ,nom_ tab);
fflush (stdin);
printf (« Сколько записей собираетесь ввести ( можно до 20);»);
scanf («%d», wod);
fflush (stdin);
for (loop=0;loop<vvod; ++loop)
{
printf (« Запись %d\n»,loop);
printf (« Фамилия :»);
scanf («%s».kol [loop].fain);
flush (stdin);
printf (« Ваш возраст :»);
scanf («%d», kol [loop]. vozr);
fflush (stdin);
printf (« Ваша зарплата :»);
scanf («%f»,kol [loop]. zarp );
flush (stdin);
}
primf («\n Теперь введите свою фамилию, возраст и зарплату \n»);
scinf («%20s %d %lf», fam, &vozr, &zarp»);
printf («\n\n Таблица( ведомость):%s\n», nom_tab);
printf (« Таблицу составил:%sвозраст %d $ 15.21F\n», fam , vozr, zarp);
printf («_______________________________________________\n»);
for ( loop = 0;loop< vvod; ++loop)
printf («%4d | % -20s|%5d|%15.21f\n»,
loop+1,
kol [loop]. fam,
kol loop].vozr,
kol [loop].zarp);
printf («_______________________________________________\n»);
48
return 0;
}
После компиляции и выполнение этой программы на экране появится следующие
запросы:
Введите номер таблицы (ведомости)?: 1
Сколько записей собираетесь ввести(можно до 20): 4
Запись 0:
Фамилия: Иванов И.
Ваш возраст: 23
Ваша зарплата. 345.67
Запись 1:
Фамилия: Сидоров В.
Ваш возраст: 22
Ваша зарплата. 545.67
Запись 2:
Фамилия: Токоев Р.
Ваш возраст: 25
Ваша зарплата. 742.00
Запись 3:
Фамилия: Нанаев Н.
Ваша возраст: 842.00
Теперь введите свою фамилию, возраст и зарплату:
Абдыкеримов 29 678.90
После этого получаем резултат в виде:
Таблица 1:
Таблицу составил: Абдыкеримов возраст: 29 $ 678.90
1
2
3
4
Иванов И.
Сидоров В.
Токоев Р.
Нанаев Н.
23
345.67
22
545.67
25
742.00
27
842.00
Варианты задач.
1. Дан файл с записями следующей структуры:
Номер
Факультет Ф.И.О.
Курс
зачетки
Группа
Шифр
предмета
Оценка
В зависимости от запроса необходимо выдать списки студентов заданного
факультета и курса, упорядочив их либо по труппам, а внутри групп по алфавиту, либо
просто по алфавиту. Кроме того, необходимо распечатать списки неуспевающих по
каждому предмету.
2. Задан файл с записями следующей структуры:
Реквизит
Шаблон
Номер зачетки
Факультет
Курс
Группа
Оценки
Записать его как индексно - последовательный файл и затем по запросу выдавать
либо списки успевающих, либо списки неуспевающих, либо полностью информацию по
какому - либо студенту.
49
3. Задан файл с записями следующей структуры
Факультет
Курс
Группа
Номер
зачетки
Оценки 1
Оценки 2
Оценки 3
Файл неупорядочен. Рассортировать его по факультету, курсу, группе, номеру
зачетки и распечатать, подсчитав количество неуспевающих и отличников по каждому
подразделению.
4. Вводится неупорядоченный файл с записями следующей структуры:
Номер зачетки
Ф.И.О.
Упорядочить его одним из методов сортировки по убыванию номеров зачеток.
5. Задан файл с записями следующей структуры:
Реквизит
Шаблон
Номер зачетки
Ф.И.О.
Курс
Группа
Оценки
Создать индексно-последовательный файл и одновременно распечатать его. Вместо
оценок выдавать признак успеваемости: неуд. –есть хотя бы одна двойка; уд. –все тройки;
см. – смешанные оценки; ох. –отлично и хорошо; отл. – отличные оценки.
6. Имеется файл, содержащий информацию об абитуриентах следующей структуры:
Реквизит
Шаблон
Факультет
Ф.И.О.
Оценки
Средний балл
Пол
Составить программу записи файла и вывода на печать списка абитуриентов:
имеющих средний балл 5; имеющих средний балл 4,5; имеющих средний балл ниже 4,5.
7. В универмаге имеется 5 секций. В конце каждого рабочего дня (на протяжении недели)
заведующий каждой секцией представляет отчет о сумме денег, на которую проданы
товары. Эта информация подготавливается в следующем виде:
Реквизит
Шаблон
Номер секции
Стоимость
Написать программу вычисления общей стоимости реализованной каждой секцией
продукции за неделю. Исходный файл записать, выдать, напечатать.
8. Задан входной файл, имеющий следующую структуру:
Реквизит
Шаблон
Ф.И.О.
Год рождения
Пол
Составить программу, которая подсчитывает школьников, дошкольников и
пенсионеров (старше 60 лет –мужчин, и старше 55 лет -женщин). Вывести файл на печать
и результаты счета.
50
9. Задан файл со следующей структурой:
Реквизит
Шаблон
Номер зачетки
Курс
Номер группы
Оценки (повторяется 5 раза)
Количество экзаменов
Вычислить итоговую успеваемость, на печать выдать в виде таблиц.
10. Файл имеет следующую структуру:
Реквизит
Шаблон
Номер курса
Ф.И.О.
Оценки (повторяется 5 раза)
Номер зачетной книжки
Адрес родителей
Он упорядочен по курсам. Составить программу подсчета числа отличников из
городов, сел, районов, центров по курсам и общего числа отличников. Результаты вывести
на печать.
11. Составить файл следующей структуры:
Реквизит
Шаблон
Курс
Группа
Ф.И.О.
Оценки
Выдать полученный файл на печать. Подсчитать количество отличников в заданной
группе. Результат отпечатать.
12. Дан файл следующей структуры:
Реквизит
Шаблон
Название команды
Количество побед
Количество ничьих
Количество поражений
Выдать на печать турнирную таблицу, рассортированную убыванию количества
очков, при равенстве очков – по убыванию количества побед, а при равенстве побед – в
произвольном порядке.
13. Чемпионат мира по волейболу проходит в 3 городах. Из каждого города в пресс –
центр поступает информация, имеющая следующий вид:
Реквизит
Шаблон
Страна
Очки
Количество выигранных партий
Количество проигранный партий
Требуется записать итоговую таблицу чемпионата, где команды должны быть
расставлены в порядке уменьшения количества очков. Таблицу распечатать.
51
14. Составить программу расположения в алфавитном порядке списка фамилий,
вводимого с клавиатуры. Всего вводится 30 фамилий каждая фамилия содержит не более
200 символов. Исходный список и упорядоченный вывести на печать.
15. Составить программу, которая упорядочивает список группы в алфавитном порядке.
Максимальное число вводимых фамилий 30, максимальное число букв в фамилии 20.
Лабораторная работа №9
Тема: Перегрузка ФУНКЦИЙ.
Постановка задачи
Используя алгоритм упорядочивания матрицы, разработанный в лабораторной
работе №5, разработать и протестировать две перегруженные функции, одна из которых
обрабатывает целочисленную матрицу, другая - вещественную матрицу (варианты 3-5, 9,
12, 13,19, 20) или матрицу, элементы которой строки (варианты 1, 2, 6-8, 10, 11, 14-18).
Пример решения (вариант 13).
Задание: Используя алгоритм упорядочивания матрицы, разработанный в лабораторной
работе №5, разработать и протестировать две перегруженные функции, одна из которых
обрабатывает целочисленную матрицу, другая - вещественную матрицу (варианты 3-5, 9,
12, 13,19, 20).
Текст программы:
//Упорядочивание матрицы
#pragma hdrstop
#pragma argsused
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <iomanip.h>
//Функция упорядочивания матрицы (тип int)
void sort(int a[][50], int n, int m)
{
//Объявление переменных
int count=0,i=0,k,b;
bool p;
do
{
p=false;
for (k=0;k<(n*m-1);k++)
{
if ((((n-1)-count%n)==k%n) && (((m-1)-count/n)==k/n))
{
p=true;
break;
}
if (a[k%n][k/n]<=0)
{
52
b=a[k%n][k/n];
a[k%n][k/n]=a[(n-1)-count%n][(m-1)-count/n];
a[(n-1)-count%n][(m-1)-count/n]=b;
count++;
break;
}
}
i++;
}
while (p!=true);
}
//Функция упорядочивания матрицы (тип float)
void sort(float a[][50], int n, int m)
{
//Объявление переменных
int count=0,i=0,k;
float b;
bool p;
do
{
p=false;
for (k=0;k<(n*m-1);k++)
{
if ((((n-1)-count%n)==k%n) && (((m-1)-count/n)==k/n))
{
p=true;
break;
}
if (a[k%n][k/n]<0)
{
b=a[k%n][k/n];
a[k%n][k/n]=a[(n-1)-count%n][(m-1)-count/n];
a[(n-1)-count%n][(m-1)-count/n]=b;
count++;
break;
}
}
i++;
}
while (p!=true);
}
//Функция заполнения матрицы (тип int)
void fill(int a[][50], int n, int m)
{
int i,j;
randomize();
for (i=0;i<n;i++)
for (j=0;j<m;j++)
53
{
//cout<<"a["<<(i+1)<<','<<(j+1)<<"]=";
//cin>>a[i][j];
a[i][j]=rand()%100-50;
}
}
//Функция заполнения матрицы (тип float)
void fill(float a[][50], int n, int m)
{
int i,j;
randomize();
for (i=0;i<n;i++)
for (j=0;j<m;j++)
{
//cout<<"a["<<(i+1)<<','<<(j+1)<<"]=";
//cin>>a[i][j];
a[i][j]=(rand()%1000-500)/100.0;
}
}
//Функция вывода матрицы на экран (тип int)
void print(int a[][50], int n, int m)
{
int i,j;
for (i=0;i<n;i++)
{ for (j=0;j<m;j++)
cout<<setw(4)<<a[i][j];
cout<<endl;
}
cout<<endl;
}
//Функция вывода матрицы на экран (тип float)
void print(float a[][50], int n, int m)
{ int i,j;
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
cout<<setprecision(2)<<setw(6)<<a[i][j];
cout<<endl;
}
cout<<endl;
}
//Основная программа
void main(void)
{
//объявление переменных
int a[100][50],i,j,n,m;
float b[100][50];
//ввод числа строк и столбцов
cout<<"Rows (from 1 to 100) >"; cin>>n;
cout<<"Cols (from 1 to 50) >"; cin>>m;
cout<<endl;
//заполнение матрицы
54
fill(a,n,m);
fill(b,n,m);
//вывод матрицы на экран
print(a,n,m);
print(b,n,m);
//упорядочивание
sort(a,n,m);
sort(b,n,m);
//вывод упорядоченной матрицы на экран
print(a,n,m);
print(b,n,m);
//задержка
getch();
}
Тестовый пример:
Rows (from 1 to 100) >10
Cols (from 1 to 50) >10
-22 -26 -6 -9 -31 29 -39 32 -44 -13
37 39 -34 21 35 -30 -33 27 -22 26
9 30 -47 -21 -10 -21 12 -41 28 29
-45 13 -1
7 -28 -2 47
5 -17 -22
-29 24 -4 20 33 -33 43 -1 -5 -7
-7 11 44 40 -45 -3 42 -36 39 10
-28 -8
7 18
0 -8 -38 -13 -17 35
0 26 -5 34 -35 -34 16
2 -44 -4
-10 -6 41 -25 -17 -31 -47 33
0 14
9 -31 -11 28 -3 18 44
0
2 40
-4.7 0.24
-3.1
2.9
0.59 -3.2
-4 0.63
3.2
3.7
1.4 -0.39
3.2 0.42
1.5 -4.2
3.4 0.44
-0.41
2.2
40
37
9
14
35
10
29
26
2
9
4.6
0.46
0.59
3.8
3.2
1.4
3.2
1.5
39
39
30
13
24
11
28
26
33
2
5
27
32
44
16
44
7
42
41
43
0.24
2.9
2.8
0.63
3.7
0.06
0.42
3.3
1.4
3.4
3.2 -4.3
0.03
1.3
-1.5
2.6
3.5 -2.3
-1.1
2.9
-1.4
4.7
-2.5 -1.2
0.91 -4.8
-4.6 -0.22
47
21
12
7
20
40
18
34
18
28
29
35
33
-28
-45
0
-35
-17
-3
-10
1.4
3.2
0.03
0.45
3.5
1.1
2.5
1.8
-30
-21
-2
-33
-3
-8
-34
-31
-31
-39
3.4
0.37
1.3
2.6
3.5
2.9
4.7
4.8
-4.8 -1.2
-4.2 -2.8
-1.6 0.29
2.2 0.48
-1.2
3.2
0.05
3.5
-0.5
4.4
1.1 -4.8
4.3 0.19
-1.5 -0.32
-33
-25
-21
-9
-11
-38
-5
-47
-4
-1
-47
-41
-34
-1
-36
-13
-6
-31
0
-44
3.9
2
4.6
2.2
3.2
0.05
0.19
1.1
-22
-6
-17
-5
-8
-17
-44
0
-26
-13
3.5
3.2
0.29
0.48
-2.8
-1.2
-4.8
-1.5
-3.9
3.8
1.1
3.2
4.8 -0.72
4.6 -3.9 -3.2
2
3.5 -3.7
3.9 -2.5 0.45
-1.1 -0.86 -3.1
2.1 0.37
3.3
-1.3
1.5 0.06
-4
1.8 -2.5
-3.1
2.5 -3.5
-1.6
-3.2
2.8
0.28
-2.6
-2.4
3.8
0.46
4.6
-0.1
-10
0
-22
-7
-28
-7
-4
-29
-45
-22
-0.5 -4.8 -0.72 -3.2
-1.2 -3.9 -3.2 -0.39
-1.6 -1.2 -3.7 -3.2
-4.2 -2.5 -1.1 -2.6
-1.1 -0.86 -3.1 -2.4
-4.8 -2.3 -1.5 -0.41
-1.3 -4.3 -4.2
-4
-4 -4.6 -2.5 -3.1
55
3.4
0.28
0.44
2.2
0.91
1.5
3.8
2.1
4.3 -0.32 -3.1
4.4 -3.9 -0.22
-2.5
-1.4
-3.5
-1.6
-0.1
-4.7
Лабораторная работа №5
Шаблоны функций
Постановка задачи
Создать шаблон функции, выполняющей сортировку или поиск элементов в
массиве. Протестировать шаблон для массивов с элементами различных типов: для
вариантов 2, 10 и 20 – int, short и char, а для остальных вариантов - int, float и char.
Варианты заданий:
№.
Метод сортировки (поиска)
1
Сортировка простой (линейной) вставкой
2
Бинарный поиск
3
Сортировка слиянием (метод фон Неймана)
4
Сортировка методом бинарной вставки без использования рабочего
массива
5
Сортировка Шелла (слияние с обменом)
6
Быстрая сортировка (метод Хоара)
7
Комбинированный метод быстрой сортировки с методом «пузырька»
8
Внешняя двухфазная сортировка прямым слиянием
9
Челночная сортировка (сортировка с просеиванием)
10
Интерполяционный поиск
11
Сортировка методом центрированной вставки (нахождение медианы)
12
Шейкер – сортировка
13
Сортировка методом бинарной вставки с использованием рабочего
массива
14
Обменная сортировка
15
Внешняя однофазная сортировка прямым слиянием
16
Внешняя сортировка естественным слиянием
17
Сортировка Шелла (слияние с обменом)
18
Внешняя сортировка сбалансированным слиянием
19
Сортировка простой (линейной) вставкой
20
Бинарный поиск
Методические указания
Пример шаблона функции перестановки значения двух числовых переменных
приведен на рис. 3.
56
template <class t>
void change (t a, t b)
{
t c;
c=a; a=b; b=c;
}
Рис. 3. Шаблон функции
Пример решения (вариант 13).
Задание: Создать шаблон функции, выполняющей сортировку или поиск элементов в
массиве. Протестировать шаблон для массивов с элементами различных типов: для
вариантов 2, 10 и 20 – int, short и char, а для остальных вариантов - int, float и char.
Текст программы:
//Сортировка массива методом бинарной вставки
//Использование шаблона функции
#pragma hdrstop
#pragma argsused
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <iomanip.h>
//Шаблон сортировки массива методом бинарной вставки
template <class TP>
void sort(TP a[], int n)
{
//Объявление переменных
int left, right, middle, i, j;
TP newElement;
for (i=1;i<n;i++)
{
//Обрабатываемый на данном этапе элемент
newElement=a[i];
//Границы отсортированной части массива
left=0; right=i-1;
while (left<=right)
{
//Средний элемент в отсортированной части
middle=(left+right)/2;
//Анализ отношения обрабатываемого и среднего элемента
if (a[middle]<=newElement)
left=middle+1;
else
right=middle-1;
}
//Сдвиг элементов вправо и вставка обрабатываемого элемента
//на новое место
57
for (j=i;j>right+1;j--) a[j]=a[j-1];
a[right+1]=newElement;
}
}
//Заполение массива, в зависимости от типа элементов
//(перегруженная функция)
void fill(int a[], int n)
{
randomize();
int i;
for (i=0;i<n;i++)
a[i]=rand()%1000;
}
void fill(float a[], int n)
{
randomize();
int i;
for (i=0;i<n;i++)
a[i]=(rand()%1000)/100.0;
}
void fill(char a[], int n)
{
randomize();
int i;
for (i=0;i<n;i++)
a[i]=rand()%200+56;
}
//Вывод массива на экран в зависимости от типа
//(перегруженная функция)
void print(int a[], int n)
{
int i;
for (i=0;i<n;i++)
cout<<setw(6)<<a[i];
cout<<endl<<endl;
}
void print(float a[], int n)
{
int i;
for (i=0;i<n;i++)
cout<<setprecision(2)<<setw(6)<<a[i];
cout<<endl<<endl;
}
void print(char a[], int n)
{
int i;
for (i=0;i<n;i++)
58
cout<<setw(6)<<a[i];
cout<<endl<<endl;
}
//Основная программа
void main(void)
{
//Объявление переменных
float a[100]; int b[100]; char c[100]; int n;
//Ввод числа элементов массивов
cout<<"Number of elements (from 1 to 100) >"; cin>>n;
cout<<endl;
//Заполнение массивов
fill(a,n); fill(b,n); fill(c,n);
//Вывод неотсортированных массивов на экран
print(a,n); print(b,n); print(c,n);
cout<<endl<<endl;
//Вызов функции сортировки массива
sort(a,n); sort(b,n); sort(c,n);
//Вывод отсортированных массивов на экран
print(a,n); print(b,n); print(c,n);
//Задержка
getch();
}
Тестовый пример:
Number of elements (from 1 to 100) >10
2 8.4 8.9 7.4 9.7 8.7 9.4 2.7 5.8 4.3
197 836 885 736 966 867 943 266 577 431
э
\
Ќ
А
Ю
{
З
z
й
W
2 2.7 4.3 5.8 7.4 8.4 8.7 8.9 9.4 9.7
197 266 431 577 736 836 867 885 943 966
Ќ
А
З
Ю
й
э
W
\
z
{
Лабораторная работа №11
Тема: Файловый ввод – вывод в С++
Постановка задачи.
Разработать программу, выполняющую следующие функции:
 поэкранный вывод текстового файла
 преобразование текстового файла в двоичный файл
 вывод двоичного файла
59
 выполнение дополнительной операции с двоичным файлом
Для работы с файлами использовать библиотеку классов потокового ввода – вывода
fstream.h.Текстовый файл создать с помощью любого текстового редактора, записав в
каждую строку файла информацию об одном экземпляре объекта. Варианты заданий
приведены в табл.11
Таблица 11
Варианты заданий
№
Объект
Дополнительная операция с двоичным файлом
1
ФИО, номер
Добавление информации о работнике в конец
подразделения, зарплата файла
2
Табельный номер, ФИО, Удаление записи о работнике с заданным
номер подразделения
табельным номером
3
Наименование товара,
Поиск товара с заданным наименованием
цена, количество
4
Телефон, ФИО, адрес
Изменение информации о владельце данного
телефона
5
Шифр студента, ФИО,
Подсчет количества студентов в заданной группе
группа
6
Шифр студента, ФИО,
Удаление записей о студентах, со средним
средний балл
баллом<3
7
Табельный номер, ФИО, Изменение кафедры у работника с заданным
кафедра
табельным номером
8
Наименование товара,
Добавление информации о товаре в конец файла
цена, количество
9
Шифр студента, год
Запись информации о студентах с заданной
поступления.
специальностью в новый файл
специальность
10
Шифр студента, четыре
Формирование нового файла, каждая запись
оценки
которого содержит шифр студента и средний
балл
11
ФИО, год рождения, пол Копирование файла в другой файл
12
Номер заказа, ФИО и
Поиск номеров заказа данного заказчика
телефон заказчика
13
Шифр группы, средний
Поиск лучшей группы
балл
14
Номер заказа, цена
Добавление нового заказа
заказа, заказчик
15
Автор, название и год
Удаление книги с заданным названием и
издания книги
заданного автора
16
Номер задания, имя
Формирование нового файла, из заданий с
задания, количество
числом страниц, большим заданного
страниц
17
Код работника,
Изменение опыта работы у работника с заданным
профессия, опыт работы кодом на новое значение
18
Код детали,
Добавление новой детали
наименование детали
19
Табельный номер,
Подсчет работников из заданного подразделения
должность,
подразделение
20
Авторы, название,
Копирование файла в другой файл
специальность для
учебного пособия
60
Методические указания
В С++ для работы с файлами определены три класса потоков:
ifstream
Файловый поток ввода (чтения) данных из файла
ofstream
Файловый поток вывода (записи) данных в файл
fstream
Файловый поток ввода и вывода данных
Объявления этих классов находятся в заголовочном файле <fstream.h>.
Основные компонентные функции классов-потоков приведены в табл. 12.
Таблица 12
Компонентные функции классов-потоков
Функция
Описание функции
void open(«Внешнее имя
Открывает файл
файла»[, режим])
ostream& write(const signed
Выводит в выходной поток n символов из
char*, int n)
массива, на который указывает первый
параметр
istream& read (const signed char*, Читает из входного потока n символов в
int n)
массив, на который указывает первый параметр
int eof(void)
void close(void)
ostream& seekp (смещение, точка
отсчета)
istream& seekg (смещение, точка
отсчета)
long tellg()
long tellp()
Тестирует конец файла (1- конец файла)
Закрывает поток (файл)
Смещает указатель записи выходного потока на
заданное число байтов от точки отсчета (0начало, 1-текщая позиция, 2-конец потока)
Смещает указатель записи входного потока на
заданное число байтов от точки отсчета (0начало, 1-текщая позиция, 2-конец потока)
Возвращает текущую позицию указателя
чтения входного потока
Возвращает текущую позицию указателя
записи выходного потока
Значения параметра «режим» функции открытия файла приведены в табл. 13.
Таблица 13
Режимы открытия файла
Значение параметра
Описание параметра
«режим»
ios::in
Задает режим открытия файла для ввода
ios::out
Задает режим открытия файла для вывода
ios::ate
Задает режим открытия файла для добавления в конец
файла
ios::app
Задает режим открытия файла для добавления в конец
файла
ios::trunc
Удаляет содержимое файла
ios::binary
Задает режим открытия файла в двоичном режиме
Для обмена данными с двоичными файлами используются компонентные функции
read и write, а для работы с текстовыми файлами - перегруженные операции >> и <<. На
рис. 18 приведена программа, которая создает текстовый файл и записывает в него
данные. Пример программы чтения записи с заданным номером из двоичного файла
приведен на рис. 19.
61
#include <conio.h>
#include <fstream.h>
#include <stdlib.h>
struct rab
{
long nom;
char fam[15];
char name[15];
int zar;
int nal;
};
void main(void)
{
rab r;
ofstream f;
// выходной поток
char name[12]; // имя файла
cout<<"Введите имя файла";
cin>>name;
f.open(name); //открытие файла для записи
if(!f)
//проверка выполнения операции открытия
{ cout<<"Ошибка"; getch(); exit(1); }
for(int i=1;i<=10;i++) //цикл ввода данных и записи в файл
{cout<<"? "; cin>>r.nom>>r.fam>>r.name>>r.zar>>r.nal;
f<<r.nom<<" "<<r.fam<<" "<<r.name<<" "<<r.zar<<" "<<r.nal <<endl;}
f.close();
}
Рис. 18. Создание текстового файла
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
struct rab
{
long nom;
char fam[15];
char name[15];
int zar;
int nal;
};
void main(void)
{
rab r;
int n;
ifstream f;
//входной поток
f.open("d:\\user\\b.dat",ios::binary| ios::in);
if(!f)
{ cout<<"Ошибка"; getch(); exit(1);}
cout<<"n ? "; cin>>n;
f.seekg((n-1)*sizeof(r));
// перемещение указателя на запись
f.read((char*)&r,sizeof(r));
//чтение записи в структуру cout<<r.nom<<" "<<r.fam<<"
"<<r.name<<" "<<r.zar<<" "<<r.nal <<endl;
f.close();
}
62
Рис. 19. Чтение из двоичного файла
63
ТЕСТЫ
1-Й СЕМЕСТР
Вариант 1.
1. В детской игре "Угадай число" первый участник загадал целое число в промежутке от 1
до 8. Второй участник задает вопросы: "Загаданное число больше числа ...?" Какое
количество вопросов при правильной стратегии (интервал чисел в каждом вопросе
делится пополам) гарантирует угадывание? а) 1; б) 2; в) 3; г) 4.
2. Определить истинность составного высказывания: "(2*2=4 или 3*3=10) и (2*2=5 или
3*3=9)". а) ложно; б) истинно; в) не ложно и не истинно; г) не истинно.
3. Фрагмент алгоритма изображен в виде блок-схемы. Определите, какое значение
переменной S будет напечатано в результате выполнения алгоритма.
а) 12; б) 3; в) 4; г) 8.
4. Какой тип переменной определяет зарезервированное слово char?
а) строковый; б) символьный; в) вещественный; г) логический.
5. Дан фрагмент программы.
… i:=13; while i>1 do i:=i-3; …
Сколько раз будет выполнен цикл? а) ни разу; б) 4 раза; в) 5 раз; г) произойдет
зацикливание.
6. Дан фрагмент программы.
I:=10; if i>9 then i:=11; if i<11 then i:=9; if i>10 then i:=8 else if (i>11) or (i<9)
then i:=12; writeln(i).
Что будет выведено на экран? а) 8; б) 9; в) 11; г) 12.
7. Дана программа.
label 2,3; var I,j:integer; begin J:=3; i:=4; j:=i-2; i:=i-2; case j of 2: i:=i+1; 3: i:=i+3; end;
case I of 2: goto 2; 3: goto 3 end; 2: i:=i+2; 3: writeln(i) end.
Что будет выведено на экран? а) 3; б) 4; в) 5; г) 7.
Вариант 2.
1. В детской игре "Угадай число" первый участник загадал целое число в промежутке от 1
до 12. Второй участник задает вопросы: "Загаданное число больше числа ...?" Какое
количество вопросов при правильной стратегии (интервал чисел в каждом вопросе
делится пополам) гарантирует угадывание? а) 1; б) 2; в) 3; г) 4.
2. Определить истинность составного высказывания: "(2*2=4 или 3*3=9) или (2*2=5 или
3*3=9)". а) ложно; б) истинно; в) не ложно и не истинно; г) не истинно.
64
3. Фрагмент алгоритма изображен в виде блок-схемы. Определите, какое значение
переменной S будет напечатано в результате выполнения алгоритма.
а) 12; б) 15; в) 4; г) 8.
4. Какой тип переменной определяет зарезервированное слово boolean?
а) строковый; б) символьный; в) вещественный; г) логический.
5. Дан фрагмент программы.
… i:=13; while i<1 do i:=i-3; …
Сколько раз будет выполнен цикл? а) ни разу; б) 4 раза; в) 5 раз; г) произойдет
зацикливание.
6. Дан фрагмент программы.
I:=15;if i>=15 then i:=16;if i<=16 then i:=14;if i>14 then i:=15 else if (i>16) or
(i<15) then i:=17; writeln(i).
Что будет выведено на экран? а) 14; б) 15; в) 16; г) 17.
7. Дана программа.
label 12,13;var I,j:integer; begin J:=12; i:=13; j:=i-1; i:=i-1; case j of 12: i:=i+1;
13: i:=i+3;end; case I of 12: goto 12; 13: goto 13 end; 12: i:=i+2; 13: writeln(i) end.
Что будет выведено на экран? а) 13; б) 14; в) 15; г) 17.
Вариант 3.
1. В детской игре "Угадай число" первый участник загадал целое число в промежутке от 1
до 16. Второй участник задает вопросы: "Загаданное число больше числа ...?" Какое
количество вопросов при правильной стратегии (интервал чисел в каждом вопросе
делится пополам) гарантирует угадывание? а) 51; б) 2; в) 3; г) 4.
2. Определить истинность составного высказывания: "(2*2>=4 и 3*3>=10) и (2*2<=5 или
3*3<=9)". а) ложно; б) истинно; в) не ложно и не истинно; г) не истинно.
3. Фрагмент алгоритма изображен в виде блок-схемы. Определите, какое значение
переменной S будет напечатано в результате выполнения алгоритма.
а) 12; б) 3; в) 4; г) 8.
4. Какой тип переменной определяет зарезервированное слово real?
65
а) строковый; б) символьный; в) вещественный; г) логический.
5. Дан фрагмент программы.
… i:=-17; while i<=1 do i:=i+4; …
Сколько раз будет выполнен цикл? а) ни разу; б) 5 раз; в) 6 раз; г) произойдет
зацикливание.
6. Дан фрагмент программы.
I:=8;if (i>=9) or (i<8) then i:=7;if i<=8 then i:=10;if i>9 then i:=9 else if i<8 then
i:=8; writeln(i).
Что будет выведено на экран?а) 7; б) 8; в) 9; г) 10.
7. Дана программа.
label 21,22;var I, j: integer; begin J:=21; i:=22; j:=i-1; i:=i-1; case j of 21: i:=i+1;
22: i:=i+3; end; case I of 21: goto 21; 22: goto 21 end; 21: i:=i+2; 22: writeln(i) end.
Что будет выведено на экран? а) 20; б) 21; в) 22; г) ничего.
Вариант 4.
1. В детской игре "Угадай число" первый участник загадал целое число в промежутке от 1
до 20. Второй участник задает вопросы: "Загаданное число больше числа ...?" Какое
количество вопросов при правильной стратегии (интервал чисел в каждом вопросе
делится пополам) гарантирует угадывание? а) 5; б) 2; в) 3; г) 4.
2. Определить истинность составного высказывания: "(2*2>=4 и 3*3>=10) или (2*2 =5 и
3*3=9)". а) ложно; б) истинно; в) не ложно и не истинно; г) не истинно.
3. Фрагмент алгоритма изображен в виде блок-схемы. Определите, какое значение
переменной S будет напечатано в результате выполнения алгоритма.
а) 7; б) 16; в) 4; г) 8.
4. Что означает зарезервированное слово mod?
а) модуль числа; б) целая часть результата деления;
в) остаток от деления нацело; г) дробная часть от деления.
5. Дан фрагмент программы.
… i:=-17; while i<=1 do i:=i-4; …
Сколько раз будет выполнен цикл? а) ни разу; б) 5 раз; в) 6 раз; г) произойдет
зацикливание.
6. Дан фрагмент программы.
I:=12; if (i>=11) and (i<10) then i:=13; if i<=12 then i:=11; if i>11 then i:=10 else
if i<=10 then i:=12; writeln(i).
Что будет выведено на экран? а) 10; б) 11; в) 12; г) 13.
66
7. Дана программа.
label 10,20;var I,j:integer; begin J:=20; i:=15; j:=i-5; i:=i+5; case j of 10: i:=i-10;
20: i:=20; end; case I of 10: goto 10; 20: goto 20 end;10: i:=i+5; 20: writeln(i) end.
Что будет выведено на экран? а) 10; б) 15; в) 20; г) ничего.
Ответы:
№ задания
1
2
3
4
5
6
7
Вариант 1
в
б
г
б
б
а
а
Вариант 2
г
б
б
г
а
а
а
Вариант 3
г
а
г
в
в
в
г
Вариант 4
а
а
а
в
г
б
г
67
Download