Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Выбор, размещение и задание свойств  компонентов.




ЛАБОРАТОРНЫЕ   РАБОТЫ   ПО   ПРОГРАММИРОВАНИЮ

В   СРЕДЕ  C++ BUILDER

Учебно-методическое пособие

 

Киров

2013

 

 

УДК 004.42(07)

           

Рекомендовано к изданию методическим советом

факультета автоматики и вычислительной техники

ФГБОУ ВПО «ВятГУ»

Допущено редакционно-издательской комиссией методического совета ФГБОУ ВПО«ВятГУ» в качестве учебно-методического пособия по дисциплине «Технологии программирования» для студентов направления подготовки 230400 «Информационные системы и технологии», профиль «Информационные системы и технологии» всех форм обучения

 

Рецензент:

кандидат технических наук, доцент кафедры ЭВМ М. Н. Томчук

 

Чуркин В.В.

Лабораторные работы по программированию в среде C++Builder: учебно-методическое пособие для студентов направления 230400 «Информационные системы и технологии», профиль «Информационные системы и технологии», всех форм обучения / В. В. Чуркин. – Киров: ПРИП ФГБОУ ВПО «ВятГУ», 2013. – 247 с.

 

В издании излагается методика выполнения лабораторных работ по дисциплине «Технологии программирования». В учебно-методическом пособии приведены примеры выполнения лабораторных работ, в которых изучение технологий программирования и структур данных сочетается с изучением интегрированной среды разработки приложений C++Builder.

 

УДК 004.42(07)

 

© ПРИП ФГБОУ ВПО «ВятГУ», 2012

 

ISBN ______________________


 


СОДЕРЖАНИЕ

Введение................................................................................................................4

Ознакомление с Интегрированной Средой Разработки (ИСР)

C++Builder6.........................................................................................................6

Лабораторная работа 1. Формирование и обработка динамических массивов……………………………………………………………………….16

    Контрольные вопросы…………………………………………………31

    Задания………………………………………………………………….33

Лабораторная работа 2. Текстовые файлы, символы, строки….…….......35

Контрольные вопросы…………………………………………………45

    Задания………………………………………………………………….46

Лабораторная работа 3. Сортировки числовых массивов.

Рекурсивные функции….…………………………………….………………49

Контрольные вопросы………………………………………………....72

    Задания………………………………………………………………….73

Лабораторная работа 4. Способы шифрования и дешифрования

текста…………………………………………………………………………..76

Контрольные вопросы………………………………………………..105

Лабораторная работа 5. Преобразование и вычисление

 арифметических выражений с помощью стека…………………………...106

Контрольные вопросы………………………………………………..128

Лабораторная работа 6. Очередь приоритетов…….………………........129

Контрольные вопросы………………………………………………..150

    Задания (стеки, очереди)……………………………………………..151

Лабораторная работа 7. Двунаправленный неоднородный список

с однородными подсписками…… …………………………………………156

Контрольные вопросы………………………………………………..191

    Задания………………………………………………………………...192

Лабораторная работа 8. Бинарное упорядоченное дерево …………….197

Контрольные вопросы………………………………………………..222

    Задания………………………………………………………………...222

Лабораторная работа 9. Иерархия: точка, круг, цилиндр ………….….226

Контрольные вопросы………………………………………………..245

    Задания………………………………………………………………...246

Библиографический cписок………………………………………………….247



Введение

    При составлении  данного учебно-методического пособия была поставлена задача – совместить изучение технологий программирования на языке  C/C++ – структурного, модульного и объектно-ориентированного с изучением и получением навыков работы в интегрированной среде разработки (ИСР) приложений C++ Builder.

Лабораторные работы предваряет ознакомление с ИСР на примере разработки проекта для расчетов по формуле, содержащей математические функции. Сначала пользователь получает сведения о содержании проекта, его файлах, об основном окне ИСР, главном меню, инструментальных панелях, Дереве Объектов, Инспекторе Объектов. Затем пользователь создает проект, получает представление о библиотеке визуальных компонентов и её применении.

    В лабораторной работе «Формирование и обработка динамических массивов» изучается работа с динамической памятью в процессе обработки одномерного и двумерного массивов. В работе используются компоненты: многостраничная панель, компоненты ввода целых чисел, индикаторы, таблица, компонент для отображения хода длительных процессов, полоса состояния, компоненты для построения графиков. Функции пользователя размещаются в файле реализации модуля формы.

В лабораторной работе «Текстовые файлы, символы, строки» используются многострочные окна редактирования для работы с текстами в простом и обогащенном форматах, компоненты-диалоги для работы с текстовыми файлами, компонент – всплывающее меню. В коде использованы функции работы со строками разных типов. Функции пользователя размещаются в файле реализации модуля формы.

Лабораторная работа «Сортировки числовых массивов. Рекурсивные функции» содержит изложение процесса создания проекта для классических сортировок числовых массивов с сохранением результатов в графических файлах. Для реализации сортировок предложены рекурсивные функции; в процессе выполнения работы вскрывается их основной недостаток – переполнение стека. В проекте разрабатывается и используется класс; объявление класса размещено в заголовочном файле модуля формы, а реализация класса – в файле реализации модуля формы. Использованы новые компоненты: главное меню, управляющая кнопка с пиктограммой, панель общего назначения. Студентам предлагается дополнить проект функциями сортировок с использованием циклов.

    Лабораторная работа «Способы шифрования и дешифрования текста» предназначена для изучения алгоритмов и приложения, позволяющего шифровать и дешифровать тексты по треугольнику Паскаля, методом Гронсфельда и по матрице. Приложение содержит класс шифрования/дешифрования текста. В проекте использован модуль, не связанный с формой; объявление класса находится в заголовочном файле, а реализация класса – в файле реализации данного модуля. Результаты шифрования и информация о способе шифрования сохраняются в бинарных файлах. Для представления информации о программе и её разработчике в проект включена дополнительная форма. В приложении впервые использована инструментальная панель на основе простой панели с расположенными на ней кнопками с фиксацией и пиктограммами. Показано использование Исследователя классов.

В лабораторной работе «Преобразование и вычисление арифметических выражений с помощью стека» изложены алгоритмы преобразования инфиксной записи арифметических выражений в постфиксную и префиксную записи и алгоритм вычисления значения выражения по постфиксной записи. Представлены коды для реализации алгоритмов. Пользовательские типы и класс помещены в файл, не связанный с формой. В проекте впервые использованы интерфейсные компоненты: список изображений, диспетчер действий, инструментальная панель. Изложен порядок диспетчеризации действий. Цель данной лабораторной работы состоит в изучении динамической структуры данных – стек и типичного примера использования стека.

