30.07.2015 Views

x - Донбаська державна машинобудівна академія

x - Донбаська державна машинобудівна академія

x - Донбаська державна машинобудівна академія

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

ДОДАТОК 1Обчислювальна техніка та програмуванняКурс 3 (прискорена заочна форма навчання). Семестр 7.Студент у письмовому вигляді готовить відповідь на два питання. Вибір варіантів - подвум останнім цифрам залікової книжки у відповідності з наступною таблицею:ПершацифраномераОстання цифра номера0 1 2 3 4 5 6 7 8 90 19,10 1,11 3,12 5,13 7,14 9,15 11,16 13,17 15,18 17,191 19,1 2,12 4,10 6,18 8,2 10,6 12,4 14,8 16,1 18,32 1,14 2,16 3,17 4,9 5,7 6,11 7,13 8,15 9,19 10,53 3,19 10,12 4,14 7,12 8,11 1,19 3,8 13,9 3,9 9,134 4,18 11,5 8,16 5,16 3,14 2,13 4,10 5,11 2,7 14,65 5,17 9,7 15,3 8,10 6,10 3,11 5,9 6,7 6,8 8,16 6,16 6,14 18,7 9,14 5,19 4,16 13,4 8,12 11,4 9,87 7,15 8,19 17,8 8,12 2,18 5,14 19,7 9,14 15,7 3,178 8,14 6,18 2,11 1,19 1,15 6,12 15,1 2,18 12,5 18,119 9,13 9,11 3,16 3,10 4,17 7,15 3,17 1,8 11,10 2,16Питання:1. Довідкова система Windows. Способи одержання довідкової інформації.2. Початок роботи в Windows Робітник стіл. Головне меню. Панель завдань. Робота змишею. Багатовіконний інтерфейс.3. Графічний редактор Paint. Вікно програми Paint. Набір інструментів. Прийоми малювання.Форми й координати покажчика.4. Шрифти й печатка. Типи шрифтів, печатка документів. Перегляд документів передпечаткою.5. Настроювання системи Windows. Меню Пуск (Настроювання. Вікна ―Властивостіекрана‖, ―Мова й стандарти‖, ―Властивості: Клавіатура‖.6. Установка й видалення додатків Windows.7. Відкриття й збереження документів у додатках Windows. Печатка документів. Настойкипринтера.8. Вікна. Види вікон. Елементи вікна. Операційне меню вікна. Панелі інструментів.Стан вікна. Зміна розмірів і стану вікна.9. Файли й файлова система Windows. Основні додатки для роботи з файлами.10. Папка мій комп'ютер. Призначення. Основні функції й прийоми роботи.11. Провідник Windows (Windows explorer). Призначення. Структура вікна. Основніфункції. Прийоми роботи.12. Способи відображення об'єктів у вікнах роботи з файловою системою: при відкриттій збереженні файлів, Провіднику, папці Мій комп'ютер і т.п. Сортування об'єктів.13. Основні елементи вікна діалогу. Призначення. Прийоми роботи.14. Ярлики. Призначення. Створення ярликів.15. Копіювання й переміщення об'єктів (папок, файлів).16. Стандартні програми. Блокнот. Калькулятор.17. Пошук файлів, папок, додатків.2


верхнєнижнєлівеправеМіжрядковийінтервалАбзацний відступКолонтитул18. Меню. Призначення. Види меню. Контекстне меню.19. Буфер обміну Clipboard. Використання буфера для копіювання й переміщення інформаціїв Windows.ОФОРМЛЕННЯ КОНТРОЛЬНОЇ РОБОТИ:Титульний лист оформлюється у наступному вигляді:Міністерство освіти і науки, молоді та спорту УкраїниДонбаська державна машинобудівна академіяКафедра Прикладної математикиКОНТРОЛЬНА РОБОТАз дисципліни«Обчислювальна техніка та програмування»Номер залікової книжки 110317Виконав:студент групи ЕСА-10-1з(т)Іванов Іван ПетровичПеревірив:канд.пед.наук, доцент каф. ПМЗагребельний С.Л.Краматорськ – 2012Поля сторінки, міжрядковийінтервал, абзацнийвідступ, параметризаголовка, параметриосновного тексту, нумераціясторінок та колонтитулидив. у таблиці№2.У колонтитулі повиннобути написане: Прізвище,ім’я студента,шифр групи та варіант.Обсяг відповіді не менше3-х сторінок на кожнепитання. У відповідіможна використовуватискановані малюнки тамалюнки ScreenShot. Вкінці КР повинен бутисписок використанихджерел (література), неменше 10.Робота здається тазахищається викладачу,який веде практику.Поля сторінкиТаблиця №2Стиль заголовкаСтиль основноготекстуНумераціясторінок2 2 3 1,5 1,5 1,25Arial, розмір18 pt, полужирний,поцентруTimes New Roman,розмір 14 pt, вирівнюванняпо шириніаркуша.Внизу поцентруВверхусправаЛекторС.Л.Загребельний3


Министерство образования и науки, молодежи и спорта УкраиныДонбасская государственная машиностроительная академия (ДГМА)С. Л. Загребельный,А. В. КолотПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ С++В СРЕДЕ VISUAL STUDIO 2010Учебное пособиедля студентов специальности8.05070204 «Электромеханические системыавтоматизации и электропривод»КраматорскДГМА20124


УДК 004.43 (075.8)ББК 32.97я73З-14Рецензенти:Башков Е. А., д-р техн. наук, профессор, Донецкий национальныйтехнический университет;Марченко И. К., д-р техн. наук, профессор, Краматорский экономико-гуманитарныйінститут.Розглянуто теоретичні відомості з програмування для підготовки студентівспеціальності 8.05070204 «Електромеханічні системи автоматизації та електропривід».Детально описано приклади програм, показано хід виконання лабораторнихробіт за допомогою блок-схем. Наведено завдання для самостійної роботистудентів. Кожна лабораторна робота містить контрольні питання для самоперевірки.Загребельный, С. Л.З-14 Программирование на языке С++ в среде Visual Studio 2010 : учебноепособие для студентов специальности 8.05070204 «Электромеханическиесистемы автоматизации и электропривод» / С. Л. Загребельный,А. В. Колот. – Краматорск : ДГМА, 2012. – 148 с.ISBN 978-966-379-545-4Рассмотрены теоретические сведения по программированию для подготовкистудентов специальности 8.05070204 «Электромеханические системы автоматизациии электропривод». Подробно описаны примеры програм, показан ходвыполнения лабораторных работ с помощью блок-схем. Приведены заданиядля самостоятельной работы студентов. Каждая лабораторная работа содержитконтрольные вопросы для самопроверки.УДК 004.43 (075.8)ББК 32.97я73ISBN 978-966-379-545-4© С. Л. Загребельный,А. В. Колот, 2012© ДГМА, 20125


СОДЕРЖАНИЕВведение ........................................................................................................... 8Требования к выполнению и оформлению лабораторных работ.................. 9Лабораторная работа 1. Знакомство со средой Microsoft Visual Studio 2010и настройка компилятора языка С++. Стандартный ввод-вывод.Создание простейшей программы на языке С++. .........................................101.1 Теоретическая часть ..............................................................................101.2 Задание к лабораторной работе ............................................................241.3 Контрольные вопросы ...........................................................................24Лабораторная работа 2. Переменные и базовые типы данных языка С++.Создание программы линейного алгоритма..................................................252.1 Теоретическая часть ..............................................................................252.1.1 Понятие алгоритма. Блок-схема .....................................................252.1.2 Алфавит и лексемы языка С++ .......................................................282.1.3 Математические функции в языке программирования С++ .........372.2 Практическая часть ...............................................................................392.3 Индивидуальные задания ......................................................................422.4 Контрольные вопросы ...........................................................................44Лабораторная работа 3. Принятие решений. Условные операторыв языке С++ .....................................................................................................453.1 Теоретическая часть ..............................................................................453.1.1 Оператор if .......................................................................................453.1.2 Конструкция if–else .........................................................................463.1.3 Конструкция if–else if–else if–...–else .............................................463.1.4 Оператор switch ...............................................................................473.1.5 Условный оператор .........................................................................483.1.6 Оператор break (от английского – прерывать) ...............................483.1.7 Оператор continue (от английского – продолжать) .......................493.1.8 Оператор goto ..................................................................................493.2 Практическая часть ...............................................................................513.3 Индивидуальные задания ......................................................................583.4 Контрольные вопросы ...........................................................................60Лабораторная работа 4. Организация циклов в языке С++ ..........................614.1 Теоретическая часть ..............................................................................614.1.1 Оператор while..............................................................................614.1.2 Оператор for ..................................................................................624.1.3 Оператор do–while.......................................................................634.2 Практическая часть ...............................................................................644.3 Индивидуальные задания ......................................................................724.4 Контрольные вопросы ...........................................................................74Лабораторная работа 5. Одномерные числовые массивы в языкепрограммирования С++. Селективная обработка элементов массива.Нахождение минимального и максимального элементов массива. .............756


5.1 Теоретическая часть ..............................................................................755.1.1 Одномерные массивы......................................................................755.1.2 Инициализация массива ..................................................................765.2 Практическая часть ...............................................................................765.3 Индивидуальные задания ......................................................................845.4 Контрольные вопросы ...........................................................................87Лабораторная работа 6. Понятие многомерного массива.Обработка элементов матриц .........................................................................886.1 Теоретическая часть ..............................................................................886.1.1 Двухмерные массивы, матрицы .....................................................886.1.2 Многомерные массивы ...................................................................886.1.3 Инициализация массивов ................................................................896.2 Практическая часть ...............................................................................906.3 Индивидуальные задания ......................................................................996.4 Контрольные вопросы ......................................................................... 102Лабораторная работа 7. Построение графика функции .............................. 1037.1 Теоретическая часть ............................................................................ 1037.2 Практическая часть ............................................................................. 1117.3 Индивидуальные задания .................................................................... 1187.4 Контрольные вопросы ......................................................................... 120Лабораторная работа 8. Файловый ввод и вывод в языке С++ .................. 1218.1 Теоретическая часть ............................................................................ 1218.2 Практическая часть ............................................................................. 1258.3 Индивидуальные задания .................................................................... 1368.4 Контрольные вопросы ......................................................................... 138Самостоятельная работа. Обработка элементов диагоналей квадратныхматриц ........................................................................................................... 1399.1 Теоретическая часть ............................................................................ 1399.1.1 Селективная обработка элементов массива ................................. 1399.1.2 Сортировка выбором .................................................................... 1409.1.3 Сортировка методом пузырька .................................................... 1419.2 Практическая часть ............................................................................. 1419.3 Индивидуальные задания .................................................................... 1459.4 Контрольные вопросы ......................................................................... 146Приложение А ............................................................................................... 147Приложение Б .............................................................................................. 148Список литературы ....................................................................................... 1507


Рисунок 1.2 – Окно с выбором нового проектаСреда Visual Studio отобразит окно Создать Проект, в которомнеобходимо выбрать тип создаваемого проекта. Проект используетсяв Visual Studio для логической группировки нескольких файлов, содержащихисходный код, на одном из поддерживаемых языков программирования,а также любых вспомогательных файлов. Обычно после сборки проекта(которая включает компиляцию всех всходящих в проект файлов исходногокода) создается один исполняемый модуль.В окне Создать Проект следует развернуть узел Visual С++, обратитьсяк пункту Win32 и на центральной панели выбрать Консольное приложениеWin32. Выбор этой опции показан на рис. рис. 1.3.Рисунок 1.3 – Выбор типа проекта12


Затем в поле редактора Имя (где по умолчанию имеется ) следует ввести имя проекта, например hell. В поле Расположениеможно указать путь размещения проекта, или выбрать путь размещенияпроекта с помощью клавиши (кнопки) Обзор. По умолчанию проект сохраняетсяв специальной папке Projects. Пример выбора имени проекта показанона рис. 1.4.Рисунок 1.4 – Пример задания имени проектаОдновременно с созданием проекта Visual Studio создает решение.Решение (solution) – это способ объединения нескольких проектов для организацииболее удобной работы с ними.После нажатия кнопки OK откроется окно Мастер приложенийWin32, показанное на рис. 1.5.Выбор имени проекта может быть достаточно произвольным: допустимоиспользовать числовое значение, допустимо имя задавать через буквырусского алфавита.В дальнейшем будем использовать имя, набранное с помощью буквлатинского алфавита и, может быть, с добавлением цифр.Рисунок 1.5 – Мастер создания приложения13


На первой странице представлена информация о создаваемом проекте,на второй можно сделать первичные настройки проекта. После обращенияк странице Параметры приложения, или после нажатия кнопкиДалее получим окно, показанное на рис. рис. 1.6.Рисунок 1.6 – Страница мастера настройки проекта по умолчаниюВ дополнительных опциях (Параметры приложения) следует поставитьгалочку в поле Пустой проект и убрать галочку в поле Предварительноскомпилированный заголовок. Получим экранную форму, показаннуюна рис. 1.7.Рисунок 1.7 – Выполненная настройка мастера приложений14


Здесь и далее будут создавать проекты по приведенной схеме, т. е.проекты в консольном приложении, которые должны создаваться целикомпрограммистом (за счет выбора Пустой проект). После нажатия кнопкиГотово, получим экранную форму, показанную на рис. 1.8, где приведенапоследовательность действий добавления файла для создания исходногокода к проекту. Стандартный путь для этого: подвести курсор мышик пункту Проект, выбрать Добавить новый элемент.Рисунок 1.8 – Меню добавления нового элемента к проектуПосле выбора (нажатия) Новый элемент получим окно, показанноена рис. 1.9, где через пункт меню Код узла Visual C++ выполнено обращениек центральной части панели, в которой осуществляется выбор типафайлов. В данном случае требуется обратиться к закладке C++ File (*.cpp).Рисунок 1.9 – Окно выбора типа файла для подключения к проекту15


Теперь в поле редактора Имя (в нижней части окна) следует задатьимя нового файла и указать расширение ".с". Например, main.c. Имя файламожет быть достаточно произвольным, но имеется негласное соглашение,что имя файла должно отражать его назначение и логически описыватьисходный код, который в нем содержится. В проекте, состоящемиз нескольких файлов, имеет смысл выделить файл, содержащий главнуюфункцию программы, с которой она начнет выполняться. В данном пособиитакому файлу мы будем задавать имя main.c, где расширение .с указываетна то, что этот файл содержит исходный код на языке С, и он будеттранслироваться соответствующим компилятором. Программам на языкеС принято давать расширение .с. После задания имени файла в поле редактораName получим форму, показанную на рис. 1.10.Рисунок 1.10 – Задание имени файла, подключаемому к проектуЗатем следует нажать кнопку Добавить. Вид среды Visual Studioпосле добавления первого файла к проекту показан на рис. 1.11.Для добавленного файла автоматически открывается редактор.Рисунок 1.11 – Подключение файла проекта16


В папке проекта отображаются файлы, включенные в проект в папках.Приведем описание.Папка Файлы исходного кода предназначена для файлов с исходнымкодом. В этой папке отображаются файлы с расширением .с.Папка Заголовочные файлы содержит заголовочные файлы с расширением.h.Папка Файлы ресурсов содержит файлы ресурсов, например изображенияи т. д.Папка Внешние зависимости отображает файлы, не добавленныеявно в проект, но использующиеся в файлах исходного кода, напримервключенные при помощи директивы #include. Обычно в папке Внешниезависимости присутствуют заголовочные файлы стандартной библиотеки,использующиеся в проекте.Следующий шаг состоит в настройке проекта. Для этого в менюПроект главного меню следует выбрать Свойства hell (или с помощьюпоследовательного нажатия клавиш Alt+F7). Пример обращения к этомупункту меню показан на рис. 1.12.Рисунок 1.12 – Обращение к странице свойств проектаПосле того как произойдет открытие окна свойств проекта, следуетобратиться (с левой стороны) к Свойства конфигурации. Появится ниспадающийсписок, который показан на рис. 1.13. Выполнить обращение к узлуОбщие, и через него в левой панели выбрать Набор символов,где установить свойство Использовать многобайтовую кодировку.Настройка Набор символов позволяет выбрать, какая кодировка символов– ANSI или UNICODE – будет использована при компиляции программы.Для совместимости со стандартом C89 мы выбираем Использоватьмногобайтовую кодировку. Это позволяет использовать многие привычныефункции, например функции по выводу информации на консоль.17


свойство Обеспечение согласования видимости переменных, объявленныхв заголовке оператора цикла for установить в да(/Zc:forScope),свойство Включить информацию о типах время выполнения установитьв Нет (/GR–), свойство Поддержка Open MP (разрешить расширениеOpen MP – используется при написании программ для многопроцессорныхсистем) установить в Нет(/openmp–).Результат выполнения этих действий показан на рис. 1.15.Рисунок 1.15 – Страница свойств закладки ЯзыкПосле выполнения указанных действий следует нажать клавишуПрименить. Далее в ниспадающем списке узла С/С++ следует выбратьпункт Дополнительно и в правой панели изменить свойство Компилироватькак в свойство компиляции языка С, т. е. Компилировать как код C(/TC). Результат установки компилятора языка С показан на рис. 1.16.Рисунок 1.16 – Результат выбора режима компиляции языка С19


После нажатия клавиш Применить и ОК сначала откроется подготовленныйпроект с пустым полем редактора кода, в котором можноначать писать программы. В этом редакторе наберем программу, выводящуютрадиционное приветствие "Hello World". Для компиляции созданнойпрограммы можно обратиться в меню Построение, или, например, набратьклавиши Ctr+F7. В случае успешной компиляции получим следующуюэкранную форму, показанную на рис. 1.17.Рисунок 1.17 – Успешно откомпилированная первая программа на языке СДля приведенного кода программы запуск на ее исполнение из окнаредактора в Visual Studio 2010 можно нажать клавишу F5. На рис. 1.18 показанрезультат исполнения первой программы.Рисунок 1.18 – Консольный вывод первой программы на языке С20


Примечание. Вывод требуемой информации осуществляетсяс помощью букв латинского алфавита. Комментарии в программе могутбыть сделаны после символа "//" или внутри комбинации символов "/* */".Произведем разбор первой программы. Во-первых, надо отметить,что в языке С нет стандартных инструкций (операторов) для вывода сообщенийна консоль (окно пользователя). В языке С предусматриваются специальныебиблиотечные файлы, в которых имеются функции для этих целей.В приведенной программе используется заголовочный файл с именемstdio.h (стандартный ввод–вывод), который должен быть включен в началопрограммы. Для вывода сообщения на консоль используется функцияprintf(). Для работы с консолью включен также заголовочный файлconio.h., который поддерживает функцию _getch(), которая извлекает символиз потока ввода, т. е. она предназначенна для приема сообщенияо нажатии какой-либо (почти любой) клавиши на клавиатуре. С другимикомпиляторами, возможно, потребуется getch(), т. е. без префиксного нижнегоподчеркивания. Строка программыint main (void)сообщает системе, что именем программы является main() – главная функция,и что она возвращает целое число, о чем указывает аббревиатура"int". Имя main() – это специальное имя, которое указывает, где программадолжна начать выполнение. Наличие круглых скобок после слова main()свидетельствует о том, что это имя функции. Если содержимое круглыхскобок отсутствует или в них содержится служебное слово void, то этоозначает, что в функцию main() не передается никаких аргументов. Телофункции main() ограничено парой фигурных скобок. Все утверждения программы,заключенные в фигурные скобки, будут относиться к функцииmain().В теле функции main() имеются еще три функции. Во-первых, функцииprintf() находятся в библиотеке компилятора языка С, и они печатаютили отображают те аргументы, которые были подставлены вместо параметров.Символ "\n" составляет единый символ newline (новая строка), т. е.с помощью этого символа осуществляется перевод на новую строку. Символ"\t" осуществляет табуляцию, т. е. начало вывода результатов программыс отступом вправо.Функция без параметров _getch() извлекает символ из потока ввода(т. е. ожидает нажатия почти любой клавиши). С другими компиляторами,возможно, потребуется getch(), т.е. без префиксного нижнего подчеркивания.Последнее утверждение в первой программеreturn 0;указывает на то, что выполнение функции main() закончено и что в системувозвращается значение 0 (целое число). Нуль используется в соответствиис соглашением об индикации успешного завершения программы.21


В завершение следует отметить, что все действия в программезавершаются символом точки с запятой.Все файлы проекта сохраняются в той папке, которая сформироваласьпосле указания в поле Location имени проекта (hell). На рис. 1.19показаны папки и файлы проекта Visual Studio 2010.Рисунок 1.19 – Файлы и папки созданного проектаНа рис. 1.19 файлы с полученными расширениями означают:hell.sln – файл решения для созданной программы. Он содержит информациюо том, какие проекты входят в данное решение. Обычно, этипроекты расположены в отдельных подкаталогах. Например, наш проектнаходится в подкаталоге hell;hell.suo – файл настроек среды Visual Studio при работе с решением,включает информацию об открытых окнах, их расположении и прочихпользовательских параметрах.hell.sdf – файл, содержащий вспомогательную информацию о проекте,который используется инструментами анализа кода Visual Studio, такимикак IntelliSense для отображения подсказок об именах и т. д.Файлы папки Debug показаны на рис. 1.20.22


Рисунок 1.20 – Файлы папки DebugРассмотрим файлы в соответствии с рис. 1.20.hell.exe – исполняемый файл проекта;hell.ilk – файл "incremental linker", используемый компоновщикомдля ускорения процесса компоновки;hell.pdb – отладочная информация/информация об именах в исполняемыхфайлах, используемая отладчиком.Файлы папки hell показаны на рис. 1.21.Рисунок 1.21 – Содержимое папки hell23


Характеристика содержимого папки hell:main.c – файл исходного программного кода,hell.vcxproj – файл проекта,hell.vcxproj.user – файл пользовательских настроек, связанныхс проектом,hell.vcxproj.filters – файл с описанием фильтров, используемыхVisual Studio Solution Explorer для организации и отображения файловс исходным кодом.1.2 Задание к лабораторной работеРазобраться с программой Visual Studio 2010 и суметь создать консольнуюпрограмму по выше показанному примеру.1.3 Контрольные вопросы1 Назовите компиляторы языка С?2 Какое имя имеет исполняемый файл созданного проекта?3 Объясните назначение заголовочных файлов stdio.h, conio.h.4 Как будет работать программа без заголовочного файла conio.h?5 В каком месте программы находится точка ее входа?6 Как осуществляется табуляция строки на консоли и на сколькопозиций выполняется отступ от левого края?7 Какое значение имеет главная функция проекта main() в программахна языке С?24


ЛАБОРАТОРНАЯ РАБОТА 2Переменные и базовые типы данных языка С++.Создание программы линейного алгоритмаЦель: научится создавать блок-схемы и программы линейного алгоритма,записывать математические выражения на языке С++.2.1 Теоретическая часть2.1.1 Понятие алгоритма. Блок-схемаАлгоритм – конечная последовательность предписаний, однозначноопределяющая процесс преобразования исходных данных в результат решениязадачи.В процессе разработки алгоритма могут использоваться различныеспособы его описания. Наиболее распространенные:− словесная запись;− графические схемы алгоритмов (блок-схемы);− псевдокод (формальные алгоритмические языки);− структурограммы.Блок-схема – это графическое представление алгоритма, дополненноеэлементами словесной записи. На блок-схеме каждый пункт алгоритмаизображается соответствующей геометрической фигурой. В таблице 2.1.приведены графические элементы, на которых компонуются блок-схемы,их названия и символы.Таблица 2.1 – Графические элементы блок-схемНазвание блокаБлокОтображаемаяфункцияНачало-конецНачало, конец, входвыходв программахБлок ввода-выводаВвод данных либовывод результатовна экранБлок выводаВывод данныхна печать25


Продолжение таблицы 2.1ПроцессВычислениеили последовательностьвычисленийПредопределенныйпроцессВыполнениеподпрограммыАльтернативаПроверка условийМодификацияНачало циклаСоединительРазрыв линий потокаинформации в пределаходной страницыВ таблице 2.2. приведены основные базовые элементарные структурыдля составления блок-схем.Таблица 2.2 – Базовые структуры блок-схемНазвание типаИзображениеструктурыПоследовательность+ -Разветвление(выбор)26


Продолжение таблицы 2.2+ -Сокращенная записьразветвленияВыбор варианта-Цикл с предусловием+Цикл с постусловием-++ -Цикл с параметрами27


2.1.2 Алфавит и лексемы языка С++В алфавит языка С входят: прописные и строчные буквы латинского алфавита; цифры: 0,1,2,3,4,5,6,7,8,9; специальные знаки:” {} , [] () | + - / \ % ;‘ : < = > _ ! & # ^ . *~Из символов алфавита формируются лексемы языка: идентификаторы; ключевые (служебные, иначе зарезервированные) слова; константы; знаки операций; разделители (знаки пунктуации).Рассмотрим эти лексические элементы языка подробнее.Идентификатор – последовательность из букв латинского алфавита,десятичных цифр и символов подчеркивания, начинающаяся не с цифры:RUN run hard_RAM_disk сору_54Прописные и строчные буквы различаются. Таким образом, в этомпримере два первых идентификатора различны. На длину различаемой частиидентификатора конкретные реализации накладывают ограничение. Компиляторыразличают не более 32-х первых символов любого идентификатора.Некоторые реализации С++ на ЭВМ типа VAX допускают идентификаторыдлиной до 8 символов.Ключевые (служебные) слова – это идентификаторы, зарезервированныев языке для специального использования. Ключевые слова С++:asm else private throwauto enum protected trybreak extern public typedefcase float register typeidcatch for return unionchar friend short unsignedclass goto signed virtualconst if sizeof voidcontinue inline static volatiledefault int struct whiledelete long switchdo new templatedouble operator this28


Ранее в языке С++ был зарезервирован в качестве ключевого словаидентификатор overload. Для компиляторов фирмы Borland (ВС++ и ТС++)дополнительно введены ключевые слова:cdecl _export _loadds _saveregs_cs far near _seg_ds huge pascal _ssеs interrupt regparamТам же введены как служебные слова регистровые переменные:_АН _СН _SI _SS_AL _CL _DI _ES_AX _CX _BP _FLAGS_ВН _DH _SP_BL _DL _CS_BX _DX _DSОтметим, что ранние версии ВС++ и ТС++ не включали в качествеключевых слов идентификаторы throw, try, typeid, catch.He все из перечисленных служебных слов сразу же необходимы программисту,однако запрещено использовать их в качестве произвольно выбираемыхимен, и список служебных слов нужно иметь уже на начальномэтапе знакомства с языком С++. Кроме того, идентификаторы, включающиедва подряд символа подчеркивания (__), резервируются для реализацийС++ и стандартных библиотек. Идентификаторы, начинающиесяс символа подчеркивания (_), используются в реализациях языка Си.В связи с этим начинать выбираемые пользователем идентификаторыс символа подчеркивания и использовать в них два подряд символа подчеркиванияне рекомендуется.Константа (литерал) – это лексема, представляющая изображениефиксированного числового, строкового или символьного (литерного)значения.Константы делятся на пять групп: целые, вещественные (с плавающейточкой), перечислимые, символьные (литерные) и строковые(строки или литерные строки). Перечислимые константы проект стандартаязыка С++ [2] относит к одному из целочисленных типов.Компилятор, выделив константу в качестве лексемы, относит еѐк той или другой группе, а внутри группы – к тому или иному типу данныхпо ее «внешнему виду» (по форме записи) в исходном тексте и по числовомузначению.Целые константы могут быть десятичными, восьмеричнымии шестнадцатеричными.Фундаментальные объекты данных, с которыми работает программа,– это переменные и константы. Используемые в программе переменныеперечисляются в объявлениях или декларациях, в которых указываетсяих тип, а также иногда их начальные значения.С именами переменных связывается тип данных, который контролируетсякомпилятором и для которого выделяется определенное количествобайтов памяти. Имена переменных должны начинаться с буквы (латинского29


алфавита) или символа подчеркивания (например, _aza), за которым могутследовать любые комбинации букв в любом регистре (заглавныеили строчные), символы подчеркивания или цифры 0–9. В языке С имеетсяразличие между заглавными и строчными буквами. Поэтому переменнаяWorld будет отличаться от переменной world и т. п. При этом в определениипеременной не разрешается символ пробела (пробелов) и некоторыедругие символы, например $... .Стандарт С89 определяет пять базовых типов данных:int – целочисленный тип, целое число;float – вещественное число одинарной точности с плавающей точкой;double – вещественное число двойной точности с плавающей точкой;char – символьный тип для определения одного символа;void – тип без значения.Кроме того, существуют модификаторы, которые могут применятьсяк этим базовым типам. Ряд компиляторов может поддерживать еще и логическийтип _Bool. Тип void служит для объявления функции, не возвращающейзначения, или для создания универсального указателя (pointer).Объект типа char всегда занимает 1 байт памяти. Размеры объектовдругих типов, как правило, зависят от среды программирования и операционнойсистемы.Приведем модификаторы базовых типов данных. К ним относятсяследующие спецификаторы, предшествующие им в тексте программы:signed, unsigned, long, shortБазовый тип int может быть модифицирован каждым из перечисленныхспецификаторов. Тип char модифицируется с помощью unsignedи signed, тип double – с помощью long.В табл. 2.3 приведены допустимые комбинации типов данных языкаС с их минимальным диапазоном значений и типичным размером.Таблица 2.3 – Типы данных языка СТип данныхТипичный Минимально допустимыйразмер в битах диапазон значенийchar 8 (или 1 байт) от –127 до 127unsigned char 8 от 0 до 255signed char 8 от –127 до 127int 16 или 32 от –32767 до 32767unsigned int 16 или 32 от 0 до 65535signed int 16 или 32 от –32767 до 32767short int 16 от –32767 до 32767unsigned short int 16 от 0 до 65535signed short int 16 от –32767 до 32767long int 32 от –2147483647 до 2147483647long long int 64 от –(2 63 –1 ) до (2 63 –1) для С9930


Продолжение таблицы 2.3signed long int 32 от –2147483647 до 2147483647unsigned long int 32 от 0 до 4294967295unsigned long long int 64 от 0 до (2 64 –1) для С99float 32от 1Е–37 до 1Е+37 (с точностьюне менее 6 значащих десятичныхцифр)double 64от 1Е–37 до 1Е+37 (с точностьюне менее 10 значащих десятичныхцифр)long double 80от 1Е–37 до 1Е+37 (с точностьюне менее 10 значащих десятичныхцифр)Для базового типа int возможны следующие записи с модификатором:signed или signed intunsigned или unsigned intlong или long intshort или short intДля данных вещественного типа максимальные значения абсолютныхвеличин представлены в табл. 2.4.Таблица 2.4 – Вещественные типы данных языка СТип данныхТипичный размерв битахДиапазон абсолютных величинfloat 32 от 3.4Е–38 до 3.4Е+37double 64 от 1.7Е–308 до 1.7Е+308long double 80 от 3.4Е–4932 до 1.1Е+4932В языке С предусматривается преобразование типов в выраженияхи приведение типов. Если в выражении смешаны различные типы литералови переменных, то компилятор преобразует их в один тип. Во-первых,все char и short int значения автоматически преобразуются (с расширением"типоразмера") в тип int. Этот процесс называется целочисленным расширением(integral promotion). Во-вторых, все операнды преобразуются (такжес расширением "типоразмера") в тип самого большого операнда. Этотпроцесс называется расширением типа (type promotion), причем он выполняетсяпооперационно. Например, если один операнд имеет тип int, а другой– long int, то тип int расширяется в тип long int. Или если хотя бы одиниз операндов имеет тип double, то любой другой операнд приводится к типуdouble. Это означает, что такие преобразования, как тип char в типdouble, вполне допустимы (если предусматривать, к чему это приведет).После преобразования оба операнда будут иметь один и тот же тип, а результатоперации – тип, совпадающий с типом операндов. Приведемпоследовательность преобразования типов в выражениях по старшинству:31


Для заполнения нулями перед спецификацией ширины поля нужно поместитьнуль, т. е. 0. Например, спецификация формата %05d дополнит нулямивыводимое целое число, в котором менее пяти цифр, чтобы общаядлина равнялась пяти символам. Действие модификатора точности зависитот кода формата, к которому он применяется. Чтобы добавить модификаторточности, следует поставить за спецификатором ширины поля десятичнуюточку, а после нее – требуемое значение точности (число знаковпосле десятичной точки). Применительно к целым числам модификаторточности задает минимальное количество выводимых цифр. При необходимостиперед целым числом будут добавлены нули. Если модификаторточности применяется к строкам, то число, следующее за точкой, задаетмаксимальную длину поля. Например, спецификация %5.7s выведет строкудлиной не менее пяти, но не более семи символов. Если выводимая строкаокажется длиннее максимальной длины поля, конечные символы будут отсечены.По умолчанию все выводимые значения выравниваются по правомукраю: если ширина поля больше выводимого значения, то оно будетвыровнено по правому краю поля. Чтобы установить выравнивание по левомукраю, нужно поставить знак "минус" ("–") сразу после знака процента.Например, спецификация формата % – 10.4f обеспечит выравниваниевещественного числа с четырьмя десятичными знаками по левому краюв 10-символьном поле. Существуют два модификатора формата, позволяющиефункции printf() отображать короткие и длинные целые числа. Этомодификатор l (латинская буква эль) уведомляет функцию printf() о длинномтипе значения. Модификатор h сообщает функции printf(), что нужновывести число короткого целого типа. Кроме того, модификатор l можнопоставить перед командами форматирования вещественных чисел. В этомслучае он уведомит о выводе значения типа long double.Спецификаторы формата для функции printf() перечислены в табл. 2.5.Таблица 2.5 – Спецификаторы формата функции printf()КодФормат%c Символ%d Десятичное целое число со знаком%i Десятичное целое число со знаком%e Экспоненциальное представление числа (в виде мантиссыи порядка, е — на нижнем регистре)%E Экспоненциальное представление числа (в виде мантиссыи порядка, Е — на верхнем регистре)%f Десятичное число с плавающей точкой%F Десятичное число с плавающей точкой (только стандарт С99;если применяется к бесконечности или нечисловому значению,то выдает надписи INF, INFINITY(бесконечность) или NAN —Not A Number на верхнем регистре. Спецификатор %f выводитих эквиваленты на нижнем регистре)33


Продолжение таблицы 2.5%g Использует более короткий из форматов %e или %f%G Использует более короткий из форматов %E или %F%o Восьмеричное число без знака%s Символьная строка%x Шестнадцатеричное без знака (строчные буквы)%X Шестнадцатеричное без знака (прописные буквы)%p Выводит указатель%n Соответствующий аргумент должен быть указателем на целоечисло. (Этот спецификатор указывает, что в целочисленнойпеременной, на которую указывает ассоциированный с даннымспецификатором указатель, будет храниться число символов,выведенных к моменту обработки спецификации %n)%% Выводит знак процентаПрототип функции getchar() имеет следующий вид:int getchar(void);Функция getchar() возвращает из стандартного потока stdin (входногопотока данных) следующий символ. При чтении символа предполагается,что символ имеет тип unsigned char, который потом преобразуется в целый.При достижении конца файла, как и при обнаружении ошибки, функцияgetchar() возвращает значение EOF (End Of File – конец файла).Прототип функции gets имеет следующий вид:char *gets(char *str);Функция gets() читает символы (включая пробелы) из стандартногопотока stdin и помещает их в массив символов, адресуемый указателем *str(далее это массив символов). Символы читаются до тех пор, пока не встретитсяразделитель строк или значение EOF. Для реализации EOF на клавиатуреследует набрать одновременно Ctrl+Z. Вместо разделителя строкв конец строки вставляется нулевой символ, свидетельствующий о ее завершении.Следует учесть, что нет способа ограничить количество символов,которое прочитает функция gets(). Поэтому массив, адресуемый указателем*str, может переполниться, и тогда программа выдаст непредсказуемыерезультаты.Прототип функции scanf() имеет следующий вид:int scanf(const char *format, ?);Функция scanf() представляет собой функцию для ввода данных общегоназначения, которая читает поток stdin и сохраняет информациюв переменных, перечисленных в списке аргументов. Если в строке форматированиявстретится разделитель, то функция scanf() пропустит один34


или несколько разделителей во входном потоке. Под разделителем,или пробельным символом, подразумевают пробел, символ табуляции \tили разделитель строк \n. Все переменные должны передаваться посредствомсвоих адресов, например, с помощью символа &. Управляющая строка,задаваемая параметром format, состоит из символов трех категорий: спецификаторовформата, пробельных символов, символов, отличных от пробельных.Спецификация формата начинается знаком % и сообщает функцииscanf() тип данного, которое будет прочитано. Спецификации форматафункции scanf() приведены в табл.2.6.Таблица 2.6 – Спецификаторы формата функции scanf()КодФормат%c Читает один символ%d Читает десятичное целое число%i Читает целое число в любом формате (десятичное, восьмеричноеили шестнадцатеричное)%u Читает десятичное целое число типа short int%e Читает число с плавающей точкой (и в экспоненциальной форме)%E Аналогично коду %e%f Читает число с плавающей точкой%lf Читает десятичное число с плавающей точкой типа double%F Аналогично коду %f (для стандарта С99)%g Читает число с плавающей точкой.%G Аналогично коду %g%o Читает восьмеричное число%x Читает шестнадцатеричное число%X Аналогично коду %x%s Читает строку%p Читает указатель%n Принимает целое значение, равное количеству прочитанныхдо сих пор символов%[ ] Просматривает набор символов%% Читает знак процентаСтрока форматирования читается слева направо, и спецификацииформата сопоставляются с аргументом в порядке их перечисления в спискеаргументов. Символ *, стоящий после знака % и перед кодом формата, прочитаетданные заданного типа, но запретит их присваивание. Команды форматированиямогут содержать модификатор максимальной длины поля. Онпредставляет собой целое число, располагаемое между знаком % и кодомформата, которое ограничивает количество читаемых для всех полей символов.Если входной поток содержит больше заданного количества симво-35


лов, то при последующем обращении к операции ввода чтение начнетсяс того места, в котором «остановился» предыдущий вызов функции scanf().Если разделитель (например, пробел) встретится раньше, чем достигнутамаксимальная ширина поля, то ввод данных завершится. В этом случаефункция scanf() переходит к чтению следующего поля. При чтении одиночныхсимволов символы табуляции и разделители строк читаются подобнолюбому другому символу.В программах бывает необходимость определять константы.В языке С типы констант можно задавать явно при использовании суффиксов.Например:long int j = –12345678L; /* суффикс L */unsigned int a = 678U; /* суффикс U */float x = 123.45F; /* суффикс F */long double z = 12345678.99L; /* суффикс L* /По умолчанию спецификации f, e, g заставляют функцию scanf()присваивать переменным типа float. Если перед одной из этих спецификацийпоставить модификатор l, то функция scanf() присвоит прочитанныеданные переменной типа double.Функция scanf() поддерживает спецификатор формата общего назначения,называемый набором сканируемых символов. В этом случае определяетсянабор символов, которые могут быть прочитаны функцией scanf()и присвоены соответствующему массиву символов. Для определения такогонабора символы, подлежащие сканированию, необходимо заключитьв квадратные скобки. Открывающая квадратная скобка должна следоватьсразу за знаком процента. При использовании набора сканируемых символовфункция scanf() продолжает читать символы и помещать их в соответствующиймассив символов до тех пор, пока не встретится символ, отсутствующийв данном наборе. Если первый символ в наборе является знаком"^", то получится обратный эффект: входное поле читается до тех пор,пока не встретится символ из заданного набора сканируемых символов,т. е. знак "^" заставляет функцию scanf() читать только те символы, которыеотсутствуют в наборе сканируемых символов. Если в строке форматированиявстретился символ, отличный от разделителя, то функция scanf()прочитает и отбросит его. Если заданный символ не найден, то функцияscanf() завершает работу.В таких средах разработки как MS Visual Studio 2008 и 2010 рекомендуетсядля безопасной работы применять функции gets_s() и scanf_s().Для этих функций при чтении символа или строки следует указать размерв байтах, соответственно для символа или строки. Например, scanf_s("%c",&ch, 1). В Visual Studio 2010 тип данных char занимает 1 байт.36


2.1.3 Математические функции в языке программирования С++Таблица 2.7 – Запись математических функций в С++МатематическаяфункцияНазваниефункцииФункция на языкепрограммирования С++Поясненнеarccos x арккосинусаrccosh(x)обратныйгиперболическийкосинусarcsin x арксинусArcsinh(x)arctgxarctgh x3xcosh xxexобратныйгиперболическийсинусарктангенсобратныйгиперболическийтангенскубическийкореньгиперболический косинусэкспонентачисламодуль числа(абсолютнаявеличина)#include doubleacos(double x);float acosf(float x);#include doubleacosh(double x);float acoshf(float x);#include doubleasin(double x);float asinf(float x);#include doubleasinh(double x);float asinhf(float x);#include doubleatan(double x);float atanf(float x);#include doubleatanh(double x);float atanhf(float x);#include doublecbrt(double x);float cbrtf(float x);#include doublecosh(double x);float coshf(float x);#include doubleexp(double x);float expf(float x);#include doublefabs(double x);float fabsf(float x);аргумент для acosдолжен находитьсяв отрезке [-1,1].Acos и acosf возвращаютзначения в радианахна промежуткеот 0 до pi.x должен бытьбольше либоравен 1.аргумент для asinдолжен находитьсяв отрезке [-1,1].Asin и asinf возвращаютзначенияв радианах в промежуткеот –pi/2до pi/2.ни atanh, ни atanhfне являются ANSIC – функциями.atan и atanf возвращаютзначенияв радианах на промежуткеот –pi/2до pi/2.ни atanh, ни atanhfне являются ANSIC - функциями.Является стандартнойфункциейANSI CУглы определеныв радианах.Является стандартнойфункциейANSI CЯвляется стандартнойфункциейANSI C37


Продолжение таблицы 2.7Min и maxmodln xlg xyxrint, rintf,xнаименьшееи наибольшееближайшиецелыеостатокот деленияв виде числас плавающейточкойнатуральныйлогарифмлогарифмпо основанию10возведениеоснования хв степень уокруглениедо ближайшегоцелогоостаток отделения х/уквадратныйкореньиз числаsin x синусcos xsinh xкосинусгиперболическийсинусtg xтангенсtgh xгиперболическийтангенс#include doublefloor(double x);float floorf(float x);double ceil(double x);float ceilf(float x);#include doublefmod(double x, doubley); floatfmodf(float x,float y);#include doublelog(double x);float logf(float x);#include doublelog10(double x);float log10f(float x);#include doublepow(double x, doubley);float powf(float x,float y);#include double rint(double x);float rintf(float x);double remainder(doublex, double y);float remainderf(floatx, float y);#include doublesqrt(double x);float sqrtf(float x);#include doublesin(double x);float sinf(float x);#include doublecos(double x);float cosf(float x);#include doublesinh(double x);float sinhf(float x);#include doubletan(double x);float tanf(float x);#include doubletanh(double x);float tanhf(float x);Является стандартнойфункциейANSI CЯвляется стандартнойфункциейANSI CЯвляется стандартнойфункциейANSI Clog10 возвращаетзначение логарифмапо основанию 10от х. Он определяетсякак ln(х)/ln(10).Является стандартнойфункциейANSI CЯвляется стандартнойфункциейANSI Cэто будет числомежду –y/2 и y/2.вычисляет арифметический(неотрицательный)квадратныйкореньиз аргументаУглы определеныв радианах.Углы определеныв радианах.Углы определеныв радианах.Углы определеныв радианах.Углы определеныв радианах.tanh(x) определяетсякак sinh(x)/cos(x)38


2.2 Практическая частьПример 1. Напишите программу вычисления площади круга и егодлины окружности по заданному радиусу, вводимого пользователем с клавиатуры,а также вывода на консоль максимальных значений чисел типаint, float и double.Для решения примера следует воспользоваться математической библиотекойкомпилятора, т. е. включить в программу заголовочный файл., а также заголовочные файлы , .Программный код решения примера:#include #include // Для числа пи ( )#define _USE_MATH_DEFINES#include #include #include int main (void){double R, Sr, Lr;printf("\n Enter a real greater than zero: ");scanf_s("%lf", &R);Sr = M_PI*R*R;Lr = 2*M_PI*R;printf("\n Area of a circle of radius R = %g is %g", R, Sr);printf("\n The length of a circle of radius R = %g is%g",R,Lr);puts("");printf("\n Maximum integer: %d\n ", INT_MAX);printf(" Maximum real number of float: %g\n ", FLT_MAX);printf("Maximum real number type double: %g\n ", DBL_MAX);printf("\n Press any key: ");_getch();return 0;}В программу включена константа _USE_MATH_DEFINES для работыс числом M_PI ( ). Остальные константы можно найти в справочнойдокументации компилятора. Например, через меню Help →Index системыMS Visual Studio 2008.Функция scanf_s() определена в компиляторе языка С системыMS Visual Studio 2008. С этой функцией компилятор не выдает пр е-дупреждений.Результат выполнения программы показан на рис. 2.1.39


Рисунок 2.1 – Пример использования предопределенных константВ начале функции int main(void) сделано объявление переменных,которые будут использоваться в программе. Каждый тип переменныхобъявлен через запятую.Функции printf() выводят либо только сообщения, либо еще заданныепеременные соответствующих типов.Функция gets() позволяет считывать символы с наличием разделителей,в частности, с пробелами. В Microsoft Visual Studio 2010 рекомендуетсяиспользовать gets_s(), чтобы не было предупреждений.Следует обратить внимание на формат записи функций scanf(). Еслисканируются числа, или одиночные символы, то присваивание этих символовпеременным, которые были объвлены через соответствующие типыданных, осуществляется с помощью взятия адреса этих переменных, т. е.с помощью символа &, например, scanf_s(«%c»,&ch, 1). При сканированиимассива символов, т. е. при сканировании строки, символ & не используется.Имя массива само по себе является указателем. Обращение к адресу осуществляетсяс помощью указателей (будут рассмотрены позднее).Для сканирования чисел типа double в функции scanf_s() используетсяспецификатор l.Пример 2. Создать блок-схему к программе и программу на языкепрограммирования Си++ для вычисления функции В, которая зависитот трех переменных x, y, z. Ввод значений переменных сделать с клавиа-2туры, если B x 3xy z , где z x y 3.Окно с программой показано на рис. 2.2, а блок-схема к заданиюна рис.2.3.40


Рисунок 2.2 – Окно программы Примера 2Программный код решения примера:/** Вторая программа на языке СИ* Автор Загребельный С.Л.*/#include #include #define _USE_MATH_DEFINES#include #include #include int main (void){double x,y,z,b;printf("\n Enter x = ");scanf_s("%lf", &x);printf("\n Enter y = ");scanf_s("%lf", &y);z=pow((x+y),3);printf("\n z = %1.2f", z);b=pow(x,2)+3*x*y+sqrt(z);printf("\n b = %lf ",b);printf("\n press any key ");_getch();return 0;}41


НачалоВвод значенийх, уВычисление функции Zz x y 3Вывод значения ZВычисление функции В2B x 3xy zВывод значения ВКонецРисунок 2.3 – Блок-схема примера 2В программу включена библиотека математических функций math.h,в которой sqrt() – функция извлечения квадратного корня, pow(а, b) –функция возводит в степень b число по основанию а. Все эти функции возвращаютрезультат типа double и вычисляют от числа (выражения) такжетипа double.Результат выполнения программы показан на рис. 2.4.Рисунок 2.4 – Окно вывода результата Примера 22.3 Индивидуальные заданияСоставить блок-схему к программе и программу на языке программированияС++ для вычисления функций b = f(x,y,z) , где z = w(x,y) при постоянныхзначениях x и y (см. пример 2). Значения x и y заданы в таблице 2.8.42


Таблица 2.8 – Индивидуальные заданияВариант f(x,y,z) w(x,y) x y12e x ( tg(z) 2y)sin 2 x + y -4,52 0,752x sin(2y)zz e yy z /( y x)cos( x) ( y x)3 2456 243x2xycos( y)2,87 0,8415yy ctg ( x)1,82 18,25XZ20xy +3x y e-0,85 1,252 3x y3sin( x / y)ln( x y 2) z2 25,34 33,852xxarctg ( z)y x sin(y)0,12 -8,75y x3z1573yyx 2x zx e2z3x8 sin( y 5)32y xcos ( y) 39 cos( ) sin( ) 2tg 2 x ( y)x y ( z)yx ex yy 2ysin( x)210 ln ( z )2z11 sin(y)3y x 512132cos ( z)214 sin( y )32y x1,54 3,261,58 3,42sin 2 0,42 -0,873 -15,24 4,67xarctg (2y)yxe12x e3 x yyx y/x + 3 yz e x2ln( ex y x )1e z 15 ( yxy e) cos( z3 )16176,55 -2,78-2,75 -1,421,82 18,2323 2cos ( y) sin ( x ) 0,84 0,65x 6ysin( x) ln( y)2 3x4yex y x38z ln xx 10y ln( x) zx1tg2( x2ln( y y x )182 x / 2( z x ) e19202)23x ysin 2 ( z) x / 5x y( x2 y))y(x z)cos(ln xz1,12 0,870,27 4,383e x x y6,35 7,32x 12xsin( x4 y2y2)2cos (3(2 x))x0,42 1,2343,32 -0,542sin(3x y)3,25 4,12


Продолжение таблицы 2.821cos ( x z)21 3x 2ln y2223ln x3 x y tg(z)24 425 e x1y26272829303zy 8x3 2x y /( x z )sin( x) tg(y)xxy22 y z cos (x 53yxy3 e3 y )23xxy x221z3z x y2 y2zx2 y20,83 2,38xye2x sin( y)-0,93 -0,253xx-0,72 -1,42xy2yln y x y3 2x y zx z2ztgx y zln x y zxtgz3 cos sinyx2x 10yy2xx y x2cos33yy22yx x3yx4x3,98 1,633,91 -0,511,26 3,69-4,11 2,991,24 2,55-1,25 -3,161,84 -1,172.4 Контрольные вопросы1 Для каких типов данных используются суффиксы при инициализациипеременных?2 Чем отличаются функции printf() и puts() при консольном выводеинформации?3 Для чего в программах на С++ используется заголовочный файлmath.h?4 При использовании функции gets_s() с какими разделителямиможет происходить считывание информации с консоли?5 Какой тип данных возвращает функция gets_s() при считыванииинформации?6 Как осуществляется считывание с консоли информация с помощьюфункции scanf_s()?7 Как с консоли осуществляется считывание последовательностиразличных типов данных с помощью одной функции scanf_s()?8 Как выводится на консоль последовательность различных типовданных с помощью одной функции printf()?44


ЛАБОРАТОРНАЯ РАБОТА 3Принятие решений. Условные операторы в языке С++Цель: изучить виды условных операторов, научиться создавать программына языке С++ разветвляющейся структуры.3.1 Теоретическая частьВ языке программирования С используются несколько конструкцийдля принятия решений:− оператор if;− оператор switch;− условный оператор ? (оператор условия).Для прерывания программного цикла при некотором условии применяетсяутверждение (оператор) break, для продолжения итераций циклапри выполнении некоторых условий применяется утверждение (оператор)continue, для выхода из функции при выполнении некоторых условий применяетсяоператор return, для перехода к заданному месту программыприменяется оператор goto, хотя считается, что в программированиине существует ситуаций, в которых нельзя обойтись без оператора goto [2; 3].Утверждение break применяется также в теле оператора switch.3.1.1 Оператор ifОбщая форма записи оператора if:if (expression)program statement;В операторе if используется результат вычисления условия, заключенногов круглые скобки, на основе которого принимается решение. Результатвычисления условия expression может быть арифметическимили логическим. Если результат выполнения условия expression будет истинным,то возможно выполнить несколько утверждений типа programstatement. Для этого следует использовать фигурные скобки, например:if (expression){program1 statement1;program2 statement2;...}45


3.1.2 Конструкция if–elseОбщая форма записи конструкции if–else:if (expression)program1 statement1;elseprogram2 statement2;Если выполняется условие expression, то будет выполняться фрагментпрограммы program1 statement1, в противном случае будет выполнятьсяprogram2 statement2.Каждое из утверждений может быть множественным. В таком случаеприменяются фигурные скобки:if (expression){program1 statement1;program2 statement2;...}else{program33 statement33;program34 statement34;...}3.1.3 Конструкция if–else if–else if–...–elseФорма записи конструкции if–else if–else if–...–else:if (expression1)program1 statement1;else if (expression2)program2 statement2;else if (expression3)program3 statement3;...elseprogram statement;Приведенная конструкция используется для выбора возможных ситуаций,когда проверяются условия expression1, expression2, expression1,... .Соответственно будут выполняться действия program1 statement1,program2 statement2, program3 statement3 и т.д. В случае, когда ни одноиз условий не выполняется, выполняются действия, прописанные послеоператора else.46


В случае выполнения множественных действий применяются фигурныескобки для каждого из утверждений:if (expression1){program1 statement1;...}else if (expression2){program2 statement2;...}else if (expression3){program3 statement3;...}...else{program statement;...}3.1.4 Оператор switchОбщая форма записи оператора switch:switch (expression) {case value1:program statement;...break;case value2:program statement;...break;...case valuen:program statement;...break;default:program statement;...break;}47


Выражение заключенного в круглые скобки оператора последовательносравнивается со значениями value1, value2,..., valuen, которыедолжны быть простыми константами или константными выражениями.В том случае, когда одно из этих значений равно значению, выполняютсяутверждения, которые следуют за данным значением.Утверждение break сигнализирует об окончании выполнения утвержденийи приводит к выходу из оператора switch. Утверждение break ставитсяв конце каждого варианта выбора. Если этого не сделать, то выполнениепоследовательности утверждений перейдет в следующий вариант выбораи будет выполняться до тех пор, пока не встретится утверждение break.Специальный дополнительный вариант default будет выполнен в томслучае, когда не будет найдено ни одного совпадения.Операторы if и switch той или иной синтаксической конструкциисуществуют практически во всех языках программирования (в первую очередьязыках высокого уровня), и их часто называют операторами ветвления.3.1.5 Условный операторВ отличие от других операторов языка С, которые могут быть унарнымиили бинарными, специфический оператор условия является тернарнымоператором. Это означает, что у него может быть три операнда.Общий формат записи оператора условия:условие ? выражение_1 : выражение_2Если в результате вычисления условия будет получено значениеTRUE (истина, не нуль), то выполняется выражение_1, и результатом выполненияоператора условия будет значение, полученное при вычисленииэтого выражения. Если в результате вычисления условия будет полученозначение FALSE (ложь, т. е. нуль), то выполняется выражение_2, и результатомвыполнения оператора условия будет значение, полученное при вычислениивыражение_2.Оператор условия часто описывают как оператор ?. Тернарный операторусловия ? наиболее часто используется для присвоения переменнойодного из двух значений в зависимости от некоторого условия.3.1.6 Оператор break (от английского – прерывать)Оператор или утверждение break служит для немедленного выходаиз цикла, будь то while, for или do–while. После выхода из цикла выполнениепрограммы продолжается с утверждения (фрагмента программы),непосредственно следующего за циклом.48


Если оператор break встречается во вложенном цикле (вложенныхциклах), то будет прекращено выполнение того цикла, в котором этот операторвстретился.Необходимость в использовании оператора прерывания break в телецикла возникает тогда, когда условие продолжения итераций нужно проверятьне в начале цикла (как в циклах while и for) и не в конце тела цикла(как в цикле do–while), а в середине тела цикла.Формат записи оператора break:break;3.1.7 Оператор continue (от английского – продолжать)Оператор или утверждение continue служит для перехода к следующейитерации цикла.Оператор continue противоположен по действию оператору break.Оператор continue позволяет в любой точке тела цикла (while, for или do–while) прервать текущую итерацию и перейти к проверке условий продолженияцикла. В соответствии с результатами проверки либо заканчиваетсявыполнение цикла, либо начинается новая итерация. При этом все утверждения(фрагменты программы), которые следуют за оператором continue(ключевым словом), автоматически пропускаются.Формат записи оператора continue:continue;3.1.8 Оператор gotoСейчас во многих языках программирования оператор безусловногоперехода типа goto не используется. Однако в языке программирования Сон имеет место. Применение оператора goto не является хорошим стилемпрограммирования. Но в некоторых случаях его применение бываетуместно. Иногда, при умелом использовании, оператор goto может оказатьсявесьма полезным, например, если нужно покинуть глубоко вложенныециклы.Для оператора goto всегда необходима метка. Метка – это идентификаторс последующим двоеточием. Метка должна находиться в той жефункции, что и оператор goto, переход в другую функцию невозможен.Общий формат записи оператора goto:goto метка;…метка: заданные действия.49


Метка может находиться как до, так и после оператора goto.С помощью оператора goto можно не только выходить из цикла,но и организовать цикл.Логические операторы отношения приведены в табл. 3.1.Таблица 3.1 – Логические операторы№ п/п Оператор Операция1 && И2 || ИЛИ3 ! НЕ, отрицаниеНиже приведены операции отношений в убывающей последовательностиприоритетов:Наивысший !> >= < = Больше или равноРезультат любой операции сравнения или логической операции есть0 (нуль) или 1.50


3.2 Практическая частьПример 1. Напишите программу решения квадратного уравненияс проверкой на наличие вещественных (не комплексных) корней на основетолько операторов if. Вид квадратного уравнения:2ax bx c 0Как известно, квадратное уравнение будет иметь вещественные корни,если его дискриминант будет неотрицательным, т. е. когда2D b 4ac 0Программный код решения примера:#include #include #include int main(void) {float a, b, c;float D, x1, x2, x;printf("\n\t Equation a*x^2 + b*x + c = 0\n");printf("\n\t Enter the coefficient a: ");scanf_s("%f", &a);printf("\t Enter the coefficient b: ");scanf_s("%f", &b);printf("\t Enter the coefficient c: ");scanf_s("%f", &c);D = b*b - 4*a*c;if (D >= 0 && a != 0) {x1 = -b/(2*a) + (float)sqrt(D)/(2*a);x2 = -b/(2*a) - (float)sqrt(D)/(2*a);printf("\n\t The roots of the equation:\n\t x1 = %1.4f,x2 = %1.4f\n", x1, x2);}if (D < 0)printf("\n\t The roots of complex\n");if (a == 0 && b != 0) {x = -c/b;printf("\n\t As a = %1.0f,\n\t the solution of the equationis: %1.4f\n", a, x); }}printf("\n Press any key: ");_getch();return 0;Возможный результат выполнения программы показан на рис. 3.1.51


Рисунок 3.1 – Результат решения квадратного уравненияВ программе последовательно проверяются условия с помощью операторовif. В последнем случае, когда коэффициент а = 0, квадратное уравнениевырождается и превращается в линейное уравнение. Решение в этомслучае очевидно.В программе применены функции scanf_s() вместо стандартнойфункции scanf() языка С. Это сделано для того, чтобы по этим функциямне было предупреждений (warning) в MS Visual Studio 2008.Кроме того, в программу подключена библиотека math.h для действийс математическими функциями, например, sqrt().В первом операторе if применено логическое условие И (&&)для проверки того, что дискриминант не равен отрицательному значениюи одновременно, чтобы первый коэффициент квадратного уравненияне был равен нулю. Аналогичное условие прописано и для последнегооператора if.Пример 2. Напишите программу решения квадратного уравненияс проверкой на наличие вещественных корней на основе конструкции if–else. Вид квадратного уравнения:2ax bx c 0Программный код решения примера:#include #include #include int main(void){float a, b, c;float D, x1, x2, x;printf("\n\t Equation a*x^2 + b*x + c = 0\n");printf("\n\t Enter the coefficient a: ");scanf_s("%f", &a);printf("\t Enter the coefficient b: ");scanf_s("%f", &b);printf("\t Enter the coefficient c: ");scanf_s("%f", &c);52


D = b*b - 4*a*c;if (D >= 0 && a != 0 && b != 0) {x1 = -b/(2*a) + (float)sqrt(D)/(2*a);x2 = -b/(2*a) - (float)sqrt(D)/(2*a);printf("\n\t The roots of the equation:\n\t x1 = %1.4f,x2 = %1.4f\n", x1, x2);}else {if (a == 0 && b != 0) {x = -c/b;if (c != 0)printf("\n\t As a = %1.0f,\n\t the solution of the equationis: %1.4f\n", a, x);elseprintf("\n\t As a = %1.0f and c = %1.0f,\n\t the solution ofthe equation is: %1.0f\n", a, -x);}if (D < 0)printf("\n\t The roots of complex\n");}}printf("\n Press any key: ");_getch();return 0;В программе использованы вложенные операторы if.Результат выполнения программы при исключительной ситуациипоказан на рис. 3.2.Рисунок 3.2 – Выполнение программы с двумя нулевыми коэффициентамиПример 4. Напишите программу расчета простого арифметическоговыражения на основе оператора switch.Программный код решения примера:#include #include int main (void) {53


