Технология разработки программного обеспечения
Основные понятия и определения, классификация программ, этапы создания программного продукта в рамках жизненного цикла. Особенности отладки, тестирования, сопровождения программ. Структурное программирование с использованием процедур и функций.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | учебное пособие |
Язык | русский |
Дата добавления | 15.01.2020 |
Размер файла | 2,0 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Широкая строка типа WideString введена для обеспечения совместимости с компонентами, основанными на OLE-технологии. От типа String отличается только тем, что для представления каждого символа используется не один, а два байта.
Нуль-терминальная строка типа PChar представляет собой цепочку символов, ограниченную символом #0. Максимальная длина строки ограничена только доступной программе памятью. Нуль-терминальные строки широко используются при обращениях к API-функциям Windows (API - Application Program Interface - интерфейс прикладных программ).
Представление строки в виде массива символов
Строка может быть описана как массив символов. Если массив имеет нулевую границу, он совместим с типом PChar.
Var
MasS: array[1…100] of Char;
В отличие от нуль-терминальной строки здесь длина имеет фиксированное значение и не может меняться в процессе выполнения программы.
Компонент TListBox
Компонент TListBox представляет собой список, элементы которого выбираются при помощи клавиатуры или мыши. Список элементов задается свойством Items, методы Add, Delete и Insert которого используются для добавления, удаления и вставки строк. Объект Items (TString) хранит строки, находящиеся в списке. Для определения номера выделенного элемента используется свойство ItemIndex.
Компонент TComboBox
Комбинированный список TComboBox представляет собой комбинацию списка TListBox и редактора TЕdit, поэтому практически все свойства заимствованы у этих компонентов. Для работы с окном редактирования используется свойство Text как в TEdit, а для работы со списком выбора - свойство Items как в TListBox. Существует пять модификаций компонента, определяемых его свойством Style. В модификации csSimple список всегда раскрыт, в остальных он раскрывается после нажатия кнопки справа от редактора.
Компонент TBitBtn
Компонент TBitBtn расположен на странице Additonal палитры компонентов и представляет собой разновидность стандартной кнопки TBotton. Его отличительная особенность - наличие растрового изображения на поверхности кнопки, которое определяется свойством Clyph. Кроме того, имеется свойство Kind, которое задает одну из 11 стандартных разновидностей кнопок. Нажатие любой из них, кроме bkCustom и bkHelp, закрывает модальное окно и возвращает в программу результат mr*** (например, bkOk - mrOk). Кнопка bkClose закрывает главное окно и завершает работу программы.
Обработка событий
Обо всех происходящих в системе событиях, таких как создание формы, нажатие кнопки мыши или клавиатуры и т.д., ядро Windows информирует окна путем посылки соответствующих сообщений. Среда Delphi позволяет принимать и обрабатывать большинство таких сообщений. Каждый компонент содержит обработчики сообщений на странице Events инспектора объектов.
Для создания обработчика события необходимо раскрыть список компонентов в верхней части окна инспектора объектов и выбрать необходимый компонент. Затем на странице Events нажатием левой клавиши мыши выбрать обработчик и дважды щелкнуть по его левой (белой) части. В ответ Delphi активизирует окно текста программы и покажет заготовку процедуры обработки выбранного события.
Каждый компонент имеет свой набор обработчиков событий. Наиболее часто применяемые события представлены в табл. 8.1.
Таблица 8.1
Часто применяемые события в Delphi
Событие |
Описание события |
|
OnActivate |
Форма получает это событие при активации |
|
OnCreate |
Возникает при создании формы (компонент TForm). В обработчике данного события следует задавать действия, которые должны происходить в момент создания формы, например установка начальных значений |
|
OnKeyPress |
Возникает при нажатии кнопки на клавиатуре. Параметр Key имеет тип Char и содержит ASCII-код нажатой клавиши (клавиша Enter клавиатуры имеет код #13, клавиша Esc - #27 и т.д.). Обычно это событие используется в том случае, когда необходима реакция на нажатие одной из клавиш |
|
OnKeyDown |
Возникает при нажатии клавиши на клавиатуре. Обработчик этого события получает информацию о нажатой клавише и состоянии клавиш Shift, Alt и Ctlr, а также о нажатой кнопке мыши. Информация о клавише передается параметром Key, который имеет тип Word |
|
OnKeyUp |
Является парным событием для OnKeyDown и возникает при отпускании ранее нажатой клавиши |
|
OnClick |
Возникает при нажатии кнопки мыши в области компонента |
|
Событие |
Описание события |
|
OnDblClick |
Возникает при двойном нажатии кнопки мыши в области компонента |
Пример написания программы
Задание: написать программу подсчета числа слов в произвольной строке. В качестве разделителя может быть любое число пробелов. Для ввода строк и работы с ними использовать TComboBox. Ввод строки заканчивать нажатием клавиши Enter. Для выхода из программы использовать кнопку Close.
Окно диалога будет иметь вид (рис. 8.1).
Рис. 8.1 Окно диалога программы
Текст программы.
unit tema6;
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 FormActivate(Sender: TObject);
procedure ComboBox1KeyPress(Sender: TObject; var Key: Char);
procedure ComboBox1Click(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;
// Обработка события нажатия левой клавиши мыши
procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then begin // Если нажата клавиша Enter, то...
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; // Содержит число слов
ind:=0;
nst:=ComboBox1.ItemIndex;
// Определение номера выбранной строки
st:=ComboBox1.Items[nst];
// Занесение выбранной строки в переменную st
for i:=1 to Length(st) do begin
// Просмотр всех символов строки st
case ind of
0: if st[i]<>' ' then begin
// Если встретился символ после пробела
ind:=1;
n:=n+1;
// Число слов увеличивается на единицу
end;
1: if st[i]=' ' then ind:=0;
// Если встретился пробел после символов
end;
end;
Label3.Caption:=IntToStr(n);
// Вывод числа слов в Label3
end; end.
Индивидуальные задания
Во всех заданиях (табл.8.2) исходные данные следует вводить с помощью компонента TEdit в компонент TListBox либо с помощью свойства Text в свойство Items компонента TComboBox. Ввод строки заканчивать нажатием клавиши Enter. Для выхода из программы использовать кнопку Close. Для расчетов вводить несколько различных строк.
Таблица 8.2
Индивидуальные задания
Вариант |
Задание |
|
1 |
Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется от другой одним или несколькими пробелами. Найти количество групп с пятью символами |
|
2 |
Дана строка, состоящая из групп нулей и единиц. Найти и вывести на экран самую короткую группу |
|
3 |
Дана строка, состоящая из групп нулей и единиц. Подсчитать количество символов в самой длинной группе |
|
4 |
Дана строка, состоящая из групп нулей и единиц. Найти и вывести на экран группы с четным количеством символов |
|
5 |
Дана строка, состоящая из групп нулей и единиц. Подсчитать количество единиц в группах с нечетным количеством символов |
|
6 |
Дана строка, состоящая из букв, цифр, запятых, точек, знаков “+” и “-“. Выделить подстроку, которая соответствует записи целого числа (т.е. начинается со знака “+” или “-” и внутри подстроки нет букв, запятых и точек) |
|
7 |
Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков “+” и “-”. Выделить подстроку, которая соответствует записи вещественного числа с фиксированной точкой |
|
8 |
Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков “+” и “-”. Выделить подстроку, которая соответствует записи вещественного числа с плавающей точкой |
|
9 |
Дана строка символов, состоящая из произвольных десятичных цифр, разделенных пробелами. Вывести на экран числа этой строки в порядке возрастания их значений |
|
Вариант |
Задание |
|
10 |
Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Заменить буквы латинского алфавита на соответствующие им буквы русского алфавита |
|
11 |
Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Вывести на экран слова этого текста в порядке, соответствующем латинскому алфавиту |
|
12 |
Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Поменять местами первую и последнюю буквы каждого слова |
|
13 |
Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Вывести на экран порядковый номер слова минимальной длины и количество символов в этом слове |
|
14 |
Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. В каждом слове заменить первую букву на прописную |
|
15 |
Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Удалить первые k слов из строки, сдвинув на их место последующие слова строки |
Лабораторная работа 9 Оптимальное построение структур данных
Цель работы: изучить правила работы с компонентами TOpenDialog и TSaveDialog. Написать программу с использованием файлов и данных типа запись с оптимальной структурой данных.
Общие сведения
Запись - это структура данных, объединяющая элементы одного или различных типов, называемые полями. Записи удобны для создания структурированных баз данных с разнотипными элементами, например:
Type {Объявление типа запись}
TStudent = record
Fio: string[20]; {Поле ФИО}
Group: integer; {Поле номера студ. группы}
Ocn: array[1..3] of integer; {Поле массива оценок}
end;
Var
Student: TStudent; {Объявление переменной типа запись}
Доступ к каждому полю осуществляется указанием имени записи и поля, разделенных точкой, например:
Student.Fio:= `Иванов А.И.';
{Внесение данных в поля записи}
Student. Group:=720603;
...
Доступ к полям можно также осуществлять при помощи оператора with:
With Student do
Begin
Fio:= `Иванов А.И.';
Group:=720603;
End;
Работа с файлами
Файл - это именованная область данных на внешнем физическом носителе. В Object Pascal различают три вида файлов в зависимости от способа их организации и доступа к элементам: текстовые, типизированные и нетипизированные.
Текстовой файл - это файл, состоящий из строк. Примером текстового файла может служить файл исходного текста программы в DELPHI (расширение *.pas). Для работы с текстовым файлом должна быть описана соответствующая файловая переменная: Var F: TextFile;.
Типизированные файлы имеют строго заданную их описанием структуру, когда все элементы имеют фиксированный и одинаковый размер. Это свойство типизированных файлов позволяет получить доступ к любому компоненту файла по его порядковому номеру. Элементами такого файла являются, как правило, записи. В описании файловой переменной указывается ее тип: Var F: TStudent;.
Нетипизированный файл - это файл, в котором данные не имеют определенного типа и рассматриваются как последовательность байт. Файловая переменная объявляется: Var F: File;.
Порядок работы с файлами следующий:
...
AssignFile(F, `Filename.txt');
// Связывание файловой переменной F
// с именем дискового файла “Filename.txt”
Rewrite(F);
// Создание нового или открытие (Reset(F);)
// уже существующего файла
...
Read(F, Stud);
// Чтение данных из файла или
// запись (Write(F, Stud)) в файл
...
CloseFile(F); // Закрытие файла
Подпрограммы работы с файлами
AssignFile(var F; FileName: string) - связывает файловую переменную F и файл с именем FileName.
Reset(var F[: File; RecSize: word]) - открывает существующий файл. При открытии нетипизированного файла RecSize задает размер элемента файла.
Rewrite(var F[: File; RecSize: word]) - создает и открывает новый файл.
Append(var F: TextFile) - открывает текстовой файл для дописывания текста в конец файла.
Read(F,v1[,v2,…vn]) - чтение значений переменных начиная с текущей позиции для типизированных файлов и строк для текстовых.
Write(F,v1[,v2,…vn]) - запись значений переменных начиная с текущей позиции для типизированных файлов и строк для текстовых.
CloseFile(F) - закрывает ранее открытый файл.
Rename(var F; NewName: string) - переименовывает неоткрытый файл любого типа.
Erase(var F) - удаляет неоткрытый файл любого типа.
Seek(var F; NumRec: Longint) - для нетекстового файла устанавливает указатель на элемент с номером NumRec.
SetTextBuf(var F: TextFile; var Buf [; Size: word]) - для текстового файла устанавливает новый буфер ввода-вывода объема Size.
Flush(var F: TextFile) - немедленная запись в файл содержимого буфера ввода-вывода.
Truncate(var F) - урезает файл, начиная с текущей позиции.
LoResult: integer - код результата последней операции ввода-вывода.
FilePos(var F): longint - для нетекстовых файлов возвращает номер текущей позиции. Отсчет ведется от нуля.
FileSize(var F): longint - для нетекстовых файлов возвращает количество компонентов в файле.
Eoln(var F: TextFile): boolean - возвращает True, если достигнут конец строки.
Eof(var F) ): boolean - возвращает True, если достигнут конец файла.
SeekEoln(var F: TextFile): boolean - возвращает True, если пройден последний значимый символ в строке или файле, отличный от пробела или знака табуляции.
SeekEof(var F: TextFile): boolean - то же, что и SeekEoln, но для всего файла.
BlockRead(var F: File; var Buf; Count: word[; Result: word]), BlockWrite(var F: File; var Buf; Count: word[; Result: word]) - соответственно процедуры чтения и записи переменной Buf с количеством Count блоков.
Компоненты TOpenDialog и TSaveDialog
Компоненты TOpenDialog и TSaveDialog находятся на странице DIALOGS. Все компоненты этой страницы являются невизуальными, т.е. не видны в момент работы программы. Поэтому их можно разместить в любом удобном месте формы. Оба рассматриваемых компонента имеют идентичные свойства и отличаются только внешним видом. После вызова компонента появляется диалоговое окно, с помощью которого выбирается имя программы и путь к ней. В случае успешного завершения диалога имя выбранного файла и маршрут поиска содержaтся в свойстве FileName. Для фильтрации файлов, отображаемых в окне просмотра, используется свойство Filter, а для задания расширения файла, в случае, если оно не задано пользователем, - свойство DefaultExt. Если необходимо изменить заголовок диалогового окна, используется свойство Title.
Пример написания программы
Задание: написать программу, вводящую в файл или читающую из файла ведомость абитуриентов, сдавших вступительные экзамены. Каждая запись должна содержать фамилию, а также оценки по физике, математике и сочинению. Вывести список абитуриентов, отсортированный в порядке уменьшения их среднего балла, и записать эту информацию в текстовой файл.
Настройка компонентов TOpenDialog и TSaveDialog
Для установки компонентов TOpenDialog и TSaveDialog на форму необходимо на странице Dialogs меню компонентов щелкнуть мышью соответственно по пиктограммам или и поставить их в любое свободное место формы. Установка фильтра производится следующим образом. Выбрав соответствующий компонент, дважды щелкнуть по правой части свойства Filter инспектора объектов. Появится окно Filter Editor, в левой части которого записывается текст, характеризующий соответствующий фильтр, а в правой части - маску. Для OpenDialod1 установим значения маски как показано на рис. 9.1. Формат *.dat означает, что будут видны все файлы с расширением.dat, а формат *.* - что будут видны все файлы (с любым именем и с любым расширением).
Рис. 9.1 Установка масок для OpenDialod
Для того чтобы файл автоматически записывался с расширением.dat, в свойстве DefaultExt запишем требуемое расширение -.dat. Аналогичным образом настроим SaveDialog1 для текстового файла (расширение.txt).
Работа с программой
После запуска программы на выполнение появится диалоговое окно программы. Кнопка «Ввести запись» видна не будет. Необходимо создать новый файл записей, нажав на кнопку «Создать» или открыть ранее созданный, нажав кнопку «Открыть». После этого станет видна кнопка «Ввести запись» и можно будет вводить записи. При нажатии на кнопку «Сортировка» будет проведена сортировка ведомости по убыванию среднего балла и диалоговое окно примет вид как на рис. 9.2. Затем при нажатии на кнопку «Сохранить» будет создан текстовой файл, содержащий отсортированную ведомость. Файл записей закрывается одновременно с программой при нажатии на кнопку «Close».
Рис.9.2 Диалоговое окно программы
Текст программы.
unit tema7;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ExtCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Memo1: TMemo;
Button1: TButton;
Button3: TButton;
Splitter1: TSplitter;
Button5: TButton;
BitBtn1: TBitBtn;
SaveDialog1: TSaveDialog;
Button2: TButton;
OpenDialog1: TOpenDialog;
Button4: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
Type
TStudent = record
FIO: string[40]; // Поле ФИО
otc: array[1..3] of word; // Поле массива оценок
sball: extended; // Поле среднего балла
end;
Var
Fz : file of Tstudent; // Файл типа запись
Ft : TextFile; // Текстовой файл
Stud: array[1..100] of Tstudent; // Массив записей
nzap: integer; // Номер записи
FileNameZ, FileNameT: string; // Имя файла
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text:='';
Edit2.Text:='';
Edit3.Text:='';
Edit4.Text:='';
Memo1.Clear;
Button1.Hide; // Сделать невидимой кнопку «Ввести запись»
nzap:=0;
end;
procedure TForm1.Button1Click(Sender: TObject); // Ввести новую запись
begin
nzap:=nzap+1;
with stud[nzap] do begin
FIO:=Edit1.Text;
otc[1]:=StrToInt(Edit2.Text);
otc[2]:=StrToInt(Edit3.Text);
otc[3]:=StrToInt(Edit4.Text);
sball:=(otc[1]+otc[2]+otc[3])/3;
Memo1.Lines.Add(fio+' '+IntToStr(otc[1])+' '+ IntToStr(otc[2])+' '+IntToStr(otc[3]));
end;
Write(fz,Stud[nzap]); // Запись в файл
Edit1.Text:='';
Edit2.Text:='';
Edit3.Text:='';
Edit4.Text:='';
end;
procedure TForm1.Button2Click(Sender: TObject);
// Создание нового файла записей
begin
OpenDialog1.Title:='Создать новый файл';
// Изменение заголовка окна диалога
if OpenDialog1.Execute then
// Выполнение стандартного диалога выбора имени файла
begin
FileNameZ:= OpenDialog1.FileName;
// Возвращение имени дискового файла
AssignFile(Fz, FileNameZ);
// Связывание файловой переменной Fz c именем файла
Rewrite(Fz);
// Создание нового файла
end;
Button1.Show;
// Сделать видимой кнопку «Ввести запись»
end;
procedure TForm1.Button3Click(Sender: TObject);
// Открыть существующий файл
begin
if OpenDialog1.Execute then
// Выполнение стандартного диалога выбора имени файла
begin
FileNameZ:= OpenDialog1.FileName;
// Возвращение имени дискового файла
AssignFile(Fz, FileNameZ);
// Связывание файловой переменной Fz c именем файла
Reset(Fz);
// Открытие существующего файла
end;
while not eof(fz) do begin
nzap:=nzap+1;
Read(fz,stud[nzap]); // Чтение записи из файла
with stud[nzap] do
Memo1.Lines.Add(fio+' '+IntToStr(otc[1])+' '+IntToStr(otc[2])+' '+IntToStr(otc[3]));
end;
Button1.Show; // Сделать видимой кнопку «Ввести запись»
end;
procedure TForm1.Button4Click(Sender: TObject);
// Сортировка записей
var i,j: word;
st: TStudent;
begin
for i:=1 to nzap-1 do
// Сортировка массива записей
for j:=i+1 to nzap do
if Stud[i].sball < Stud[j].sball then begin
st:=Stud[i];
Stud[i]:=Stud[j];
Stud[j]:=st;
end;
Memo1.Clear;
for i:=1 to nzap do
// Вывод в окно Memo1 отсортированных записей
with stud[i] do
Memo1.Lines.Add(IntToStr(i)+' '+fio+' '+FloatToStrf(sball,fffixed,4,2));
end;
procedure TForm1.Button5Click(Sender: TObject);
// Сохранение результатов сортировки в текстовом файле
var i:word;
begin
if SaveDialog1.Execute then
// Выполнение стандартного диалога выбора имени файла
begin
FileNameT:= SaveDialog1.FileName;
// Возвращение имени дискового файла
AssignFile(Ft, FileNameT);
// Связывание файловой переменной Ft c именем файла
Rewrite(Ft);
// Открытие нового текстового файла
end;
for i:=1 to nzap do
with stud[i] do Writeln(Ft,i:4,'. ',fio,sball:8:2);
// Запись в текстовой файл
CloseFile(Ft);
// Закрытие текстового файла
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
CloseFile(fz);
// Закрытие файла записей при нажатии на кнопку «Сlose»
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CloseFile(fz);
// Закрытие файла записей при нажатии на кнопку
end; end.
Индивидуальные задания
Ниже приведены 15 вариантов задач (табл. 9.1). По указанию преподавателя выберите свое индивидуальное задание. Уточните условие задания, количество, наименование, типы исходных данных.
В программе предусмотреть сохранение вводимых данных в файле и возможность чтения из ранее сохраненного файла.
Результаты выводить в окно просмотра и в текстовой файл.
Таблица 9.1
Индивидуальные задания
Вариант |
Задание |
|
1 |
В магазине формируется список лиц, записавшихся на покупку товара повышенного спроса. Каждая запись этого списка содержит: порядковый номер, ФИО, домашний адрес покупателя и дату постановки на учет. Удалить из списка все повторные записи, проверяя ФИО и домашний адрес |
|
2 |
Список товаров, имеющихся на складе, включает наименование товара, количество единиц товара, цену единицы и дату поступления товара на склад. Вывести в алфавитном порядке список товаров, хранящихся больше месяца, стоимость которых превышает 1 млн. руб. |
|
3 |
Для получения места в общежитии формируется список студентов, который включает ФИО студента, группу, средний балл, доход на члена семьи. Общежитие в первую очередь предоставляется тем, у кого доход на члена семьи меньше двух минимальных зарплат, затем остальным в порядке уменьшения среднего балла. Вывести список очередности предоставления мест в общежитии |
|
4 |
В справочной автовокзала хранится расписание движения автобусов. Для каждого рейса указаны его номер, тип автобуса, пункт назначения, время отправления и прибытия. Вывести информацию о рейсах, которыми можно воспользоваться для прибытия в пункт назначения раньше заданного времени |
|
5 |
На междугородной АТС информация о разговорах содержит дату разговора, код и название города, время разговора, тариф, номер телефона в этом городе и номер телефона абонента. Вывести по каждому городу общее время разговоров с ним и сумму |
|
6 |
Информация о сотрудниках фирмы включает: ФИО, табельный номер, количество проработанных часов за месяц, почасовой тариф. Рабочее время свыше 144 часов считается сверхурочным и оплачивается в двойном размере. Вывести размер заработной платы сотрудника фирмы за вычетом подоходного налога, который составляет 12% суммы заработка |
|
7 |
Информация об участниках спортивных соревнований содержит наименование страны, название команды, ФИО игрока, игровой номер, возраст, рост, вес. Вывести информацию о самой молодой, рослой и легкой команде |
|
8 |
Для книг, хранящихся в библиотеке, задаются регистрационный номер книги, автор, название, год издания, издательство, количество страниц. Вывести список книг с фамилиями авторов в алфавитном порядке, изданных после заданного года |
|
9 |
Различные цехи завода выпускают продукцию нескольких наименований. Сведения о выпущенной продукции включают наименование, количество, номер цеха. Для заданного цеха необходимо вывести количество выпущенных изделий по каждому наименованию в порядке убывания количества |
|
10 |
Информация о сотрудниках предприятия содержит ФИО, номер отдела, должность, дату начала работы. Вывести списки сотрудников по отделам в порядке убывания стажа |
|
11 |
Ведомость абитуриентов, сдавших вступительные экзамены в университет, содержит ФИО, адрес, оценки. Определить количество абитуриентов, проживающих в г. Минске и сдавших экзамены со средним баллом не ниже 4.5, вывести их фамилии в алфавитном порядке |
|
12 |
В справочной аэропорта хранится расписание вылета самолетов на следующие сутки. Для рейса указаны: номер рейса, тип самолета, пункт назначения, время вылета. Вывести номера рейсов, типы самолетов и времена вылета для заданного пункта в порядке возрастания времени вылета |
|
13 |
У администратора железнодорожных касс хранится информация о свободных местах в поездах дальнего следования на ближайшую неделю в следующем виде: дата выезда, пункт назначения, время отправления, число свободных мест. Оргкомитет международной конференции обращается к администратору с просьбой зарезервировать m мест до города N на k-й день недели с временем отправления поезда не позднее t часов вечера. Вывести время отправления или сообщение о невозможности выполнить заказ в полном объеме. |
|
14 |
Ведомость абитуриентов, сдавших вступительные экзамены в университет, содержит ФИО абитуриента, оценки. Определить средний балл по университету и вывести список абитуриентов, средний балл которых выше среднего балла по университету. Первыми в списке должны идти студенты, сдавшие все экзамены на 5 |
|
15 |
Разработать программу формирования ведомости об успеваемости студентов. Каждая запись этой ведомости должна содержать: номер группы, ФИО студента, оценки за последнюю сессию. Вывести списки студентов по группам. В каждой группе ФИО студентов должны быть расположены в порядке убывания среднего балла |
Лабораторная работа 10 Структурное программирование с использованием подпрограмм и модулей
Цель работы: изучить возможности Delphi для написания подпрограмм и создания модулей. Составить и отладить программу, использующую внешний модуль UNIT с подпрограммой.
Общие сведения
Использование подпрограмм
Подпрограмма - это именованная, определенным образом оформленная группа операторов, которая может быть вызвана любое количество раз из любой точки основной программы. Подпрограммы используются в том случае, когда одна и та же последовательность операторов в тексте программы повторяется несколько раз.
Эта последовательность заменяется вызовом подпрограммы, содержащей необходимые операторы. Подпрограммы также применяются для создания специализированных библиотечных модулей, содержащих набор подпрограмм определенного назначения, для их использования другими программистами.
Подпрограммы подразделяются на процедуры и функции.
Процедура имеет следующую структуру:
Procedure <имя процедуры> ([список формальных параметров]);
Const [описание используемых констант];
Type [описание используемых типов];
Var [описание используемых переменных];
Begin
… // Операторы
End;
В отличие от процедур функции могут использоваться в выражениях в качестве операнда, поэтому они имеют следующую структуру:
Function <имя функции> ([список формальных параметров]): <тип результата>;
Const [описание используемых констант];
Type [описание используемых типов];
Var [описание используемых переменных];
Begin
… // Операторы
Result:= … ; // Занесение результата вычислений в Result
End;
Процедуры и функции могут быть использованы в качестве формальных параметров подпрограмм. Для этого определяется тип:
Type <имя> = function ([список формальных параметров]): <тип результата>;
или
Type <имя> = procedure ([список формальных параметров]).
Имя процедуры или функции должно быть уникальным в пределах программы. Список формальных параметров необязателен и может отсутствовать. Если он есть, то в нем перечисляются через точку с запятой имена формальных параметров и их типы. Существуют три вида формальных параметров: параметры-значения, параметры-переменные, параметры-константы. При вызове подпрограммы передача данных для этих видов осуществляется по-разному. Параметры-значения копируются, и подпрограмма работает с их копией, поэтому при вызове на месте такого параметра можно ставить арифметическое выражение. При использовании параметров-переменных (в описании перед ними ставится Var) и параметров-констант в подпрограмму передается адрес и она работает с самой переменной. С помощью параметров-переменных подпрограмма передает результаты своей работы вызывающей программе.
В функциях используется специальная переменная Result, интерпретируемая как значение, которое вернет в основную программу функция по окончании своей работы.
В язык Object Pascal встроен ряд наиболее часто употребляемых процедур и функций, которые являются частью языка и вызываются без предварительного определения в разделе описаний.
Использование модулей
Модуль - автономно компилируемая программная единица, включающая процедуры, функции, а также различные компоненты раздела описаний. Структура модуля представлена в п.1.2 и содержит следующие основные части: заголовок, интерфейсная часть, исполняемая, инициирующая и завершающая.
Заголовок состоит из зарезервированного слова Unit и следующего за ним имени модуля, которое должно совпадать с именем дискового файла. Использование имени модуля в разделе Uses основной программы приводит к установлению связи модуля с основной программой.
Интерфейсная часть расположена между зарезервированными словами interface и implementation и содержит объявление тех объектов модуля, которые должны быть доступны другим программам.
Исполняемая часть начинается зарезервированным словом implementation и содержит описание процедур и функций, объявленных в интерфейсной части. Она может также содержать вспомогательные типы, константы, переменные, процедуры и функции, которые будут использоваться только в исполняемой части и не будут доступны внешним программам.
Инициирующая часть начинается зарезервированным словом initialization и содержит операторы, которые исполняются до передачи управления основной программе.
Завершающая часть начинается зарезервированным словом finalization и выполняется в момент окончания работы программы.
Инициирующая и завершающая части модуля используются крайне редко.
Пример написания программы
Задание: написать программу вывода на экран таблицы функции, которую оформить в виде процедуры. В качестве функции использовать по выбору Tg(x), ch(x) и sin2(x).
Создание модуля
Создавая модуль, следует обратить внимание на то, что он не должен иметь своей формы. Система DELPHI при начальной загрузке автоматически создает шаблон программы, имеющий в своем составе форму, файл проекта и т.д. Так как модуль состоит только из одного файла, то перед его созданием необходимо уничтожить заготовку файла проекта и форму. Для этого в меню File выбрать Close All, файл проекта не сохранять.
Для создания модуля в меню File выбрать File New, и затем в репозитории - пиктограмму . В результате будет создан файл с заголовком Unit Unit1. Имя модуля можно сменить на другое, отвечающее внутреннему содержанию модуля, например Unit Matfu. Затем необходимо сохранить файл с именем, совпадающим с именем заголовка модуля: Matfu.pas.
Следует обратить внимание на то, что имя файла должно совпадать с именем модуля, иначе Delphi не сможет подключить его к другой программе.
Подключение модуля
Для того чтобы подключить модуль к проекту, необходимо в меню Project выбрать опцию Add to Project и выбрать файл, содержащий модуль. После этого в разделе Uses добавить имя подключаемого модуля - MatFu. Теперь в проекте можно использовать функции, содержащиеся в модуле.
Панель диалога будет иметь следующий вид (рис. 10.1).
Рис. 10.1 Окно диалога программы
Тексты модуля и вызывающей программы приведены ниже.
Текст модуля:
unit Matfu;
interface
Function Tg(x:extended): extended; // Функция для вычисления тангенса
Function Ch(x:extended): extended; // Функция для вычисления гиперболического синуса
Function Sin2(x:extended): extended; // Функция для вычисления квадрата синуса
implementation
Function Tg;
begin
Result:=Sin(x)/Cos(x);
end;
Function Ch;
begin
Result:=(exp(x)-exp(-x))/2;
end;
Function Sin2;
begin
Result:=sqr(sin(x));
end;
end.
Текст вызывающей программы:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ExtCtrls,MatFu;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Memo1: TMemo;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
RadioGroup1: TRadioGroup;
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Type
fun = function(x:extended):extended; // Объявление типа функция
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text:='0';
Edit2.Text:='3';
Edit3.Text:='0,3';
Memo1.Clear;
RadioGroup1.ItemIndex:=0;
end;
procedure Tabl(f:fun;xn,xk,h:extended); // Расчет таблицы
var x,y: extended;
begin
x:=xn;
repeat
y:=f(x);
Form1.Memo1.Lines.Add('x='+FloatToStrf(x,fffixed,8,3)+
' y='+FloatToStrf(y,fffixed,8,3));
x:=x+h;
until (x>xk);
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var xn,xk,h: extended;
begin
xn:=StrToFloat(Edit1.Text); // Начальное занчение интервала
xk:=StrToFloat(Edit2.Text); // Конечное значение интервала
h:=StrToFloat(Edit3.Text); // Шаг расчета
case RadioGroup1.ItemIndex of // Выбор функции
0: Tabl(tg,xn,xk,h);
1: Tabl(ch,xn,xk,h);
2: Tabl(sin2,xn,xk,h);
end;
end;
end.
Индивидуальные задания
По указанию преподавателя выберите вариант задачи из заданий, приведенных в четвёртой лабораторной работе. Предусмотрите возможность выбора функции, для которой будет рассчитываться таблица значений. Функции поместите в отдельный модуль. Вызывать выбранную функцию должна процедура, использующая в качестве входного параметра имя соответствующей функции.
Лабораторная работа 11 Программирование с использованием средств графической информации
Цель работы: изучить возможности построения графиков с помощью компонента отображения графической информации TСhart. Написать и отладить программу построения на экране графика заданной функции.
Общие сведения
Построение графика с помощью компонента TChart
Обычно результаты расчетов представляются в виде графиков и диаграмм. Система DELPHI имеет мощный пакет стандартных программ вывода на экран и редактирования графической информации, который реализуется с помощью визуально отображаемого на форме компонента TChart (рис. 11.1).
Построение графика (диаграммы) производится после вычисления таблицы значений функции y = f(x) на интервале [Xmin, Xmax]с заданным шагом.
Полученная таблица передается в специальный двухмерный массив Seriesk (k - номер графика) компонента TСhart с помощью метода Add.
Рис. 11.1 Внешний вид формы программы для работы с графической информацией
Компонент PChart осуществляет всю работу по отображению графиков, переданных в объект Seriesk: строит и размечает оси, рисует координатную сетку, подписывает название осей и самого графика, отображает переданную таблицу в виде всевозможных графиков или диаграмм. При необходимости с помощью встроенного редактора EditingChart компоненту TСhart передаются данные о толщине, стиле и цвете линий, параметрах шрифта подписей, шагах разметки координатной сетки и другие настройки. В процессе работы программы изменение параметров возможно через обращение к соответствующим свойствам компонента TChart. Так, например, свойство Chart1.BottomAxis содержит значение максимального предела нижней оси графика и при его изменении во время работы программы автоматически изменяется изображение графика (см. нижеприведенную программу).
Пример написания программы
Задание: составить программу, отображающую графики функций sin(x) и cos(x) на интервале [Xmin, Xmax]. Предусмотреть возможность изменения разметки координатных осей, а также шага построения таблицы.
Настройка формы
Панель диалога программы организуется в виде, представленном на рис. 9.1.
Для ввода исходных данных используются окна TEdit. Компонент TChart вводится в форму путем нажатия пиктограммы в меню компонентов Standard.
Работа с компонентом TChart
Для изменения параметров компонента TChart необходимо дважды щелкнуть по нему мышью в окне формы. Появится окно редактирования EditingChat1 (рис. 11.2). Для создания нового объекта Series1 щелкнуть по кнопке Add на странице Series. В появившемся диалоговом окне TeeChart Gallery выбрать пиктограмму с надписью Line (график выводится в виде линий). Если нет необходимости представления графика в трехмерном виде, отключить независимый переключатель 3D. После нажатия на кнопку OK появится новая серия с название Series1. Для изменения названия нажать кнопку Title. В появившемся однострочном редакторе набрать имя отображаемой функции - “sin(x)”. Аналогичным образом создать объект Series2 для функции cos(x).
Для изменения надписи над графиком на странице Titles в многострочном редакторе набрать: «Графики функций».
Для разметки осей выбрать страницу Axis и научиться устанавливать параметры настройки осей.
Нажимая различные кнопки меню, познакомиться с другими возможностями EditingChat.
Написание программы обработки события создания формы
В данном месте программы устанавливаются начальные пределы и шаг разметки координатных осей. Когда свойство Chart1.BottomAxis.Automatic имеет значения False, автоматическая установка параметров осей не работает.
Рис. 11.2 Окно редактирования EditingChat1
Написание программ обработки событий нажатия на кнопки
Процедура TForm1.Button1Click обрабатывает нажатие кнопки “Установить оси”. Процедура TForm1.Button2Click обрабатывает нажатие кнопки “Построить график”. Для добавления координат точек (X,Y) из таблицы значений в двухмерный массив объекта Seriesk используется процедура Series1.AddXY(Const AXValue, AYValue: Double; Const AXLabel: String; AColor: TColor): Longint, где AXValue, AYValue - координаты точки по осям X и Y; AXLabel может принимать значение ` '; AСolor задает цвет линий (если равен clTeeColor, то принимается цвет, определенный при проектировании формы).
Текст программы имеет вид:
unit tem9;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, TeeProcs, TeEngine, Chart, Buttons, StdCtrls, Series;
type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Button1: TButton;
Button2: TButton;
BitBtn1: TBitBtn;
Chart1: TChart;
Series2: TLineSeries;
Label6: TLabel;
Edit6: TEdit;
Label7: TLabel;
Edit7: TEdit;
Series1: TLineSeries;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Xmin,Xmax,Ymin,Ymax,Hx,Hy,h: extended;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
{Установка начальных параметров координатных осей}
Xmin:=0;
Xmax:=2*pi;
Ymin:=-1;
Ymax:=1;
Hx:=pi/2;
Hy:=0.5;
h:=0.01; // Установка шага расчета таблицы
{Вывод данных в окна однострочных редакторов}
Edit1.Text:=FloatToStr(Xmin);
Edit2.Text:=FloatToStr(Xmax);
Edit3.Text:=FloatToStr(Ymin);
Edit4.Text:=FloatToStr(Ymax);
Edit5.Text:=FloatToStr(Hx);
Edit6.Text:=FloatToStr(Hy);
Edit7.Text:=FloatToStr(h);
Chart1.BottomAxis.Automatic:=False;
// Отключение автоматического определения параметров нижней оси
Chart1.BottomAxis.Minimum:=Xmin;
// Установка левой границы нижней оси
Chart1.BottomAxis.Maximum:=Xmax;
// Установка правой границы нижней оси
Chart1.LeftAxis.Automatic:=False;
// Отключение автоматического определения параметров левой оси
Chart1.LeftAxis.Minimum:=Ymin;
// Установка нижней границы левой оси
Chart1.LeftAxis.Maximum:=Ymax;
// Установка верхней границы левой оси
Chart1.BottomAxis.Increment:=Hx;
// Установка шага разметки по нижней оси
Chart1.LeftAxis.Increment:=Hy;
// Установка шага разметки по левой оси
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
{Чтение даннных из окон однострочных редакторов}
Xmin:=StrToFloat(Edit1.Text);
Xmax:=StrToFloat(Edit2.Text);
Ymin:=StrToFloat(Edit3.Text);
Ymax:=StrToFloat(Edit4.Text);
Hx:=StrToFloat(Edit5.Text);
Hy:=StrToFloat(Edit6.Text);
Chart1.BottomAxis.Minimum:=Xmin;
// Установка левой границы нижней оси
Chart1.BottomAxis.Maximum:=Xmax;
// Установка правой границы нижней оси
Chart1.LeftAxis.Minimum:=Ymin;
// Установка нижней границы левой оси
Chart1.LeftAxis.Maximum:=Ymax;
// Установка верхней границы левой оси
Chart1.BottomAxis.Increment:=Hx;
// Установка шага разметки по нижней оси
Chart1.LeftAxis.Increment:=Hy;
// Установка шага разметки по левой оси
end;
procedure TForm1.Button2Click(Sender: TObject);
var x,y1,y2: extended;
begin
{Очистка графиков}
Series1.Clear;
Series2.Clear;
Xmin:=StrToFloat(Edit1.Text);
Xmax:=StrToFloat(Edit2.Text);
h:=StrToFloat(Edit7.Text); // Шаг расчета таблицы для графика
x:=Xmin; // Начальное значение по оси X
repeat
y1:=sin(x); // Расчет функции
Series1.AddXY(x,y1,'',clTeeColor); // Вывод точки на график
y2:=cos(x); // Расчет функции
Series2.AddXY(x,y2,'',clTeeColor); // Вывод точки на график
x:=x+h; // Увеличение значения X на величину шага
Until (x>Xmax);
end;
end.
Индивидуальные задания
Постройте графики функций для соответствующих вариантов из четвертой лабораторной работы. Таблицу данных получить, изменяя параметр X с шагом h. Ввод исходных данных организовать через окна TEdit. Самостоятельно выбрать удобные параметры настройки.
Лабораторная работа 12 Использование OLE- и СОМ-технологий программирования
Цель работы: познакомиться на конкретных примерах с технологиями программирования OLE и СОМ.
...Подобные документы
Требования к технологии проектирования программного обеспечения (ПО). Состав и описание стадий полного жизненного цикла ПО. Классификация моделей жизненного цикла ПО, их особенности. Методологии разработки ПО, приёмы экстремальный программирование.
презентация [874,4 K], добавлен 19.09.2016Понятие и этапы жизненного цикла программного обеспечения как некоторых событий, которые происходят с системой компьютера в процессе ее создания, внедрения и сопровождения. Модели данного процесса: каскадная, спиральная, их отличительные особенности.
доклад [33,5 K], добавлен 06.04.2015Общая характеристика основных моделей жизненного цикла: каскадная, инкрементная, спиральная. Стадия как часть процесса создания программного обеспечения, ограниченная определенными временными рамками и заканчивающаяся выпуском конкретного продукта.
презентация [159,1 K], добавлен 27.12.2013Особенности разработки программ для ЭВМ. Этапы планирования программы. Понятие и особенности алгоритмов. Средства, используемые для создания программ. Виды и классификация языков программирования. Структурное и объектно-ориентированное программирование.
реферат [59,7 K], добавлен 19.08.2010Технологии разработки программного обеспечения. Процедура постановки задачи, определения требований. Последовательность действий логической, разветвленной и циклической структуры. Терминология программирования. Этапы создания программного продукта.
презентация [793,8 K], добавлен 15.11.2010Изучение составляющих этапов разработки программ, процесса их тестирования, отладки и документирования в контексте курса обучения начинающих программистов. Теоретический анализ постановки задачи и модели программы, создания текста, семантической отладки.
курсовая работа [29,2 K], добавлен 28.11.2010Определение понятия и сущности программного обеспечения. Рассмотрение основ интерпретируемых и компилируемых программ. Особенности несвободных, открытых, свободных, системных, прикладных и инструментальных программ; основные принципы их применения.
реферат [25,6 K], добавлен 06.11.2014Проблема надежности программного обеспечения, ее показатели и факторы обеспечения. Методы контроля процесса разработки программ и документации, предупреждение ошибок. Этапы процесса отладки ПО, приемы структурного программирования и принцип модульности.
презентация [379,5 K], добавлен 30.04.2014Основные этапы разработки программного обеспечения (пакета программ), анализ требований к системе. Метод пошаговой детализации. Языки программирования низкого уровня и высокого уровня (императивные, объектно-ориентированные, функциональные, логические).
презентация [41,4 K], добавлен 13.10.2013Этапы разработки и отладки приложения "Помощь почтальону". Составление сопроводительной документации. Выбор средств и методов программирования. Анализ проектных данных. Особенности создания базы данных, СУБД. Тестирование созданного программного продукта.
контрольная работа [2,5 M], добавлен 17.12.2014Формирование опыта создания программ с использованием программного продукта Turbo Assembler. Использование меньшего количества команд и обращений в память, увеличение скорости и уменьшение размера программы. Степень сложности совместной разработки.
реферат [15,4 K], добавлен 24.02.2010Анализ требований к программному продукту. Требования к информационной и программной совместимости. Проектирование архитектуры программного продукта. Виды программ и программных документов. Общие сведения о С++. Технология разработки программного модуля.
дипломная работа [1,2 M], добавлен 05.08.2011Модульная структура программного продукта и типовые управляющие структуры алгоритмов обработки данных различных программных модулей в основе структурного программирования. Особенности пошаговой разработки программ. Основные типы базовых конструкций.
контрольная работа [163,7 K], добавлен 04.06.2013Реализация программного средства "Действия над матрицами". Разработка кода программного продукта на основе готовой спецификации на уровне модуля. Использование инструментальных средств на этапе отладки программного модуля. Выбор стратегии тестирования.
отчет по практике [296,1 K], добавлен 19.04.2015Разработка программного обеспечения для микропроцессорных систем МК51, интерфейсы в системах связи, основы асинхронной связи. Этапы решения задачи на ЭВМ, принципы тестирования программ и их отладка. Расчет затрат на разработку программного продукта.
дипломная работа [270,6 K], добавлен 19.06.2010Виды моделей жизненного цикла разработки программного продукта. Отладка и тестирование программы. Вопросы и варианты ответов на отдельных вкладках. Запись результатов тестирования в файл, вывод на экран количества правильных и неправильных ответов.
курсовая работа [663,8 K], добавлен 23.09.2014Обзор существующих моделей параллельного программирования, основные средства отладки эффективности MPI-программ, общие проблемы всех средств трассировки. Создание экспериментальной системы отладки эффективности MPI-программ, этапы работы анализатора.
дипломная работа [767,2 K], добавлен 14.10.2010Тестирование как составляющая часть процесса отладки программного обеспечения, его роль для обеспечения качества продукта. Обнаружение ошибок в программах, выявление причин их возникновения. Подходы к формулированию критериев полноты тестирования.
курсовая работа [1,6 M], добавлен 20.12.2012Решение задач прикладного программирования. Оформление разработанных алгоритмов в виде графических схем. Написание программ с использованием подпрограмм, их отладка. Блок-схемы и листинг программ. Наборы тестов для отладки разработанных программ.
курсовая работа [575,8 K], добавлен 06.12.2013Комплексное функциональное и структурное тестирование программного продукта - граф-программа решения квадратного уравнения. Постановка задачи структурного тестирования маршрутов. Заключение о типе и причине ошибки, предложение по ее исправлению.
курсовая работа [2,8 M], добавлен 05.01.2013