Лабораторная работа «Очередь приоритетов» представляет собой пример построения проекта для изучения реализации динамической структуры данных на основе массива структур. В проекте использован структурный тип и два класса: первый – для заявок, а второй – для очереди заявок. Продолжено изучение использования диспетчера действий при проектировании интерфейса проекта. В заключение студентам предлагается модифицировать приложение путем переноса данных-элементов из закрытых разделов в открытые разделы классов.

В лабораторной работе «Двунаправленный неоднородный список с однородными подсписками» продолжается изучение динамических структур данных на основе использования взаимосвязанных блоков динамической памяти, выделяемой по мере поступления разнотипных данных во время выполнения приложения. В проекте используется четыре пользовательских класса: базовый, два производных и класс, интегрирующий базовый и производные классы. В интерфейсной части проекта впервые использован более мощный диспетчер действий - с полосами действий: полосой главного меню и инструментальными панелями.

 В лабораторной работе «Бинарное упорядоченное дерево» изучается нелинейная динамическая структура данных – бинарное упорядоченное дерево поиска. В проекте использованы два класса: для узла дерева и для бинарного дерева, причем последний объявлен дружественным первому. Даны основные функции работы с деревом и продемонстрировано их использование. Интерфейс подобен интерфейсу в предыдущей работе.

В лабораторной работе «Иерархия : точка, круг, цилиндр» изучается пример иерархии с прямым открытым наследованием. Для демонстрации возможностей полиморфизма в лабораторной работе рассмотрено два варианта иерархии. Виртуальные функции находятся во втором варианте. В первом варианте для отображения объектов использовано приведение типов указателей базовых классов к указателям производных классов, во втором – полиморфизм, реализованный при помощи виртуальных функций-элементов.

 

 

Ознакомление с Интегрированной Средой Разработки (ИСР) C++Builder 6

        

Интегрированная Среда Разработки (Integrated Development Environment – IDE, или ИСР) – это среда, в которой есть все необходимое для быстрой разработки (проектирования) сложных прикладных программ (приложений). ИСР интегрирует в себе редактор кодов, отладчик, инструментальные панели, редактор изображений, инструментарий баз данных, что позволяет проектировать, запускать и тестировать приложения.

Проекты C++Builder

    Проект C++Builder состоит из форм, модулей с их заголовочными файлами и файлами реализации, установок параметров проекта, ресурсов и т.д. Вся эта информация размещается в файлах. Многие из этих файлов автоматически создаются C++Builder в процессе построения приложения:

 

Головной файл проекта (.cpp) C++Builder создает файл .cpp для головной функции WinMain, инициирующей приложениеи запускающей его на выполнение
Файл опций проекта (.bpr) Этот текстовый файл содержит установки опций проекта и указания на то, какие файлы должны компилироваться и компоноваться в проект. Файл сохраняется в формате XML
Файл ресурсов проекта (.res) Двоичный файл, содержащий ресурсы проекта: пикто-граммы, курсоры и т.п. По умолчанию содержит только пиктограмму проекта. Может дополняться с помощью Редактора Изображений
Файл реализации модуля (.cpp) Каждой создаваемой пользователем форме соответствует текстовый файл реализации модуля, используемый для хранения кода. Пользователь может создавать модули, не связанные с формами
Заголовочный файл модуля (.h) Каждой создаваемой пользователем форме соответствует не только файл реализации модуля, но и его заголовочный файл с описанием класса формы. Пользователь может и сам создавать необходимые заголовочные файлы
Файл формы (.dfm) Это двоичный или текстовый файл, который C++Builder создает для хранения информации о фор-мах пользователя. Пользователь может смотреть этот файл в текстовом виде или в виде формы. Каждому файлу формы соответствует файл модуля (.cpp)
Заголовочный файл компонента (.hpp) Файл создается при создании пользователем нового компонента. Пользователю также часто приходится подключать к проекту эти файлы из библиотеки компонентов C++Builder, расположенные в каталоге Include\VCL
Файл группы проектов (.bpg) Текстовый файл, создаваемый в C++Builder при созда-нии пользователем группы проектов
Файлы пакетов (.bplи .bpk) Эти двоичные файлы используются C++Builder при ра-боте с пакетами: .bpl– файл самого пакета, .bpk– файл, определяющий компиляцию и компоновку пакета
Файл рабочего стола проекта (.dsk) В этом текстовом файле C++Builder хранит информа-цию о последнем сеансе работы с проектом: открытых окнах, их размерах и положении. Благодаря этому файлу в новом сеансе работы пользователь сразу видит тот же экран, который был в предыдущем сеансе. Файл создается только при включении опции Опции автосохранения |Рабочий стол проекта ( на странице Предпочтения–многостраничного окна Опции среды общих настроек среды, вызываемого командой Инструменты|Опции среды)
Файлы резервных копий (.~bp, .~df, .~cp, .~h) Это соответственно файлы резервных копий для файлов проекта, формы, реализации модуля и заголовочного. Если пользователь что-то безнадежно испортит в своем проекте, он может соответственно изменить расширения этих файлов и таким образом вернуться к предыдущему не испорченному варианту

 

 

        

Следующая группа файлов создается компилятором:

Исполняемый  файл (.exe) Это исполняемый файл проектируемого приложения. Он является автономным исполняемым файлом, для которого больше ничего не требуется, если только пользователь не использует библиотеки, содержащиеся в пакетах, DLL, OCX и т.д.
Объектный файл модуля (.obj) Это откомпилированный файл модуля (.cpp), который компонуется в окончательный исполняемый файл
Динамически присоединяемая библиотека (.dll) Этот файл создается в случае, если пользователь проектирует свою собственную DLL
Файл таблицы символов (.tds) Двоичный файл, используемый отладчиком в процессе отладки приложения
Файлы выбороч-ной компоновки (.il?) Файлы с расширением, начинающемся с il(.ilc, .ild, .ilf, .ils), позволяют повторно компоновать только те файлы, которые были изменены после последнего сеанса

        

C++Builder может использовать файлы Windows:

Файлы справки (.hlp) Это стандартные файлы справки Windows, которые мо-гут быть использованы приложением C++Builder
Файлы изображе-ний или графи-ческие файлы (.wmf, .bmp, .ico) Эти файлы обычно используются в приложениях Win-dows для создания привлекательного и дружественного пользовательского интерфейса

        