float value1, value2;char operat;printf("\n\t Printed on the keyboard expression: ");scanf_s("%f%c%f", &value1, &operat, sizeof(char), &value2);switch (operat) {case '+':printf("\n\t Result: %1.4f\n", value1 + value2);break;case '-':printf("\n\t Result: %1.4f\n", value1 - value2);break;case '*':printf("\n\t Result: %1.4f\n", value1 * value2);break;case '/':if (value2 == 0.0)printf("\n\t Division by zero.\n");elseprintf("\n\t Result: %1.4f\n", value1 / value2);break;default:printf("\n\t Unknown arithmetic operator\n\t erroror enter a number. Break!\n");break;} // End switch}printf("\n Press any key: ");_getch();return 0;В программе использована полная форма оператора switch. Операторbreak инициирует немедленный выход из оператора switch. Возможноиспользование вложенных операторов switch.Возможный результат выполнения программы показан на рис. 3.3.Рисунок 3.3 – Расчет простого арифметического выражения54


Пример 5. Напишите программу вычисления двух целых случайныхчисел и определения наибольшего из них. Определение наибольшего числапроизведите с помощью оператора условия ?.Программный код решения примера:#include #include #include // Для функций случайных чисел#include int main (void) {int a, b, maxab;unsigned int some;long int L;L = (long) time(NULL);some = (unsigned) L/2;srand(some);a = rand();b = rand();printf("\n\t Random numbers: a = %d; b = %d\n", a, b);// Оператор условия для определения максимального числаmaxab = (a > b) ? a : b;printf("\n\t Maximum number: %d\n", maxab);printf("\n Press any key: ");_getch();return 0;}В программе использованы функции генерации псевдослучайныхчисел rand() и задания исходного псевдослучайного числа srand(). Указанныефункции входят в стандартную библиотечную функцию stdlib.h.Функция time() входит в библиотечную функцию time.h, которая поддерживаетфункции, обращающиеся к системному времени.Для переменных L и some выполнено приведение типов.При каждом обращении к функции rand() возвращается целое в интервалемежду нулем и значением RAND_MAX, которое в любой реализациидолжно быть не меньше числа 32767.Возможный результат выполнения программы показан на рис. 3.4.Рисунок 3.4 – Результат определения максимального числа55


