Лабораторная работа №1
Цель лабораторной работы: изучить основные элементы визуальной среды, освоить использование простейших компонентов DELPHI для ввода/вывода данных, и создать приложение, которое использует линейный алгоритм.
При запуске DELPHI на экране появляется панель интерфейса, показанная на рис. 1.1. Среда DELPHI визуально реализуется в виде нескольких одновременно раскрытых на экране монитора окон. Количество, расположение, размер и вид окон может изменяться программистом.
Главное
окно всегда
присутствует
на экране и
предназначено
для управления
процессом
создания приложения.
Главное меню содержит все необходимые средства для управления проектом.
Пиктограммы главного меню облегчают доступ к наиболее часто применяемым командам.
Палитра Компонентов обеспечивает доступ к набору библиотечных программ среды DELPHI, которые описывают некоторый элемент (компонент), помещенный программистом в окно Формы. Каждый компонент имеет определенный набор свойств, которые программист может выбирать и изменять по своему усмотрению. Например, заголовок окна, надпись на кнопке, размер, цвет и тип шрифта и др. Свойства компонентов приведены в HELP.
Окно Инспектора Объектов предназначено для изменения свойств выбранных компонентов и состоит из двух страниц. Страница Properties (Свойства) предназначена для изменения необходимых свойств компонента. Страница Events (События) – для определения реакции компонента на то или иное событие (например, щелчок кнопки “мыши ”).
Окно Формы представляет собой интерфейс проектируемого Windows-приложения. В это окно на этапе проектирования приложения помещаются необходимые компоненты, которые разработчик берет из Палитры Компонентов. Каждой Форме проекта соответствует модуль (Unit), текст которого на языке Object Pascal размещается в окне Редактора Кода.
Окно Редактора Кода предназначено для просмотра, создания и редактирования текстов модулей проекта. При первоначальной загрузке в окне Редактора Кода находится текст модуля, содержащий минимальный набор операторов для нормального функционирования пустой Формы в качестве Windows-приложения. При размещении некоторого компонента в окне Формы, текст модуля автоматически дополняется необходимыми операторами.
Обо всех происходящих в системе событиях, таких как создание Формы, нажатие кнопки мыши или клавиатуры и т.д., ядро Windows информирует окна путем посылки соответствующих сообщений. Среда DELPHI принимает и обрабатывает сообщения с помощью обработчиков событий (например, щелчок кнопки “мыши” – событие OnClick, создание Формы – OnCreate). Наиболее часто применяемые события представлены в табл. 1.1.
Таблица 1.1 | |
Событие |
Описание события |
OnActivate | Возникает при активизации Формы |
OnCreate |
Возникает при создании Формы. В обработчике данного события следует задавать действия, которые должны происходить в момент создания Формы, например установка начальных значений. |
OnClick | Возникает при нажатии кнопки мыши в области компонента. |
OnDblClick | Возникает при двойном нажатии кнопки мыши в области компонента |
OnKeyPress |
Возникает при нажатии клавиши на клавиатуре. Параметр Key имеет тип Char и содержит ASCII-код нажатой клавиши (клавиша Enter клавиатуры имеет код #13, клавиша Esc - #27 и т.д.). Обычно это событие используется в том случае, когда необходима реакция на нажатие одной из клавиш. |
OnKeyDown | Возникает при нажатии клавиши на клавиатуре. Обработчик этого события получает информацию о нажатой клавише и состоянии клавиш Shift, Alt и Ctrl, а также о нажатой кнопке мыши. |
Для создания обработчика события программисту необходимо раскрыть список компонентов в верхней части окна Инспектора Объектов и выбрать необходимый компонент. Затем, на странице Events Инспектора Объектов, нажатием левой клавиши мыши выбрать название обработчика и дважды щелкнуть по его правой (белой) части. В ответ DELPHI активизирует окно Редактора Кода модуля и покажет заготовку процедуры обработки выбранного события. Для каждого обрабатываемого события в тексте модуля организуется процедура (procedure), между ключевыми словами begin и end которой программист на языке Object Pascal записывает требуемый алгоритм обработки события.
Переключение
между окном
Формы и окном
Редактора Кода
осуществляется
кнопкой главного
меню с пиктограммой
Задание: создать Windows-приложение для вычисления выражения
Численные значения данных x, y и z занести с клавиатуры в соответствующие поля панели интерфейса. Один из возможных вариантов панели интерфейса создаваемого приложения показан на рис. 1.2.
1.2.1. Сохранение проекта
В процессе проектирования приложения DELPHI создает несколько файлов - проект. Каждый проект целесообразно хранить в отдельной, заранее созданной папке. С помощью подходящего приложения Windows создадим папку и назовем ее, например, LAB1.
Для сохранения проекта откройте в главном меню пункт File и щелкните “мышью” на опции Save Project As…(Сохранить проект как…). Сначала DELPHI откроет панель диалога Save Unit1 As (Сохранить модуль как) для сохранения модуля проекта. В этой панели найдем созданную папку LAB1 и сохраним в ней модуль под именем, например, UnLinAlg. Обратите внимание на то, что DELPHI по умолчанию присвоит этому файлу тип Delphi unit c расширением *.pas. Затем откроется панель диалога Save Project1 As . Назовем наш проект, например, PrLinAlg и сохраним его в этой же папке. Здесь DELPHI даст файлу тип Delphi project и расширение *.dpr. Убедитесь в том, что главное окно DELPHI теперь называется PrLinAlg, окно главного файла проекта- PrLinAlg.dpr, а окно модуля проекта- UnLinAlg.pas.
Старайтесь давать файлам осмысленные имена вместо однообразных Unit1 и Project1, предлагаемых DELPHI.
Чтобы
избежать потери
файлов проекта
в аварийных
ситуациях
связанных,
например, с
выключениием
питания, зависании
системы и т.д.,
рекомендуется
периодически
сохранять
проект,
используя
пиктограмму
1.2.2. Настройка окон
Чтобы работать с окном, необходимо сделать его активным, щелкнув “мышью” в любом месте окна. У активного окна заголовок становится выделенным, например, на рис. 1.1 активным является окно Редактора Кода.
Окна
Формы и Редактора
Кода модуля
в правом верхнем
углу имеют
кнопки управления,
которые предназначены:
С помощью “мыши”, захватывая одну из кромок окна или выделенную строку заголовка, отрегулируете нужные размеры окон Формы, Редактора Кода, Инспектора Объектов и их положение на экране.
Новая Форма имеет одинаковые имя (Name) и заголовок (Сaption) - FORM1. Начинающим программистам имя Формы менять не рекомендуется, т.к. оно используется в тексте модуля.
Для изменения заголовка активизируйте окно Инспектора Объектов и на странице Properties в свойстве Caption замените заголовок Form1 на Лаб. работа №1-Линейный алгоритм. Убедитесь, что одновременно изменился заголовок окна Формы.
Будем размещать компоненты на Форме так, чтобы они соответствовали панели, показанной на рис 1.2.
Рис.1.2
Для
нанесения
надписей на
Форму используется
компонент
Label. Выберите
в Палитре Компонентов
на странице
Standard пиктограмму
Для ввода/вывода данных в простейших случаях используются компоненты Edit и Memo. Компонент Edit применяется в тех случаях, когда данные представляются одной строкой. Если данные представляют собой несколько строк, то используется компонент Memo.
Для
создания полей
ввода численных
значений переменных
x, y
и z используем
компонент
Edit. Выберите
в Палитре Компонентов
на странице
Standard пиктограмму
Для
вывода результатов
используем
компонент Memo.
Выберите в
Палитре Компонентов
на странице
Standard пиктограмму
Если программист желает, чтобы при появлении панели интерфейса на экране в соответствующих полях находились начальные значения данных, он должен учесть, что при запуске приложения возникает событие - создание Формы (OnCreate). Создадим процедуру обработки этого события, которая занесет начальные значения переменных x, y, z в поля Edit1, Edit2 и Edit3 соответственно, а в поле Memo1 поместит строку Лабораторная работа №1 – Линейный алгоритм. Для этого дважды щелкните мышью на любом свободном месте Формы. На экране появится текст модуля UnLinAlg, в котором DELPHI автоматически создает заготовку процедуры-обработчика события создания Формы: Procedure TForm1.FormCreate(Sender:TObject). Между операторами begin и end этой процедуры вставьте операторы, которые выполняют необходимые действия (текст модуля приведен в п.1.2.7).
Поместим
на Форму кнопку,
нажатие которой
приведет к
вычислению
выражения.
Выберите в
Палитре Компонентов
на странице
Standart пиктограмму
Unit UnLinAlg;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Label3: TLabel;
Edit3: TEdit;
Label4: TLabel;
Memo1: TMemo;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
// Процедура обработки события создания Формы:
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text:='0.4'; // начальное значение X
Edit2.Text:='8.75e-2'; // начальное значение Y
Edit3.Text:='-19.63'; // начальное значение Z
Memo1.Clear; // очистка Memo1
// Вывод строки в Memo1:
Memo1.Lines.Add('Лабораторная работа №1 - Линейный алгоритм');
end;
// Процедура обработки события нажатия кнопки Button1:
procedure TForm1.Button1Click(Sender: TObject);
var
x,y,z,a,b,c,u : extended; // объявление локальных переменных
begin
x:=StrToFloat(Edit1.Text); // X присваивается содержимое Edit1
y:=StrToFloat(Edit2.Text); // Y присваивается содержимое Edit2
z:=StrToFloat(Edit3.Text); // Z присваивается содержимое Edit3
// Вычисляется выражение
a:=sqrt(x)-y*y*y;
b:=sin(a)/cos(a);
c:=Exp(5*Ln(b));
u:=c+exp(y/z)*sin(z*z);
Memo1.Lines.Add('X = '+Edit1.Text+' Y = '+Edit2.Text+
' Z = '+Edit3.Text); // контрольный вывод X, Y, Z в Memo1
// Вывод результата в Memo1:
Memo1.Lines.Add(' U = '+FloatToStrF(u,ffFixed,8,3));
end;
end.
Данные, с которыми работают компоненты Edit и Memo, имеют тип String. Поэтому в процедуре TForm1.Button1Click при присваивании содержимого полей Edit1,Edit2,Edit3 переменным X,Y,Z c помощью функции StrToFloat осуществляется преобразование данных типа String в действительные значения с плавающей точкой типа Extended. Если необходимо работать с данными целого типа, используется функция StrToInt.
При выводе данных в Memo1 используется метод Add свойства Lines, причем для преобразования данных из действительного значения в строковое и управления формой представления выводимого результата используется функция FloatToStrF.
Для
запуска созданного
приложения
нажмите пиктограмму
Щелкните
“мышью”
на кнопке “Вычислить”
и в поле Memo1
появляется
результат.
Измените исходные
значения x,
y, z в полях
Edit и снова
нажмите кнопку
”Вычислить”.
Убедитесь, что
в поле Memo1
отображаются
новые результаты.
Завершить
работу приложения
можно нажатием
кнопки
В случае нештатного функционирования приложения восстановить первоначальный режим работы с проектом можно путем выбора в меню Run опции ProgramReset или нажать клавиши Ctrl+F2.
По указанию преподавателя выберите свое индивидуальное задание. Уточните условие задания, количество и типы исходных данных. В соответствии с этим оформите дизайн панели интерфейса проектируемого приложения, установите необходимое количество полей Edit, тексты заголовков на Форме, размеры шрифтов, а также типы переменных и функции преобразования при вводе и выводе результатов.
1.
При
x=14.26, y=-1.22, z=3.5
2.
При
x=-4.5,
y=0.75
3.
При
x=3.74
4.
При
x=0.4
5.
При
x=-15.246, y=4.642
Лабораторная работа №2
Цель лабораторной работы: освоить использование простейших компонентов-переключателей и создать приложение, которое использует разветвляющийся алгоритм.
Задание: создать Windows-приложение для вычисления выражения
Z=
Один из возможных вариантов панели интерфейса создаваемого приложения показан на рис. 2.1.
Будем размещать компоненты на Форме так, чтобы они соответствовали панели, показанной на рис 2.1.
Рис. 2.1
При создании приложений в DELPHI часто используются компоненты в виде кнопок-переключателей. Состояние такой кнопки (включено - выключено) визуально отражается на Форме. На панели (рис. 2.1) представлены кнопки-переключатели двух типов: CheckBox и RadioGroup .
Компонент CheckBox организует кнопку независимого переключателя, с помощью которой пользователь может указать свое решение типа “да/нет”. Компонент RadioGroup организует группу кнопок - зависимых переключателей. При нажатии одной из кнопок группы все остальные кнопки выключаются.
Поместите
на Форму компоненты
Label, Edit и Memo
в соответствии
с рис.2.1. Выберите
в Палитре Компонентов
на странице
Standard пиктограмму
Выберите
в Палитре Компонентов
Standard пиктограмму
Технология создания процедур обработки событий FormСreate и Button1Сlick ничем не отличается от предыдущей работы. Внимательно наберите операторы этих процедур, используя текст модуля UnRazvAlg.
Unit UnRazvAlg;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Label4: TLabel;
Memo1: TMemo;
Button1: TButton;
RadioGroup1: TRadioGroup;
CheckBox1: TCheckBox;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
// Процедура обработки события создания Формы:
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text:='0.5'; // начальное значение X
Edit2.Text:='1.8'; // начальное значение Y
Memo1.Clear; // очистка Memo1
// Вывод строки в Memo1:
Memo1.Lines.Add(‘Лабораторная работа №2 - Разветвляющийся алгоритм’);
end;
// Процедура обработки события нажатия кнопки Button1:
procedure TForm1.Button1Click(Sender: TObject);
var
x,y,z,fx : extended; // объявление локальных переменных
begin
x:=StrToFloat(Edit1.Text); // X присваивается содержимое Edit1
y:=StrToFloat(Edit2.Text); // Y присваивается содержимое Edit2
fx:=sin(x); // fx присваивается начальное значение
// Выбор функции, соответствующей нажатой кнопке:
case RadioGroup1.ItemIndex of
0:fx:=sin(x);
1:fx:=cos(x);
end;
// Вычисление выражения:
if
x
z:=fx
else
z:=y;
// Проверка состояния кнопки CheckBox1:
if CheckBox1.Checked then
Memo1.Lines.Add('X = '+Edit1.Text+
' Y = '+Edit2.Text); // контрольный вывод X, Y в Memo1
// Вывод результата в Memo1:
Memo1.Lines.Add(' Z = '+FloatToStrF(z,ffFixed,8,3));
end;
end.
Если нажата первая кнопка RadioGroup1, в переменную целого типа RadioGroup1.ItemIndex заносится нуль, если вторая – единица. Если кнопка CheckBox1 нажата, логическая переменная CheckBox1.Checked имеет значение True, если нет – False.
Запустите созданное приложение. Используя все управляющие компоненты панели интерфейса, убедитесь в правильном функционировании приложения во всех предусмотренных режимах работы.
По указанию преподавателя выберите свое индивидуальное задание. Создайте приложение и протестируйте его работу.
Для заданий №1-№15 на панели интерфейса предусмотреть возможность выбора одной из трех функций f(x): sh(x), x2, eX.
1. |
|
2. |
|
3. |
|
4. |
|
5. |
|
6. |
|
7. |
|
8. |
|
Лабораторная работа №3
Цель лабораторной работы: освоить простейшие средства отладки модулей проекта и создать приложение, которое использует циклический алгоритм.
Отладка представляет собой процесс обнаружения, локализации и устранения ошибок в проекте. Она занимает значительную часть рабочего времени программиста, нередко большую, чем разработка проекта.
Практически любой нетривиальный проект перед началом отладки содержит хотя бы одну синтаксическую или логическую ошибку.
Синтаксические ошибки состоят в нарушении формальных правил использования операторов. Эти ошибки появляются в результате недостаточного знания разработчиком языка программирования и невнимательности при наборе операторов на экране дисплея.
Поиск синтаксических ошибок в модулях проекта осуществляется компилятором. Чтобы дать программисту как можно больше информации об ошибках, допущенных в модуле, компилятор отмечает ошибки и продолжает работу до тех пор, пока не будут обработаны все операторы модуля. Следует иметь в виду, что:
компилятор распознает не все ошибки;
некоторые ошибки могут повлечь за собой то, что правильные операторы будут восприниматься компилятором как ошибочные, и наоборот – ошибочные операторы компилятор воспримет как верные;
ошибка в одном месте модуля может повлечь за собой серию диагностических сообщений компилятора в других местах модуля;
из-за некоторых ошибок компиляция модуля может вообще прекращаться и проверка последующих операторов не производится.
Информация обо всех ошибках, найденных в модуле, выводится в специальное окно, которое появляется в нижней части экрана. Каждая строка этого окна содержит имя файла, номер строки, в которой обнаружена ошибка и характер ошибки. Если дважды щелкнуть “мышью” на строке с описанием ошибки, курсор установится в той строке модуля, где обнаружена ошибка. Следует исправлять ошибки последовательно, сверху вниз и после исправления каждой ошибки компилировать программу заново. С целью сокращения времени компиляции рекомендуется осуществлять проверку наличия ошибок в режимах Syntax Check и Compile меню Project. Для получения более полной информации о характере ошибки можно обратится к HELP нажатием клавиши F1.
Отладка синтаксиса считается завершенной, когда после очередной компиляции в режиме Build All меню Project отсутствуют диагностические сообщения об ошибках.
Логические ошибки условно можно разделить на ошибки алгоритма и семантические ошибки. Причинами таких ошибок могут быть несоответствие алгоритма поставленной задаче, неправильное понимание программистом смысла (семантики) операторов языка программирования, нарушение допустимых пределов и правил представления данных, невнимательность при технической подготовке проекта к обработке на компьютере.
Для выявления ошибок служат тесты. Тест – это такой набор исходных данных, который дает результат, не вызывающий сомнений. Промежуточные и конечные результаты теста используются для контроля правильности выполнения приложения.
Составление тестов – непростая задача. Тесты должны быть с одной стороны, достаточно простыми, чтобы результат легко проверялся, с другой стороны – достаточно сложными, чтобы комплексно проверить алгоритм.
Тесты составляются по схеме алгоритма до программирования, так как составление тестов помогает выявить многие ошибки в алгоритмизации.
Количество тестов и их сложность зависят от алгоритма. Комплекс тестов должен быть таким, чтобы все ветви схемы алгоритма были пройдены, по крайней мере, по одному разу. Несовпадение результатов, выдаваемых приложением с результатами тестов – признак наличия ошибок. Эти ошибки проявляются в том, что результат расчета оказывается неверным либо происходит переполнение, деление на 0 и др.
Для локализации места ошибки рекомендуется поступать следующим образом. В окне Редактора Кода установите курсор в строке перед подозрительным участком и нажмите клавишу F4 (выполнить до курсора). Выполнение приложения будет остановлено на той строке модуля, в которой был установлен курсор. Текущее значение любой переменной можно увидеть, если накрыть курсором идентификатор переменной на 1-2 сек. Нажимая клавишу F8 (пошаговое выполнение), можно построчно выполнять программу, контролируя содержимое переменных и правильность вычислений.
Задание:
создать Windows-приложение,
которое выводит
таблицу значений
функции
В панели интерфейса предусмотреть возможность управления выводом исходных данных и погрешности вычислений.
Один из возможных вариантов панели интерфейса создаваемого приложения показан на рис.3.1.
3.2.1. Размещение компонентов на Форме
Вместо компонента Edit используем компонент SpinEdit, который обеспечивает отображение и редактирование целого числа с возможностью его изменения посредством двойной кнопки.
Рис. 3.1
Компонент SpinEdit находится на странице Samples Палитры Компонентов. В тех случаях, когда объем выводимой информации превышает размер поля компонента Memo, целесообразно снабдить его линейками прокрутки. В свойстве ScrollBars компонента Memo1 установим значение ssVertical – появится вертикальная линейка прокрутки. Присвоим модулю имя UnCiklAlg.
3.2.2. Текст модуля UnCiklAlg
Unit UnCiklAlg;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Spin;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Edit2: TEdit;
SpinEdit1: TSpinEdit;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
SpinEdit1.text:='3'; // начальное значение N
Edit1.text:='0.1'; // начальное значение Xn
Edit2.text:='2.0'; // начальное значение Xk
Memo1.Clear;
Memo1.Lines.Add('Лабораторная работа №3 - Циклический алгоритм');
end;
procedure TForm1.Button1Click(Sender: TObject);
var xn,xk,x,h,c,s,y,al,del:extended;
n,k:integer;
begin
n:=StrToInt(SpinEdit1.Text);
xn:=StrToFloat(Edit1.Text);
xk:=StrToFloat(Edit2.Text);
if CheckBox1.Checked then
Memo1.Lines.Add(‘Исходные данные: n=’+IntToStr(n)+
' Xn='+FloatToStrF(xn,ffFixed,6,1)+
' Xk='+FloatToStrF(xk,ffFixed,6,1));
h:=(xk-xn)*0.1; // шаг h
x:=xn;
repeat // цикл по x
c:=-x*x*0.5;
S:=1;
for k:=1 to n do
begin
s:=s+c*(2*k*k+1);
c:=-c*x*x/((2*k+1)*(2*k+2));
end;
y:=(1-x*x*0.5)*cos(x)-0.5*x*sin(x);
if CheckBox2.Checked then
if CheckBox3.Checked then
begin
al:=s-y; // абсолютная погрешность
del:=abs((s-y)/y)*100; // относительная погрешность
Memo1.Lines.Add('x='+FloatToStrF(x,ffFixed,6,2)+
' S='+ FloatToStrF(s,ffFixed,6,3)+
' Y='+ FloatToStrF(y,ffFixed,6,3)+
' A='+ FloatToStrF(al,ffFixed,6,3)+
' D='+ FloatToStrF(del,ffFixed,6,0)+'%');
end
else
begin
al:=s-y;
Memo1.Lines.Add('x='+FloatToStrF(x,ffFixed,6,2)+
' S='+ FloatToStrF(s,ffFixed,6,3)+
' Y='+ FloatToStrF(y,ffFixed,6,3)+
' A='+ FloatToStrF(al,ffFixed,6,3));
end
else
if CheckBox3.Checked then
begin
del:=abs((s-y)/y)*100;
Memo1.Lines.Add('x='+FloatToStrF(x,ffFixed,6,2)+
' S='+ FloatToStrF(s,ffFixed,6,3)+
' Y='+ FloatToStrF(y,ffFixed,6,3)+
' D='+ FloatToStrF(del,ffFixed,6,0)+'%');
end
else
Memo1.Lines.Add('x='+FloatToStrF(x,ffFixed,6,2)+
' S='+ FloatToStrF(s,ffFixed,6,3)+
' Y='+ FloatToStrF(y,ffFixed,6,3));
x:=x+h;
until x>xk;
end;
end.
По указанию преподавателя выберите свое индивидуальное задание. Создайте приложение и протестируйте его работу.
В
заданиях с №1
по №15 необходимо
вывести на
экран таблицу
значений функции
Y(x) и ее разложения
в ряд S(x) для значений
x от
№ |
|
|
S(x) | n | Y(x) |
1 |
0.1 |
1 |
|
16 |
|
2 |
0.1 |
1 |
|
10 |
|
3 |
0.1 |
1 |
|
12 |
|
4 |
0.1 |
1 |
|
8 |
|
5 |
0.1 |
1 |
|
14 |
|
6 |
0.1 |
1 |
|
8 |
|
7 |
0.1 |
1 |
|
12 |
|
8 |
0.1 |
1 |
|
10 |
|
9 |
0.1 |
1 |
|
14 |
|
10 |
0.1 |
0.5 |
|
15 |
|
11 |
0.1 |
0.8 |
|
10 |
|
12 |
0.1 |
1 |
|
8 |
Лабораторная работа №4
Цель лабораторной работы: освоить применение компонента StringGrid и создать приложение, в котором используются массивы.
Задание: создать Windows-приложение для вычисления вектора x={x1,x2,…,xm},равного p-й строке матрицы A={aij}(xj=apj, j=1,2,…,m) и вектора y={y1,y2,…,yn}, равного q-му столбцу матрицы A={aij}(yi=aiq, i=1,2,…,n) (n6,m8). В панели интерфейса предусмотреть возможность управления размерностью массивов.
Один из возможных вариантов панели интерфейса создаваемого приложения показан на рис.4.1.
При работе с массивами ввод и вывод информации на экран удобно организовывать с помощью компонента StringGrid.
Рис. 4.1
Компонент StringGrid используется для отображения информации в виде таблицы. Таблица содержит две зоны – фиксированную и рабочую. Фиксированная зона служит для вывода наименований строк и столбцов рабочей зоны и управления их размерами с помощью “мыши”. Фиксированная зона выделена другим цветом и в нее запрещен ввод информации с клавиатуры. Количество строк и столбцов фиксированной зоны устанавливается в свойствах FixedRows и FixedCols, соответственно.
Рабочая зона содержит RowCount строк и ColCount столбцов информации, которую можно изменять как программно, так и с помощью “мыши” или клавиатуры.
Доступ к информации в программе осуществляется с помощью свойства Cells[ACol, ARow: integer]: string, где ACol-номер столбца, а ARow – номер строки таблицы, причем нумерация начинается с нуля.
Пиктограмма
По умолчанию в компонент StringGrid запрещен ввод информации с клавиатуры, поэтому для компонента StringGrid1 необходимо в Инспекторе Объектов дважды щелкнуть “мышью” на символе + свойства +Options и в открывшемся списке опций установить значение goEditing в True.
Для удобства работы с компонентами SpinEdit установите для компонента SpinEdit1 значения свойств: MinValue=1, MaxValue=6, а для компонента SpinEdit2: MinValue=1, MaxValue=8.
События SpinEdit1Change и SpinEdit2Change возникают при любом изменении значения в поле редактора SpinEdit1 и SpinEdit2 соответственно. Создадим процедуры обработки этих событий, в которых присвоим значения n и m, полученные из полей редакторов SpinEdit, свойствам ColCount и RowCount компонентов StringGrid. Это позволит управлять размерами таблиц StringGrid с помощью компонентов SpinEdit без дополнительных кнопок, так как изменение значений в поле редактора SpinEdit сразу приведет к изменению размера таблиц StringGrid. Дважды щелкните “мышью” на компоненте SpinEdit1 – курсор установится в тексте процедуры-обработчика события SpinEdit1Change: procedure TForm1.SpinEdit1Change(Sender: TObject). Внимательно наберите операторы этой процедуры, используя текст модуля UnMas(см. п.4.1.3). Аналогичным образом создайте процедуру-обработчик события SpinEdit2Change: procedure TForm1.SpinEdit2Change(Sender: TObject).
4.1.3. Текст модуля UnMas
Unit UnMas;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Spin, Grids;
type
TForm1 = class(TForm)
Label1: TLabel;
SpinEdit1: TSpinEdit;
SpinEdit2: TSpinEdit;
Label8: TLabel;
StringGrid1: TStringGrid;
StringGrid2: TStringGrid;
StringGrid3: TStringGrid;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
SpinEdit3: TSpinEdit;
SpinEdit4: TSpinEdit;
Label6: TLabel;
Label7: TLabel;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
procedure SpinEdit2Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
var
A:array[1..6,1..8] of extended;// объявление двумерного массива A
X:array[1..8] of extended; // объявление одномерного массива X
Y:array[1..6] of extended; // объявление одномерного массива Y
n,m,p,q:integer; // объявление глобальных переменных
procedure TForm1.FormCreate(Sender: TObject);
begin
SpinEdit1.Text:='4'; // начальное значение n
SpinEdit2.Text:='6'; // начальное значение m
SpinEdit3.Text:='2'; // начальное значение p
SpinEdit4.Text:='3'; // начальное значение q
StringGrid1.RowCount:=4; // количество строк массива A
StringGrid1.ColCount:=6; // количество столбцов массива A
StringGrid2.RowCount:=6; // количество строк массива X
StringGrid3.RowCount:=4; // количество строк массива Y
end;
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
n:=StrToInt(SpinEdit1.Text);// n присваивается содержимое поля редактора
StringGrid1.RowCount:=n; // устанавливается количество строк массива A
StringGrid3.RowCount:=n; // устанавливается количество строк массива Y
end;
procedure TForm1.SpinEdit2Change(Sender: TObject);
begin
m:=StrToInt(SpinEdit2.Text);// m присваивается содержимое поля редактора
StringGrid1.ColCount:=m; // устанавливается количество столбцов массива A
StringGrid2.RowCount:=m; // устанавливается количество строк массива X
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer; // объявление локальных переменных
begin
n:=StrToInt(SpinEdit1.Text);
StringGrid1.RowCount:=n;
StringGrid3.RowCount:=n;
m:=StrToInt(SpinEdit2.Text);
StringGrid1.ColCount:=m;
StringGrid2.RowCount:=m;
p:=StrToInt(SpinEdit3.Text);
q:=StrToInt(SpinEdit4.Text);
// Ввод значений из таблицы в массив A
for i:=1 to n do
for j:=1 to m do
A[i,j]:=StrToFloat(StringGrid1.Cells[j-1,i-1]);
for j:=1 to m do // формирование массива X и вывод его значений в таблицу
begin
X[j]:=A[p,j];
StringGrid2.Cells[0,j-1]:=FloatToStrF(X[j],ffFixed,3,1);
end;
for i:=1 to n do // формирование массива Y и вывод его значений в таблицу
begin
Y[i]:=A[i,q];
StringGrid3.Cells[0,i-1]:=FloatToStrF(Y[i],ffFixed,3,1);
end;
end;
end.
4.1.4. Работа с приложением
Запустите созданное приложение. Занесите числовые значения в элементы матрицы A и убедитесь в том, что приложение функционирует в соответствии с заданием.
4.2. Выполнение индивидуального задания
Изучите в приложении 2 описание компонентов StringGrid и DrawGrid.
По указанию преподавателя выберите свое индивидуальное задание. Создайте приложение и протестируйте его работу.
Индивидуальные задания
1. Задана целочисленная матрица A размером NxM. Получить массив B, присвоив его k-му элементу значение 0, если все элементы k-го столбца матрицы нулевые, и значение 1 в противном случае(k=1,2,…,M).
2. Задана целочисленная матрица A размером NxM. Получить массив B, присвоив его k-му элементу значение 1, если элементы k–й строки матрицы упорядочены по убыванию, и значение 0 в противном случае(k=1,2,…,N).
3. Задана целочисленная матрица A размером NxM. Получить массив B, присвоив его k-му элементу значение 1, если k-я строка матрицы симметрична, и значение 0 в противном случае(k=1,2,…,N)..
4. Задана целочисленная матрица размером NxM. Определить k–количество “особых” элементов матрицы, считая элемент “особым”, если он больше суммы остальных элементов своего столбца.
5. Задана целочисленная матрица размером NxM. Определить k–количество “особых” элементов матрицы, считая элемент “особым”, если в его строке слева от него находятся элементы, меньшие его, а справа – большие.
6. Задана символьная матрица размером NxM. Определить k-количество различных элементов матрицы (т.е. повторяющиеся элементы считать один раз).
7. Дана вещественная матрица размером NxM. Упорядочить ее строки по неубыванию их первых элементов.
8. Дана вещественная матрица размером NxM. Упорядочить ее строки по неубыванию суммы их элементов.
9. Дана вещественная матрица размером NxM. Упорядочить ее строки по неубыванию их наибольших элементов.
10. Определить является ли заданная квадратная матрица n-го порядка симметричной относительно побочной диагонали.
11. Для заданной целой матрицы размером NxM вывести на экран все ее седловые точки. Элемент матрицы называется седловой точкой, если он является наименьшим в своей строке и одновременно наибольшим в своем столбце или, наоборот, является наибольшим в своей строке и наименьшим в своем столбце.
12. В матрице n-го порядка переставить строки так, чтобы на главной диагонали матрицы были расположены элементы, наибольшие по абсолютной величине.
Лабораторная работа №5
Цель лабораторной работы: освоить применение компонентов ListBox и СomboBox и создать приложение, в котором используются строки.
Задание: создать Windows-приложение для подсчета количества слов в произвольной строке. Слова в строке разделяются любым количеством пробелов. Ввод строки заканчивать нажатием клавиши Enter. Работа приложения должна завершаться нажатием кнопки Close.
Один из возможных вариантов панели интерфейса создаваемого приложения показан на рис.5.1.
При работе со строками ввод и вывод информации на экран удобно организовывать с помощью компонентов ListBox и ComboBox.
Рис. 5.1
Компонент ListBox представляет собой список, элементы которого выбираются при помощи клавиатуры или “мыши”. Список элементов задается свойством Items, методы Add, Delete и Insert которого используются для добавления, удаления и вставки строк, соответственно. Для определения номера выделенного элемента используется свойство ItemIndex.
Компонент ComboBox представляет собой комбинацию списка ListBox и редактора Еdit, поэтому практически все свойства заимствованы у этих компонентов. Для работы с окном редактирования используется свойство Text как в Edit, а для работы со списком выбора используется свойство Items как в ListBox. Cуществует 5 модификаций компонента, определяемых его свойством Style. В модификации csSimple список всегда раскрыт, в остальных он раскрывается после нажатия кнопки справа от редактора.
Компоненты ListBox и ComboBox находятся на странице Standard Палитры Компонентов.
Компонент BitBtn расположен на странице Additional Палитры Компонентов и представляет собой разновидность стандартной кнопки Button. Его отличительная особенность – наличие растрового изображения на поверхности кнопки, которое определяется свойством Glyph. Кроме того, имеется свойство Kind, которое задает одну из 11 стандартных разновидностей кнопок. Нажатие любой из них, кроме bkCustom и bkHelp закрывает модальное окно. Кнопка bkClose закрывает главное окно и завершает работу программы.
В момент запуска приложения, когда панель интерфейса появляется на экране, для пользователя удобно чтобы курсор уже находился в поле редактора компонента ComboBox. При активизации Формы возникает событие OnActivate, которое можно использовать для передачи фокуса ввода компоненту ComboBox. Для создания процедуры-обработчика этого события необходимо в Инспекторе Объектов выбрать компонент Form1, на странице Events найти событие OnActivate и дважды щелкнуть “мышью” по его правой (белой) части. Курсор установится в тексте процедуры-обработчика события активизации Формы: procedure TForm1.FormActivate(Sender: TObject). В этом месте процедуры наберите оператор передачи фокуса ввода компоненту ComboBox1 (см. текст модуля UnStr, который приведен в п. 5.1.3).
В соответствии с заданием необходимо, чтобы при нажатии клавиши Enter строка символов, которую пользователь набрал в поле редактирования, переносилась в список выбора компонента ComboBox. Для создания процедуры-обработчика этого события необходимо в Инспекторе Объектов выбрать компонент ComboBox1, на странице Events найти событие OnKeyPress и дважды щелкнуть “мышью” по его правой части. Курсор установится в тексте процедуры-обработчика события нажатия клавиши на клавиатуре: procedure TForm1.ComboBox1KeyPress(Sender:TObject;var Key:Char). В этом месте процедуры, пользуясь текстом модуля UnStr, наберите операторы, которые при нажатии клавиши Enter переносят строку из поля редактирования в список выбора и очищают поле редактирования.
Процесс создания процедуры-обработчика события нажатия клавиши “мыши” в списке выбора procedure TForm1.ComboBox1Click(Sender: TObject) выполняется аналогично для события OnClick компонента
ComboBox1. Пользуясь текстом модуля UnStr, наберите операторы, которые осуществляют основной алгоритм обработки символов выбранной строки.
5.1.3. Текст модуля UnStr
Unit UnStr;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons;
type
TForm1 = class(TForm)
Label2: TLabel;
Label3: TLabel;
BitBtn1: TBitBtn;
ComboBox1: TComboBox;
Label1: TLabel;
procedure ComboBox1KeyPress(Sender: TObject; var Key: Char);
procedure ComboBox1Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Implementation
{$R *.DFM}
// Обработка события активизации Формы
procedure TForm1.FormActivate(Sender: TObject);
begin
ComboBox1.SetFocus; // передача фокуса ввода ComboBox1
end;
// Обработка события ввода символа и нажатия клавиши Enter
procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then // если нажата клавиша Enter то
begin // строка из поля редактирования заносится
ComboBox1.Items.Add(ComboBox1.Text); // в список выбора
ComboBox1.Text:=''; // очистка окна редактирования
end;
end;
// Обработка события нажатия клавиши "мыши" в списке выбора
procedure TForm1.ComboBox1Click(Sender: TObject);
var
st : string;
n,i,nst,ind: integer;
begin
n:=0; // n содержит количество слов
ind:=0;
nst:=ComboBox1.ItemIndex; // определение номера выбранной строки
st:=ComboBox1.Items[nst]; // st присваивается выбранная строка
for i:=1 to Length(st) do // просмотр всех символов строки
case ind of
0 : if st[i]<>' ' then // если встретился символ
begin
ind:=1;
n:=n+1; // количество слов увеличивается на единицу
end;
1 : if st[i]=' ' then // если встретился пробел
ind:=0;
end;
Label3.Caption:=IntToStr(n); // вывод количества слов в Label3
end;
end.
Для проверки функционирования приложения подготовить несколько тестов.
1. Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется друг от друга одним или несколькими пробелами. Найти количество групп с пятью символами.
2. Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется друг от друга одним или несколькими пробелами. Найти и вывести на экран самую короткую группу.
3. Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется друг от друга одним или несколькими пробелами. Подсчитать количество символов в самой длинной группе.
4. Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется друг от друга одним или несколькими пробелами. Найти и вывести на экран группы с четным количеством символов.
Лабораторная работа №6
Цель лабораторной работы: создать приложение, в котором используются данные типа запись.
Задание: создать Windows-приложение для обработки ведомости об успеваемости учащихся в количестве 9 человек. Каждая запись должна содержать фамилию, инициалы, а также оценки по физике, математике и сочинению. Вывести список учащихся, отсортированный в порядке уменьшения их среднего балла.
Один из возможных вариантов панели интерфейса создаваемого приложения показан на рис.6.1.
Рис. 6.1
В этом задании для нанесения соответствующих надписей в колонках и строках используется фиксированная зона компонента StringGrid, поэтому в Инспекторе Объектов значения свойств FixedCols и FixedRows установите равными 1. В соответствии с заданием установите значение свойства ColCount=6, а значение свойства RowCount=10. Для возможности просмотра всего списка учащихся в компоненте StringGrid удобно использовать вертикальную линейку прокрутки, поэтому установите свойство ScrollBars в состояние ssVertical. Откройте список опций свойства +Options и установите значение goEditing в True – это даст возможность редактировать информацию в компоненте StringGrid с помощью клавиатуры и “мыши”.
Двойным нажатием клавиши “мыши” на Форме и кнопке Button1 создайте соответствующие процедуры обработки событий. Используя текст модуля UnZap, внимательно наберите операторы этих процедур.
Unit UnZap;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, Grids;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
type
zap=record // объявление записи
fio :string[20];
mat,fiz,soch:integer;
srbal :extended
end;
var
MZap:array[1..9] of zap; // объявление массива записей
procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
begin
with StringGrid1 do
begin // занесение информации в ячейки StringGrid1
Cells[0,0]:='№пп’;
Cells[1,0]:='Фамилия,инициалы';
Cells[2,0]:='Математика';
Cells[3,0]:='Физика';
Cells[4,0]:='Сочинение';
Cells[5,0]:='Ср.балл';
for i:=1 to 9 do
Cells[0,i]:=IntToStr(i);
Cells[1,1]:='Первый П.П.'; Cells[2,1]:='3'; Cells[3,1]:='3'; Cells[4,1]:='3';
Cells[1,2]:='Второй В.В.'; Cells[2,2]:='3'; Cells[3,2]:='3'; Cells[4,2]:='4';
Cells[1,3]:='Третий Т.Т.'; Cells[2,3]:='3'; Cells[3,3]:='4'; Cells[4,3]:='4';
Cells[1,4]:='Четвертый Ч.Ч.'; Cells[2,4]:='4'; Cells[3,4]:='4'; Cells[4,4]:='4';
Cells[1,5]:='Пятый П.П.'; Cells[2,5]:='3'; Cells[3,5]:='4'; Cells[4,5]:='5';
Cells[1,6]:='Шестой Ш.Ш.'; Cells[2,6]:='5'; Cells[3,6]:='4'; Cells[4,6]:='4';
Cells[1,7]:='Седьмой С.С.'; Cells[2,7]:='5'; Cells[3,7]:='5'; Cells[4,7]:='4';
Cells[1,8]:='Восьмой В.В.'; Cells[2,8]:='5'; Cells[3,8]:='5'; Cells[4,8]:='5';
Cells[1,9]:='Девятый Д.Д.'; Cells[2,9]:='3'; Cells[3,9]:='5'; Cells[4,9]:='5';
for i:=1 to 9 do
with MZap[i] do
begin // формирование полей массива записей
fio:=Cells[1,i];
mat:=StrToInt(Cells[2,i]);
fiz:=StrToInt(Cells[3,i]);
soch:=StrToInt(Cells[4,i]);
srbal:=(mat+fiz+soch)/3; // вычисление значения ср. балла
Cells[5,i]:=FloatToStrF(srbal,ffFixed,5,2); // вывод значения ср.балла
end; // в последнюю колонку StringGrid1
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i,j :integer;
vper:zap;
begin
for i:=1 to 9 do
with StringGrid1,MZap[i] do
begin
fio:=Cells[1,i];
mat:=StrToInt(Cells[2,i]);
fiz:=StrToInt(Cells[3,i]);
soch:=StrToInt(Cells[4,i]);
srbal:=(mat+fiz+soch)/3;
Cells[5,i]:=FloatToStrF(srbal,ffFixed,5,2);
end;
for i:=2 to 9 do // сортировка методом "пузырька"
for j:=9 downto i do
if
MZap[j-1].srbal
begin
vper:=MZap[j-1];
MZap[j-1]:=MZap[j];
MZap[j]:=vper;
end;
for i:=1 to 9 do // заполнение ячеек StringGrid1 полями массива записей
with StringGrid1,MZap[i] do
begin
Cells[1,i]:=fio;
Cells[2,i]:=IntToStr(mat);
Cells[3,i]:=IntToStr(fiz);
Cells[4,i]:=IntToStr(soch);
Cells[5,i]:=FloatToStrF(srbal,ffFixed,5,2);
end;
end;
end.
По указанию преподавателя выберите свое индивидуальное задание. Создайте приложение и протестируйте его работу.
1. Поля шахматной доски характеризуются записью
Type
Pole=record
Ver: 1..8; {вертикальные координаты}
Hor: (a,b,c,d,e,f,g,h); {горизонтальные координаты}
end;
Вывести шахматную доску, пометив крестиками все поля, которые «бьет» ферзь, стоящий на поле с координатами Veri и Hori, и ноликами все остальные поля.
2. Поля шахматной доски характеризуются записью (см. задание 1)
Var Figura:Pole;
Вывести сообщение может ли конь за один ход перейти с поля Figurai на поле Figuraj.
3. Type
Karta=record
m: (piki,trefi,bubni,chervi); {масть}
d:(shest,sem,vosem,devjat,desjat,valet,dama,korol,tuz); {достоинство}
end;
Var k1,k2:Karta;
Вывести сообщение «бьет» ли карта k1, карту k2, с учетом того, что масть mi является козырной.
В магазине формируется список лиц, записавшихся на покупку товара повышенного спроса. Каждая запись этого списка содержит: порядковый номер, Ф.И.О., домашний адрес покупателя и дату постановки на учет. Удалить из списка все повторные записи, проверяя Ф.И.О. и домашний адрес.
Лабораторная работа №7
Цель лабораторной работы: освоить применение компонентов OpenDialog и SaveDialog и создать приложение, в котором используются файлы.
Задание: создать Windows-приложение для записи в файл и чтения из файла ведомости об успеваемости учащихся в количестве 10 человек. Каждая запись файла должна содержать фамилию, инициалы, а также оценки по физике, математике и сочинению. Вывести список учащихся, отсортированный в алфавитном порядке и записать эту информацию в текстовой файл.
Один из возможных вариантов панели интерфейса создаваемого приложения показан на рис.7.1.
При работе с файлами чтение и запись информации удобно организовывать с помощью компонентов OpenDialog и SaveDialog.
BitBtn
Рис. 7.1
Для
установки
компонентов
OpenDialog и SaveDialog на
Форму необходимо
на странице
Dialogs Палитры
Компонентов
щелкнуть “мышью”
соответственно
по пиктограмме
Пользователь
имеет возможность
настроить
параметры окна
диалога по
своему усмотрению.
В частности,
изменить
заголовок окна
можно с помощью
свойства Title.
В свойстве
DefaultExt можно
указать расширение
файла, если оно
не задано
пользователем.
Свойство Filter
используется
для поиска
(фильтрации)
файлов, отображаемых
в окне. Установка
фильтра производится
следующим
образом.
Выделив
соответствующий
компонент,
необходимо
дважды щелкнуть
по правой
(белой) части
свойства Filter
Инспектора
Объектов. В
появившемся
окне редактора
фильтра-Filter
Editor необходимо
в колонке Filter
Name набрать текст,
характеризующий
соответствующий
фильтр, а в колонке
Filter–маску.
Для компонента
OpenDialog1 установим
значения масок
как показано
на рис. 7.2.
Рис.7.2
Маска *.dat означает что, будут видны файлы данных с любым именем и с расширением dat, а маска *.* - что будут видны все файлы (с любым именем и с любым расширением).
Для того, чтобы файл автоматически записывался с расширением dat в свойстве DefaultExt запишем требуемое расширение - dat.
Аналогичным образом настроим компонент SaveDialog1 для текстового файла (расширение txt).
Для удобства работы с несколькими различными процедурами обработки событий в свойстве Name каждого компонента BitBtn замените программные имена кнопок: BitBtn1 – на BitBtnNew, BitBtn2 – на BitBtnOpen, BitBtn3 – на BitBtnSort, BitBtn4 – на BitBtnSave. Двойным нажатием клавиши “мыши” на кнопках BitBtn создайте соответствующие процедуры обработки событий. Пользуясь текстом модуля UnFile, внимательно наберите операторы этих процедур.
Unit UnFile;
Interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, Grids, Spin;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
BitBtnNew: TBitBtn;
BitBtnOpen: TBitBtn;
BitBtnSort: TBitBtn;
BitBtnSave: TBitBtn;
SaveDialog1: TSaveDialog;
SpinEdit1: TSpinEdit;
Label1: TLabel;
OpenDialog1: TOpenDialog;
procedure TForm1.FormCreate(Sender: TObject);
procedure BitBtnSortClick(Sender: TObject);
procedure BitBtnNewClick(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
procedure BitBtnOpenClick(Sender: TObject);
procedure BitBtnSaveClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Implementation
{$R *.DFM}
type
zap=record // объявление записи
fio :string[20];
mat,fiz,soch:integer;
end;
var
MZap:array[1..25] of zap; // объявление массива записей
FileZap:file of zap; // объявление файла записей
FileText:TextFile; // объявление текстового файла
FileNameZap,FileNameText:string; // имена файла записей и текстового файла
n:integer; // текущее кол-во элементов массива записей
{ Обработчик события создания Формы }
procedure TForm1.FormCreate(Sender: TObject);
begin
with StringGrid1 do
begin // занесение информации в ячейки StringGrid1
Cells[0,0]:=’№пп’;
Cells[1,0]:=’Фамилия,инициалы’;
Cells[2,0]:=’Математика’;
Cells[3,0]:=’Физика’;
Cells[4,0]:=’Сочинение’;
end;
BitBtnSort.Hide; // спрятать кнопку ”Sort”
BitBtnSave.Hide; // спрятать кнопку “Save”
end;
{ Обработчик нажатия кнопки Sort }
procedure TForm1.BitBtnSortClick(Sender: TObject);
var
i,j :integer;
vper:zap;
begin
for i:=1 to n do
with StringGrid1,MZap[i] do
begin
fio:=Cells[1,i];
mat:=StrToInt(Cells[2,i]);
fiz:=StrToInt(Cells[3,i]);
soch:=StrToInt(Cells[4,i]);
end;
{ сортировка методом "пузырька"}
for i:=2 to n do
for j:=n downto i do
if MZap[j-1].fio>MZap[j].fio then
begin
vper:=MZap[j-1];
MZap[j-1]:=MZap[j];
MZap[j]:=vper;
end;
for i:=1 to n do // заполнение ячеек StringGrid1 полями массива записей
with StringGrid1,MZap[i] do
begin
Cells[0,i]:=IntToStr(i);
Cells[1,i]:=fio;
Cells[2,i]:=IntToStr(mat);
Cells[3,i]:=IntToStr(fiz);
Cells[4,i]:=IntToStr(soch);
end;
end;
{ Создание нового файла записей}
procedure TForm1.BitBtnNewClick(Sender: TObject);
var
i:integer;
begin // вывод на экран окна с предупреждающим сообщением
if MessageDlg('Содержимое существующего файла будет уничтожено. Вы уверены?',
mtConfirmation, mbYesNoCancel, 0)=mrYes then
begin
for i:=1 to n do
with StringGrid1,MZap[i] do
begin // формирование полей массива записей
fio:=Cells[1,i];
mat:=StrToInt(Cells[2,i]);
fiz:=StrToInt(Cells[3,i]);
soch:=StrToInt(Cells[4,i]);
end;
with OpenDialog1 do
begin
Title:='Создание файла'; // заголовок окна диалога
if Execute then // выполнение стандартного диалога выбора имени файла
begin
FileNameZap:=FileName; // присваивание имени файла
AssignFile(FileZap,FileNameZap); // назначить файлу FileZap имя FileNameZap
ReWrite(FileZap); // открыть файл на запись
for i:=1 to n do
write(FileZap,MZap[i]); // запись в файл массива записей
CloseFile(FileZap); // закрытие файла записей
end;
end;
end;
end;
{Обработчик кнопки изменения размера}
procedure TForm1.SpinEdit1Change(Sender: TObject);
var
i,m:integer;
begin
m:=StrToInt(SpinEdit1.Text); // присвоить новое значение размера
with StringGrid1 do
begin
RowCount:=m+1; // пересчитать количество строк
if m>n then // если строки добавлены то
for i:=n+1 to m do // инициализировать новые ячейки
begin
Cells[0,i]:=IntToStr(i);
Cells[1,i]:='';
Cells[2,i]:='';
Cells[3,i]:='';
Cells[4,i]:='';
end;
end;
n:=m; // запомнить новое значение размера
end;
{ обработчик нажатия кнопки Open }
procedure TForm1.BitBtnOpenClick(Sender: TObject);
var
i:integer;
begin
with OpenDialog1 do
begin
Title:='Открытие файла'; // заголовок окна диалога
if Execute then // выполнение стандартного диалога выбора имени файла
begin
FileNameZap:=FileName; // присваивание имени файла
AssignFile(FileZap,FileNameZap); // назначить файлу FileZap имя FileNameZap
ReSet(FileZap); // открыть файл на чтение
n:=0; // инициализация счетчика кол-ва прочитанных из файла элементов
while not EoF(FileZap) do
begin
n:=n+1; // увеличение счетчика
read(FileZap,MZap[n]); // чтение из файла n-го элемента массива записей
end;
SpinEdit1.Text:=IntToStr(n); // занести кол-во прочитанных записей в SpinEdit
StringGrid1.RowCount:=n+1; // присвоить кол-во строк
for i:=1 to n do
with StringGrid1,MZap[i] do
begin // заполнение ячеек StringGrid1 полями массива записей
Cells[0,i]:=IntToStr(i);
Cells[1,i]:=fio;
Cells[2,i]:=IntToStr(mat);
Cells[3,i]:=IntToStr(fiz);
Cells[4,i]:=IntToStr(soch);
end;
CloseFile(FileZap); // закрытие файла записей
end;
end;
BitBtnSort.Show; // показать кнопку “Sort”
BitBtnSave.Show; // показать кнопку “Save”
end;
{ Сохранение данных в текстовом файле}
procedure TForm1.BitBtnSaveClick(Sender: TObject);
var
i:integer;
begin
with SaveDialog1 do
if Execute then // выполнение стандартного диалога выбора имени файла
begin
FileNameText:=FileName; // присваивание имени файла
AssignFile(FileText,FileNameText); // назначить файлу FileText имя FileNameText
ReWrite(FileText); // открыть текстовый файл на запись
for i:=1 to n do
with MZap[i] do // запись в текстовый файл
writeln(FileText,i:3,fio:20,mat:5,fiz:5,soch:5);
CloseFile(FileText); // закрытие текстового файла по окончании записи
end;
BitBtnSort.Hide; // спрятать кнопку ”Sort”
end;
end.
Запустите созданное приложение. Занесите в соответствующие поля панели интерфейса информацию об успеваемости учащихся. Кнопкой “New” сохраните данные в файле. Завершите выполнение приложения.
Вновь запустите приложение и кнопкой “Open” откройте только что созданный файл. Убедитесь, что информация не содержит ошибок. При необходимости обнаруженные ошибки можно исправить, а также дополнить ведомость новой информацией. Для сортировки ведомости в алфавитном порядке воспользуйтесь кнопкой “Sort” и сохраните отсортированную информацию кнопкой “New”.
Еще раз завершите и вновь запустите приложение.
Кнопкой “Open откройте файл и убедитесь, что в нем теперь содержится ведомость, отсортированная в алфавитном порядке. Кнопкой “Save” сохраните информацию в текстовом файле. Для просмотра содержимого текстового файла воспользуйтесь, например, приложением “Microsoft Word”.
Используя все управляющие компоненты панели интерфейса, убедитесь в правильном функционировании приложения во всех предусмотренных режимах работы.
Во всех заданиях предусмотреть сохранение вводимых данных в файле и возможность чтения из ранее созданного файла. Результаты выводить в панель интерфейса и в текстовый файл.
1. Ведомость абитуриентов, сдавших вступительные экзамены в университет содержит: Ф.И.О. абитуриента, оценки. Определить средний балл по университету и вывести список абитуриентов, средний балл которых выше среднего балла по университету. Первыми в списке должны идти студенты, сдавшие все экзамены на 5.
2. В радиоателье хранятся квитанции о сданной в ремонт радиоаппаратуре. Каждая квитанция содержит следующую информацию: наименование группы изделий (телевизор, радиоприемник и т. п.), марка изделия, дата приемки в ремонт, состояние готовности заказа (выполнен, не выполнен). Вывести информацию о состоянии заказов на текущие сутки по группам изделий.
3. У администратора железнодорожных касс хранится информация о свободных местах в поездах дальнего следования на ближайшую неделю в следующем виде: дата выезда, пункт назначения, время отправления, число свободных мест. Оргкомитет международной конференции обращается к администратору с просьбой зарезервировать m мест до города N на k-й день недели с временем отправления поезда не позднее t часов вечера. Вывести время отправления или сообщение о невозможности выполнить заказ в полном объеме.
4. Разработать программу формирования ведомости об успеваемости студентов. Каждая запись этой ведомости должна содержать: номер группы, Ф.И.О. студента, оценки за последнюю сессию. Вывести списки студентов по группам. В каждой группе Ф.И.О. студентов должны быть расположены в порядке убывания среднего балла.
Лабораторная работа №8
Цель лабораторной работы: освоить методику создания модулей, содержащих процедуры и функции, и использования их в проекте.
Задание:
создать Windows-приложение
которое выводит
таблицу значений
функции
Один из возможных вариантов панели интерфейса создаваемого приложения показан на рис.8.1.
8.1.1. Размещение компонентов на Форме
Label Edit Button
Р
Memo
Сохраним модуль под именем UnModul (текст модуля приведен в п.8.1.4).
8.1.2. Создание модуля и подключение его к проекту
В соответствии
с заданием
создадим модуль,
в котором вычисление
значений
В этом модуле операторы вычисления Y(x) в виде подпрограммы-функциии F и операторы вычисления S(x) в виде подпрограммы-процедуры Sum оформим по правилам создания модулей (текст модуля UnFuncProc приведен в п.8.1.3).
Для подключения модуля UnFuncProc к проекту необходимо сделать активным окно с текстом модуля UnModul, затем в меню File выбрать опцию Use Unit…и в открывшемся окне Use Unit указать имя используемого модуля – UnFuncProc. Убедитесь в том, что в разделе Implementation модуля UnModul появился оператор Uses UnFuncProc; , который Delphi вставила в текст модуля UnModul.
Откройте главный файл проекта и убедитесь в том, что проект не содержит посторонних модулей и файлов.
8.1.3. Текст модуля UnFuncProc
unit UnFuncProc;
interface
var
n:integer; // количество слагаемых в сумме S
Function F(x:extended):extended;
Procedure Sum(x:extended;Var s:extended);
Implementation
Function F(x:extended):extended;
begin
result:=(1-x*x*0.5)*cos(x)-0.5*x*sin(x);
end;
Procedure Sum(x:extended;Var s:extended);
var
c:extended;
k:integer;
begin
c:=-x*x*0.5;
S:=1;
for k:=1 to n do
begin
s:=s+c*(2*k*k+1);
c:=-c*x*x/((2*k+1)*(2*k+2));
end;
end;
end.
8.1.4. Текст модуля UnModul
Unit UnModul;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Spin, Buttons;
type
TForm1 = class(TForm)
Memo1: TMemo;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Edit2: TEdit;
SpinEdit1: TSpinEdit;
BitBtn1: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Type
func=function(x:extended):extended; // функциональный тип
proc=procedure(x:extended;Var s:extended); // процедурный тип
var
Form1: TForm1;
implementation
uses UnFuncProc; // Delphi подключает модуль UnFuncProc
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
SpinEdit1.text:='4'; // начальное значение N
Edit1.text:=’0.1’; // начальное значение Xn
Edit2.text:=’2.0’; // начальное значение Xk
Memo1.Clear;
Memo1.Lines.Add('Лабораторная работа №8 - Создание модулей');
end;
{В процедуре Tablica вычисляется и выводится таблица значений x, S(x) и Y(x)}
procedure Tablica(Sum:proc;F:func;n:integer;xn,xk,h:extended);
var
x,y,s:extended;
begin
Form1.Memo1.Lines.Add(#9+'x'+#9+'S'+#9+'Y');// заголовок таблицы
x:=xn;
repeat // цикл по x
Sum(x,s); // вызов процедуры Sum для вычисления S(x)
y:=F(x); // обращение к функции F для вычисления Y(x)
Form1.Memo1.Lines.Add(#9+FloatToStrF(x,ffFixed,5,2) // вывод x
+#9+FloatToStrF(s,ffFixed,6,3) // вывод S
+#9+FloatToStrF(y,ffFixed,6,3)); // вывод Y
x:=x+h;
until x>xk;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
xn,xk,h:extended;
begin
n:=StrToInt(SpinEdit1.Text);
xn:=StrToFloat(Edit1.Text);
xk:=StrToFloat(Edit2.Text);
h:=(xk-xn)*0.1; // шаг h
Tablica(Sum,F,n,xn,xk,h); // вызов процедуры Tablica для вычисления таблицы
end;
end.
По
указанию
преподавателя
выберите из
таблицы два
варианта
индивидуальных
заданий. Создайте
модуль, в котором
вычисление
значений
В
заданиях необходимо
вывести на
экран таблицу
значений функции
Y(x) и ее разложения
в ряд S(x) для значений
x от
Близость значений S(x) и Y(x) во всем диапазоне значений x указывает на правильность вычисления S(x) и Y(x).
№ |
|
|
S(x) |
n |
Y(x) |
1 |
0.1 |
1 |
|
8 |
|
2 |
|
|
|
18 |
|
3 |
|
|
|
6 |
|
4 |
0.1 |
0.8 |
|
12 |
|
5 |
0.1 |
0.8 |
|
16 |
|
6 |
0.1 |
1 |
|
14 |
|
Лабораторная работа №9
Цель лабораторной работы: освоить методику создания приложений, в которых используются динамические структуры данных.
Задание: создать приложение для вычисления наименьшего и наибольшего из всех значений элементов целочисленной матрицы A={aij}, где i=1,2,…, m; j=1,2,…, n. Значения m и n задаются пользователем на панели интерфейса, а элементы матрицы A генерируются с помощью датчика случайных чисел и размещаются в памяти динамически.
Один из возможных вариантов панели интерфейса создаваемого приложения показан на рис.9.1.
9.1.1. Размещение компонентов на Форме
Разместим на Форме компоненты Label, SpinEdit, Button и StringGrid.
Label
SpinEdit Label StringGrid
Button
Рис. 9.1
Сохраним модуль под именем UnDinMas (текст модуля приведен в п.9.1.3).
Двойным нажатием клавиши “мыши” на Форме и кнопке Button1 создайте соответствующие процедуры обработки событий. Пользуясь текстом модуля UnDinMas, внимательно наберите операторы этих процедур.
При желании можно создать процедуру, которая будет выделять заданным цветом границы ячеек с наименьшим и наибольшим значениями в компоненте StringGrid. Для создания такой процедуры сделайте активным компонент StringGrid и на странице Events(события) Инспектора Объектов дважды щелкните “мышью” в правой части события OnDrawCell. В ответ Delphi создаст обработчик этого события – процедуру procedure TForm1.StringGrid1DrawCell и установит курсор между операторами begin и end этой процедуры. Используя текст модуля UnDinMas, внимательно наберите операторы процедуры TForm1.StringGrid1DrawCell.
Unit UnDinMas;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Spin, Grids, Buttons;
type
TForm1 = class(TForm)
Label1: TLabel;
SpinEdit1: TSpinEdit;
SpinEdit2: TSpinEdit;
Label8: TLabel;
StringGrid1: TStringGrid;
Label2: TLabel;
Label5: TLabel;
Label3: TLabel;
Button1: TButton;
Label4: TLabel;
Label6: TLabel;
Label7: TLabel;
Label9: TLabel;
procedure FormCreate(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
procedure SpinEdit2Change(Sender: TObject);
procedure StringGrid1DrawCell(Sender: TObject; Col, Row: Integer;
Rect: TRect; State: TGridDrawState);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
Type
Mas=array[1..1] of integer; // массив целочисленных значений
pMas=array[1..1] of ^mas; // массив указателей
var // объявление глобальных переменных
pA:^pMas; // указатель на массив указателей
m,n,max,min:integer;
procedure TForm1.FormCreate(Sender: TObject);
begin
m:=6; // начальное значение m
n:=8; // начальное значение n
SpinEdit1.Text:='6';
SpinEdit2.Text:='8';
StringGrid1.RowCount:=m; // количество строк
StringGrid1.ColCount:=n; // количество столбцов
end;
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
m:=StrToInt(SpinEdit1.Text);// m присваивается содержимое поля редактора
StringGrid1.RowCount:=m;
end;
procedure TForm1.SpinEdit2Change(Sender: TObject);
begin
n:=StrToInt(SpinEdit2.Text);// n присваивается содержимое поля редактора
StringGrid1.ColCount:=n;
end;
procedure TForm1.Button1Click(Sender: TObject);
label 1;
var
i,j,k,l,r:integer;
begin
Randomize; // инициализация датчика случайных чисел
GetMem(pA,4*m); // выделение памяти для массива из m указателей
for i :=1 to m do
begin // формирование i-й строки массива
{ Выделение памяти для n элементов i-й строки}
GetMem(pA^[i],SizeOf(integer)*n);
pA^[1]^[1]:=Random(1000);// случайное целое число занести в массив
for j:=1 to n do
begin // формирование j-го элемента строки
1: r:=Random(1000); // генерирование случайного числа
for k:=1 to i do
for l:=1 to j do
if r=pA^[k]^[l] then // если такое число уже есть в массиве тогда...
goto 1;
pA^[i]^[j]:=r; // случайное число занести в массив
end;
end;
for i:=1 to m do // элементы массива занести в ячейки
for j:=1 to n do // компонента StringGrid1
StringGrid1.Cells[j-1,i-1]:=IntToStr(pA^[i]^[j]);
{ Поиск min и max значений среди элементов массива}
max:=pA^[1]^[1];
min:=max;
for i:=1 to m do
for j:=1 to n do
if
pA^[i]^[j]
min:=pA^[i]^[j]
else
if pA^[i]^[j]>max then
max:=pA^[i]^[j];
Label7.Caption:=IntToStr(min); // вывод min значения
Label9.Caption:=IntToStr(max); // вывод max значения
for i:=1 to m do
{ Освобожение памяти, занимаемой n элементами i-й строки}
FreeMem(pA^[i],SizeOf(integer)*n);
{ Освобождение памяти, занимаемой массивом из m указателей}
FreeMem(pA,4*m);
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Integer;
Rect: TRect; State: TGridDrawState);
begin
with StringGrid1.Canvas do
if StringGrid1.Cells[Col,Row]=IntToStr(min) then // если элемент ячейки
begin // равен min тогда...
Brush.Color:=clGreen; // установить цвет кисти зеленый
FrameRect(Rect); // выделить границы ячейки заданным цветом
end
else
if StringGrid1.Cells[Col,Row]=IntToStr(max) then // если элемент ячейки
begin // равен max тогда...
Brush.Color:=clRed; // установить цвет кисти красный
FrameRect(Rect); // выделить границы ячейки заданным цветом
end
end;
end.
Задание2: создать приложение для формирования стека, который заполняется путем ввода целых положительных чисел с клавиатуры. Как только будет введено первое отрицательное число, содержимое стека выводится на панель интерфейса, а память занимаемая его элементами освобождается.
Один из возможных вариантов панели интерфейса создаваемого приложения показан на рис.9.2.
9.2.1. Размещение компонентов на Форме
Разместим на Форме компоненты Label, Edit, Button и Memo.
Label Memo
Edit
Button
Рис. 9.2
Сохраним модуль под именем UnStek (текст модуля приведен в п.9.2.3).
Двойным нажатием клавиши “мыши” на Форме и кнопке Button1 создайте соответствующие процедуры обработки событий. Используя текст модуля UnStek, внимательно наберите операторы этих процедур.
Unit UnStek;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
Label2: TLabel;
Label3: TLabel;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
Type
PSt=^Zap;
Zap=record
inf:integer;
adr:PSt
end;
Var // объявление глобальных переменных:
PVer, // указатель вершины стека
PTek:PSt; // текущий указатель
ElSt:integer; // элемент стека
procedure TForm1.Button1Click(Sender: TObject);
begin
New(PTek); // выделить память
ElSt:=StrToInt(Edit1.Text);// в ElSt занести значение из Edit1
PTek^.inf:=ElSt; // в информационную часть стека занести ElSt
PTek^.adr:=PVer; // в адресную часть занести указатель на вершину
PVer:=PTek;// указатель вершины должен указывать на последний элемент
if ElSt>=0 then // если элемент стека неотрицательный тогда...
begin
Edit1.Text:='';// очистить окно редактора Edit1
Edit1.SetFocus;// передать фокус ввода редактору Edit1
end
else
begin
Memo1.Lines.Add('Элементы стека:'); // вывести заголовок
repeat
Memo1.Lines.Add(#9+IntToStr(PTek^.inf));// вывод элементов
PVer:=PTek^.adr;
Dispose(PTek); // освободить память
PTek:=PVer
until PTek=nil;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
PVer:=nil; // инициализировать указатель вершины
ElSt:=0; // инициализировать элемент стека
end;
end.
По указанию преподавателя выберите два варианта индивидуальных заданий. В заданиях №1-№15 необходимо использовать динамические массивы, а в заданиях №16-№30 – динамические списки. Во всех заданиях необходимо предусмотреть контрольный вывод исходных данных.
Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры, меняет местами элементы с наибольшим и наименьшим значениями среди четных и выводит полученный массив.
Создать приложение, которое осуществляет ввод m строк и n столбцов двумерного массива с клавиатуры и выводит номер строки и номер столбца наименьшего из всех значений его элементов.
Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры и выводит порядковый номер элемента с наименьшим значением среди нечетных.
Создать приложение, которое осуществляет ввод значений элементов двумерного массива n-го порядка с клавиатуры и выводит значение наибольшего из элементов главной диагонали.
Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры, изменяет порядок следования элементов на противоположный и выводит полученный массив.
Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры и выводит порядковый номер элемента с наибольшим значением среди четных.
Создать приложение, которое осуществляет ввод значений элементов двумерного массива n-го порядка с клавиатуры и выводит значение суммы элементов главной диагонали.
Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры, меняет местами элементы с минимальным и максимальным значениями и выводит полученный массив.
Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры и выводит порядковый номер элемента с наименьшим значением среди положительных.
Создать приложение, которое осуществляет ввод значений элементов двумерного массива n-го порядка с клавиатуры, изменяет порядок следования элементов главной диагонали на противоположный и выводит преобразованный массив.
Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры, меняет местами элементы с минимальным и максимальным значениями среди положительных и выводит полученный массив.
Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры и выводит порядковый номер элемента с наибольшим значением среди отрицательных.
Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры, меняет местами элементы с наибольшим значением среди отрицательных и наименьшим среди положительных и выводит полученный массив.
Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры и выводит среднее арифметическое значение элементов массива.
Создать приложение, которое осуществляет ввод k значений элементов одномерного массива с клавиатуры, меняет местами элементы с наименьшим значением среди четных и наибольшим среди нечетных и выводит полученный массив.
Создать приложение, которое заносит в стек целые положительные числа с клавиатуры, выводит содержимое стека и среднее арифметическое значение его элементов.
Создать приложение, которое заносит в стек символы с клавиатуры, выводит содержимое стека и сообщение о том, содержится или нет в стеке заданный символ.
Создать приложение, которое заносит в каждый элемент стека английское слово с клавиатуры и, как только будет введено слово “end”, выводит содержимое стека.
Создать приложение, которое заносит в стек произвольные целые числа с клавиатуры, выводит содержимое стека и сообщение о том, содержится или нет в стеке заданное число.
Создать приложение, которое заносит в стек символы с клавиатуры, выводит содержимое стека и сообщение о том, упорядочены ли элементы стека по алфавиту или нет.
Создать приложение, которое заносит в стек положительные целые числа с клавиатуры и, как только будет введено число, равное сумме введенных чисел, выводит содержимое стека.
! |
Как писать рефераты Практические рекомендации по написанию студенческих рефератов. |
! | План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом. |
! | Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач. |
! | Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты. |
! | Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ. |
→ | Виды рефератов Какими бывают рефераты по своему назначению и структуре. |