Из всех перечисленных файлов (а могут использоваться еще и другие) важнейшими являются файлы .cpp, .h, .dfm, .bpr, .res. Это файлы, которые необходимо перенести на другой компьютер, чтобы продолжить на нем работу над проектом. Все остальные файлы C++Builder создаст автоматически в процессе компиляции проекта и его отладки.

    Главной частью приложения является головной файл .cpp(файл проекта, исходный файл проекта) с функцией WinMain, с которой начинается выполнение программы и которая обеспечивает инициализацию других модулей. Она создается и модифицируется C++Builder автоматически в процессе разработки приложения. Имя, которое дает пользователь файлу проекта, когда сохраняет его, становится именем исполняемого файла.

    Все изменения файла проекта при добавлении новых форм, изменении имен форм и т.п. поддерживаются C++Builder автоматически. Для просмотра исходного файла проекта надо выполнить команду Проект|Вид источника. Но обычно просмотр не требуется.

    Информация о формах C++Builder хранится в трех файлах: .dfm, .cpp, и .h. Информация о внешнем виде формы, ее размерах, местоположении на экране и т.д. хранится в файле с расширением .dfm, который по умолчанию имеет текстовый вид. Для хранения файла формы в двоичном виде нужно щелкнуть на форме правой кнопкой мыши, и во всплывшем меню выключить индикатор Текст DFM.

    Основной файл, с которым работает пользователь, – это файл реализации модуля .cpp, в котором хранится код, соответствующий данной форме. В текстовом заголовочном файле с расширением .hхранится объявление класса используемой формы. Весь основной текст этого файла C++Builder формирует автоматически по мере проектирования пользователем формы. Но иногда требуется вручную вводить в этот файл объявления каких-то функций, типов, переменных. В C++Builder заголовочный файл загружается в окно Редактора Кода автоматически.

    Имена всех файлов, описывающих модуль, одинаковы. Это имя задает пользователь, когда в первый раз сохраняет модуль.

    Рекомендуется создавать в приложении модуль, не связанный с формой, в который помещают описания типов, констант, переменных, функций, используемых другими модулями. Это способствует хорошей структурированности программы, поддерживает единое понимание типов, констант, переменных во всех модулях и уменьшает количество взаимных ссылок модулей друг на друга. Тем самым упрощается модификация и сопровождение программы.

    Чтобы создать в проекте новый модуль, не связанный с какой-либо формой, надо выполнить команду Файл|Новый|Другое и в открывшемся многостраничном окне Новые элементы дважды щелкнуть на пиктограмме Модуль страницы Новый.

    По окончании работы над проектом следует удалить вспомогательные файлы – .obj, .res,.tds,.il?, ~*. Объем файлов .tds может быть очень большим (мегабайты).

 

Основное окно ИСР

    Основное окно появляется на экране после запуска C++ Builder 6.

    В верхней части окна ИСР находится полоса главного меню. Главное меню имеет следующие разделы (меню).

 

Файл – позволяет создать новый проект, новую форму, открыть ранее созданный проект или форму, сохранить проекты или формы в файлах с заданными именами.

Правка – позволяет выполнять обычные для приложений Windows операции обмена с буфером Clipboard, а также дают возможность выравнивать группы размещенных на форме компонентов по размерам и местоположению.

 

Поиск – позволяет осуществлять поиск и контекстные замены в коде приложения.

 

Вид – позволяет вызывать на экран различные окна, необходимые для проектирования.

 

Проект – позволяет добавлять и убирать из проекта формы, задавать опции проекта, компилировать проект без его выполнения и т.д.

 

Запуск – дает возможность выполнять проект в нормальном или отладочном режимах, продвигаясь по шагам, останавливаясь в указанных точках кода, просматривая значения переменных и т.д.

 

Компонент – позволяет создавать и устанавливать новые компоненты, конфигурировать палитру компонентов, работать с пакетами.

 

База данных – позволяет использовать инструментарий для работы с базами данных.

 

Инструменты – позволяет настраивать ИСР и выполнять различные вспомогательные программы, например: вызывать редактор изображений, работать с программами, конфигурирующими базы данных и т.д. Кроме того, в это меню можно включать любые разделы, вызывающие те или иные приложения.

 

Окно – позволяет ориентироваться среди массы окон, обычно одновременно открытых в процессе проектирования и переключаться в нужное окно.

 

Помощь – содержит разделы, помогающие работать со встроенной в C++Builder справочной системой.

 

    Помимо главного меню в C++Builder имеется система контекстных всплывающих меню, которые появляются, если пользователь поместил курсор мыши в каком-то окне или на каком-то компоненте и щелкнул правой кнопкой мыши. Большинство разделов контекстных меню дублирует основные разделы главного меню. Но есть и разделы, отсутствующие в главном меню и позволяющие ускорить программирование.

    Ниже полосы главного меню в окне ИСР расположены две инструментальные панели. Левая панель (состоит из нескольких панелей) содержит два ряда быстрых кнопок, дублирующих некоторые наиболее часто используемые команды меню. Правая панель содержит палитру компонентов библиотеки визуальных компонентов. Палитра компонентов содержит ряд страниц, закладки которых видны в ее верхней части.

    Правее полосы главного меню размещена еще одна небольшая инструментальная панель, содержащая выпадающий список и две быстрые кнопки. Это панель сохранения и выбора различных конфигураций окна ИСР, которые пользователь может создавать и запоминать.

    В основном поле окна слева видны два окна: сверху – Дерева Объектов, под ним – Инспектора Объектов (Инспектора проекта). Окно Дерева Объектов будет отображать иерархическую связь визуальных и невизуальных компонентов и объектов проектируемого приложения. А Инспектор Объектов – это основной инструмент, с помощью которого пользователь задает свойства компонентов и обработчики событий. Правее этих окон видно окно пустой формы, готовой для переноса на нее компонентов. Под ним расположено окно Редактора Кода. Чтобы увидеть его, окно формы необходимо сдвинуть.

 

Проектирование приложения – расчет по формуле z=f(x,y)

1.Создайте для проекта приложения каталог (папку Windows) с именем ТЕХН_ПРОГР  и запустите C++Builder 6.

2.Создайте новый проект командой Файл|Новый|Приложение.

3.Сохраните файл модуля и проект командой Файл|Сохранить все. Во время работы над проектом удобно использовать соответствующую быструю кнопку. При первом сохранении C++Builder спросит сначала имя файла сохраняемого модуля, а затем – имя головного файла проекта. Файл модуля и головной файл проекта имеют одинаковое расширение .cpp и поэтому они должны различаться именами, чтобы не затереть на диске друг друга. Итак, файлу модуля дайте имя Formula, а файлу проекта – PR_Formula.В последующих сеансах работы можно открыть сохраненный проект командой Файл|Открыть проект ( или Повторно открыть).