Пример 7. Напишите программу распечатки четных целых чиселот 0 до 30.#include #include int main (void){int x;printf("\n\t Even numbers from 0 to 30:\n\n");for (x = 0; x < 31; x++) {if ( x % 2 ) continue;printf("\t\t %3d\n", x);}printf("\n Press any key: ");_getch();return 0;}В программе в качестве проверки условия использовано делениепо модулю (х%2). Если остаток от деления числа х не равен нулю,то утверждение (оператор, инструкция) continue передает управлениенепосредственно инструкции, проверяющей условное выражение, послечего циклический процесс продолжается. С помощью программы выводятсятолько четные числа, а при обнаружении нечетного числа происходитпреждевременный переход к следующей итерации цикла, и функцияprintf() опускается. Функция printf() включена в тело цикла оператора for.Результат выполнения программы показан на рис. 3.5.Рисунок 3.5 – Результат вывода четных чиселПримечание. Оператор goto нельзя применять для перехода в телоцикла, т. е. метка не должна быть внутри оператора цикла. Метка можетпоявиться текстуально до или после оператора goto.56


Пример 8. Создать блок-схему и программу вычисления функциис использованием оператора IF. Значение х и а ввести с клавиатуры. 32x 4x 7,y 3x1,2 2(x 2)x 0x аОкно с программой показано на рис. 3.6, блок-схема к заданиюна рис. 3.7.Рисунок 3.6 – Окно с программойНачалоВвод а, х+x 0-y 2x3 4x 7+x a-3x 1y 2( x 2)2Вывод уРисунок 3.7 – Блок-схема к заданию57Конец


Третья программа на языке Си//автор Загребельный С.Л.#include #include #include int main(void){ float a, x;float y;printf("\n\t Vvedite coefficient a= ");scanf_s("%f", &a);printf("\t vvedite x= ");scanf_s("%f", &x);if (x >= 0) {y = sqrt(2*x*x*x+4*x+7);printf("\n\t y = %1.4f\n", y);}elseif (x