4.Перейдите в Инспектор Объектов, щелкнув левой кнопкой мыши на свойстве Caption (надпись). Данное по умолчанию значение Form1 свойства Caption замените на значение РАСЧЕТ ПО ФОРМУЛЕ. Перейдите в форму, щелкнув на ней левой кнопкой.

5.В процессе первого проектирования приложения полезно иметь в качестве справки результат проектирования, представленный на рис.1.

 

                       

Рис.1 – результат проектирования

 

6.Перенесите па пустую форму кнопку Button со страницы Стандарт палитры компонентов. Для этого выделите пиктограмму кнопки (она седьмая слева). При этом первая слева кнопка-указатель приобретет вид ненажатой кнопки. Это означает намерение поместить компонент (в данном случае кнопку) на форму. Если нажать кнопку-указатель, то это будет означать отказ от размещения выбранного компонента. Итак, выделив пиктограмму кнопки, щелкните курсором мыши в нижней части формы, посредине. На форме появится кнопка, которой C++Builder присвоит имя по умолчанию – Button1. Теперь свойствам перенесенного на форму компонента – кнопке присваивают нужные значения. (Во время присваивания компонент должен оставаться выделенным, т.е. окруженным рамкой с маркерами. Для выделения компонента достаточно щелкнуть на нем левой кнопкой мыши. Для удаления ошибочно перенесенного на форму компонента нужно выделить его и нажать клавишу Delete.) Перейдите в Инспектор Объектов и измените ее свойство Caption (надпись), которое по умолчанию равно Button1, на РАСЧЕТ. Установите свойство кнопки Height(высота) равным 30. Раскройте двойным щелчком свойство Font (шрифт), установите свойство шрифта Height(высота) равным 10, затем также двойным щелчком раскройте подсвойство Style (стиль) и установите в trueсвойство fsBold(жирный). Затем перейдите в форму, щелкнув на ней курсором мыши. Выделение с кнопки будет снято.

7.Над кнопкой РАСЧЕТ поместите на форме панель Panel1. На странице Стандарт палитры компонентов пиктограмма панели – вторая справа. Результат расчета по формуле будем выводить в панель, и поэтому, перейдя в Инспектор Объектов, очистите свойство Caption у панели. Высоту шрифта установите равной 20. Поварьируйте такими свойствами панели, как BevelInnerи BevelOuter, которые определяют вид (утопленный – bvLoweredили выпуклый – bvRaised)основного поля и рамки панели. Установите BevelInner= bvLoweredи BevelOuter= bvRaised.

8.Над панелью поместите метку Label1 (на странице Стандарт – четвертая слева). Укажите на метке надпись РЕЗУЛЬТАТ жирным шрифтом, высотой 20.

9.Перенесите в верхнюю часть формы со страницы Дополнительно два окна редактирования с присоединенными к ним метками LabeledEdit, расположив их на одной горизонтали. Измените надписи в метках компонентов LabeledEditна ЗНАЧЕНИЕ X и ЗНАЧЕНИЕ Y соответственно. Для этого щелкните на символе ‘+’ в свойстве EditLabelэтих компонентов и измените надпись в свойстве Caption раскрывшихся списков свойств меток на ЗНАЧЕНИЕ X и ЗНАЧЕНИЕ Y соответственно. Задайте для меток жирный шрифт высотой 10. Закройте свойствоEditLabel,щелкнув на символе ‘-’ перед этим свойством. Затем высоте шрифта присвойте значение 10, а свойству Text компонентов - значения 1,3 и 5,6 соответственно.

10. Выше окон редактирования с метками, на одной вертикали с кнопкой, панелью и меткой, перенесите на форму еще одну метку Label2, в свойстве Captionкоторой запишите программируемую формулу так, чтобы она легко читалась на экране.

11.  Выделите кнопку РАСЧЕТ на форме, щелкнув на ней курсором мыши. Перейдите в Инспектор Объектов, откройте в нем страницу событий (События), найдите (второе сверху) событие кнопки OnClick (щелчок) и сделайте двойной щелчок в окне справа от имени этого события. Это стандартный способ задания обработчиков любых событий. Но перейти в обработчик события OnClick(только этого события) можно и иначе: достаточно сделать двойной щелчок на кнопке. В обоих случаях окажетесь в окне Редактора Кода и увидите там функцию с заголовком, который складывается из имени класса формы (TForm1), имени компонента (Button1) и имени события без префикса On (Click). Курсор находится в позиции, с которой вписывается обработчик события. Например, в случае формулы

                                

 

он может выглядеть так (курсив):

void __fastcall TForm1::Button1Click(TObject *Sender)

{

double x,y,z;

x=StrToFloat(LabeledEdit1->Text);

y=StrToFloat(LabeledEdit2->Text);

z=(exp(x*x+2.37)-pow(x,1.5))/sqrt(fabs(y*y*y+atan2(y,x)));

Panel1->Caption="z="+FloatToStr(z);

}

12. Перейдите в этом файле выше и после директивы #include”Formula.h” добавьте директиву #include <math.h>.

13. Сохраните проект быстрой кнопкой Сохранить все и запустите приложение на выполнение командой Запуск|Запустить или нажмите соответствующую быструю кнопку, или нажмите «горячую» клавишу F9. После недолгой компиляции, сопровождающейся временным появлением на экране окна компилятора, появится окно приложения. Щелкнув на кнопке РАСЧЕТ, в панели получите результат выполнения приложения (Рис.2). Очевидно, нужен форматированный вывод результата. Для перехода в окно Редактора Кода закройте окно с результатом щелчком на крестике в правом верхнем углу формы.

14. Введите форматированный вывод в строку в обработчике. Для этого используется функция FloatToStrF с синтаксисом:       

 System::AnsiString FloatToStrF(Extended Value,

                          TFloatFormat Format, int Precision, int Digits).

    Число Value функция преобразует в строку с помощью формата типа TFloatFormat с синтаксисом: enum TFloatFormat{ffGeneral, ffExponent, ffFixed, ffNumber, ffCurrency};

 

                                  

Рис.2 – результат выполнения без форматирования

 

        Возможные значения формата определяют следующие правила форматирования:

ffGeneral Основной числовой формат. Число преобразуется по формату с фиксированной точкой или научному в зависимости от того, какой из них оказывается короче. Начальные нули удаляются, десятичная точка ставится только при необходимости. Фиксированный формат используется, если число разрядов слева от точки не больше указанной точности Precisionи если значение не меньше 0.00001. В противном случае используется научный формат, в котором параметр Digitsопределяет число разрядов степени – от 0 до 4
ffExponent Научный формат. Число преобразуется в строку вида “–d.ddd…E+dddd”. Общее число цифр, включая одну перед десятичной точкой, задается параметром Precision. После символа “E” всегда следует знак “+” или “–“ и до четырех цифр. Параметр Digits определяет минимальное число разрядов степени – от 0 до 4
ffFixed Формат с фиксированной точкой. Число преобразуется в строку “–ddd.ddd…”. По крайней мере одна цифра всегда предшествует десятичной точке. Число цифр после десятичной точки задается параметром Digits, который может лежать в пределах от 0 до 18. Если число разрядов слева от десятичной точки больше указанного параметром Precision, то используется научный формат

    Соответствующую строку в обработчике измените следующим образом:

    Panel1->Caption=”z=”+FloatToStrF(z,ffExponent,5,2);

    После ввода команды Сохранить все запустите приложение на выполнение (Рис.3).

 

                         

Рис.3 – результат выполнения с форматированием

 

    Теперь в окна редактирования можно вводить значения  и (между целой и дробной частью числа ставьте запятую!) и получать результат , нажимая на кнопку РАСЧЕТПоэкспериментируйтесформатами ffGeneral и ffFixed.

15. Выйдите из среды C++Builder, щелкнув на крестике в правом верхнем углу формы.

ЛАБОРАТОРНАЯ  РАБОТА  1

ФОРМИРОВАНИЕ И ОБРАБОТКА ДИНАМИЧЕСКИХ МАССИВОВ

 

ОДНОМЕРНЫЕ МАССИВЫ

    Формирование динамического массива осуществляется в два этапа: на первом – выделяют под массив динамическую память, на втором – инициализируют (заполняют данными) выделенную память. После обработки массива и получения результатов использованную память необходимо освобождать. Выделение и освобождение динамической памяти под массив производится по указателю при помощи операций new и delete соответственно. Контроль за правильностью выполнения операции выделения динамической памяти осуществляется с помощью макроса assert, определенного в файле <assert.h>. Например,

                                          int n, *iptr; // n – размер массива

------------ инициализация n -------------

                                          iptr = new int[n];

                                          assert(iptr!=0);

           //  инициализация элементов массива случайными числами

           // в диапазоне значений от -9 до 9

             for(int i=0: i<n; i++)

iptr[i]= (rand()-16383)%10; }

              --------- обработка динамического массива --------

                                          delete[]iptr;

                                          iptr=0;

    Операция newвыделяет непрерывный участок динамической памяти под массив длиной n, для целых чисел, и возвращает адрес этого участка, т.е. адрес элемента массива с индексом 0 – iptr[0]. Если память не выделена, то значение указателя iptr окажется равным нулю, а значение выражения iptr!=0 – ложным (нулевым). Тогда макрос assert прерывает выполнение программы. При завершении работы выводится сообщение об ошибке вида: Assertion failed: expression, file <имя файла>, line <номер строки>. После того, как отладка программы будет закончена и макросы assert будут больше не нужны, в начале программы достаточно добавить строку #define NDEBUG вместо того, чтобы удалять в программе каждый макрос assert вручную. Операция delete объявляет участок памяти под массивом свободным. После применения операции deleteуказатель рекомендуется обнулять, с целью защиты программного продукта.

ДВУМЕРНЫЕ МАССИВЫ (МАТРИЦЫ)

    Выделение и освобождение динамической памяти для размещения двумерного массива (матрицы) выполняется, например, следующим образом.

              int n, m, **iptr; // n – число строк, m – число столбцов матрицы

------------ инициализация n, m -------------

              // выделение памяти под массив указателей на строки

              iptr=new int*[n];

              assert(iptr!=0);        

                   for(int i=0; i<n; i++) {

                       // выделение памяти под  i – ю строку

                       iptr[i]=new int[m];

assert(iptr[i]!=0);

for(int j=0; j<m; j++)

// инициализация строк матрицы случайными

// числами в диапазоне значений от -99 до 99

iptr[i][j] = (rand()-16383)%100;}

------------- обработка динамической матрицы ------------

              for(int i=0: i<n; i++)

                       // освобождение памяти под i – й строкой

                       delete[]iptr[i];

              // освобождение памяти под массивом указателей на строки

              delete[]iptr;

              iptr=0;

    Возможен и другой вариант, когда память выделяется под столбцы. В этом случае приведенный выше фрагмент программы будет выглядеть следующим образом.

              int n, m, **iptr; // n – число строк, m – число столбцов матрицы

------------ инициализация n, m -------------

              // выделение памяти под массив указателей на столбцы

              iptr=new int*[m];

              assert(iptr!=0);        

                   for(int j=0; j< m; j++) {

                       // выделение памяти под j – й столбец

                       iptr[j]=new int[n]

assert(iptr[j]!=0);

for(int i=0: i<n; i++)

// инициализация столбцов матрицы случайными

// числами в диапазоне значений от -99 до 99

iptr[j][i]= (rand()-16383)%100; }

------------- обработка динамической матрицы ------------

for(int j=0; j<m; j++)

                       // освобождение памяти под j– м столбцом

                       delete[]iptr[j];

              // освобождение памяти под массивом указателей на столбцы

              delete[]iptr;

              iptr=0;

Задания

1.В одномерном массиве нулевые элементы удалить, положительные элементы расставить по убыванию, отрицательные - по возрастанию. Получить зависимость затрат машинного времени от размера массива.

2.В матрице удалить строки с последними отрицательными элементами, а затем добавить строку из сумм элементов по столбцам.

Проектирование приложения.

Выбор, размещение и задание свойств  компонентов.

 Коды обработчиков событий и функций

1.Запустите C++Builder 6.

2.Создайте новый проект командой Файл/Новый/Приложение.

3.Сохраните файлы модуля и проекта командой Файл/Сохранить все под именами LR_1 и PR_LR_1 в каталоге ТЕХН_ПРОГР. Для этого удобно использовать соответствующую быструю кнопку (Сохранить все). В последующих сеансах работы сохраненный проект можно открыть командой Файл/Открыть проект (или Повторно открыть). Теперь перейдем к проектированию приложения - переносам на форму необходимых компонентов и заданию их свойствам значений, а в обработчиках событий – размещению кодов соответствующих алгоритмов. (Рекомендуется нажимать кнопку  Сохранить все по окончании работы с каждым компонентом.) В результате проектирования получим форму, представленную на рис.1.1,2,3.

4.Выделите форму, щелкнув на ней левой кнопкой мыши, и в свойство Caption(надпись) впишите ДИНАМИЧЕСКИЕ МАССИВЫ.

5.Вначале перенесите на форму многостраничную панель – компонент PageControl1(страница Win32). Для размещения остальных компонентов приложения достаточно использовать две страницы компонента – по заданиям 1 и 2 соответственно.