Продолжение таблицы 3.2244 sin x cos x ln 2 ( x) xtg 2( x)x35 x ln ( x 1)2х 2(tg (2x1)1)4 xx x4 36 x 2 x xe х 4 3 2x ln( x x )7(3x 1)5 38 x ctg (2x)x52ln 2 5tg (2x2cos 1x 5 3) 139 x sin 3xx cos x 2tg x2 1 ex xsin2x x0.2510x2x12sin x2lnx x2 311 sin xx6x x 1 2sin ( x e )5 2x12 2 xe 333 3( x 1) cos ( x ) 2 x sin ( x )13 ln 2 5x sin (x 2)3 3214 2 x sin ( x ) ( x 1) cos x315 cos x x x sin x16 sin x 4x ln (42 1)e tg5x1342x 2 sin x 3 8 cos 3xx5 2ln5 x17 x 4 2x 3 x1,34 x2xx 1518 x ctg xln (2 2x 1)e х 3x 15 319 x ctg (2x)x5 4 32sin x 12x20ctg (32x 1)2 xe x 3 2sin x21 x 3sin ( x 1)( x 1) cosx33 x sin x3223x 1) /( x 2) e x 5 2 cos ( x 2)( 3lnsin x 2235 33x ctgxln (sin 4592x 1)3 2 42x x 1


Продолжение таблицы 3.2224 1,34 x325 e x cos x26xx3 3 43 x x 1 sin( x 2)sin x30,1x33 ( x 1) x1 cos 2x2127 tg(0,1 x ) x sin ( x )5328 3x ctg x sin( x)e x3 23x1 sin (7x) tg(0,01x)e x 5 20,33( x 1) sin 2x29 x sin ( x)3x 3 2x230 x sin (7x)3 sin x 225x x x2 sin xxx 3 102x x 17 4 23.4 Контрольные вопросы1 Как организуются множественные действия в оператореусловия if?2 Какой формат записи имеет тернарный оператор условия?3 Какой оператор условия рекомендуется использоватьдля программирования меню?4 В чем различие и сходство между операторами break и continue?5 Как можно обеспечить выход из вложенных циклов?6 Как можно организовать переходы в различные точки программына С++?7 Какие логические операторы отношения используются в языкеС++?8 Что произойдет, если в операторе switch после метки case не использоватьоператор break?9 Что произойдет, если в операторе switch не поставить меткуdefault и условие переключения не совпадет ни с одной меткой case?60


ЛАБОРАТОРНАЯ РАБОТА 4Организация циклов в языке С++Цель: изучить операторы цикла, научиться создавать программыи блок-схемы циклических структур.4.1 Теоретическая частьОператоры цикла относятся к управляющим конструкциям всякогоязыка программирования. Управляющие операторы и конструкцииязыка задают порядок, в котором выполняются вычислительные операциипрограммы.4.1.1 Оператор whileИзучение операторов цикла начнем с оператора while. Цикл whileимеет следующий формат (синтаксис) записи:while (expression)program statement;Производится расчет выражения expression, заключенного в круглыескобки. Если в результате расчета выражения expression получается истинныйрезультат (TRUE), то выполняется утверждение program statement,следующее непосредственно за закрывающей круглой скобкой. После выполненияэтого утверждения вновь рассчитывается выражение expression.Если в результате расчета будет TRUE, то вновь будут выполнены утвержденияprogram statement. Цикл повторяется до тех пор, пока в результатерасчета выражения expression (в круглых скобках оператора while)не будет получено значение FALSE (ложный), которое является признакомокончания цикла, после чего выполнение программы продолжаетсяс утверждения, следующего за утверждением program statement. Когда требуетсявыполнить группу утверждений, то она (группа) располагаетсяв фигурных скобках:while (expression){program statement;program2 statement2;program3 statement3;...}61


Открывающаяся фигурная скобка может следовать непосредственнопосле закрывающей круглой скобки оператора while. Все, что находитсяв фигурных скобках, будет выполняться, пока верно выражение expression.Очевидно, что неверное задание выражения expression может привестик бесконечному циклу (к зацикливанию).4.1.2 Оператор forОператор цикла for имеет следующий формат записи:for (init_expression; loop_condition; loop_expression)program statement;Три выражения, заключенные в круглые скобки оператора цикла for,задают условия выполнения программного цикла.Первый параметр init_expression используется для задания начальногозначения цикла.Второй компонент loop_condition определяет условие или условия,в соответствии с которыми будет происходить выход из цикла. Повторениебудет происходить до тех пор, пока это условие (или условия) выполняется.Если условие не выполняется, то цикл немедленно заканчивается.Третий параметр loop_expression выполняется каждый раз, когда заканчиваетсяобработка тела цикла, т. е. program statement.Чаще всего выражения init_expression и loop_expression являютсяоператорами присваивания или вызовами функций, а второе выражениеloop_condition – выражением отношения или логическим выражением.Любую из трех частей можно опустить, но точки с запятыми должныостаться на своих местах. Если опустить init_expressionили loop_expression, то соответствующие операции не будут выполняться.Если же опустить проверку условия loop_condition, то по умолчанию считается,что условие продолжения цикла всегда истинно, и тогда цикл станетбесконечным (произойдет зацикливание).Когда требуется выполнения нескольких утверждений, то они должнызаключаться в фигурные скобки:for (init_expression; loop_condition; loop_expression){program1 statement1;program2 statement2;program3 statement3;...}62


В представленном случае тело цикла находится в фигурных скобках.Конструкция цикла, реализованная оператором for, может быть выполненатакже и оператором while следующим образом:init_expression;while (loop_condition){program statement;loop_expression;}Исключением является применение операции continue.В программах языка С возможно применять вложенные циклы, каждыйиз которых контролируется своей переменной цикла и своим отношением(второе выражение в круглых скобках оператора for). Вложенныециклы могут идти непосредственно друг за другом или составлять телоцикла с помощью фигурных скобок. Возможно также использование двухиндексных переменных для инициализации начала цикла с последующимих инкрементированием (увеличением) или декрементированием (уменьшением).4.1.3 Оператор do–whileРассмотренные операторы цикла while и for производят проверкуусловия выполнения цикла до начала выполнения тела цикла. Поэтому телоцикла может ни разу не выполниться, если с самого начала результатомрасчета условия выполнения цикла будет значение FALSE (ложь).В случае необходимости производить проверку условия выполнения циклапосле тела цикла (т. е. когда выполняется хотя бы одно предписанное действиев теле цикла) прибегают к циклу do–while.Оператор цикла do–while имеет следующий формат записи:doprogram statement;while (loop_expression);Выполнение цикла do–while происходит следующим образом: сначалавыполняется утверждение program statement, затем производитсяпроверка условия выполнения цикла loop_expression с помощью оператораwhile. Если результатом проверки будет значение TRUE (истина),то выполнение цикла продолжится, и утверждение program statement всякийраз будет выполняться вновь. Повторение цикла будет продолжатьсядо тех пор, пока в результате проверки условия выполнения цикла63


loop_expression будет получаться значение TRUE. Когда в результатепроверки условия будет вычислено значение FALSE (ложь), то выполнениецикла прекратится и произойдет переход к утверждению (следующемуфрагменту программы), непосредственно следующему за циклом.Таким образом, цикл do–while гарантированно выполнится хотя быодин раз.В случае выполнения нескольких утверждений используются фигурныескобки для выделения тела цикла:do {program1 statement1;program2 statement2;program3 statement3;... } while (loop_expression);Оператор цикла while называется оператором цикла с предусловием,оператор цикла for называется оператором цикла с параметром, операторцикла do–while называется оператором цикла c постусловием.4.2 Практическая частьРассмотрим примеры программ с операторами циклов while, forи do–while.Пример 1. Напишите программу вывода на экран пользователяцелых положительных чисел с помощью оператора while. Начальноеи последнее число должно задаваться пользователем с клавиатуры.Программный код решения примера:#include #include int main(void){int i, j = 0, n;printf("\n\t Enter the primary natural number: ");scanf_s("%d", &i);printf("\t Enter the last natural number: ");scanf_s("%d", &n);printf("\n\t The numbers are:");while (i


Возможный результат выполнения программы показан на рис. 4.1.Рисунок 4.1 – Результат выполнения программы с вводом целых чиселВ программе использована функция scanf_s(), принятая в MS VisualStudio. В программе применено инкрементирование переменных, принятоев языке С, а именно ++i или ++j означает, что переменные увеличиваютсяна единицу. При этом знаки "++" могут располагаться перед именем переменнойили после. Отличие в том, что ++i – это значение переменнойпосле увеличения, а i++ – сначала переменная имеет заданное значение,а потом происходит ее увеличение. Для переменных цикла обе формы равнозначны.Условием цикла является то, что пока переменная i меньше или равнапеременной n (предполагается, что n больше начального значения i),то будут выполняться действия (печать и увеличение переменной j), заложенныев теле цикла. Расчет выражения, заключенного в круглые скобкиоператора, предназначен для проверки нестрогого неравенства переменнойi по отношению к переменной n. Если это неравенство выполняется,то в теле цикла происходят печать и увеличение (инкрементирование) переменныхi, j.Пример 2. Напишите программу табличного вывода строчных буквлатинского алфавита и их десятичных кодов с помощью оператора циклаfor.Как известно, в латинском алфавите 26 букв. Поэтому можно создатьмассив символов этих букв. С учетом того, что тип char представляетсобой целочисленный тип, то можно обойтись без создания массива.Программный код решения примера:#include #include int main(void){int j = 1;65


char a = 'a';printf("\n Table code characters:\n");for ( ; a


double sum1 = 0.0, sum2 = 0.0;int k = 1;denom = k * (k + 1) * (k + 2); // знаменатель рядаdo {sum1 = sum2;sum2 += 1.0 / denom;denom = denom / k * (k + 3);++k;} while (sum1 < sum2);printf("\n\t The amount of numerical series: %lg\n", sum2);printf("\n Press any key: ");_getch();return 0;}В приведенной программе сумма вычисляется как значение переменнойsum2. Ее предыдущее значение сохраняется в переменной sum1.Так как приближенное значение с добавлением неотрицательных слагаемыхне уменьшается, условием продолжения цикла служит отношениеsum1 < sum2 (поскольку растет знаменатель denom). Когда при добавленииочередного слагаемого значение суммы остается неизменным (за счет конечнойразрядной сетки для представления вещественных чисел), нарушаетсяусловие sum1 < sum2 и цикл прекращается. Таким образом, конечностьразрядной сетки представления вещественных чисел в компьютереопределяет собой «машинный нуль».Инициализация знаменателя сделана до начала цикла. Форматныйвывод результата выполнен с помощью спецификатора символа «l».Результат выполнения программы показан на рис. 4.3.Рисунок 4.3 – Результат подсчета суммы бесконечного рядаПример 4. Произведите реверс цифр заданного целого числа, вводимогос клавиатуры пользователем.Задача заключается в том, чтобы, например, число 123 переписатькак 321.Программный код решения примера:#include #include int main(void){ long int x, r;printf("\n Enter an integer: ");67


}scanf_s("%ld", &x);printf("\n Reverse-digit number %ld:\n\n\t", x);do {r = x % 10;printf(" %ld", r);x = x / 10;} while ( x != 0);printf("\n\n Press any key: ");_getch();return 0;В программе применена операция арифметическая операция деленияпо модулю, которая имеет символ процента, т. е. «%». Любой остаток, получающийсяв результате деления целых чисел, будет отброшен. В шкалестаршинства оператор деления по модулю имеет приоритет, равный приоритетуоператоров умножения и деления. Переменные, используемыев программе, объявлены как длинные числа, поэтому применен тип long int(или long). В некоторых компиляторах имеются отличия между типами intи long int в смысле максимально поддерживаемого значения числа.Результат выполнения программы показан на рис. 4.4.Рисунок 4.4 – Результат программы по реверсу числаПример 5. На основе только оператора цикла for напишите программупо выводу "горки" заглавных букв, симметрично убывающихк букве, введенной пользователем. Также на основе оператора цикла forпредусмотрите защиту от неправильного ввода.Программный код решения примера:#include #include int main (void) {int p = 0;char ch = 'A';char i, j, k, ch2, kk, chA;chA = ch;printf("\n Enter a capital letter between \"A\" and \"S\":");scanf_s("%c", &ch2, sizeof(char));for(chA -= 1; chA >= ch2; chA-- )68


{ printf("\n Error! Press any key: ");_getch();return -1; }for (kk = 'S'+1; kk


НачалоВвод а, хn,xk, xh+x=xn;x


scanf_s("%lf", &xn);printf("\t vvedite Xk= ");scanf_s("%lf", &xk);printf("\t vvedite Xh= ");scanf_s("%lf", &xh);printf("\t vvedite a= ");scanf_s("%lf", &a);printf("\n\t Tablica znacheniy");x=xn;while (x


ВариантШаг табулированияРисунок 4.8 – Результат выполнения программы4.3 Индивидуальные заданияСоздать блок-схему к программе и программу на языке программированияС++ таблицы табулирования функции f 1у f 2 f 3x,x,x,если х 0если 0 х aесли х aс использованием оператора While на отрезке [xn;xk] с шагом xh.Данные взять с таблицы 4.2.Таблица 4.2 – Индивидуальные заданияФункцииf 1 xf 2 xf 3 xГраницыотрезка1 ln 2 5x sin ( ex 2)sin x 32x [-2,9; 8,2] 0,2e cos x 13 322 2 x sin ( x ) ( x1) cos x3 sin 5 34 4 tgx 2x x sin xx ln (4x2 1)3 3 4sinx 1x4ln722 2 sin x [-1,2; 2,6] 0,1x [-1,7; 2,4] 0,35 x [-4,3; 8,0] 0,55 2


Продолжение таблицы 4.2553x x 101,34 x2xx 1 [-9,1; 5,8] 0,146 x ctg 2x5ln2х( x 2 1)e 3x 1[-3,4; 2,5] 0,235 37 ctg (2x)8x5 4ctg (3x1)2x 33 239 x 4xx ( x 1) cosx10( 2 2x2sin x 1 [-2,2; 8,1] 0,152 xe x sin x 3 1[-2,8; 5,2] 0,533 sin x3x 1)(x 2) e x 5 2 sin x 211 ctg x3 1212 1,34 x2313 sin (2x)14ln (sine x sin 3 x4x30,1x33 ( x 1) x1 cos x3x [-3,2; 7,8] 0,363lnsin x 2 [-6,1; 1,3] 0,152x 1)3 2 4x3x3 5 1 tgx12x x 1 [-7,4; 0,6] 0,16[-1,2; 7,1] 0,45 3 2e x 3x1 [-2,2; 3,9] 0,55 2x tg( x 2 2)[-0,3; 4,5] 0,621532х 5х3 25х х( х22 3)3cos23( x x)[-2,4; 4,4] 0,4165 2х х 1 ln 2 ( x 5 )1x e x sin ( x)5317 3 ctg x15318 x ctg x sin ( 5 20,3 (7x1) sin x22 0,25x ) x [-3,9; 3,8] 0,15sin x 2 [-1,3; 7,1] 0,65x x [-2,9; 6,2] 0,82x x 19 sin ( x)220 x sin (7x)13 21 x 2 13xsin ( 5 23 2xxx 103 7 4 22 0,25x ) x ( x) xх х 1 [-3,7; 8,5] 0,112x x 1 [-3,9; 1,2] 0,25ln 2 [-4,5; 6,1] 0,32422 sin x cos x ln ( x 1) 3x5 tg x 3x1 2[-3,4; 3,4] 0,3373


Продолжение таблицы 4.223 3 3 2 2х 2x x x 6tg (2x1)14 xx x [-4,1; 5,0] 0,454 324 x 2 x x 3 2ln ( x )e х 3 xx [-1,7; 2,9] 0,75252(3x1)5x 2x15 326 x ctg (2x)27 x x tgx 528 ln ( x 1) 3xln 2 5x 5 25tg(2x 3) 1x cos x sin x 3x3 2 0. 251 x [-1,6; 4,7] 0,65x 2 e x [-1,6;3,7] 0,3sin x x [-2,8; 8,2] 0,42 ln 2 x x 3 [-1,7; 2,6] 0,2529 sin 2 3 xx6x x 1 sin ( x e ) [-2,2; 7,4] 0,235 23 x30 cosx1 e32х 5х3 2223x 7sin ( x ) [-1,1; 7,9] 0,84.4 Контрольные вопросы1 Как организуются составные операторы циклов в языке С++?2 Как организуются вложенные циклы в языке С++?3 В каких случаях может произойти зацикливание при использованииоператора цикла с предусловием?4 В каких случаях может произойти зацикливание при использованииоператора цикла с постусловием?5 Сколько условий требуется для работы оператора циклас параметром?6 Сколько операторов отношения в языке С++? Перечислите их.7 Как реализуется взаимозаменяемость операторов цикла whileи for?8 В чем сходство и различие между циклами с предусловиеми с постусловием?74


ЛАБОРАТОРНАЯ РАБОТА 5Одномерные числовые массивы в языке программирования С++.Селективная обработка элементов массива. Нахождение минимальногои максимального элементов массиваЦель: изучить понятие массива, способы ввода и вывода в программеэлементов массива, методов селективной обработки элементов массиваи нахождение минимального и максимального элемента в массиве.5.1 Теоретическая частьВ языке программирования С заложены средства для задания последовательностейупорядоченных данных. Такие последовательности называютсямассивами. В массивах должны быть упорядочены данные одногои того же типа. В данной лабораторной работе будут рассматриваться массивыс целыми и вещественными типами данных, т. е. типы int, floatили double.Массивы данных могут быть одномерными (векторами размера 1 nили n 1), двухмерными (матрицами размера n m) или многомерными(размера n m p...). В частности, для векторов и матриц в приведеннойзаписи первый индекс означает количество строк, а второй (числоили буква) – это количество столбцов. Для названия массива может бытьиспользована переменная, состоящая из букв (буквы), букв с цифрами,букв с цифрами и знаком подчеркивания и т. д. в соответствии с правиламиобъявления переменных, принятых в языке С. Если размерность массиваменьше, чем требуется, то компилятор не выдаст сообщения об ошибке.Выход за границы массивов должен следить только сам программист.5.1.1 Одномерные массивыОдномерный массив – это список связанных однотипных переменных.Общая форма записи одномерного массива:тип имя_массива[размер];В приведенной записи элемент тип объявляет базовый тип массива.Количество элементов, которые будут храниться в массиве с именемимя_массива, определяется элементом размер.В языке С индексация массива начинается с нуля. Например, еслиразмер массива определен величиной 9, то в массиве можно хранить10 элементов с индексацией 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.75


Доступ к отдельному элементу массива осуществляется с помощьюиндекса. Индекс описывает позицию элемента внутри массива.Все массивы занимают смежные ячейки памяти, т. е. элементы массивав памяти расположены последовательно друг за другом. Ячейка памятис наименьшим адресом относится к первому элементу массива,а с наибольшим – к последнему.Для одномерных массивов общий размер массива в байтах вычисляетсяпо формулевсего байт = размер типа в байтах * количество элементовВ языке С++ нельзя присвоить один массив другому. Для передачиэлементов одного массива другому необходимо выполнить присвоениепоэлементно.5.1.2 Инициализация массиваВ языке С++ массив при объявлении можно инициализировать.Общая форма инициализации массива:тип имя_массива[размер1] * [размерN] = {список_значений};В список_значений входят констант, разделенных запятыми. Типыконстант должны быть совместимыми с типом массива.Пример инициализации одномерного массива:int A[5] = {1, 2, 3, 4, 5};При этом A[0] = 1, A[1] = 2 и т. д.В языке С возможна инициализация безразмерных массивов. Напримердля одномерного массива:int A[ ] = {1, 2, 3, 4, 5};5.2 Практическая частьПример 1. Напишите программу заполнения одномерного массиваслучайными числами из интервала от 1 до 15 по случайному равномерномузакону. Отсортировать массив случайных чисел по возрастанию.76


Для решения поставленной задачи применим сортировку методомпрямого выбора. Алгоритм сортировки заключается в следующем:1 В исходной последовательности из N элементов отыскиваетсяэлемент с наименьшим ключом.2 Он меняется местами с первым элементом.3 В оставшейся последовательности из (N–1) элементов отыскиваетсяминимальный элемент и меняется местами со вторым элементом и т. д.,пока не останется один, самый большой элемент.Программный код решения примера:#include #include #include #include #define Left 1#define Right 15#define N 10int main (void) {float R, r, min;float A[N];int i, j, k;unsigned int some;long int L;L = (long) time(NULL); // Системное времяsome = (unsigned) L; // Приведение типовsrand(some); // Задание исходного случайного числа для rand()printf("\n\t The initial array of random numbers in the interval[%d, %2d]\n", Left, Right);for (i = 0; i < N; ++i){// Случайное число из интервала [0,1]r = (float) rand()/RAND_MAX;// Формирование случайного числа из заданного интервалаR = Left + (Right - Left) * r;// Заполнение массива случайными числамиA[i] = R; }// Печать элементов исходного массиваfor (i = 0; i < N; ++i)printf("\n\t %5d) %10.4f", i + 1, A[i]);// Сортировка методом выбораfor (i = 0; i < (N - 1); ++i){min = A[i]; k = i;for (j = i + 1; j < N; ++j)if (A[j] < min) { k = j; min = A[k]; }77


A[k] = A[i]; A[i] = min;}// Печать отсортированного массива по возрастаниюprintf("\n\n\t Sort an array:\n");for (i = 0; i < N; ++i)printf("\n\t %5d) %10.4f", i + 1, A[i]);}printf("\n\n Press any key: ");_getch();return 0;Возможный результат выполнения программы показан на рис. 5.1.Рисунок 5.1 – Сортировка одномерного массива по возрастаниюВ программе использованы директивы препроцессора для заданиялевой границы (#define Left 1), правой границы (#define Right 15) и размераодномерного массива (#define N 10). Включены дополнительные библиотекиtime.h – для обращения к функциям системного времени, stdlib.h –для обращения к функциям генерации псевдослучайных чисел.Пример 2. Напишите программу поиска максимального элементав заданном одномерном массиве. Элементы массива являются целымичислами.Программный код решения примера:#include #include 78


int main (void){int i, size, max;int A[ ] = {3, 5, 2, 8, 12, 0, -7, -3, -21};size = sizeof(A)/sizeof(A[0]);printf("\n\t The dimention of the array A is equal to: %d\n",size);max = A[0]; // Предполагаемый максимумfor (i = 0; i < size; ++i)if (A[i] > max) max = A[i];printf("\n\t Maximum array element: %d\n", max);printf("\n\n Press any key: ");_getch();return 0;}В программе использована инициализация безразмерного массиваи определения его размерности с помощью функции sizeof().Результат выполнения программы показан на рис. 5.2.Рисунок 5.2 – Определение максимального элемента массиваПример 3. Напишите программу циклической перестановки чиселзаданного массива так, чтобы i-e число стало (i+1)-м, а последнее число –первым. Выведите на дисплей исходный массив и преобразованный.Программный код решения примера:#include #include #define N 55int main (void){int i, j, k;double D[ ] = {1.23, 2.34, 3.45, 4.56, 5.67, 6.78};double B[N];// Заведомо больший размер, чем у массива D// Обнуление массива и выделение памяти для него79


for (i = 0; i < N; ++i)B[i] = 0.0;k = sizeof(D)/sizeof(D[0]);B[0] = D[k-1];for (i = 0; i < (k - 1); ++i)B[i+1] = D[i];printf("\n\t The original array:\n");for (i = 0; i < k; ++i)printf("%8.2f", D[i]);printf("\n\n\t The reconfigured array:\n");for (j = 0; j < k; ++j)printf("%8.2f", B[j]);}printf("\n\n Press any key: ");_getch();return 0;Результат выполнения программы показан на рис. 5.3.Рисунок 5.3 – Пример циклической перестановки элементов числовогомассиваПример 4. В данном одномерном массиве вещественных чисел поменяйтеместами элементы, стоящие на нечетных местах, с элементами,стоящими на четных местах. Предусмотрите четность и нечетностьразмерности массива.Для определения четности места в заданном массиве можно использоватьоперацию деления по модулю, т. е. %.Программный код решения примера:#include #include // Размер массива#define n 7int main (void) {80


int i, k;// Пример массиваfloat A[n] = {1.23F, 2.34F, 3.45F, 4.56F, 5.67F, 6.78F,7.89F};float B[n];// Вспомогательный массив// Обнуление массиваfor (i = 0; i < n; ++i)B[i] = 0;// Распечатка заданного массиваprintf("\n\t\t The original array of dimention n = %d:\n", n);printf("\t");for (i = 0; i < n; ++i)printf("%6.2f", A[i]);// Распечатка преобразованного массиваprintf("\n\n\t\t The reconfigured array:\n");for (i = 0; i < n; ++i) {k = i % 2; // Для определения четности индекса массиваif (k == 0 && i < n - 1 )B[i] = A[i + 1];else if (k != 0 && i > 0 )B[i] = A[i-1];else if (k == 0 && i < n)B[i] = A[i]; }printf("\t");for (i = 0; i < n; ++i)printf("%6.2f", B[i]);printf("\n\n Press any key: ");_getch();return 0;}При инициализации массива каждый его элемент снабжен суффиксом F.Результат выполнения программы показан на рис. 5.4.Рисунок 5.4 – Смена четных и нечетных мест чисел массиваПример 5. Создать блок-схему к заданию и программу на С++, еслидан массив А(8), элементы которого нужно ввести с клавиатуры,найти сумму четных положительных элементов и минимальный элементмассива.81


Блок-схема к заданию на рис. 5.5, окно кода программы показанна рис. 5.6, а результат выполнения программы на рис. 5.7.НачалоI=1,8Ввод А[i]I=1,8Вывод А[i]Sum=0Min=A[0]I=1,8Sum=sum+A[i]ДаA[i] положительное,четноеНетДаA[i]


Программный код решения примера:// Пятая программа на языке Си++// Автор Загребельный С.Л.#include #include #include int main (void){int A[8];int i, sum,min;printf("\n\t Vvedite massiv iz 8 chisel\n");for (i = 0; i < 8; i++)scanf("%i",&A[i]);// Печать элементов исходного массиваprintf("\n\t ishodniy massiv \n");for (int i = 0; i < 8; i++)printf("\n\t %5d element massiva %10d", i + 1, A[i]);// Нахождение суммы четных положительных элементовsum=0;min=A[0];for (i = 0; i < 8; i++){ if((A[i]>0)&&(!(A[i]%2))) {sum=sum+A[i];}if (A[i] < min) {min = A[i];}}printf("\n\t Minimalniy elementmassiva %d\n", min);// Печать найденной суммыprintf("\n\n\t Summa=:%10d\n",sum);printf("\n\n Press any key: ");_getch();return 0;}Рисунок 5.6 – Окно кода программы83


Рисунок 5.7 – Окно обработки элементов массива5.3 Индивидуальные заданияСоставить блок-схемы и программы для решения следующих задачтаблица 5.1.Таблица 5.1 – Индивидуальные заданияВариант задание Условие задания12345аНайти количество положительных элементовб Найти сумму элементов больших 3вабваНайти максимальный элемент массиваНайти количество отрицательных элементовНайти сумму отрицательных элементовНайти минимальный элемент кратный пятиНайти количество четных элементовб Найти сумму элементов кратных 3вабвабвНайти разность максимального и минимального элементовмассиваНайти среднее арифметичекое элементов массиваНайти сумму наибольшего и наименьшего элементов массиваНайти максимальный по модулю элемент массиваВычислить среднее арифметическое четных элементовмассиваНайти сумму минимального положительного элементамассива и его номераНайти произведение модулей наибольшего отрицательногои наименьшего четного элементов массива84


Продолжение таблицы 5.1678910111213а Найти количество элементов кратных 5бвабвабНайти сумму четных элементов массива стоящихна нечетных местахНайти сумму второго и наибольшего положительногоэлементов массиваНайти среднее геометрическое четных элементов массиваНайти номер наибольшего по модулю элемента массиваНайти максимальный четный элемент массиваВычислить среднее арифметическое максимальногои минимального элементов массиваНайти минимальный по модулю элемент массивав Найти сумму элементов из интервала [0;10]абваВычислить среднее геометрическое номеров максимальногои минимального элементов массиваНайти разность суммы положительных и произведенияотрицательных чисел массиваНайти количество положительных элементовНайти сумму отрицательных элементовб Найти сумму элементов массива, у которых индекс кратен 3вабваНайти произведение модулей наибольшего и наименьшегоэлементов массиваНайти сумму отрицательных элементовНайти сумму второго и наибольшего положительногоэлементов массиваНайти разность максимального и минимального элементовмассиваВычислить среднее арифметическое четных элементовмассиваб Найти сумму элементов в диапазоне [-10;20]вабвНайти максимальный по модулю элемент массиваНайти сумму минимального положительного элементамассива и его номераНайти сумму четных элементов массива из диапазона[-20;30]Найти минимальный по модулю элемент массива85


14151617181920212223Продолжение таблицы 5.1а Найти количество элементов кратных 5бваНайти сумму четных элементов массива стоящихна нечетных местахНайти максимальный четный элемент массиваНайти количество положительных элементовб Найти сумму элементов больших 3вабваНайти максимальный элемент массиваНайти количество отрицательных элементовНайти сумму отрицательных элементовНайти минимальный элемент кратный пятиНайти количество четных элементовб Найти сумму элементов кратных 3вабвабвНайти разность максимального и минимального элементовмассиваНайти среднее арифметическое элементов массиваНайти сумму наибольшего и наименьшего элементовмассиваНайти максимальный по модулю элемент массиваВычислить среднее арифметическое четных элементовмассиваНайти сумму минимального положительного элементамассива и его номераНайти произведение модулей наибольшего отрицательногои наименьшего четного элементов массиваа Найти количество элементов кратных 5бвабвабНайти сумму четных элементов массива стоящихна нечетных местахНайти сумму второго и наибольшего положительногоэлементов массиваНайти среднее геометрическое четных элементов массиваНайти номер наибольшего по модулю элемента массиваНайти максимальный четный элемент массиваВычислить среднее арифметическое максимальногои минимального элементов массиваНайти минимальный по модулю элемент массивав Найти сумму элементов из интервала [0;10]абвВычислить среднее геометрическое номеров максимальногои минимального элементов массиваНайти разность суммы положительных и произведенияотрицательных чисел массиваНайти количество положительных элементов86


24252627282930Продолжение таблицы 5.1а Найти сумму отрицательных элементовб Найти сумму элементов массива, у которых индекс кратен 3вабваНайти произведение модулей наибольшего и наименьшегоэлементов массиваНайти сумму отрицательных элементовНайти сумму второго и наибольшего отрицательногоэлементов массиваНайти разность максимального и минимального элементовмассиваВычислить среднее арифметическое четных элементовмассиваб Найти сумму элементов в диапазоне [-10;20]вабвабвНайти максимальный по модулю элемент массиваНайти сумму минимального положительного элементамассива и его номераНайти сумму четных элементов массива из диапазона[-20;30]Найти минимальный по модулю элемент массиваМаксимальный по модулю элементНайти среднее арифметичекое элементов массиваНайти сумму отрицательных элементова Найти количество элементов кратных 4бвабНайти сумму отрицательных элементовНайти сумму наибольшего и наименьшего элементов массиваНайти разность максимального и минимальногоположительных элементовНайти сумму нечетных элементовв Найти минимальный элемент из диапазона [-20;30]5.4 Контрольные вопросы1 Как организуются одномерные числовые массивы в языке С++?2 Как организуется индексирование числовых массивов в языке С++?3 На кого или на что возлагается контроль границ числовых массивовв языке программирования С++?4 Для чего применяется начальная инициализация числовых массивовпри дальнейшем их использовании?5 Почему при определении размерности массива с помощью препроцессорнойдирективы define не используется точка с запятой послечислового значения?87


ЛАБОРАТОРНАЯ РАБОТА 6Понятие многомерного массива. Обработка элементов матрицЦель: изучить понятие матрицы, селективной обработки элементовматрицы, а также обработки элементов столбцов, строк и диагоналей матриц.6.1 Теоретическая часть6.1.1 Двухмерные массивы, матрицыДвухмерный массив представляет собой список одномерных массивов.Общая форма записи двухмерного массива:тип имя_массива[размер1] [размер2];В приведенной записи размер1 означает количество строк двухмерногомассива, а размер2 – количество столбцов.В двухмерном массиве позиция любого элемента определяется двумяиндексами. Индексы каждого из размеров массива начинаются с 0 (с нуля).Место хранения для всех элементов массива определяется во времякомпиляции. Память, выделенная для хранения массива, используетсяв течение всего времени существования массива.Для двухмерных массивов общий размер массива в байтах вычисляетсяпо формулевсего байт = число строк * число столбцов * размер типав байтах6.1.2 Многомерные массивыОбщая форма записи многомерного массива:тип имя_массива[размер1] [размер2]... [размерN];Индексация каждого размера начинается с нуля. Элементы многомерногомассива располагаются в памяти в порядке возрастания самогоправого индекса. Поэтому правый индекс будет изменяться быстрее, чемлевый (левые).При обращении к многомерным массивам компьютер много временизатрачивает на вычисление адреса, так как при этом приходится учитыватьзначение каждого индекса. Следовательно, доступ к элементам многомерногомассива происходит значительно медленнее, чем к элементам одномерного.В этой связи использование многомерных массивов встречаетсязначительно реже, чем одномерных или двухмерных массивов.88


Для многомерных массивов общий размер многомерного массивав байтах вычисляется по формулевсего байт = размер1* размер2*...* размерN *размер типав байтахОчевидно, многомерные массивы способны занять большой объемпамяти, а программа, которая их использует, может очень быстро столкнутьсяс проблемой нехватки памяти.Для определения размера типа в байтах применяется функцияsizeof(), которая возвращает целое число. Например, sizeof(float).6.1.3 Инициализация массивовПри инициализации многомерного массива для улучшения наглядностиэлементы инициализации каждого измерения можно заключатьв фигурные скобки.Пример инициализации двухмерного массива:int MN[3][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};Массив MN[3][4] – это матрица, у которой 3 строки и 4 столбца.Для многомерных массивов инициализацию можно также проводитьс указанием номера инициализируемого элемента.Пример инициализации трехмерного массива:int XYZ[2][3][4] = {{ {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} },{ {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24} }};Как видно, массив XYZ содержит два блока, каждый из которых естьматрица размера 3 4, т. е. 3 строки и 4 столбца.В многомерном массиве размер самого левого измерения такжеможно не указывать. В частности, для инициализации массива MN[3][4]допустима следующая запись:int MN[][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};89


При инициализации многомерных массивов необходимо указать вседанные (размерности) за исключением крайней слева размерности. Это нужнодля того, чтобы компилятор смог определить длину подмассивов, составляющихмассив, и смог выделить необходимую память. Рассмотрим примербезразмерной инициализации для трехмерного массива целых чисел:int XYZ[][3][4] = {{{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}},{{13, 14, 15, 16},{17, 18, 19, 20},{21, 22, 23, 24}}};Вывод трехмерного массива на консоль (дисплей) можно выполнитьпо следующей программе:#include #include int main (void) {int i, j, k;int XYZ[][3][4] = {{ {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }, // 1-й{ {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24} } }; //2-йfor (i = 0; i < 2; ++i) { printf("\n");for (j = 0; j < 3; ++j) { printf("\n");for (k = 0; k < 4; ++k)printf(" %3d", XYZ[i][j][k]);}}printf("\n\n Press any key: ");_getch();return 0;}6.2 Практическая частьПример 1. Напишите программу заполнения квадратной матрицы(заданного размера n > 2) по спирали натуральными числами начинаяс левого верхнего угла (принимая его за номер 1) и двигаясь по часовойстрелке.90


Образец заполнения:Рисунок 6.1 – Образец заполнения матрицы числами по спиралиПрограммный код решения примера:#include #include #define n 13int main(void) {int i = 1, j, k;int p = n/2;int A[n][n];// Обнуление матрицыfor (j = 0; j < n; ++j)for (k = 0; k < n; ++k)A[j][k] = 0;printf("\n\t Spiral matrix of dimention (%d x %d):\n", n, n);for (k = 1; k = (k-1); --j)A[n-k][j] = i++;// Левый верхний столбецfor (j = (n-k-1); j >= k; j--)A[j][(k-1)] = i++;}if ( n % 2 )A[p][p] = n*n;// Распечатка матрицыfor (i = 0; i < n; ++i)for (j = 0; j < n; ++j){printf("%5d", A[i][j]);if (j == (n-1))91


}}_getch();return 0;printf("\n");printf("\n Press any key: ");Результат выполнения программы показан на рис. 6.2.Рисунок 6.2 – Заполнение матрицы по спиралиПример 2. Каждый день производятся замеры некоторых величин(вещественных значений), причем значения этих величин сводятся в прямоугольнуютаблицу размера n m. Составьте многомерный массив данныхза 30 дней. Формирование данных произвести по случайному равномерномузакону из интервала от –12 до 21.Этот пример относится к определению трехмерного массива данных.Программный код решения примера:#include #include #include #include #define n 6#define m 7#define N 30const int Left = -12; // Левая границаconst int Right = 21; // Правая границаint main (void){float R, r;float A[N][n][m];int i, j, k;// Инициализация генератора случайных чиселsrand((unsigned) time(NULL));printf("\n\t The values of every 10 days from 30days:");92