6.Щелкните на компоненте PageControl1 правой кнопкой мыши и во всплывшем меню дважды используйте команду Новая страница. В свойство Captionпервой страницы впишите массив, второй – матрица. Установите свойства компонента PageControl1: MultiLinefalse, StyletsTabs, TabPositiontpTop.

7.Перенесите на первую страницу (массив) компонент PageControl2 и, как и вPageControl1, создайте две страницы, с надписями тестирование и использование и графики соответственно.

8.На страницу тестирование и использование (рис.1.1) перенесите семь меток Label(страница Стандарт), в свойство Caption (надпись) которых соответственно впишите размер массива, начальный, конечный, шаг, диапазон чисел, макс, мин; пять компонентов ввода целых чисел – CSpinEdit(страница Примеры) для задания параметров формируемых массивов.

 

 

Рис.1.1 – форма по окончании проектирования (вид 1)

 

 

Рис.1.2 – форма по окончании проектирования (вид 2)

Рис.1.3 – форма по окончании проектирования (вид 3)

 

9.У компонентаCSpinEdit1, расположенного правее метки начальный, занесите в свойство MaxValue – 1000, MinValue – 1, Value10; правее метки конечный(CSpinEdit2)  - MaxValue – 10000, MinValue – 1, Value10; правее метки шаг(CSpinEdit3)  - MaxValue– 1000, MinValue – 0, Value1, правее метки макс(CSpinEdit4) - MaxValue– 99, MinValue – -99, Value9, правее метки мин(CSpinEdit5)  - MaxValue– 99, MinValue – -99, Value-9.

10.Для разрешения или запрещения вывода на экран исходных и результирующих массивов, а также графиков полученных зависимостей, в правую верхнюю часть страницы перенесите два компонента-индикатора CheckBox(страница Стандарт), в свойство Captionкоторых впишите соответственно вывод в таблицу и графики, а свойство Alignment  обоих компонентов установите в taRightJustify.

11.Ниже индикаторов CheckBoxпоместите панель Panel1( страница Стандарт) для вывода в нее сообщений: Макс значение не м.б. меньше мин значения!, В массиве только нули!, Кол-во сравнений = <число> Кол-во обменов = <число> . Очистите свойство Caption у панели.  

12.Для вывода массивов на экран при тестировании перенесите на страницу компонент StringGrid1 (страница Дополнительно). Установите следующие значения свойств компонента StringGrid1: ColCount– 11, DefaultColWidth -24, FixedCols – 1, FixedRows – 0, Font – черный, обычный, размер 8, RowCount – 8.

13.Правее компонента StringGrid1 разместите 2 кнопки (страница Стандарт) с надписями соответственно: Button1 –ПУСК1, Button2 –СБРОС1.

14.Для отображения процесса обработки массиваниже компонента StringGrid1 поместите компонент ProgressBar1 (страница Win32).

15.Еще ниже поместите компонент StatusBar1(страница Win32), который представляет собой ряд панелей, отображающих полосу состояния. Поскольку в нашем случае достаточно одной панели (для одного сообщения), то установите свойство SimplePanel= true. Свойство  SimpleText представляет собой текст, который задается во время проектирования или программно (в нашем случае во время проектирования). Итак, в свойствоSimpleText впишем кратко задание 1: Нули - удалить, "+" - элементы расставить по убыванию, "-" - по возрастанию.

16.Затраты машинного времени на обработку массива оценивают косвенно – по количествам сравнений и обменов. Для вывода на экран зависимостей  количеств сравнений и обменов от размера массива, на страницу графики (рис.1.2) компонента PageControl2перенесите компоненты Chart1 и Chart2 (страница Additional).

17.Задайте свойства компонента Chart1. Для этого щелкните правой кнопкой мыши на компоненте Chart1 и в появившемся меню выберите Edit Chart…. На экране появится окно Редактора Диаграмм (Editing Chart1) с открытой страницей Chart,которая имеет несколько закладок. В данный момент открыта закладка Series. Щелкните на кнопке Add… - добавить серию. В появившемся окне выберите тип графика – Line и выключите индикатор 3D. На закладке Panel, нажав кнопку Panel Color…, выберите белый цвет. Перейдите на закладку Titles. В окне редактирования, которое в данный момент соответствует Title – заголовку графика, сотрите TChart и напишите (шрифт Font… - черный, жирный, размер 8) количество сравнений. Цвет фона Back Color.. установите белый.В выпадающем списке от окна редактирования Title перейдите в окно редактирования Foot и напишите тем же шрифтом размер массива. Цвет фона Back Color.. также установите белый. Нажмите кнопку Close и выйдите из режима редактирования компонентаChart1. Свойства компонента Chart2задаются так же.

18.Перейдем к обработчикам событий – щелчков на кнопках ПУСК1 и СБРОС1. В первом обработчике размещен алгоритм формирования и обработки массива по заданию 1, а также вывод сообщений и результатов в виде таблицы и графиков, а во втором – подготовка компонентов к выводу новых сообщений и новых результатов. Перед, после и в обработчике щелчка на кнопке ПУСК1 напишите (курсив):

 

int i=0,*vptr=0;

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Series1->Clear();

Series2->Clear();

void __fastcall sort(int*p,int n);

Panel1->Caption="";

if(CSpinEdit4->Value<CSpinEdit5->Value){

Panel1->Caption="Макс значение не м.б. меньше мин значения!";

return;}

int count,current=0;

count=(CSpinEdit2->Value-CSpinEdit1->Value)/CSpinEdit3->Value+1;

for(int n=CSpinEdit1->Value; n<=CSpinEdit2->Value; n+=CSpinEdit3->Value)

 {

 vptr=new int[n];

 assert(vptr!=0);

 for(int j=0;j<n;j++)

   vptr[j]=random(CSpinEdit4->Value-CSpinEdit5->Value+1)+

           CSpinEdit5->Value;

 if(CheckBox1->Checked){

   StringGrid1->Cells[0][i]="Исходный массив";

   for(int j=0;j<n;j++)

     StringGrid1->Cells[j+1][i]=IntToStr(vptr[j]);

  i++;}

 sort(vptr,n);

 current+=1;

 ProgressBar1->Position=100*current/count;

 delete[]vptr;

 }

vptr=0;

}

//---------------------------------------------------------------------------

void __fastcall sort(int*p,int n)