Формирование данных за 30 днейfor (k = 0; k < N; ++k)for (i = 0; i < n; ++i)for (j = 0; j < m; ++j){ r = (float) rand()/RAND_MAX;R = Left + (Right - Left)*r;A[k][i][j] = R;}// Печать данных за каждый 10-й деньfor (k = 0; k < N; k += 10) { printf("\n");for (i = 0; i < n; ++i) { printf("\n");for (j = 0; j < m; ++j)printf("%10.4f", A[k][i][j]);}}printf("\n Press any key: ");_getch();return 0;}В программе используется трехмерный массив размера 30 6 7.Это означает, что прямоугольная таблица (массив) данных размера 6 7как бы скрепляется 30 раз – по заданному числу дней. Границы случайныхчисел определены с помощью спецификатора const.Возможный результат выполнения программы показан на рис. 6.3.Рисунок 6.3 – Вывод данных за каждый 10-й деньПример 3. Напишите программу по перемножению двух матриц Аи В с размерностями (m r) и (r n) соответственно. Матрицу А примитеразмером 4 5, матрицу В – размером 5 3 (обе целочисленные).Условием перемножения двух матриц А и В является равенство числастолбцов матрицы А и числа строк матрицы В. Если первая матрица Аимеет размер m r, то вторая матрица В должна иметь размер r n.В результате перемножения получим матрицу С размера m n. Приведемследующую схему по размерностям:93


Поэлементное перемножение двух матриц в стандартной математическойформе имеет следующий вид:nCij ailbkj,i 1,2, 3..., n,j 1,2, 3...,mk 1С учетом синтаксиса формирования массивов в языке С индексациядолжна начинаться с нуля, поэтому формулу перепишем в следующем виде:Cijn1 k 1ailbkj,i 1,2, 3..., n 1,Программный код решения примера:#include #include #define m 4#define r 5#define n 3int main (void) {int i, j, k; // переменные цикловj 0,1,2, 3..., m 1.const int A[m][r] = {{1,2,3,4,5},{2,3,4,5,6},{2,2,2,2,2},{3,3,3,3,3}};const int B[r][n] = {{9,8,7},{1,2,3},{4,5,6},{7,8,9},{1,1,1}};// Массив под результат произведения двух матрицint C[m][n];// Обнуление результирующей матрицыfor (i = 0; i < m; i++)for (j = 0; j < n; j++)C[i][j] = 0;// Формирование результата произведения двух матрицfor (i = 0; i < m; i++)for (j = 0; j < n; j++)for (k = 0; k < r; k++)C[i][j] = C[i][j] + A[i][k]*B[k][j];// Распечатка результата произведения двух матрицprintf("\n 1) Index: \"ijk\". Matrix (%dx%d):\n", m, n);for (i = 0; i < m; i++) {printf("\n");for (j = 0; j < n; j++)printf(" %4d", C[i][j]); }94


printf("\n\n ... Press any key: ");_getch();return 0;}В программе используются три цикла по формированию произведениядвух матриц. Первый цикл (переменная i) связан с количеством строкпервой матрицы (матрицы А), второй цикл (переменная j) связан с количествомстолбцов второй матрицы (матрица В), третий цикл (переменнаяk) связан со смежной размерностью матриц, которая исчезает в результирующейматрице С. Матрицы А и В определены как неизменяемые типы(const int). Приведенный программный метод можно назвать как первыйметод, метод "ijk".Результат выполнения программы показан на рис. 6.4.Рисунок 6.4 – Результат произведения двух матрицПример 5. Напишите программу транспонирования матрицы, размерностикоторой (количество строк и количество столбцов) вводятсяс клавиатуры, а элементы – вещественные случайные числа, распределенныепо равномерному закону из интервала [0;15].TПо определению транспонированная матрица – это матрица A ,полученная из исходной матрицы A заменой строк на столбцы.Программный код решения примера:#include #include #include #include #include int main (void) {int i, j, n, m;double *A_ptr, *B_buf;// Для рандомизации псевдослучайных чиселsrand((unsigned)time(NULL));setlocale(LC_ALL, "Russian");printf("\n Введите размерность матрицы - \n число строк и числостолбцов через пробел: ");scanf_s("%d%d", &n, &m);A_ptr = (double *) calloc((n*m),sizeof(double));B_buf = (double *) calloc((n*m),sizeof(double));for (i = 0; i < n*m; ++i)95


A_ptr[i] = 15.0*rand()/RAND_MAX;setlocale(LC_NUMERIC, "English");printf("\n Исходная матрица:\n");for (i = 0; i < n; ++i) { printf("\n");for(j = 0; j < m; ++j)printf(" %8.4f", A_ptr[i*m+j]); }// Основной фрагмент транспонированияfor (i = 0; i < n; ++i)for (j = 0; j < m; ++j)B_buf[j*n+i] = A_ptr[i*m+j];printf("\n\n Транспонированная матрица:\n");for (j = 0; j < m; ++j) {printf("\n");for(i = 0; i < n; ++i)printf(" %8.4f", B_buf[j*n+i]); }// Освобождение выделенной памятиfree(A_ptr); free(B_buf);printf("\n\n Press any key: ");_getch();return 0;}В программе использованы библиотечные функции для установкирусских шрифтов setlocale(LC_ALL, "Russian") и вывода элементов матрицыс плавающей точкой: setlocale(LC_NUMERIC, "English"). Для этих функцийподключен заголовочный файл locale.h.Возможный результат работы программы показан на рис. 6.5.Рисунок 6.5 – Пример транспонирования матрицыПример 4. Создать блок-схему к заданию и программу на С++нахождения суммы квадратов индексов максимального элемента матрицы,ввод элементов матрицы сделать с клавиатуры.Блок-схема к заданию на рис. 6.6, окно кода программы показанна рис. 6.7, а результат выполнения программы на рис. 6.8.96


Началоi=0,m-1Ввод 3 –x элементов(i+1) строкиj=0,m-1Ввод элементамассива A[i,j]i=0,m-1j=0,m-1Вывод элементамассива A[i,j]max:=A[0,0]i=0,m-1j=0,m-1ДаA[i,j]>maxНетmax:=A[i,j]k=i+1l=j+1Sum=k*k+l*lВывод max, k, l, SumКонецРисунок 6.6 – Блок-схема к заданию97


Программный код решения примера://Шестая программа//Автор Загребельный С.Л.#include #include #define m 3int main (void) {int i, j, k, l,max,sum; // переменные цикловint A[m][m];// Ввод элементов матрицыfor (i = 0; i < m; i++){printf("\n vvedite 3 elementa %d stroki\n",i+1);for (j = 0; j < m; j++)scanf("%i,%j",&A[i][j]);}// Распечатка матрицprintf("\n Ishodnaya matrica (%dx%d):\n", m, m);for (i = 0; i < m; i++) {printf("\n");for (j = 0; j < m; j++)printf(" %4d", A[i][j]);}//max=A[0][0];for (i = 0; i < m; i++)for (j = 0; j < m; j++)if (A[i][j]>max) {max=A[i][j];k=i+1;l=j+1;}printf(" \n maximalniy element matrici= %d ego nomer stroki=%d nomer stolbca=%d\n", max,k,l);sum=k*k+l*l;printf(" \n summa kvadratov indeksov maximalnogo elementamatrici %d\n", sum);printf("\n\n ... Press any key: ");_getch();return 0;}98


Рисунок 6.7 – Окно примераРисунок 6.8 – Обработка элементов матрицы6.3 Индивидуальные заданияСоставить блок-схемы и программы для решения следующих задачтаблица 6.1. (задача a на селективную обработку элементов матрицы,задача б на обработку элементов строк и столбцов).99


Таблица 6.1– Индивидуальные заданияВариантСодержание задачи123456789101112а) Найти сумму положительных кратных 3 элементов.б)Найти среднее геометрическое нечетных элементов 2-го столбцаи количество кратных 5 элементов 3-ей строки матрицы D(5;5).а) Найти количество отрицательных четных элементов.б)Найти сумму нечетных элементов 3-го столбца и произведениеотрицательных кратных 3 элементов 2-ой строки матрицы С(6;6).а) Найти произведение положительных четных элементов.б)Найти произведение суммы кратных 3 чисел в 4-ом столбцена количество нечетных чисел 2-ой строки матрицы Т(4;6).a) Найти сумму отрицательных четных элементов.б)a)б)a)б)В матрице А(5;7) найти разность количества нечетных чисел 1-ойстроки и количества четных чисел 4-го столбца.Найти максимальный элемент, номер строки и столбца, в котором оннаходится.Найти сумму нечетных элементов 2-го столбца и произведениеотрицательных кратных 3 элементов 4-ой сторки матрицы D(4;4).Найти минимальный элемент, номер строки и столбца, в котором оннаходится.Найти произведение отрицательных четных элементов 2-ой строкии количество не кратных 5 элементов 2-го столбца матрицы В(3;5).a) Найти количество положительных кратных 5 элементов.б)Подсчитать количество положительных кратных 3 элементов 1-ойстроки и количество нечетных элементов 2-го столбца матрицыА(6;6).a) Найти произведение отрицательных нечетных элементов.б)а)б)Найти разность произведения нечетных чисел 3-ей строкии произведения отрицательных чисел 1-го столбца матрицы В(4;4).Найти квадрат минимального элемента и номер строки и столбца,где он находится.В матрице T(3;9) найти разность произведения нечетных чисел 2-ойстроки и суммы положительных чисел 6-го столбца.а) Найти произведение положительных не кратных 5 элементов.б)а)б)В матрице A(5;5) найти сумму количества четных чисел 3-ей строкии количества отрицательных чисел 4-го столбца.Найти максимальный по модулю элемент и номер строки и столбца,где он находится.В матрице С(5;6) найти произведение количества нечетных чисел 2-го столбца и количества положительных чисел 3 строки.а) Найти количество отрицательных не кратных 3 элементов.б)Найти максимальный элемент 2-ой строки и количество четныхэлементов 5-го столбца матрицы Х(5;5).100


Продолжение таблицы 6.1а) Найти произведение положительных нечетных элементов.13 В матрице A(6;6) найти произведение суммы четных чисел 3-ейб)строки и суммы отрицательных чисел 1-го столбца.141516171819202122232425а) Найти сумму отрицательных нечетных элементов.б)Найти произведение суммы положительных чисел 1-й строки на суммучетных чисел 2-го столбца матрицы М(4;5).а) Найти произведение отрицательных четных элементов.б)а)б)а)б)а)б)В матрице А(7;7) найти разность количества отрицательных чисел 2-ой строки и количества нечетных чисел 3-го столбца.Найти количество элементов, больших заданного числа С (ввод числаС сделать с клавиатуры).В матрице B(4;6) найти сумму произведения четных чисел1-ой строки и произведения положительных чисел 3-го столбца.Найти минимальный по модулю элемент и номер строки и столбца,где он находится.Подсчитать количество кратных 3 чисел 2-ой строки и количествочетных чисел 1-го столбца матрицы А(6;6).Найти произведение элементов, меньших заданного числа Т (вводчисла Т сделать с клавиатуры).Найти разность произведения нечетных чисел 3-ей строкии произведения отрицательных чисел 1-го столбца матрицы В(4;4).а) Найти сумму положительных кратных 5 элементов.б)В матрице А(8;8) найти разность произведения нечетных чисел 3-ейстроки и суммы положительных чисел 6-го столбца.а) Найти произведение отрицательных четных элементов.б)В матрице A(5;5) найти сумму количества четных чисел 2-ой строкии количества отрицательных чисел 4-го столбца.а) Найти количество положительных нечетных элементов.б)В матрице A(3;3) найти произведение количества нечетных чисел 1-ой строки и количества положительных чисел 3-го столбца.а) Найти количество элементов, меньших числа 5.б)Найти максимальный элемент 3-го столбца и сумму нечетныхэлементов 1-ой строки матрицы Т(5;5).а) Найти произведение положительных кратных 3 элементов.б)В матрице A(6;6) найти произведение суммы четных чисел в 3-ейстроке и суммы отрицательных чисел 1-го столбца.а) Найти сумму отрицательных не кратных 5 элементов.б)а)б)Найти произведение суммы положительных чисел в 4-ом столбцена количество четных чисел 2-ой строки матрицы F(6;6).Найти квадрат максимального элемента и номер строки и столбца,где он находится.В матрице А(7;7) найти разность количества положительных чисел1-ой строки и количества четных чисел 3-го столбца.101


Продолжение таблицы 6.1а) Найти сумму четных элементов из интервала [-10;10] матрицы А(4;4).26 Найти произведение количества четных элементов 3 строки на суммуб)нечетных элементов 2 столбца матрицы В(5;4).27282930a)б)a)б)a)б)a)б)Найти количество кратных 3 элементов из интервала [-6;8] матрицыА(5;5).В матрице A(3;3) найти произведение количества четных чисел 2-ойстроки и количества отрицательных чисел 4-го столбца.Найти произведение отрицательных нечетных элементов матрицыА(4;3).В матрице А(5;5) найти произведение количества нечетных чисел 3-го столбца и количества отрицательных чисел 3 строки.Найти количество положительных элементов из интервала [-5;6]матрицы В(6;6).В матрице A(6;6) найти произведение суммы кратных 3 чисел 2-ейстроки и суммы отрицательных чисел 2-го столбца.Найти максимальный по модулю элемент и номер строки и столбца,где он находится.Найти произведение количества четных чисел в 2-ом столбце на количествонечетных чисел 2-ой строки матрицы В(4;4).6.4 Контрольные вопросы1 Как организуются многомерные числовые массивы в языке С++?2 Как организуется индексирование числовых массивов в языкеС++?3 На кого или на что возлагается контроль границ числовых массивовв языке программирования С++?4 В какой очередности и как происходит заполнение многомерныхчисловых массивов в программах на языке С++?5 Для чего применяется начальная инициализация числовых массивовпри дальнейшем их использовании?6 Сколько потребуется операторов цикла для вывода на консольдвухмерного числового массива (матрицы чисел)?7 Почему при определении размерности массива с помощью препроцессорнойдирективы define не используется точка с запятой послечислового значения?102


ЛАБОРАТОРНАЯ РАБОТА 7Построение графика функцииЦель: научится строить график функции на языке программированияС++ в консольном окне с помощью функций.7.1 Теоретическая частьПринципы программирования на языке С основаны на понятиифункции. Например, к системным функциям относятся printf(), scanf(),gets(), putchar() и др. Функции – это строительные элементы языка Си то место, в котором выполняется вся работа программы.Большие программы обычно состоят из нескольких пользовательскихфункций и ряда системных функций. Функция – самостоятельнаяединица программы. Функции повышают уровень модульности программы,облегчают ее чтение, внесение изменений и коррекцию ошибок.В основе всех программ на языке программирования С лежат однии те же фундаментальные элементы – функции. В частности, функцияmain() является обязательной для любой программы. Во всех программахС определяется единая внешняя функция с именем main(), служащаяточкой входа в программу, то есть первой функцией, выполняемой послезапуска программы.Ни одна программа в языке С++ не может обойтись без функций.Функция в языке С играет ту же роль, что и подпрограммы или процедурыв других языках. Каждая функция языка С имеет имя и список аргументов.По соглашению, принятому в языке С, при записи имени функциипосле него ставятся круглые скобки. Это соглашение позволяет легкоотличить имена переменных от имен функций.Рассмотрим модельный пример программы, в которой, кроме функцииmain(), содержатся еще три функции.#include int main(void) /* Главная функция */{ /* Начало тела функции */function1(); /* вызов первой функции */function2(); /* вызов второй функции */function3(); /* вызов третьей функции */} /* Конец тела функции main() *//* Начало определения первой функции */function1() { /* Начало тела первой функции *//* Операторы первой функции *//* Конец тела первой функции */}103


* Начало определения второй функции */function2(){ /* Начало тела второй функции*//* Операторы второй функции *//* Конец тела второй функции*/}/* Начало определения третьей функции */function3(){ /* Начало тела третьей функции*//* Операторы третьей функции *//* Конец тела третьей функции*/}В условной (модельной) программе имеются четыре функции:main(), function1(), function2(), function3(). Эти функции не имеют аргументов.Позднее рассмотрим функции, которые имеют аргументы. Аргументыфункции – это величины, которые передаются функции во времяее вызова. Аргумент, стоящий в операторе вызова функции, называетсяфактическим параметром. Аргументы, стоящие в заголовке функции,называются формальными параметрами. В языке С++ функция можетвозвращать значение в вызывающую программу посредством оператораreturn. Оператор возврата из функции в точку вызова имеет двеформы:return;return выражение;В общем виде функция выглядит следующим образом:возвр-тип имя-функции(список параметров){Тело_функции}Тело_функции – это часть определения функции, ограниченнаяфигурными скобками и непосредственно размещенная вслед за заголовкомфункции. Тело функции может быть либо составным оператором, либоблоком. В языке С определения функций не могут быть вложенными,т. е. внутри одной функции нельзя объявить и расписать тело другойфункции.Возвращаемый тип возвр-тип функции определяет тип данного, возвращаемогофункцией. Например, это могут быть int, float, double и т. д.В случае, когда функция ничего не возвращает, ей присваивается тип void.Функция может возвращать любой тип данных, за исключением массивовсписок параметров – это список, элементы которого отделяются другот друга запятыми. При вызове функции параметры принимают значенияаргументов. Если функция без параметров, то такой пустой список можноуказать в явном виде, поместив для этого внутри скобок ключевое словоvoid. Все параметры функции (входящие в список параметров) должны104


объявляться отдельно, причем для каждого из них надо указывать и тип,и имя. В общем виде список объявлений параметров должен выглядетьследующим образом:fun(тип имя_перем1, тип имя_перем2,..., тип имя_перем N)Например:fun(int i, int j, float k, char str1, char str2)Рассмотрим пример программы с выводом сообщения не в главнойфункции main(), а в другой:#include #include void printMessage (void){printf("\n\t hello, world\n");return;printf("\n\t 123\n");}int main(void){printMessage();printf("\n Press any key: ");_getch();return 0;}Результат выполнения программы показан на рис. 7.1.Рисунок 7.1 – Вывод сообщения с помощью двух функцийПрограмма состоит из двух функций: printMessage() и main(). Выполнениепрограммы всегда начинается с функции main(), которую называютеще главной. Внутри функции main() происходит вызов функцииprintMessage() без параметров. Когда происходит вызов функции, выполнениепрограммы передается непосредственно вызванной функции. Внутрифункции printMessage() выполняется только утверждениеprintf("\n\t hello, world\n");Несмотря на то, что в функции printMessage() есть еще одно утверждениеprintf("\n\t 123\n"), которое не выполняется, поскольку используетсяутверждение возврата (return) из функции.105


В языке С функция введена как один из производных типов.Формальные параметры в определениях функций могут объявлятьсяв форме прототипа. Прототипы дают компилятору возможность тщательнеевыполнять проверку типов аргументов. Если используются прототипы,то компилятор может обнаружить любые сомнительные преобразованиятипов аргументов, необходимые при вызове функции, если тип ее параметровотличается от типов аргументов. Компилятор также обнаружитразличия в количестве аргументов, использованных при вызове функции,и в количестве параметров функции.В общем случае прототип функции должен выглядеть таким образом:тип имя_функции(тип имя_парам1, тип имя_парам2,..., типим_парамN);В приведенной выше программе прототип функции printMessage()не использовался, так как сама функция была объявлена до главной функцииmain(). Для переносимости С-кода в С++ использование прототипафункции обязательно. Поэтому к хорошему стилю программирования относитсяиспользование прототипов функций, поскольку большие программыобычно состоят из нескольких функций, часто расположенныхв различных файлах.Вышеприведенная программа с использованием прототипа функцииprintMessage() будет выглядеть следующим образом:#include #include //void printMessage (void);//Прототип функцииint main(void){void printMessage (void); //Прототип функцииprintMessage(); // Вызов функцииprintf("\n Press any key: ");_getch();return 0;}// Определение функцииvoid printMessage (void){printf("\n\t hello, world\n");return;printf("\n\t 123\n");}В листинге программы показаны две возможности использованияпрототипа функции printMessage(). При этом, сама функция printMessage()объявлена после функции main().106


Формальные параметры функции определены в прототипе функции.При обращении к функции используются фактические параметры, называемыеаргументами функции.Список фактических параметров – это список выражений, количествокоторых равно количеству формальных параметров функции (исключениесоставляют функции с переменным числом параметров). Соответствиемежду формальными и фактическими параметрами устанавливаетсяпо их взаимному расположению в списках. Между формальными и фактическимипараметрами должно быть соответствие по типам.Синтаксис языка С++ предусматривает только один способ передачипараметров – передачу по значениям. Это означает, что формальные параметрыфункции локализованы в ней, т. е. недоступны вне определенияфункции и никакие операции над формальными параметрами в теле функциине изменяют значений фактических параметров.Передача параметров по значению предусматривает следующие шаги:1 При компиляции функции выделяются участки памяти для формальныхпараметров, т. е. формальные параметры оказываются внутреннимиобъектами функции. При этом для параметров типа float формируютсяобъекты типа double, а для параметров типов char и short int создаютсяобъекты типа int. Если параметром является массив, то формируется указательна начало этого массива, и он служит представлением массивапараметрав теле функции.2 Вычисляются значения выражений, использованных в качесствефактических параметров при вызове функции.3 Значения выражений – фактических параметров заносятсяв участки памяти, выделенные для формальных параметров функции.4 В теле функции выполняется обработка с использованием значенийвнутренних объектов-параметров, и результат передается в точку вызовафункции как возвращаемое ею значение.5 Никакого влияния на фактические параметры (на их значения)функция не оказывает.6 После выхода из функции освобождается память, выделеннаядля ее формальных параметров.Важным является момент, что объект вызывающей программы, использованныйв качестве фактического параметра, не может быть изменениз тела функции. Для подобного изменения существует косвенная возможностьизменять значения объектов вызывающей программы действиямив вызванной функции. Это становится возможным с помощью указателя(указателей), когда в вызываемую функцию передается адрес любого объектаиз вызывающей программы. С помощью выполняемой в тексте функцииразыменования указателя осуществляется доступ к адресуемому указателемобъекту из вызывающей программы. Тем самым, не изменяя самогопараметра (указатель-параметр постоянно содержит только адрес одногои того объекта), можно изменять объект вызывающей программы.107


Массивы и строки также могут быть параметрами функции. В этомслучае внутрь функции передается только адрес начала массива. Тогдаможно в качестве параметра использовать указатель. Приведем два равноправныхпрототипа функций:float fun(int n, float A[ ], float B[ ]);float fun(int n, float *a, float *b);Поскольку массив передается в функцию как указатель, внутрифункции можно изменять значения элементов массива – фактического параметра,определенного в вызывающей программе. Это возможнои при использовании индексирования, и при разыменовании указателейна элементы массива.В языке С существует возможность создавать функции, число аргументовкоторых не определено – функции с переменным числом аргументов.При этом следует указать только количество аргументов. Пример прототипафункции с переменным числом аргументов:int fun(int n, ј);Многоточие (ј) в прототипе функции означает, что функция получаетпеременное число аргументов любого типа. Многоточие должно всегданаходиться в конце списка параметров.Макросы и определения заголовочного файла переменных аргументовstdarg.h (табл. 7.1) предоставляют программисту средства, необходимыедля построения функций со списком аргументов переменной длины.Таблица 7.1 – Макросы заголовочного файла stdarg.hИдентификатор Объяснениеva_listТип, предназначающийся для хранения информации,необходимой макросам v_start, va_arg и va_end. Чтобыполучить доступ к аргументам в списке переменнойдлины, необходимо объявить объект типа va_listva_start Макрос, который вызывается перед обращениемк аргументам списка переменной длины. Он инициализируетобъект, объявленный с помощью va_list,для использования макросами va_arg и va_endva_argva_endМакрос, расширяющийся до выражения со значениеми типом следующего аргумента в списке переменнойдлины. Каждый вызов его изменяет объект, объявленныйс помощью va_list так, что объект указываетна следующий аргумент спискаМакрос обеспечивает нормальный возврат из функции,на список аргументов которой ссылается макросva_start108


Примеры обращений к функции с фактическими аргументами:double k;double v1 = 1.5,v2 = 2.5,v3 = 3.5;// Первый вариант, где 3 – количество аргументовk = fun(3,v1, v2, v3);// Второй вариант, где 0.0 – завершающий нуль списка аргументовk = fun(v1, v2, v3, 0.0);Указатели, передаваемые в функцию, могут быть указателямина указатели. Указатели могут указывать на начало какого-либо массиваи т. д. Указатели могут использоваться для защиты массивов, над которыминеобходимо произвести некоторые вычисления или преобразования.Особым свойством указателей можно считать возможность использоватьих в качестве возвращаемых значений функций. Поскольку функциивозвращают только одно значение, то несколько значений одного типаможно поместить в массив, а затем указатель на этот массив использоватьв качестве возвращаемого значения.Общая форма определения функции, которая возвращает указатель,следующая:тип *имя_функции ( аргументы функции ){// тело функциитип *имя_указателя;?return имя_указателя;}Рассмотрим пример, в котором осуществляется сложение двух одномерныхмассивов и результат возвращается через указатель.Программный код решения примера:#include #include #include int *out2(int A[], int B[], int);int main (void) {int i, n;int A[] = {1,2,3,4,5};int B[] = {2,2,2,2,2};int *ptrAB = NULL;109


n = (sizeof(A)/sizeof(A[0]));puts("\n The initial arrays: ");for (i = 0; i < n; i++)printf(" %d", A[i]);puts("");for (i = 0; i < n; i++)printf(" %d", B[i]);ptrAB = out2(A, B, n);puts("\n\n Result from function: ");for (i = 0; i < n; i++)printf(" %d", ptrAB[i]);puts("\n\n Control of the arrays: ");for (i = 0; i < n; i++)printf(" %d", A[i]);puts("");for (i = 0; i < n; i++)printf(" %d", B[i]);free(ptrAB); // освобождение выделенной памяти}printf("\n\n ... Press any key: ");_getch();return 0;int *out2(int A[], int B[], int n){int i;int *ptr = (int *)calloc(n, sizeof(int)); //выделение памятиfor (i = 0; i < n; i++)ptr[i] = A[i] + B[i];}return ptr;Программа не требует особых пояснений.Следует отметить, что никогда не следует возвращать адрес переменной,определенной в теле функции, так как переменные функции являютсялокальными, и они существуют только во время работы функции.Указатели возвращаются подобно значениям любых других типовданных. Чтобы вернуть указатель, функция должна объявить его тип в качестветипа возвращаемого значения. Таким образом, если функция возвращаетуказатель, то значение, используемое в ее инструкции return, такжедолжно быть указателем. В частности, многие библиотечные функции,предназначенные для обработки строк, возвращают указатели на символы.110


В языке С++ существует такой механизм как указатель на функцию.Допустим, существует несколько функций для различных операций с данными.В этом случае оказывается удобным определить указатель на функцию,и использовать его там, где требуется производить расчет для различныхфункций.Указатель на функцию – это переменная, содержащая адрес в памяти,по которому расположена функция. Имя функции – это адрес началапрограммного кода функции. Указатели на функции могут быть переданыфункциям в качестве аргументов, могут возвращаться функциями, сохранятьсяв массивах и присваиваться другим указателям на функции.Типичное определение указателя на функцию следующее:тип_возвращаемый_функцией(*имя_указателя_на_функцию)(аргументы);В приведенном объявлении используются круглые скобки, в которыхсобственно и определяется указатель на функцию, которая возвращает тотили иной тип – тип_возвращаемый_функцией. Хотя знак * обозначаетпрефиксную операцию, он имеет более низкий приоритет, чем функциональныекруглые функции, поэтому для правильного комбинированиячастей объявления необходимы еще и дополнительные скобки. При этомаргументы – это аргументы той или иной функции с заданным типом возвращаемогозначения, и на которую ссылается указатель*имя_указателя_на_функцию. Очевидно, что возможны сложные объявленияфункций.Указатели на функции часто используются в системах, управляемыхменю. Пользователь выбирает команду меню (одну из нескольких). Каждаякоманда обслуживается своей функцией. Указатели на каждую функциюнаходятся в массиве указателей. Выбор пользователя служит индексом,по которому из массива выбирается указатель на нужную функцию.Другим типичным применением указателей на функции являютсяреализация обобщенных алгоритмов, например, алгоритмов сортировкии поиска. В этом случае критерии сортировки и поиска реализуются в видеотдельных функций и передаются при помощи указателей на функциив качестве параметра реализации основного алгоритма.7.2 Практическая частьПример 1. Напишите программу сортировки по возрастанию заданногомассива случайных чисел, равномерно распределенных в интервале[–6; 6], с помощью вспомогательной функции.111


Программный код решения примера:#include #include #include #include #define MAX 10// Прототип функции с формальными параметрамиvoid sort(double arr[], int n);int main (void) {double M[MAX];int i, size = MAX;long int L;unsigned int some;L = (long) time(NULL);srand((unsigned)L);for (i = 0; i < MAX; ++i)M[i] = 12.0*rand()/RAND_MAX - 6.0;printf("\n\t The original array:\n");for (i = 0; i < MAX; ++i)printf("\t%8.4f\n", M[i]);// Обращение к функции с фактическими параметрамиsort(M, size);// Распечатка отсортированного массиваprintf("\n\t After sorting: \n");for (i = 0; i < MAX; ++i) printf("\t%8.4f\n", M[i]);printf("\n Press any key: ");_getch();return 0; }// Вспомогательная функция сортировкиvoid sort(double Array[], int m) {int i, j;double tmp;for (i = 0; i < m-1; ++i)for (j = 0; j < m-i-1; ++j)if (Array[j+1] < Array[j]) {tmp = Array[j];Array[j] = Array[j+1];Array[j+1] = tmp;}}Следует обратить внимание на имена формальных параметровв самой функции sort() и в ее прототипе: они имеют разные имена, но одинаковыетипы. Фактические параметры или аргументы функции sort()в вызывающей программе (в теле функции main()) имеют свои имена,не связанные с именами формальных параметров.112


Заполнение массива случайными числами производится с помощьюбиблиотечной функции rand() и макроопределения RAND_MAX. Для рандомизациимассива случайных чисел при каждом новом запуске программыиспользуется библиотечная функция srand(), аргументом которой являетсясистемное время, формируемое библиотечной функцией time().Возможный результат выполнения программы показан на рис. 7.2.Рисунок 7.2 – Пример сортировки числового массиваРанее было отмечено, что в языке С++ аргументы передаютсяв функции по значению и не существует прямого способа изменить переменнуювызывающей функции, действуя внутри вызываемой функции.Благодаря аргументам-указателям функция может обращаться к объектамв вызвавшей ее функции, в том числе модифицировать их. В качестве примерарассмотрим функцию swap(), в задачу которой входит обмен элементовместами. Для решения такой задачи необходимо передать из вызывающейпрограммы (например, из главной функции main()) в функцию указателина переменные, которые нужно изменить.Программный код решения примера:#include #include // Прототип функцииvoid swap(int*, int*);int main (void) {int a = 10,b = -20;// Вывод на консоль исходных значений переменных113


printf("\n Initial values:\n a = %d, b = %d\n", a, b);// Вызов функции swap() с фактическими параметрамиswap(&a, &b);// Результат после обращения функции swap()printf("\n New values:\n a = %d, b = %d\n", a, b);printf("\n ... Press any key: ");_getch();return 0;}// Определение функцииvoid swap(int *pa, int *pb){int temp;temp = *pa;*pa = *pb;*pb = temp;}В программе в качестве фактических параметров функции swap()выступают адреса заданных переменных. Можно было в главной функцииопределить указатели и инициализировать их адресами заданных переменных,а потом передать эти указатели в функцию swap.Результат выполнения программы показан нa рис. 7.3.Рисунок 7.3 – Результат обмена данными, выполненного функцией swap()Пример 4. Напишите программу с функцией пузырьковой сортировки,использующей вызов по ссылке.В условии примера «вызов по ссылке» означает, что в качестве фактическихпараметров функций будут использоваться адреса переменных.И в этом случае прототип таких функций будет содержать указателина соответствующие типы.Программный код решения примера:#include #include 114