{

int k=0,sr=0,obm=0,m=n;

void __fastcall swap(int&x,int&y);

for(int j=0;j<n;j++)

   if(!p[j])k++;

     else p[j-k]=p[j];

n-=k;

sr+=n;

if(!n){Form1->Panel1->Caption="В массиве только нули!"; return;}

for(int m=0;m<n-1;m++)

for(int j=m+1;j<n;j++){

if(p[m]>0&&p[j]>0&&p[m]<p[j]){swap(p[m],p[j]);obm++;}

if(p[m]<0&&p[j]<0&&p[m]>p[j]){swap(p[m],p[j]);obm++;}

sr+=6;}

if(Form1->CheckBox1->Checked){

   Form1->StringGrid1->Cells[0][i]="Получен массив";

   for(int j=0;j<n;j++)

     Form1->StringGrid1->Cells[j+1][i]=IntToStr(p[j]);

   i++;}

if(Form1->CSpinEdit1->Value==Form1->CSpinEdit2->Value)

Form1->Panel1->Caption=

"Кол-во сравнений = "+IntToStr(sr)+

" Кол-во обменов = "+IntToStr(obm);

if(Form1->CheckBox2->Checked){

Form1->Series1->AddXY(m,sr,"",clBlack);

Form1->Series2->AddXY(m,obm,"",clBlack);}

}

//-----------------------------------------------------

void __fastcall swap(int&x,int&y)

{int z=x;x=y;y=z;}

19.В обработчике щелчка на кнопке СБРОС1 напишите (курсив):

void __fastcall TForm1::Button2Click(TObject *Sender)

{

Panel1->Caption="";

ProgressBar1->Position=0;

for(int k=0;k<StringGrid1->RowCount;k++)

for(int j=0;j<StringGrid1->ColCount;j++)

   StringGrid1->Cells[j][k]="";

i=0;

Series1->Clear();

Series2->Clear();

}

20.Перенесите на вторую страницу (матрица) компонента PageControl1(рис.1.3) восемь меток Label(страница Стандарт), в свойство Caption (надпись) которых впишите значения размеры, число строк, число столбцов, диапазон чисел, макс, мин, исходная матрица, матрица-результат; четыре компонента ввода целых чисел – CSpinEdit69(страница Примеры) для задания параметров формируемых матриц.

21.У компонента, расположенного правее метки число строк(CSpinEdit6), занесите в свойство MaxValue – 100, MinValue – 1, Value10; правее метки число столбцов(CSpinEdit7)  - MaxValue – 100, MinValue – 1, Value10; правее метки макс(CSpinEdit8) - MaxValue– 99, MinValue – -99, Value9, правее метки мин (CSpinEdit9) - MaxValue– 99, MinValue – -99, Value-9.

22.Перенесите также две кнопки Button1,2(страница Стандарт) с надписями ПУСК2, СБРОС2.

23.Сюда же поместите панель Panel2(страница Стандарт) для вывода в панель сообщений: Макс не м.б. меньше мин!, В матрице удалены все строки!, В матрице нет удаленных строк!, В матрице удалено <кол-во> строк(и)!. Очистите свойство Caption у панели.

24.Кроме того, на этой странице разместите две таблицы - компоненты StringGrid2,3 (страница Дополнительно) - для вывода матриц – исходной и матрицы-результата. Задайте следующие значения свойств обоих компонентов StringGrid: ColCount – 10, DefaultColWidth - 32, FixedCols – 0, FixedRows – 0, Font – черный, обычный, размер 8, RowCount – 10.

25. И, наконец, в нижней части страницы поместите компонент StatusBar2(страница Win32). Установите свойство SimplePanel= true. В свойствоSimpleText впишите кратко задание 2: Строки с "-" на конце - удалить, а затем добавить строку из сумм по столбцам.

26.В обработчике щелчка на кнопке ПУСК2 находится алгоритм формирования и обработки динамической матрицы согласно заданию 2 с выводом результатов и сообщений, а в обработчике щелчка на кнопке СБРОС2 - зачистка выведенных результатов и сообщений (курсив):

 

int n,m;

void __fastcall TForm1::Button3Click(TObject *Sender)

{int i,j,**ptr,k,q;

 Panel2->Caption="";

 for(int i=0;i<n;i++)

for(int j=0;j<m;j++){

     StringGrid2->Cells[j][i]="";

     StringGrid3->Cells[j][i]="";}

 if(CSpinEdit8->Value<CSpinEdit9->Value){

Panel2->Caption="Макс не м.б. меньше мин!";

return;}

 n=CSpinEdit6->Value;

 m=CSpinEdit7->Value;

 ptr=new int*[n];

 assert(ptr!=0);

 for(i=0;i<n;i++){

ptr[i]=new(int[m]);

assert(ptr[i]!=0);

for(j=0;j<m;j++){

  ptr[i][j]=random(CSpinEdit8->Value-CSpinEdit9->Value+1)

            +CSpinEdit9->Value;

  StringGrid2->Cells[j][i]=IntToStr(ptr[i][j]);}}

q=0;

k=0;

do{

if(ptr[q][m-1]<0){

  delete[]ptr[q];

  for(i=q;i<n-k-1;i++)ptr[i]=ptr[i+1];

  k++; continue;}

q++;}

while(q+k<n);

if(k==n){Panel2->Caption=

             "В матрице удалены все строки!"; return;}

if(k==0){Panel2->Caption=

             "В матрице нет удаленных строк!";return;}

Panel2->Caption="В матрице удалено "+IntToStr(k)+" строк(и)!";

for(i=0;i<n-k;i++)

for(j=0;j<m;j++){

  StringGrid3->Cells[j][i]=IntToStr(ptr[i][j]);}

 ptr[n-k]=new(int[m]);

 assert(ptr[n-k]!=0);

 for(j=0;j<m;j++){

ptr[n-k][j]=0;

for(i=0;i<n-k;i++)

ptr[n-k][j]+=ptr[i][j];}

 for(i=0;i<=n-k;i++)

for(j=0;j<m;j++){

  StringGrid3->Cells[j][i]=IntToStr(ptr[i][j]);}

 for(i=0;i<=n-k;i++)delete[]ptr[i];

 delete[]ptr;

 ptr=0;

}

//---------------------------------------------------------------------------

 

void __fastcall TForm1::Button4Click(TObject *Sender)

{

 Panel2->Caption="";

 for(int i=0;i<n;i++)

for(int j=0;j<m;j++){

     StringGrid2->Cells[j][i]="";

     StringGrid3->Cells[j][i]="";}

}

//---------------------------------------------------------------------------

 

27.По окончании проектирования файл LR_1.cpp будет выглядеть так:

//---------------------------------------------------------------------------

 

#include <vcl.h>

#pragma hdrstop

 

#include "LR_1.h"