Прототип функцииvoid bsort (int* const, const int);int main (void){int A[] = {56, 34, 2, 0, 1, -21, 6, 8, 7};int i, n;//Размерность массиваn = sizeof(A)/sizeof(A[0]);puts("\n Data items in original order:");for (i = 0; i < n; i++)printf(" %3d", A[i]);// Вызов функции сортировки - bsort()bsort (A, n);puts("\n\n Data items in ascending order:");for (i = 0; i < n; i++)printf(" %3d", A[i]);printf("\n\n ... Press any key: ");_getch();return 0;}// Определение функцииvoid swap(int *pa, int *pb){int temp;temp = *pa;*pa = *pb;*pb = temp;}void bsort (int *const arr, const int size){int pass, //счетчик проходовj; // счетчик сравнений// Прототип функции обмена - swap()void swap (int*, int*);// Цикл для контроля проходовfor (pass = 0; pass < size - 1; pass++ ){// цикл для контроля сравнений на данном проходеfor (j = 0; j < size - 1; j++){// обмен значений при нарушении порядка возрастанияif (arr[j] > arr[j + 1]){swap(&arr[j], &arr[j+1]);}}}}115


В программе функция сортировки bsort() в качестве формального параметраиспользуется константный указатель, который указывает на первыйэлемент заданного массива. Второй формальный параметр также константный,чтобы подчеркнуть неизменность этого параметра в теле функции bsort().Передача функции размера массива в качестве параметра имеет два преимущества– это хороший стиль программирования и, кроме того, такуюфункцию можно использовать многократно.Прототип функции swap() включен в тело функции bsort(), потомучто это единственная функция, которая вызывает функцию обмена swap().Пример выполнения программы показан на рис. 7.4.Рисунок 7.4 – Пример сортировки массива методом пузырькаПример 5. Напишите программу построения на экране дисплеяграфика следующей функции:x3y sin(3x)eПредусмотрите возможность записи в текстовый файл графика даннойфункции.Для решения примера используем средства вывода на печать форматированныхданных без применения специальных графических библиотек.Результат выполнения программы на рис. 7.5.Программный код решения примера:// Заголовочные файлы#include #include #include #include // Размеры диаграммы по ширине и высоте экрана#define SCREENW 79#define SCREENH 25// Функция построения графика заданной функцииvoid plot (FILE *fout, double a, double b, double (*f) (double)){// Формальные параметры функции plot// FILE *fout – указатель на поток вывода// double a – левая граница оси абсцисс// double b – правая граница оси абсцисс116


double (*f) (double) – указатель на функциюchar screen[SCREENW][SCREENH];double x, y[SCREENW];double ymin = 0, ymax = 0;double hx, hy;int i, j;int xz, yz;// hx – шаг по оси абсциссhx = (b - a) / (SCREENW - 1);for (i = 0, x = a; i < SCREENW; ++i, x += hx) {// вычисляем значение функцииy[i] = f (x);// запоминаем минимальное и максимальное значенияif (y[i] < ymin) ymin = y[i];if (y[i] > ymax) ymax = y[i];}hy = (ymax - ymin) / (SCREENH - 1);yz = (int)floor (ymax / hy + 0.5);xz = (int)floor (-a / hx + 0.5);// рисование осей координатfor (j = 0; j < SCREENH; ++j) {for (i = 0; i < SCREENW; ++i) {if (j == yz && i == xz)screen[i][j] = '+';else if (j == yz)screen[i][j] = '-';else if (i == xz)screen[i][j] = '|';elsescreen[i][j] = ' ';}}// рисование графика функцииfor (i = 0; i < SCREENW; ++i) {j = (int)floor ((ymax - y[i]) / hy + 0.5);screen[i][j] = '.'; // символ начертания графика}// вывод результата в файл или в стандартный поток stdoutfor (j = 0; j < SCREENH; ++j) {for (i = 0; i < SCREENW; ++i)fputc (screen[i][j], fout);fprintf (fout, "\n");}}// Заданная функцияdouble f (double x){return sin (3.0*x) * exp (-x / 3.0);}int main (void){117


Вывод графика в стандартный поток (консоль)plot (stdout, 0.0, 10.0, f);printf("\n\n … Press any key: ");_getch();return 0;}В программе используется указатель на файл, который может бытьстандартным потоком, т. е. экран дисплея. В главной функции main() происходитобращение к функции рисования графика plot(), в которую вводятфактические параметры, в частности файл – это stdout, т. е. стандартныйпоток, 0.0 – это левая граница оси абсцисс, 10.0 – правая граница оси абсцисс,f – имя функции с описанием зависимости y = f(x).Пример выполнения программы показан на рис. 7.5.Рисунок 7.5 – Пример построения графика функции на консоли7.3 Индивидуальные заданияСогласно своему варианту (таблица 7.2) создать программудля построения графика функции.Таблица 7.2 – Индивидуальное заданиеВариантФункция, для построения графика1 sin 3 2x2 23xx sin 3118


Продолжение таблицы 7.233 3x sin x5x sin x 2x42 3 3 33 2 55 x cos x 2x3xx56 3 sin 27ln(sin 4x1)3 28 sin xcos x 293 3 2102x cos x 11 sin x 5 2x312 cosx2( x1) 2135 3 5cosx 2x3 x14 xsinx2 2x15ln(cos 2x1)x1316 5 sinx1175 23lnsin x x2218 sin x x cosx 219 x x cos x20 x 2 sin 5x21 3 1 xx sin 2x22 2sin( x e )sin x x232 0, 253119


Продолжение таблицы 7.2243 2 4sin253 4sin xx cos263 3 2sinx x27 x x cos x284x sin 4x29 2 3sin x30 2 3x( x1) cos x7.4 Контрольные вопросы1 Каким образом можно вернуть из функции несколько значений?2 Каким образом определяется тип функции?3 Как выглядит описание функции, которая возвращает указательна заданный тип, например, char?4 В каком месте программы можно определить указатель на функцию?5 Имеет ли указатель на функцию прототип и определение?6 Как осуществляется вызов функции с помощью указателя?7 Как взаимосвязаны между собой объявление функции, ее определениеи вызов функции?120


ЛАБОРАТОРНАЯ РАБОТА 8Файловый ввод и вывод в языке С++Цель: научится создавать программы на языке С++ используяданные текстовых файлов.8.1 Теоретическая частьФайл – это именованный объект, хранящий данные (программаили любая другая информация) на каком-либо носителе (дискета, винчестер,CD).В языке С++ файлом может быть все что угодно, начиная с дисковогофайла и заканчивая терминалом или принтером. Поток связываютс определенным файлом, выполняя операцию открытия. Как только файлоткрыт, можно проводить обмен информацией между ним и программой.Не у всех файлов одинаковые возможности. Например, к дисковомуфайлу прямой доступ возможен, в то время как к некоторым принтерам –нет. В языке С++ все потоки одинаковы, а файлы – нет.Если файл может поддерживать запросы на местоположение (указательтекущей позиции), то при открытии такого файла указатель текущейпозиции в файле устанавливается в начало. При чтении из файла (или записив него) каждого символа указатель текущей позиции увеличивается,обеспечивая тем самым продвижение по файлу.Файл отсоединяется от определенного потока (т. е. разрывается связьмежду файлом и потоком) с помощью операции закрытия. При закрытиифайла, открытого с целью вывода, содержимое (если оно есть) связанногос ним потока записывается на внешнее устройство. Этот процесс, которыйобычно называют дозаписью потока, гарантирует, что никакая информацияслучайно не останется в буфере диска. Если программа завершает работунормально, т. е. либо функция main() возвращает управление операционнойсистеме, либо вызывается функция exit(), то все файлы закрываютсяавтоматически. В случае аварийного завершения программы, например,в случае краха или завершения путем вызова функции abort(), файлыне закрываются.Файловая системы языка С++ предназначена для работы с самымиразнообразными устройствами, в том числе терминалами, дисками и накопителямина магнитной ленте. Даже если какое-то устройство сильноотличается от других, буферизованная файловая система все равно представитего в виде логического устройства, которое называется потоком.Потоки бывают двух видов: текстовые и двоичные.121


Текстовый поток – это последовательность символов. В стандартеС++ считается, что текстовый поток организован в виде строк, каждаяиз которых заканчивается символом новой строки. Однако в конце последнейстроки этот символ не является обязательным. В текстовом потокепо требованию базовой среды могут происходить определенные преобразованиясимволов. Например, символ новой строки может быть замененпарой символов – возврата каретки (например, \r) и перевода строки(например, \n), т. е. \r\n.Двоичные потоки – это последовательность байтов, которая взаимнооднозначно соответствует байтам на внешнем устройстве, причем никакогопреобразования символов не происходит. Кроме того, количество тех байтов,которые пишутся (читаются), и тех, которые хранятся на внешнемустройстве, одинаково. Однако в конце двоичного потока может добавлятьсяопределяемое приложением количество нулевых байтов. Такие нулевыебайты, например, могут использоваться для заполнения свободногоместа в блоке памяти незначащей информацией, чтобы она в точности заполниласектор на диске.Файловая система языка С++ состоит из нескольких взаимосвязанныхфункций. Самые распространенные из них показаны в табл. 8.1.Таблица 8.1 – Функции файловой системы языка С№ Имя функцииЧто делаетп/п1 fopen() Открывает файл2 fclose() Закрывает файл3 putc() Записывает символ в файл4 fputc() То же, что и putc()5 getc() Читает символ из файла6 fgetc() То же, что и getc()7 fgets() Читает строку из файла8 fputs() Записывает строку в файл9 fseek() Устанавливает указатель текущей позициина определенный байт файла10 ftell() Возвращает текущее значение указателя текущейпозиции в файле11 fprintf() Для файла то же, что printf() для консоли12 fscanf() Для файла то же, что scanf() для консоли13 feof() Возвращает значение true (истина), еслидостигнут конец файла14 ferror() Возвращает значение true (истина), еслипроизошла ошибка15 rewind() Устанавливает указатель текущей позициив начало файла16 remove() Стирает файл17 fflush() Дозапись потока в файл122


Для приведенных функций требуется подключить заголовок. Запись или чтение из файла осуществляются с помощью указателяфайла. Указатель файла – это указатель на структуру типа FILE.Для объявления переменной–указателя файла, например, *fp, используетсяследующий оператор:FILE *fp;Ключевое слово FILE определяет собой своеобразный тип данных,а указатель *fp указывает на этот тип.Указатель файла указывает на структуру, содержащую различныесведения о файле, его имя, статус и указатель текущей позиции в началофайла.Открытие файла осуществляется с помощью функции fopen(),которая открывает поток и связывает с этим потоком определенный файл.Прототип функции fopen() такой:FILE *fopen(const char *file_name, const char *mode);В прототипе функции fopen() формальные переменные имеют следующийсмысл:file_name – это имя файла с заданным расширением и возможнымпутем расположения, mode – режим работы файла: чтение, запись и т. д.В табл. 8.2 приводятся допустимые значения режима для функцииfopen().Таблица 8.2 – Допустимые значения режима функции fopen()№ РежимЧто означаетп/п1 r Открыть текстовый файл для чтения2 w Создать текстовый файл для записи3 a Добавить в конец текстового файла4 rb Открыть двоичный файл для чтения5 wb Создать двоичный файл для записи6 ab Добавить в конец двоичного файла7 r+ Открыть текстовый файл для чтения/записи8 w+ Создать текстовый файл для чтения/записи9 a+ Добавить в конец текстового файла или создатьтекстовый файл для чтения/записи10 r+b Открыть двоичный файл для чтения/записи11 w+b Создать двоичный файл для чтения/записи12 a+b Добавить в конец двоичного файла или создать двоичныйфайл для чтения/записи123