#include<assert.h>

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma link "CSPIN"

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

   : TForm(Owner)

{

}

//---------------------------------------------------------------------------

int i=0,*vptr=0;

 

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Series1->Clear();

Series2->Clear();

void __fastcall sort(int*p,int n);

Panel1->Caption="";

if(CSpinEdit4->Value<CSpinEdit5->Value){

Panel1->Caption="Макс значение не м.б. меньше мин значения!";

return;}

int count,current=0;

count=(CSpinEdit2->Value-CSpinEdit1->Value)/CSpinEdit3->Value+1;

for(int n=CSpinEdit1->Value;n<=CSpinEdit2->Value;n+=CSpinEdit3->Value)

 {

 vptr=new int[n];

 assert(vptr!=0);

 for(int j=0;j<n;j++)

   vptr[j]=random(CSpinEdit4->Value-CSpinEdit5->Value+1)+

           CSpinEdit5->Value;

 if(CheckBox1->Checked){

   StringGrid1->Cells[0][i]="Исходный массив";

   for(int j=0;j<n;j++)

     StringGrid1->Cells[j+1][i]=IntToStr(vptr[j]);

   i++;}

 sort(vptr,n);

 current+=1;

 ProgressBar1->Position=100*current/count;

 delete[]vptr;

 }

vptr=0;

}

//---------------------------------------------------------------------------

 

void __fastcall TForm1::Button2Click(TObject *Sender)

{

Panel1->Caption="";

ProgressBar1->Position=0;

for(int k=0;k<StringGrid1->RowCount;k++)

for(int j=0;j<StringGrid1->ColCount;j++)

   StringGrid1->Cells[j][k]="";

i=0;

Series1->Clear();

Series2->Clear();

}

//---------------------------------------------------------------------------

void __fastcall sort(int*p,int n)

{

int k=0,sr=0,obm=0,m=n;

void __fastcall swap(int&x,int&y);

for(int j=0;j<n;j++)

   if(!p[j])k++;

     else p[j-k]=p[j];

n-=k;

sr+=n;

if(!n){Form1->Panel1->Caption="В массиве только нули!"; return;}

for(int m=0;m<n-1;m++)

for(int j=m+1;j<n;j++){

if(p[m]>0&&p[j]>0&&p[m]<p[j]){swap(p[m],p[j]);obm++;}

if(p[m]<0&&p[j]<0&&p[m]>p[j]){swap(p[m],p[j]);obm++;}

sr+=6;}

if(Form1->CheckBox1->Checked){

   Form1->StringGrid1->Cells[0][i]="Получен массив";

   for(int j=0;j<n;j++)

     Form1->StringGrid1->Cells[j+1][i]=IntToStr(p[j]);

   i++;}

if(Form1->CSpinEdit1->Value==Form1->CSpinEdit2->Value)

Form1->Panel1->Caption=

"Кол-во сравнений = "+IntToStr(sr)+

" Кол-во обменов = "+IntToStr(obm);

if(Form1->CheckBox2->Checked){

Form1->Series1->AddXY(m,sr,"",clBlack);

Form1->Series2->AddXY(m,obm,"",clBlack);}

}

//-----------------------------------------------------

void __fastcall swap(int&x,int&y)

{int z=x;x=y;y=z;}

//-----------------------------------------------------

int n,m;

void __fastcall TForm1::Button3Click(TObject *Sender)

{int i,j,**ptr,k,q;

 Panel2->Caption="";

 for(int i=0;i<n;i++)

for(int j=0;j<m;j++){

     StringGrid2->Cells[j][i]="";

     StringGrid3->Cells[j][i]="";}

 if(CSpinEdit8->Value<CSpinEdit9->Value){

Panel2->Caption="Макс не м.б. меньше мин!";

return;}

 n=CSpinEdit6->Value;

 m=CSpinEdit7->Value;

 ptr=new int*[n];

 assert(ptr!=0);

 for(i=0;i<n;i++){

ptr[i]=new(int[m]);

assert(ptr[i]!=0);

for(j=0;j<m;j++){

  ptr[i][j]=random(CSpinEdit8->Value-CSpinEdit9->Value+1)

            +CSpinEdit9->Value;

  StringGrid2->Cells[j][i]=IntToStr(ptr[i][j]);}}

q=0;

k=0;

do{

if(ptr[q][m-1]<0){

  delete[]ptr[q];

  for(i=q;i<n-k-1;i++) ptr[i]=ptr[i+1];

  k++; continue;}

q++;}

while(q+k<n);

if(k==n){Panel2->Caption=

             "В матрице удалены все строки!"; return;}

if(k==0){Panel2->Caption=

             "В матрице нет удаленных строк!";return;}

Panel2->Caption="В матрице удалено "+IntToStr(k)+" строк(и)!";

for(i=0;i<n-k;i++)

for(j=0;j<m;j++){

  StringGrid3->Cells[j][i]=IntToStr(ptr[i][j]);}

 ptr[n-k]=new(int[m]);

 assert(ptr[n-k]!=0);

 for(j=0;j<m;j++){

ptr[n-k][j]=0;

for(i=0;i<n-k;i++)

ptr[n-k][j]+=ptr[i][j];}

 for(i=0;i<=n-k;i++)

for(j=0;j<m;j++){

  StringGrid3->Cells[j][i]=IntToStr(ptr[i][j]);}

 for(i=0;i<=n-k;i++)delete[]ptr[i];

 delete[]ptr;

 ptr=0;

}

//---------------------------------------------------------------------------

 

void __fastcall TForm1::Button4Click(TObject *Sender)

{

 Panel2->Caption="";

 for(int i=0;i<n;i++)

for(int j=0;j<m;j++){

     StringGrid2->Cells[j][i]="";

     StringGrid3->Cells[j][i]="";}

}

//-----------------------------------------------------------------------------------------------

 

Тестирование и использование приложения

1.Запустите приложение на выполнение, нажав быстрые кнопки Сохранить все и Запуск.

2.Подготовьте приложение к тестированию задания 1, щелкнув на закладке массив, а затем тестирование и использование (рис.1.1). Включите индикатор вывод в таблицу.

3.Пользуясь ПУСК1 иСБРОС1, убедитесь в работоспособности  приложения с параметрами массива, заданными по умолчанию (рис.1.4).

4.Изменяя диапазон значений элементов массива, убедитесь в работоспособности приложения в случаях: а) максимальное значение меньше минимального, б) в массиве только нули, в) в массиве только положительные элементы, г) в массиве только отрицательные элементы, д) массив состоит из равных по величине элементов (положительных и отрицательн










Последнее изменение этой страницы: 2018-05-29; просмотров: 200.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...