Например, для записи в файл с именем (и расширением) data.txtна диск D следует использовать такие объявление и операции:FILE *fp;fp = fopen("D: \\data.txt", "w");fprintf(fp, "\n\t hello, world\n");fclose(fp);В приведенном фрагменте С++ – кода функция fclose() закрываетпоток, который был открыт с помощью вызова функции fopen(). Функцияfprintf() осуществляет форматную запись (в данном случае строку hello,world) в файл. Все манипуляции с файлом происходят между функциямиfopen() и fclose(). Режим функции fopen() задается строкой "w", котораяобеспечивает создание текстового файла для записи. Это означает, что файлdata.txt создается на диске D и в него записывается строка hello, world с отступомот верхнего края и с отступом (табуляцией) от левого края.Прототип функции fclose() следующий:int fclose(FILE *fp);В приведенной записи *fp – указатель файла, возвращенный в результатевызова функции fopen(). Возвращение нуля означает успешнуюоперацию закрытия. В случае же ошибки возвращается EOF. Обычно отказпри выполнении функции fclose() происходит только тогда, когда диск былпреждевременно удален из дисковода или на диске не осталось свободногоместа.Правомочность открытия файла с помощью функции fopen() обычноподтверждается после проверки какой-либо ошибки, например, когдана диске нет места для записи или неправильного имени диска, причемэти ошибки будут обнаружены до того, как программа попытается в этотфайл что-либо записать. Поэтому приведенный фрагмент С++ – кода будетправильным, если производится проверка возможности открытия файла:FILE *fp;if ((fp = fopen("D:\\data.txt", "w")) == NULL){//exit(1);printf("\n\t Error! Can not open file\n ");printf("\n Press any key: ");_getch();return 0; }fprintf(fp, "\n\t hello, world\n");fclose(fp);При выполнении условия проверки можно выходить при нажатиилюбой клавиши с заданным сообщением или немедленный выход сделатьс помощью функции exit(), которая в данном фрагменте С++ – кода закомментирована.124


Функции для работы с текстовыми файлами удобно использоватьпри создании текстовых файлов, ведении файлов-протоколов и т. п.Но при создании баз данных целесообразно использовать функции для работыс бинарными файлами: fwrite() и fread(). Эти функции без каких-либоизменений копируют выделенный блок данных из оперативной памятив файл и, соответственно, из файла – в память.При записи или чтении суффикс «t» открывает файл в текстовом режиме.В этом режиме символ CTRL+Z (символ с кодом 26) обрабатываетсякак символ конца файла. Кроме того, комбинации символов переводастроки и возврата каретки преобразуются в единственный символ переводастроки ('\n') при вводе, и символы перевода строки преобразуются в комбинациисимволов перевода строки и возврата каретки при выводе.Суффикс «b» открывает файл в бинарном режиме, преобразованиясимволов перевода строки и возврата каретки не производятся.FILE *fp;if ((fp = fopen("D:\\data.txt", "w")) == NULL){//exit(1);printf("\n\t Error! Can not open file\n ");printf("\n Press any key: ");_getch(); return -1; }fprintf(fp, "\n\t hello, world\n");fclose(fp);8.2 Практическая частьПример 1. Напишите программу заполнения матрицы размераn m нечетными целыми числами с выводом результата на консольи в текстовый файл. Размеры матрицы и начальное нечетное число задаютсяпользователем с клавиатуры.Программный код решения примера:#define _CRT_SECURE_NO_WARNINGS#include #include #include int main(void) {int i, j, x, xi, n, m, *matr;FILE *fid;char str[] = "D:\\data.txt"; // месторасположение файлаif ((fid = fopen(str, "w")) == NULL){printf("\n\t The file could not be opened.\n ");printf("\n Press any key: ");125


_getch(); return 0; }printf("\n\t Enter the number of lines: "); scanf_s("%d", &n);printf("\t Enter the number of columns: "); scanf_s("%d", &m);printf("\t Enter the odd number: "); scanf_s("%d", &x);xi = x;matr = (int *)calloc(n*m, sizeof(int));// Заполнение матрицы целыми числамиfor (i = 0; i < n; ++i)for (j = 0; j < m; ++j){matr[i*m + j] = x; x += 2; }printf("\n\t Matrix (%d x %d), initial number: %d\n", n, m,xi);fprintf(fid, "\r\n\t Matrix (%d x %d), initial number:%d\r\n", n, m, xi);for (i = 0; i < n; ++i){printf("\n "); fprintf(fid, "\r\n ");for (j = 0; j < m; ++j){printf("%5d", matr[i*m + j]);fprintf(fid, "%5d", matr[i*m + j]); }}fclose(fid);printf("\n\n Result of record look in file %s\n", str);printf("\n Press any key: ");_getch();return 0;}В программу включена препроцессорная директива #define...для устранения предупреждения о ненадежной работе функции fopen()в Visual Studio 2008.Возможный результат выполнения программы показан на рис. 8.1.Рисунок 8.1 – Заполнение матрицы нечетными числами126


Текстовый файл с заполненной матрицей показан на рис. 8.2.Рисунок 8.2 – Матрица нечетных чисел в текстовом файлеПримечание. В текстовом файле следует использовать моноширинный(равноширинный) шрифт, например, Courier New.Пример 2. Напишите программу форматированной записив текстовый файл трех строк различной длины и одномерного целочисленногомассива. Произведите чтение из текстового файла с выводом его содержанияна консоль и преобразования одномерного массива в двухмерный.Для решения примера используем функции fprintf(), fgets(),atoi(), fscanf().Программный код решения примера:#define _CRT_SECURE_NO_WARNINGS#include #include #include #define n 4 // Число строк матрицы#define m 3 // Число столбцов матрицы#define N 123 // Число считываемых строк из текстового файлаint main(void) {int i, j = 0;int A[n*m] = {1,2,3,4,5,6,7,8,9,10,11,12};int B[n*m];FILE *fid;char *str[] = {"aza","baza","qwerty"};char str2[N][80]; // Буферный массив// Обнуление массива B[n*m]for (i = 0; i < n*m; ++i) B[i] = 0;if ((fid = fopen("D:\\data2.txt", "w")) == NULL){printf("\n\t The file could not be opened.\n ");printf("\n Press any key: "); _getch(); return 0; }// Запись в файл data2.txt127


fprintf(fid, "\n\t The lines are:\n");for (i = 0; i < m; ++i) fprintf(fid,"\t %s\n", str[i]);for (i = 0; i < n*m; ++i)fprintf(fid, " %3d", A[i]);fclose(fid);printf("\n\t From file \"data2.txt\":\n");if ((fid = fopen("D:\\data2.txt", "r")) == NULL){printf("\n\t The file could not be opened.\n ");printf("\n Press any key: "); _getch(); return 0; }// Чтение из файла data2.txtfor (i = 0; (fgets(str2[i], 80, fid) != NULL) && (i < N); ++i)printf(" %s",str2[i]);fclose(fid);if ((fid = fopen("D:\\data2.txt", "r")) == NULL){printf("\n\t Error! You can not open the file \n ");printf("\n Press any key: "); _getch(); return 0; }// Повторное чтение из файла data2.txtfor (i = 0; fscanf (fid, "%s", str2[i]) != EOF; ++i)if (atoi(str2[i])){ B[j] = atoi(str2[i]); ++j; }fclose(fid);printf("\n\n\t The reconfigured array:\n");for (i = 0; i < n; ++i) {printf("\n\t");for (j = 0; j < m; ++j)printf("%5d", B[i*m+j]); }printf("\n\n Press any key: ");_getch();return 0;}Для форматированной записи в текстовый файл и чтения из файлаприменены массивы указателей *str[], str2[123][80]. Чтение из файла одномерногомассива целых чисел выполняется с помощью функции atoi(), значенияцелых чисел заносятся сначала в одномерный массив B[n*m]. Послезакрытия файла data2.txt одномерный массив B[n*m] выводится на консольв виде двухмерной матрицы размера 4 3. Форматированная записьстрок и одномерного массива в файл data2.txt производится с помощьюфункции fprintf(). Первое чтение информации из текстового файла производитсяс помощью функции fgets(), что позволяет практически точно копироватьрасположение строк текстового файла на консоль (дисплей).Функция fscanf() используется для форматированного чтения информациииз текста с последующим выделением целых чисел с помощью функцииatoi().128


Возможный результат выполнения программы показан на рис. 8.3.Рисунок 8.3 – Содержимое текстового файла и преобразованного массиваПример 3. Напишите программу добавления слов в текстовый файлс контролем на консоли.В текстовый файл запишем название книги и авторов. После будемдобавлять слова, символы и т. д.Для программного решения примера используем функции файловоговвода/вывода fprintf(), fgets() и rewind(). Кроме того, подключим библиотекуlocale.h и объявим прототип функции, что позволит использоватьшрифты русского алфавита:#include setlocale( LC_ALL, "Russian");илиsetlocale( LC_ALL, ".1251"); //кодовая страница Windows–1251.Программный код решения примера:#define _CRT_SECURE_NO_WARNINGS#include #include #include #define MAX 40int main(void) {FILE *fid;char words[MAX+1];char str_name[] = "D:\\data3.txt";// Прототип функции поддержки русских шрифтовsetlocale( LC_ALL, "Russian");if ((fid = fopen(str_name, "a+")) == NULL)129


{fprintf(stdout, "\n\t Файл не может быть открыт \"%s\".\n ",str_name);printf("\n Нажмите любую клавишу: ");_getch(); return -1; }printf("\n\t Введите слова для включения их в файл \"%s\"\n\t\и нажмите клавишу Enter в начале строки для завершения ввода\n\t:", str_name);// Запись в файл data3.txtwhile (gets_s(words, MAX) != NULL && words[0] != '\0'){printf("\t: "); fprintf(fid," %s\n", words); }puts("\t Содержимое файла:");// Устанавливает указатель текущей позиции в начало файлаrewind(fid);// Сканирование файлаwhile (fgets(words, MAX, fid) != '\0')printf("\t%s", words);if (fclose(fid) != 0)fprintf(stderr, "\n\t Ошибка при закрытии файла \"%s\"\n",str_name);printf("\n\n Нажмите любую клавишу (Press any key): ");_getch();return 0;}В программе введены две проверки: на открытие файла if (... ==NULL) и на закрытие файла if (... != 0). Эти проверки позволяют исключитьаварийный выход из программы. Использование в функции форматноговывода fprintf() ключевого слова stdout позволяет выводить сообщенияна консоль – дисплей пользователя.Вместо стандартной функции gets() использована функция gets_s(),которую поддерживает MS Visual Studio. При работе в MS Visual Studioс функцией gets() появляются предупреждения (которыми в общем случаеможно пренебречь). Предупреждения возникают и при работе с функциейfopen(). Вместо нее можно использовать fopen_s() в следующем форматезаписи:fopen_s(&fid, "D:\\data3.txt","a+");Тогда проверку на открытие файла следует изменить, например:if (fopen_s(&fid, "D:\\data3.txt","a+")){fprintf(stdout, "\n\t Ошибка! Не удается открыть файл\"data3.txt\".\n ");printf("\n Нажмите любую клавишу: ");_getch(); return -1; }130


Если файл data3.txt сохранить, то при последующих выполненияхпрограммы в этот файл будут дописывать данные. Это обеспечиваетрежим "a+" функции fopen().Возможный результат выполнения программы показан на рис. 8.4.Рисунок 8.4 – Пример записи в файл и чтения из файлаПримечание. Для данной программы формат записи функцииfscanf():fscanf(fid, "%s", words);Пример 4. Напишите программу записи в файл нескольких строки отображения содержимого файла в обратном порядке, как на консоли,так и в другом текстовом файле.Для решения примера используем функции fseek() и ftell().Программный код решения примера:#include #include #define MAX 79#define file "D:\\data6.txt" // запись в прямом порядке#define file2 "D:\\data66.txt" // запись в обратном порядкеint main(void) {char ch, str[MAX+1];long n, m;FILE *fid, *fid2;if ( fopen_s(&fid, file, "w") ) {fprintf(stdout, "\n\t The file could not be opened.\n ");printf("\nPress any key: ");_getch(); return 0; }printf("\n\t Enter a few lines and press Enter to com-131


plete before the new line\n\t: ");// Запись в файл data6.txtwhile (gets_s(str, MAX) != NULL && str[0] != '\0'){ printf("\t: "); fprintf(fid," %s\n", str); }fclose(fid);if ( fopen_s(&fid, file, "r") ) {fprintf(stdout, "\n\t File could not be opened.\n");printf("\n Press any key: ");_getch(); return 0; }if ( fopen_s(&fid2, file2, "w") ) {fprintf(stdout, "\n\t File could not be opened.\n");printf("\n Press any key: ");_getch(); return 0; }//Переход в конец файлаfseek(fid, 0L, SEEK_END);m = ftell(fid);for (n = 1L; n


Рассмотрим следующий программный цикл:for (n = 1L; n


Окно выполнения программы на рис. 8.7, а результат записи информациив текстовый файл на рис. 8.8.Программный код решения примера:// Восьмая программа на языке Си++// Автор Загребельный С.Л.#define _CRT_SECURE_NO_WARNINGS#define MAX 79#include #include #define _USE_MATH_DEFINES#include #include #include #include int main(void) {FILE *fid;double xn, xk, xh, a, x, y;int i;char str_name[] = "D:\\data_pr.txt";char words[MAX+1];setlocale( LC_ALL, "Russian");if ((fid = fopen(str_name, "w")) == NULL){fprintf(stdout, "\n\t Файл не может быть открыт \"%s\".\n ",str_name);printf("\n Нажмите любую клавишу: ");_getch(); return 0; }printf("\n\t Введите xn= ");scanf_s("%lf", &xn);printf("\t Введите Xk= ");scanf_s("%lf", &xk);printf("\t Введите Xh= ");scanf_s("%lf", &xh);printf("\t Введите a= ");scanf_s("%lf", &a);x=xn;while (x


ewind(fid);// Сканирование файлаwhile (fgets(words, MAX, fid) != '\0')printf("\t%s", words);if (fclose(fid) != 0)fprintf(stderr, "\n\t Ошибка при закрытии файла \"%s\"\n",str_name);fclose(fid);printf("\n Press any key: ");_getch();return 0;}Рисунок 8.7 – Окно работы программыРисунок 8.8 – Результат записи информации в текстовый файл135


ВариантШаг табулирования,xh8.3 Индивидуальные заданияСоздать таблицу табулирования функции f 1у f 2 f 3x,x,x,если х 0если 0 х aесли х aс использованием оператора цикла For на отрезке [xn;xk] с шагом xh.Данные взять из таблицы 8.3. Результат табулирования записать в текстовыйфайл под именем «Tablica.txt», а также произвести чтение данныхиз этого файла и сделать вывод на экран консоли.Таблица 8.3 – Индивидуальные заданияФункцииf 1 xf 2 xf 3 xГраницыотрезка[xn;xk]1 ln2 5x sin ( ex 2)e2sin x 3 cos x 1x [-2,9; 8,2] 0,23 3232 2 x sin ( x ) ( x 1) cos x42x 2 sin x [-1,2; 2,6] 0,13 sin 5 34 4 tgx 2x553x x sin xx ln (4x2 1) x 10 3 4sinx 11,34 x2x [-1,7; 2,4] 0,3ln5 x [-4,3; 8,0] 0,55 2xx 1 [-9,1; 5,8] 0,146 x ctg 2x5ln2х( x 2 1)e 3x 1[-3,4; 2,5] 0,235 37 x ctg (2x)8ctg (3x1)22x 3 sin x 1 [-2,2; 8,1] 0,152 xe x sin x 3 1[-2,8; 5,2] 0,55 42x3 29 x 4xx103 ( x 1) cosx( 2 33 sin x3x 1)(x 2) e x 5 2 sin x 211 ctg x3 11,34 x122ln (sin3x [-3,2; 7,8] 0,363lnsin 22x 1)3 2 4x3x3 5 1 tgx1x [-6,1; 1,3] 0,152x x 1 [-7,4; 0,6] 0,16[-1,2; 7,1] 0,45136


Продолжение таблицы 8.32313 sin (2x)14e x sin 3 x4x30,1x33 ( x 1) x1 cos x 3 2e x 3x1 [-2,2; 3,9] 0,55 2x tg( x 2 2)[-0,3; 4,5] 0,621532х 5х3 25х х( х22 3)3cos23( x x)[-2,4; 4,4] 0,416 5 2х х 1 ln 2 ( x 5 )1x e x sin ( x)5317 3 ctg x15318 x ctg x sin ( 5 20,3 (7x1) sin x22 0,25x ) x [-3,9; 3,8] 0,15sin x 2 [-1,3; 7,1] 0,65x x [-2,9; 6,2] 0,82x x 19 sin ( x)202x sin (7x)121 3 x 2 13xsin ( 3 2x5 х 2 х 1 [-3,7; 8,5] 0,11xx 103 7 4 22 x 12 0,25x ) x ( x) xx [-3,9; 1,2] 0,25ln 2 [-4,5; 6,1] 0,32422 sin x cos x ln ( x 1) 3xx1 5 tgx 3 2[-3,4; 3,4] 0,3323 x3 3x2 x 62х 2tg (2x1)14 xx x [-4,1; 5,0] 0,454 324 x 2 x x 3 2ln ( x )e х 3 xx [-1,7; 2,9] 0,75252(3x1)5x 2x1ln 2 5x 5 21 x [-1,6; 4,7] 0,655 326 x ctg (2x)27 x x tgx 528 ln x 1 3 x5tg(2x 3) 1x cos x sin x 3x3 2 0. 252 ln 2 x 3x 2 e x [-1,6;3,7] 0,3sin x x [-2,8; 8,2] 0,4x [-1,7; 2,6] 0,2529 sin 2 3 xx6x x 1 sin ( x e ) [-2,2; 7,4] 0,235 2cosx1e3 x30 32х 5х3 2223x 7sin ( x ) [-1,1; 7,9] 0,8137


8.4 Контрольные вопросы1 Что может быть файлом в языке С++?2 Какие обязательные операции выполняются при нормальной работес файлами? Какие библиотечные функции при этом используются?3 Как определяется текстовой поток в стандарте языка С++?4 Как определяется двоичный поток в стандарте языка С++?5 Что определяет собой указатель файла?6 С помощью каких функций языка С++ осуществляется форматнаязапись в файл и форматное чтение данных из файла?7 Какая переменная стандартной библиотеки используетсядля определения стандартного потока вывода на дисплей?8 Какая переменная стандартной библиотеки используетсядля определения стандартного потока чтения с дисплея?9 Как в языке С++ кодируется признак конца файла?10 Как в языке С++ кодируется признак конца строки?11 Что такое файл произвольного доступа?12 Как в языке С++ осуществляется пакетная запись данных в файл?13 Как осуществляется запись бинарной информации в текстовыйфайл?14 Как осуществляется чтение бинарной информации из текстовогофайла?138


САМОСТОЯТЕЛЬНАЯ РАБОТАОбработка элементов диагоналей квадратных матрицЦель: научиться самостоятельно обрабатывать элементы диагоналейквадратных матриц.9.1 Теоретическая частьДля доступа к элементу массива следует указать имя массивас последующим числом (индексом), заключенным в квадратные скобки.Элементы массива можно использовать в любом выражении точнотакже как и значение константы или переменной.Например:a[0][0]=11.2;a[1][2]=10.2;a[3][1]=22.1;a[4][2]=1.1;Y = 2*a[0][1] – a[1][0];Селективная обработка массива – это выделение из массивов элементов,удовлетворяющих условию, и обработка выделенных фрагментов.Часто из выделенных фрагментов формируют новый (рабочий) массив, которыйдалее и обрабатывают.9.1.1 Селективная обработка элементов массиваНаиболее часто встречаются такие условия обработкиэлементов массива:– четные A[i] %2 ==0– нечетные A[i] %2 !=0– кратные k A[i] % k ==0– некратные k A[i] % k !=0– стоящие на четных местах (i+1) % 2==0– стоящие на нечетных местах (i+1) % 2!=0– положительные A[i] >0– отрицательные A[i] x1) && (A[i]


При обработке двумерных массивов возникает необходимостьвычисления суммы, произведения, количества, среднего арифметического,максимума, минимума элементов каждой строки или каждого столбца,заданной строки или заданного столбца. В таком случае, при обработкемассивов нужна организация вложенных циклов.Цикл, который содержит другой цикл, называют внешним циклом,а цикл, содержащийся в теле другого цикла, называют внутренним. Всеоператоры внутреннего цикла должны полностью располагаться в телевнешнего цикла.Поэтому, если за счетчик внешнего цикла взять индекс строки,а за счетчик внутреннего – номер столбца, то обработка двухмерного массивабудет идти по строкам, а если наоборот, то по столбцам.При обработке двумерных массивов часто приходится выделятьэлементы:– k – й строки A[i][j], где i==k, j=0,…, М-1– k – го столбца A[i][j], где i=0, …, N-1; j==kа для квадратных матриц (M=N) также:– главной диагонали A[i][i], где i=0, …, N-1– побочной диагонали A[i][N-1-i], где i=0, …, N-1– наддиагональные A[i][j], где i>j– поддиагональные A[i][j], где i


(по j) – осуществляет поиск минимального (максимального) и его позициив неотсортированной части массива. После выхода из внутреннего цикласледует перестановка элементов. Последний элемент во внешнем циклене рассматривается: он сам встанет на свое место.9.1.3 Сортировка методом пузырькаМетод основан на сравнении соседних элементов. «Неправильно»расположенные по отношению друг к другу элементы меняются местами.Во вложенных циклах поочередно фиксируется пара соседних элементовмассива. В результате первого прохода элемент с минимальным значениемоказывается в первой позиции массива (всплывает).Уплотнение массива – это удаление из него элементов, отвечающихтем или иным условиям. Образующиеся пустоты заполняются за счетсдвига всех оставшихся элементов. Так как массив укорачивается, при обработкемассива необходимо использовать не цикл с параметром, а циклс условием.Вставка элемента в массив – задача обратная предыдущей. Приемиспользуется тот же – смещение группы элементов на одну позицию.Только при уплотнении сдвиг производится влево, при вставке – вправо.При вставке возникает проблема, что делать с последними элементами?Если в дальнейшей работе с массивом участвуют только заявленные элементы,то «хвост» придется вытеснить, последние значения при этом будутутрачены. Иначе, нужно создавать дополнительный массив, размерностькоторого будет больше исходного на количество вставленных элементов.Выбор типа цикла для работы с массивом зависит от конкретного случая.9.2 Практическая частьПример 1. Создать блок-схему к заданию и программу на С++для нахождения суммы положительных элементов главной диагонали.(Матрица квадратная, ввод элементов сделать с клавиатуры).Блок-схема к заданию на рис. 9.1, окно кода программы показанна рис. 9.2, а результат выполнения программы на рис. 9.3.141


Началоi=0,m-1Ввод 3 –x элементов(i+1) строкиj=0,m-1Ввод элементамассива A[i,j]i=0,m-1j=0,m-1Вывод элементамассива A[i,j]Sum=0i=0,m-1i=0,m-1ДаA[i,i]>0Нетsum=sum+A[i,i]Вывод SumКонецРисунок 9.1 – Блок-схема к программе142


Программный код решения примера://Девятая программа//Автор Загребельный С.Л.#include #include #include #define m 3int main (void) {int i, j, k, l,sum; // переменные цикловint A[m][m];setlocale(LC_ALL, "Russian");// Ввод элементов матрицыfor (i = 0; i < m; i++){printf("\n Введите 3 элемента %d строки\n",i+1);for (j = 0; j < m; j++)scanf("%i,%j",&A[i][j]);}// Распечатка матрицprintf("\n Исходная матрица (%dx%d):\n", m, m);for (i = 0; i < m; i++) {printf("\n");for (j = 0; j < m; j++)printf(" %4d", A[i][j]);}sum=0;for (i = 0; i < m; i++)for (i = 0; i < m; i++)if (A[i][i]>0) {sum = sum+A[i][i];}printf(" \n сумма положительных элементов главной диагонали%d\n", sum);printf("\n\n ... Press any key: ");_getch();return 0;}143


Рисунок 9.2 – Окно кода программыРисунок 9.3 – Окно выполнения программы144


Номерварианта9.3 Индивидуальные заданияСоставить блок-схему к заданию и программу на языке программированияС++ для решения задания из таблицы 9.1.(Матрица квадратнаяразмером NN, ввод элементов массива сделать автоматически через генераторслучайных чисел, элементы массива должны быть целыми числами).Таблица 9.1 – Индивидуальные заданияУсловие задания123456789101112131415Общую сумму положительных четных чисел на главнойи побочной диагоналях.Общее произведение нечетных отрицательных элементов главнойи побочной диагоналей.Количества кратных 3 элементов отдельно на главной и отдельнона побочной диагоналях.Среднее арифметическое для отрицательных элементов главнойдиагонали и среднее арифметическое для положительныхэлементов побочной диагонали.Найти среднее геометрическое положительных кратных 4 элементовглавной и побочной диагоналей.Где больше кратных 3 элементов: на главной или побочнойдиагоналях.Где меньше отрицательных элементов: на главной или побочнойдиагоналях.Что больше: произведение положительных элементов главнойдиагонали или произведение отрицательных побочной.Что меньше: сумма нечетных элементов главной диагоналиили произведение некратных 3 элементов побочной.Общую сумму отрицательных нечетных чисел на главнойи побочной диагоналях.Общее произведение четных кратных 3 элементов главнойи побочной диагоналей.Количества кратных 5 элементов отдельно на главной и отдельнона побочной диагоналях.Суммы положительных четных чисел отдельно на главнойи отдельно на побочной диагоналях.Произведения нечетных отрицательных элементов отдельнона главной и отдельно на побочной диагоналях.Общее количество кратных 3 элементов на главной и побочнойдиагоналях.145


Продолжение таблицы 9.116Среднее арифметическое для всех отрицательных элементовглавной и побочной диагоналей.17Найти среднее геометрическое положительных элементовотдельно для главной и отдельно для побочной диагоналей.18Где больше сумма кратных 4 элементов: на главнойили побочной диагоналях.19Где меньше сумма положительных элементов: на главнойили побочной диагоналях.20Что больше: сумма четных элементов главной диагоналиили сумма нечетных побочной.21Что меньше: произведение кратных 4 элементов главнойдиагонали или сумма положительных побочной.22Суммы отрицательных нечетных чисел отдельно на главнойи отдельно на побочной диагоналях.23Произведения четных элементов отдельно на главной и отдельнона побочной диагоналях.24Общее количество не кратных 5 элементов на главнойи побочной диагоналях.25Общую сумму квадратов положительных элементов главнойи побочной диагоналей.26 Среднее арифметическое нечетных элементов главной диагонали.27Произведение суммы четных элементов главной диагоналина количество нечетных элементов побочной диагонали.28Количество элементов кратных числу 3 из диапазона [-10;10]для главной диагонали.29Среднее геометрическое нечетных элементов главнойи побочной диагонали.Сумму нечетных отрицательных элементов главной диагонали30 и произведение четных чисел из диапазона [-5;6] для побочнойдиагонали.9.4 Контрольные вопросы1 Понятие матрицы, ввод элементов матрицы с клавиатуры (написатьфрагмент программы).2 Селективная обработка элементов массива (четность, нечетностьи т.д.).3 Различие сортировки методом пузырка и методом выбора, какойиз них быстрее.4 Какое условие отбора элементов главной и побочной диагонали,наддиагональных элементов.146


ПРИЛОЖЕНИЕ АГрафик сдачи модулейдля студентов дневной формы обучения(1-й триместр)147


МодульТриместрОбщее количество часовКредиты ECTSКоличество аудиторныхчасовМаксМинНеделя проведенияПРИЛОЖЕНИЕ БСостав модулей дисциплины«Вычислительная техника и программирование»для студентов специальности 8.05070204 «Электромеханические системыавтоматизации и электропривод»дневной формы обучения,распределение времени на их усвоение, термины контроля(1-й триместр)Таблица Б.1 – Состав модулей дисциплиныКраткое содержаниемодуляФормы и методы контроляИз них лабораторные работыКоличествобаллов1 Основы работыс операционнойсистемойWindowsI 2 Защита л. р. по Windows.Работа с окнами. Управлениефайловой системой. Архивация3 Защита л. р. по Word. Ввод иформатирование текста. Работас таблицами, редактор формул.Вставка объектов в документ35 20 135 20 21 Защита РГР 30 15 22 ОсновныеконструкцииязыкапрограммированиеС++I18 0,5 8 6 Всего за модуль 100 55 2112245Защита л. р. 1. Знакомство сосредой Visual Stidio. Созданиепростой программы на языкеС++ в консолиЗащита л. р. 2. Создание программылинейного алгоритмавычисления функцииЗащита л. р. 3. Вычислениефункции заданной условно(использования условногооператора)Защита л. р. 4. Циклическийалгоритм. Табулированиефункции. Поиск экстремумовЗащита л. р. 5. Одномерныймассив. Селективная обработкаэлементов массиваЗащита л. р. 6. Вложены циклы(матрицы). Нахождениесуммы и произведения элементовматриц5 2 36 3 37 4 3-410 5 416 9 5-618 11 6-7148


Продолжение таблицы Б.13 Основы программированияв средеVisual Studio20102Защита л. р. 7. Элементыграфики14 8 82 Защита л. р. 8. Файлы 12 6 8-91Самостоятельная работа. Обработкаэлементов диагоналей 7 4матриц1Контрольная работа5 3 972 2 29 21 Всего за модуль 100 55 9I 6 Защита л. р. 1. Знакомство свизуальной средой программированияVisual Studio 2010. 30 17 10Создания самого простогодополнению Windows6 Защита л. р. 2. Условные операторы.Вычисление значения 30 16 12функции, заданной условно5 Защита л. р. 3. Вычислительныйпроцесс циклическойструктуры. Табулирование30 16 14функции. Поиск экстремума1 Контрольная работа 10 6 1554 1,5 23 18 Всего за модуль 100 55 15Весовые коэф. модулей:0,1; 0,5; 0,4;Всего за триместр 144 4,0 60 45 (Для триместра на модульныйконтроль)4 Разработкадополнений всреде VisualStudio 2010II 4 Защита л. р. 4. Одномерныймассив. Селективная обработкаэлементов массива5 Защита л. р. 5. Матрицы. Обработкаэлементов матриц6 Защита л. р. 6. Создание иобработка файлов с помощьюдиалоговых окон6 Защита л. р. 7. Элементыграфики. Создание операционногоменю3 Защита л. р. 8. Создание алгоритмоввычисления вероятностей20 12 1-220 12 2-315 8 414 6 615 8 82 Защита л. р. 9. Анимация 11 6 91 Контрольная работа 5 3 9108 3,0 45 27 Всего за модуль 100 55Весовые коэфициенты закурс:М1 – 0,1Всего по курсу 252 7,0 105 72 М2 – 0,3М3 – 0,25М4 – 0,35149


СПИСОК ЛИТЕРАТУРЫ1 Бадд, Т. Объектно-ориентированное программирование в действии/ Т. Бадд. – СПб. : Питер, 1997. –346 с.2 Голуб, А. С и С++. Правила программирования / А. Голуб. – М. :БИНОМ, 1996. – 249 с.3 Дейтел, П. Как программировать на С++. Введение в объектноориентированноепроектирование с использованием UML / П. Дейтел. –М. : БИНОМ, 2002. – 453 с.4 Джамса, К. Учимся программировать на языке C++ : пер. с англ. /К. Джамса. – М. : Мир, 1997. – 320 с.5 Дьюхерст, С. К. Скользкие места С++. Как избежать проблемпри проектировании и компилировании ваших программ /С. К. Дьюхерст. – М. : ДМК Пресс, 2006. – 478 с.6 Коплиен, Дж. Программирование на С++ / Дж. Коплиен. – СПб. :ПИТЕР, 2005. – 624 с.7 Лаптев, В. В. С++. Объектно-ориентированное программирование/ В. В. Лаптев. – СПб. : Питер, 2008. – 389 с.8 Павловская, Т. А. С/С++. Программирование на языке высокогоуровня : учебник для вузов / Т. А. Павловская. – СПб. : Питер, 2010. –с. 467.9 Павловская, Т. А. С/С++. Структурное и объектноориентированноепрограммирование : практикум / Т. А. Павловская,Ю. А. Щупак. – СПб. : Питер, 2010. – 329 с.10 Понамарев, В. А. Программирование на C++/C# в VisualStudio. NET / В. А. Пономарев. – СПб. : БХВ-Петербург, 2004. – 562 с.11 Скляров, В. А. Язык C++ и объектно-ориентированное программирование:справочное издание / В. А. Скляров. – Минск : Выш. шк.,1997. – 480 с.12 Сэвитч, У. C++ в примерах : пер. с англ. / У. Сэвитч. – М. :ЭКОМ, 1997. – 736 с.13 Шилдт, Г. Самоучитель C++ : пер. с англ. / Г. Шилдт. – СПб. :BHV-Санкт-Петербург, 1998. – 620 с.14 Эккель, Б. Философия С++. Введение в стандартный С++ /Б. Эккель. – СПб. : ПИТЕР, 2004. – 547 с.15 Элджер, Д. С++ : библиотека программиста / Д. Элджер. – СПб. :ПИТЕР, 2000. – 486 с.150


Навчальне виданняЗАГРЕБЕЛЬНИЙ Сергій ЛеонідовичКОЛОТ Олександр ВолодимировичПРОГРАМУВАННЯ НА МОВІ С++У СЕРЕДОВИЩІ VISUAL STUDIO 2010Навчальний посібникдля студентів спеціальності8.05070204 «Електромеханічні системиавтоматизації та електропривод»(Російською мовою)РедакторА. А. КраськоКомп’ютерне верстанняО. С. Орда72/2011. Формат 60 х 84/16. Ум. друк. арк. 8,60.Обл.-вид. арк. 7,44. Тираж прим. Зам. №Видавець і виготівникДонбаська державна машинобудівна академія84313, м. Краматорськ, вул. Шкадінова, 72.Свідоцтво суб’єкта видавничої справиДК №1633 від 24.12.2003151

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!