Читайте также:
|
|
FileExists(<имя файла>);
где <имя файла> – это символьная строка, содержащая имя файла на внешнем запоминающем устройстве. Если файл существует, то функция возвращает true, если нет – false.
Текстовый файл – последовательность символов, сгруппированных в строки произвольной длины, где каждая строка заканчивается символом конца строки – EOLN (символ перевода каретки CR (#13), за которым, возможно, следует символ перевода строки LF (#10)). Заканчивается файл символом конца файла EOF (end-of-file, #26).
Последовательное чтение данных из произвольного текстового файла осуществляется процедурами read и readln, у которых в списке параметров первой должна стоять, соответствующая файловая переменная. Например,
rеаd(f,х,у,z); {прочитать из файла, связанного с файловой переменной f, значения переменных х,у,z}
readln(f,а); {прочитать из файла, связанного с файловой переменной f, значение в переменную а и перейти к следующей строке}.
Вывод данных в произвольный текстовый файл производится процедурами write и writeln, у которых первой в списке параметров указана соответствующая файловая переменная.
Например,
write(fi,'s=',s) {осуществляет вывод в файл, связанный с файловой переменной fi, символьной строки 's=' и значение переменной s}.
Процедура writeln (fi); выводит пустую строку в файл, связанный с файловой переменной fi.
Пример.
Составить программу для нахождения суммы двух одинаковых квадратных матриц произвольного размера. Ввод исходных данных осуществить из текстового файла inp.txt. Результаты вывести в файл result.tхt.
Решение
Для создания текстового файла inp.txt, содержащего размер матриц n, а также сами матрицы а и b, можно использовать любой текстовый редактор. Используемые файлы inp.txt и result.txt размещены в одной папке с исполняемым файлом программы. Поэтому в процедурах AssignFile указаны только имена файлов без пути доступа к ним.
Программа
program pl; {$APPTYPE CONSOLE} uses SysUtils; type mas=array of array of integer; var а,b,c:mas; gl,g2,n,i,j:integer; fl,f2:TextFile; begin AssignFile(fl,'inp.txt'); AssignFile(f2,'result.txt'); Reset(fl); Rewrite(f2); readln(fl,n); SetLength(a,n,n); SetLength(b,n,n); SetLength(c,n,n); gl:= 0; g2:= n-1; for i:= gl to g2 do begin for j:= gl to g2 do read(fl,a[i,j]); readln(fl); end; | for i:= gl to g2 do begin for j:= g1 to g2 do read(fl,b[i,j]); readln(fl) end; CloseFile(fl); for i:= gl to g2 do for j:= g1 to g2 do c[i,j]:= a[i,j]+b[i,j]; writeln(f2,'Result array'); for i:= g1 to g2 do begin for j:= gl to g2 do write(f2,c[i,j]:2); writeln(f2) end; CloseFile(f2); writeln('Program terminated'); readln end. |
При работе с текстовыми файлами положение текущей позиции в файле контролируется функциями:
function Eof [(var F: FileText)]: Boolean;
возвращает значение true, если достигнут конец текстового файла, связанного с файловой переменной F.
function Eoln [(var F: FileText)]: Boolean;
возвращает значение true, если достигнут конец строки в текстовом файле, связанного с файловой переменной F.
function SeekEof [(var F: FileText) ]: Boolean;
действует аналогично Eof, но пробелы, знаки табуляции и маркеры конца строки EOLN пропускаются.
function SeekEoln [(var F: FileText)]: Boolean;
действует аналогично Eoln, но пробелы и знаки табуляции пропускаются.
Используя функции Eof и Eoln, можно организовать ввод массивов.
Пример. Пусть fa – файловая переменная, связанная с текстовым файлом, содержащим только массив а. Тогда этот массив можно ввести следующим образом:
……………………
I:=0;
while not(eof(fa)) do
begin
j:= 0;
while not(eoln(fa)) do
begin
read(fa,a[i,j]);
j:= j+1;
end;
readln(fa);
i = i+1;
end;
……………………
Если текстовый файл содержит символьное представление числовых данных, то вместо функций Eof и Eoln лучше использовать SeekEof и SeekEoln.
Типизированный файл содержит компоненты одного типа. Тип компонентов может быть любым, кроме файлового. Создать и просмотреть такой файл при помощи текстового редактора как текстовый файл нельзя. Поэтому обработка таких файлов должна осуществляться программным путем.
Для чтения данных из типизированного файла применяется процедура read. Для записи в типизированный файл используется процедура write. При использовании процедуры read или write, указатель файла перемещается к следующему по порядку элементу файла. Процедуры readln и writeln, используемые для текстовых файлов, для типизированных файлов не применяются.
Для организации прямого доступа к данным типизированного файла используют стандартные подпрограммы
procedure Seek (var F; N: Longint);
перемещает текущую позицию (указатель) в типизированном файле, связанном с файловой переменной F к требуемому компоненту с номером N. Нумерация компонентов в файле начинается с нуля.
function FilePos(var F): Longint;
возвращает номер текущего компонента в файле, связанном с файловой переменной F.
function FileSize(var F): Integer;
возвращает количество компонентов в файле, связанном с файловой переменной F.
Пример. Составить программу, которая:
1. Вводит с клавиатуры элементы целочисленной матрицы A(3x3) и записывает их в типизированный файл fl.dat.
2. Выводит на экран третью строку матрицы А из файла fl.dat.
Решение
Нумерация элементов двумерного массива в файле идет слева направо, сверху вниз. Учитывая то, что нумерация начинается с нуля, элемент матрицы А[2,1] будет являться шестым компонентом в файле.
Программа
program pl; {$APPTYPE CONSOLE} uses SysUtils; var а:array [1..3,1..3] of integer; f:file of integer; i,j:integer; begin program pl; {$APPTYPE CONSOLE} uses SysUtils; var а:array [1..3,1..3] of integer; f:file of integer; i,j:integer; begin | for j:= 1 to 3 do read(a[i,j]); readln end; for i:= 1 to 3 do for j:= 1 to 3 do write(f,a[i,j]); seek(f,6); writeln('Result:'); for j:= 1 to 3 do begin read(f,a[3, j]); write(a[3,j]:2); end; CloseFile(f); readln end. |
Нетипизированный файл представляют собой последовательность байтов, содержащих данные произвольного типа и структуры. Основное назначение нетипизированных файлов - обеспечение совместимости с любыми типами файлов, используемых в операционной системе, и организация высокоскоростного обмена данными между внешними запоминающими устройствами и оперативной памятью.
В процедурах Reset и Rewrite для нетипизированных файлов указывается дополнительный параметр RecSize, чтобы задать размер записи, использующейся при передаче файла:
procedure Reset (var F: File [; RecSize: Word]);
procedure Rewrite (var F: File [; RecSize: Word]);
Длина записи RecSize измеряется в байтах и может быть задана произвольным целым числом – от 1 байта до 2 Мбайт. Если параметр не указан, то принимаемая по умолчанию длина записи равна 128 байтам.
Вместо процедур Read и Write используются процедуры, позволяющие пересылать данные с высокой скоростью:
procedure BlockRead(var F: File; var Buf; Count: Integer [; var AmtTransferred: Integer]);
procedure BlockWrite(var F: File; var Buf; Count: Integer [; var AmtTransferred: Integer]);
где F – имя файловой переменной, связанной с нетипизированным файлом, Buf – переменная, в которую помещаются данные при чтении из файла и из которой извлекаются данные при записи в файл. Переменная Buf должна иметь длину, равную Count * RecSize байт. Count – параметр целого типа, указывающий, какое количество записей необходимо прочитать или записать за одно обращение к файлу. Необязательный параметр AmtTransferred содержит количество реально прочитанных или записанных записей.
Для файлов всех типов могут использоваться процедуры и функции:
procedure ChDir(S: string);
изменяет текущую папку на папку, указанную в символьной строке S.
function DeleteFile(const FileName: string): Boolean;
удаляет файл, имя которого содержится в символьной строке FileName. Если удаление прошло успешно, функция возвращает true.
procedure GetDir(D: Byte; var S: string);
возвращает текущую папку в папку, определенную параметром А, на диске, определенном параметром D:
Значение параметра D | Папка |
текущая папка | |
А |
procedure MkDir(S: string);
создает новую папку, имя которой указано в символьной строке S.
procedure Rename(var F; Newname:string);
переименовывает файл, связанный с файловой переменной F. Новое имя файла задается в переменной Newname.
procedure RmDir(S: string);
удаляет папку, имя которой указано в переменной S. Удаляемая папка должна быть пустой, т.е. не содержать файлов или других папок.
Стандартные диалоги – это диалоги общего назначения, которые используются многими Windows-приложениями для выполнения таких операций, как открытие, сохранение и печать файлов. Поскольку стандартные диалоги определяются средой Windows, то их внешний вид, в том числе язык интерфейсных элементов, зависит от версии установленной на компьютере Windows.
На странице Dialogs Палитры компонентов содержатся следующие компоненты, реализующие стандартные диалоги для работы с файлами:
· OреnDiаlоg – выбор открываемого файла;
· SaveDialog – выбор сохраняемого файла;
· OреnРiсtureDialog – выбор открываемого графического файла;
· SavePictureDialog – выбор сохраняемого графического файла;
· PrintDialog – вывод на принтер;
Основные свойства компонентов OpenDialog и SaveDialog:
· FileName типа String – указывает имя и полный путь файла, выбранного в диалоге. Имя файла отображается в строке редактирования с названием имя файла и является результатом диалога;
· Title типа String – задает заголовок окна. Если свойство Title не установлено, то по умолчанию используется заголовок Open для OpenDialog и заголовок Save – для SaveDialog;
· InitialDir типа String – определяет каталог, содержимое которого отображается при вызове окна диалога. Если каталог не задан, то отображается содержимое текущего каталога;
· DefaultExt типа String – задает расширение, автоматически подставляемое к имени файла, если пользователем расширение имени не указано;
· Options типа TOpenOptions – настройка параметров, управляющих внешним видом и функциональными возможностями диалога;
· Filter типа String – задает маски имен файлов, отображаемых в раскрывающемся списке под названием Files of type. В окне диалога видны имена файлов, которые совпадают с указанной маской. По умолчанию значением Filter является пустая строка, что соответствует отображению имен файлов всех типов;
· FilterIndex типа Integer – указывает, какая из масок фильтра отображается в списке. По умолчанию свойство FilterIndex имеет значение 1 и используется первая маска.
Фильтр – это последовательность значений, разделенных знаком |. Каждое значение состоит из описания и маски, также разделенных знаком |. Описание представляет собой обычный текст, поясняющий пользователю данную маску. Маска является шаблоном отображаемых файлов и состоит из имени и расширения. Если для одного описания приводится несколько масок, то они разделяются знаком;. Фильтр обычно формируется при проектировании приложения. Редактор фильтра (Filter Editor) вызывается через свойство Filter Инспектора объектов.
Пример формирования фильтра с двумя масками – маской для текстовых файлов и маской для всех файлов:
OpenDialog1.Filter:='Текстовые файлы| *.txt;*.doс|Все файлы| *.*';
Так как в раскрывающемся списке диалога отображается только описание фильтра, то в описание целесообразно включить маску, например:
OpenDialog1.Filter:= 'Текстовые файлы *.txt;*.doc|*.txt;*.doc' + '|Все файлы *.*|*.*';
Для вызова любого стандартного диалога используется метод Execute тип Boolean. При закрытии диалога кнопкой Open или Save (Открыть или Сохранить) функция Execute возвращает значение True, а при отмене диалога – значение False. После закрытия стандартного диалога он через свои свойства возвращает значения, выбранные или установленные в процессе диалога.
Пример использования стандартного диалога OpenDialog:
procedure TForm1.Button2Click(Sender: TObject); {нажатие на кнопку Button2}
begin
if OpenDialog1.Execute then {при отмене диалога открытие файла не происходит}
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
end;
Пример сохранения графического образа в файл:
На форме Form1 расположено меню с двумя пунктами Save и SaveAs, компонент SaveDialog и компонент Image1 для хранения графического образа. Если вызывается пункт Save, то проверяется, был ли уже создан файл для данного графического образа. Если был создан, то образ сохраняется. Если файл не был создан, вызывается метод SaveAs, который открывает окно SaveDialog1 и запрашивает имя файла для графического образа, после этого управление передается методу Save.
var Form1: TForm1;
CurrentFile:String;
implementation
{$R *.DFM}
procedure TForm1.Save1Click (Sender: TObject)
begin
if CurrentFile <> ' ' then
Image1.Picture.SaveToFile(CurrentFile) {файл уже существует}
else SaveAs1Click(Sender);{иначе нужно ввести имя файла}
end;
ргосеdurе ТFоrm1.SaveAs1Click(Sender: TObject);
begin
if SaveDialog1.Execute then { Получить имя файла }
begin
СurrentFile:= SaveDialog1.FileName;
{сохранить файл с именем, заданным пользователем}
Save1Click(Sender); {вызов метода сохранения файла}
end;
еnd;
Компоненты OpenPictureDialog и SavePictureDialog вызывают стандартные диалоги открытия и сохранения графических файлов. Эти стандартные диалоги отличаются от OpenDialog и SaveDialog видом окон и установленными значениями свойства Filter.
Задание
Составить программу с использованием текстовых файлов согласно заданию в лабораторной работе №7. Необходимо предусмотреть возможность ввода с клавиатуры элементов матрицы, сохранения и считывания матрицы с файла.
Пример
Найти максимальный элемент матрицы.
Решение
Ввод/вывод элементов матрицы в файл осуществляется поэлементно для каждой строки. Для отображения элементов матрицы использован компонент StringGrid. Поиск максимального элемента матрицы осуществляется по алгоритму, показанному на рис.8.1. Внешний вид спроектированной формы показан на рис.8.2.
Object Form1: TForm1 Left = 239 Top = 107 Width = 456 Height = 378 Caption = ’Лабораторная работа' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Label1: TLabel Left = 16 Top = 16 Width = 48 Height = 13 Caption = 'Столбцов' object Label2: TLabel Left = 24 Top = 48 Width = 30 Height = 13 Caption = 'Строк' object Label3: TLabel Left = 9 Top = 99 Width = 171 Height = 13 Caption = 'Максимальный элемент таблицы' object X_StringGrid: TStringGrid Tag = 1 Left = 8 Top = 136 Width = 433 Height = 209 ColCount = 8 DefaultColWidth = 50 DefaultRowHeight = 23 FixedCols = 0 RowCount = 8 FixedRows = 0 Options = [goVertLine, goHorzLine, goDrawFocusSelected, goEditing, goTabs, goAlwaysShowEditor] ScrollBars = ssNone | TabOrder = 0 object X_Button: TButton Left = 248 Top = 16 Width = 73 Height = 33 Caption = 'Открыть' TabOrder = 1 OnClick = X_ButtonClick object Col_Edit: TEdit Left = 80 Top = 8 Width = 57 Height = 21 TabOrder = 2 Text = '8' OnExit = Col_EditExit object Row_Edit: TEdit Left = 80 Top = 40 Width = 57 Height = 21 TabOrder = 3 Text = '8' OnExit = Row_EditExit object Button1: TButton Left = 152 Top = 16 Width = 75 Height = 33 Caption = 'Сохранить' TabOrder = 4 OnClick = Button1Click object Button2: TButton Left = 336 Top = 16 Width = 73 Height = 33 Caption = 'Выход' TabOrder = 5 OnClick = Button2Click object Max_Edit: TEdit Left = 192 Top = 96 Width = 121 Height = 21 TabOrder = 6 Text = '0' |
object Button3: Tbutton Left = 344 Top = 96 Width = 89 Height = 25 Caption = 'Найти' TabOrder = 7 OnClick = Button3Click | object X_OpenDialog: TOpenDialog Filter = '*.dat|*.dat' Left = 272 Top = 56 object X_SaveDialog: TSaveDialog Filter = '*.dat|*.dat' Left = 184 Top = 56 |
Текст программы
unit Lab_file;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;
type
TForm1 = class(TForm)
X_StringGrid: TStringGrid;
X_Button: TButton;
X_OpenDialog: TOpenDialog;
Col_Edit: TEdit;
Label1: TLabel;
Label2: TLabel;
Row_Edit: TEdit;
Button1: TButton;
X_SaveDialog: TSaveDialog;
Button2: TButton;
Max_Edit: TEdit;
Label3: TLabel;
Button3: TButton;
procedure X_ButtonClick(Sender: TObject);
procedure Row_EditExit(Sender: TObject);
procedure Col_EditExit(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
function Max:real;
public
{ Public declarations }
end;
var Form1: TForm1;
implementation
{$R *.DFM}
function TForm1.Max:real; // Процедура поиска максимального элемента массива
var i,j,im,jm,p:integer;
m,n:real;
begin
im:=0;jm:=0;
with X_StringGrid do
begin
Val(Cells[im,jm],m,i);
for i:=0 to ColCount do
begin
for j:=0 to RowCount do
begin
Val(Cells[i,j],n,p);
if m<=n then
begin
m:=n;
im:=i;
jm:=j;
end;
end;
end;
end;
Max:=m;
end;
procedure TForm1.Row_EditExit(Sender: TObject); //процедура изменения высоты строк
begin
with X_StringGrid do
begin
RowCount:=StrToInt(Row_Edit.Text);
DefaultRowHeight:=round(Height/(StrToInt(Row_Edit.Text)+1));
end;
end;
procedure TForm1.Col_EditExit(Sender: TObject); //процедура изменения ширины столбцов
begin
with X_StringGrid do
begin
ColCount:=StrToInt(Col_Edit.Text);
DefaultColWidth:=round(Width/(StrToInt(Col_Edit.Text)+1));
end;
end;
procedure TForm1.Button1Click(Sender: TObject); // процедура записи массива в файл
var Fl:TextFile;
i,j:integer;
begin
if X_SaveDialog.Execute then
begin
AssignFile(fl,X_SaveDialog.FileName+'.dat');
Rewrite(fl);
with X_StringGrid do
for i:=0 to RowCount do
begin
for j:=0 to ColCount do
write(fl,Cells[j,i]+' ');
writeln(fl);
end;
CloseFile(fl);
end;
end;
procedure TForm1.X_ButtonClick(Sender: TObject); // процедура чтения массива из файла
var Fl:TextFile;
i,j:integer;
s:char;
a:real;
begin
if X_OpenDialog.Execute then
begin
AssignFile(fl,X_OpenDialog.FileName);
Reset(fl);
j:=0;
while not(SeekEof(fl)) do
begin
i:=0;
while not(SeekEoln(fl)) do
begin
read(fl,a);
X_StringGrid.Cells[i,j]:=FloatToStr(a);
i:=i+1;
end;
readln(fl);
j:=j+1;
end;
CloseFile(fl);
Col_Edit.Text:=IntToStr(i);
Row_Edit.Text:=IntToStr(j);
Row_EditExit(Sender);
Col_EditExit(Sender);
end;
end;
procedure TForm1.Button2Click(Sender: TObject); // процедура выхода из программы
begin
Application.Terminate;
end;
procedure TForm1.Button3Click(Sender: TObject);
// процедура на нажатие кнопки «Найти»
begin
Max_Edit.Text:=FloatToStrF(Max,ffGeneral,4,2);
end;
end.
Контрольные вопросы
1. Что такое файл и в каких случаях его удобно использовать?
2. Какие типы файлов и как они описываются в Object Pascal?
3. Описать способ ввода/вывода файловых данных?
4. Какие диалоги используются при работе с файлами?
5. Описать разработанную программу.
Лабораторная работа №9
ПОСТРОЕНИЕ И ПЕЧАТЬ ДИАГРАММ
Цель работы:
получение практических навыков в построении и печати диаграмм.
Общие сведения
Для построения диаграмм предназначен компонент TChart.
Компонент TChart представляет собой библиотеку процедур построения диаграмм, написанных с использованием VCL. Компонент TChart выведен из класса TPanel и поэтому наследует его свойства.
Для добавления диаграммы к приложению необходимо разместить компонент TChart на форму и при необходимости изменить размеры диаграммы. Диаграмму также можно добавить с помощью команды File | New (Файл | Создать) и пиктограммы TeeChart Wizard, расположенной во вкладке Business (Бизнес) диалогового окна New Application (Создать приложение).
Редактор диаграмм и рядов предоставляет доступ к большинству свойств диаграммы и ряда и имеет две основные вкладки: Chart (Диаграмма), которая предоставляет доступ к свойствам диаграмм и упрощает добавление ряда к диаграмме, и Series (Ряд), которая позволяет изменять свойства ряда.
При добавлении в диаграмму нового ряда происходит автоматическое заполнение этого ряда случайными данными (только во время разработки), что позволяет сразу увидеть результат изменения свойств диаграммы и ряда.
Метод Add () используется для добавления данных в диаграмму. При вызове этого метода в ряд данных добавляется только одно значение (точка), поэтому для добавления массива значений следует организовать цикл:
for i:= 0 to TotalPointCount do
Series1.Add(SomeData[i], Strin [i+1], clTeeColor);
Первый аргумент метода Add() содержит координату Y добавляемого значения (в данном случае элемент массива); второй – подпись для соответствующей точки диаграммы, а третий – ее цвет (константа clTeeColor присваивает данному значению цвет, используемый по умолчанию).
Метод АddXY () используется для добавления данных в график. Форма этого метода совпадает с формой метода Аdd() за исключением дополнительного аргумента, который представляет собой массив значений X.
Пример проектирования диаграммы:
На форме Form1 размещены компоненты Chart и BitBtn1. Для Chart установлен ряд Series1.
procedure TForm1.BitBtn1Click(Sender: TObject);
const TotalPointCount=10;
XData:array [1..TotalPointCount] of real = (0,1,2,3,4,5,6,7,8,9);
YData:array [1..TotalPointCount] of real = (0,1,2,3,4,5,6,7,8,9);
Strin:array [1..TotalPointCount] of char = ('0','1','2','3','4','5','6','7','8','9');
var i:integer;
begin
for i:= 1 to TotalPointCount do
Series1.AddXY(XData[i], YData[i], Strin [i+1], clTeeColor);
end;
Самый простой способ вывода диаграмм на печать – использовать метод Print формы, содержащей диаграмму. Однако качество воспроизведения диаграмм с его помощью неудовлетворительное.
В компоненте TChart предусмотрено несколько собственных методов печати, которые генерируют диаграммы гораздо более высокого качества, чем метод печати формы. Самым простым из них является метод Print.
Chart1.Print;
При выполнении этой строки программы диаграмма будет напечатана с использованием полных значений ширины и высоты печатной страницы при разрешении экрана, действующего по умолчанию. Однако печать при таком разрешении экрана часто не подходит для приложений, включающих диаграммы. Поэтому нужно изменить это разрешение, а следовательно, и качество печатаемых диаграмм. Компонент TChart имеет динамическое свойство PrintResolution, которое можно установить равным целому значению в диапазоне – 100 ¸ 0, где 100 означает, что диаграмма печатается при максимальном разрешении принтера, а 0 – при установленном разрешении экрана.
Chart1.PrintResolution = PrintResScroll.Position;
Используя методы PrintPartial и PrintRect, можно также задать прямоугольник для диаграммы с целью ее масштабирования на печатной странице.
При проектировании диаграммы можно заранее определить принтер и осуществить его настройки и предварительный просмотр печатываемой диаграммы. Для этого в окне Edition Chart необходимо зайти на вкладку General и выбрать Print Preview.
Задание
Построить и распечатать график функции
№ | f(x) | Хнач | Хкон | № | f (x) | Хнач | Хкон | № | f (x) | Хнач | Хкон | № | f (x) | Хнач | Хкон |
cos(x) | (2-x)/2 | -3 | 2-x2 | -2 | x-cos(x) | ||||||||||
tg(x) | -0,5 | 0,5 | |x/3| | -3 | x*sin(x) | ex/x | |||||||||
ctg(x) | 0,5 | 1/x2 | |cos(x)| | -2 | ln(x)*ex | ||||||||||
ln(x) | sh(x) | tg(x2) | 0,5 | 1,2 | th(x) | -3 | |||||||||
x2 | 1/x3 | 0,5 | ch(x) | sin(x2) | -1 | ||||||||||
1/x | Öx | 1/sin(x) | 0,1 | cth(x) | |||||||||||
x3 | ex | cos(x)/x |
Пример.
Построить график функции у=Sin(x).
Решение
После размещения компонентов форма имеет вид
object Form1: TForm1 Left = 252 Top = 107 Width = 458 Height = 397 Caption = 'Лабораторная работа' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Label1: TLabel Left = 32 Top = 8 Width = 30 Height = 13 Caption = 'X нач.' object Label2: TLabel Left = 184 Top = 8 Width = 31 Height = 13 Caption = 'Х кон.' object Label3: TLabel Left = 320 Top = 8 Width = 29 Height = 13 Caption = 'шаг Х' object Xn_Edit: TEdit Left = 88 Top = 8 Width = 57 Height = 21 TabOrder = 0 Text = '0' object Xk_Edit: TEdit Left = 224 Top = 8 Width = 57 Height = 21 TabOrder = 1 Text = '1' | object dX_Edit: TEdit Left = 360 Top = 8 Width = 57 Height = 21 TabOrder = 2 Text = '0,1' object Chart1: TChart Left = 16 Top = 40 Width = 425 Height = 273 AllowPanning = pmNone BackWall.Brush.Color = clWhite BackWall.Brush.Style = bsClear PrintProportional = False Title.Text.Strings ='Y = sin (X)' BottomAxis.Increment = 0.1 View3D = False View3DWalls = False TabOrder = 3 object Series1: TLineSeries Marks.ArrowLength = 8 Marks.Visible = False SeriesColor = clRed ShowInLegend = False Dark3D = False Pointer.InflateMargins = True Pointer.Style = psRectangle Pointer.Visible = False XValues.DateTime = False XValues.Name = 'X' XValues.Multiplier = 1 XValues.Order = loAscending YValues.DateTime = False YValues.Name = 'Y' YValues.Multiplier = 1 YValues.Order = loNone object Button1: TButton Left = 16 Top = 328 Width = 113 Height = 33 Caption = 'График' TabOrder = 4 OnClick = Button1Click |
object Button2: TButton Left = 184 Top = 328 Width = 105 Height = 33 Caption = 'Печать' TabOrder = 5 OnClick = Button2Click | object Button3: TButton Left = 328 Top = 328 Width = 97 Height = 33 Caption = 'Выход' TabOrder = 6 OnClick = Button3Click |
Программа
unit Lab2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart, Printers;
type
TForm1 = class(TForm)
Label1: TLabel;
Xn_Edit: TEdit;
Label2: TLabel;
Xk_Edit: TEdit;
Label3: TLabel;
dX_Edit: TEdit;
Chart1: TChart;
Series1: TLineSeries;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var xn,xk,dx,x,y:real;
begin
xn:=StrToFloat(Xn_Edit.Text);
xk:=StrToFloat(Xk_Edit.Text);
dx:=StrToFloat(dX_Edit.Text);
Chart1.BottomAxis.Increment:=(Xk-Xn)/10;
x:=xn;
while x<=xk do
begin
y:= Sin(x);
Series1.AddXY(x,y);
x:=x+dx;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Chart1.Print;
end;
end.
Контрольные вопросы
1. Какой компонент предназначен для построения диаграмм?
2. Какие виды диаграмм возможно построить в Delphi?
3. Какие методы используются для построения диаграмм?
4. Какие методы используются для печати диаграмм?
5. Перечислить основные свойства компонента TChart.
6. Опишите разработанную программу.
Лабораторная работа №10
ПРОГРАММНЫЕ СРЕДСТВА ДЛЯ РЕШЕНИЯ
МАТЕМАТИЧЕСКИХ ЗАДАЧ (ПАКЕТ MATHCAD)
Цель работы:
изучить интерфейс пакета MathCad, научиться применять функции пакета, выполнять аналитические вычисления и представлять результаты расчетов в виде таблиц и графиков.
Общие сведения:
В MathCad интерфейс пользователя содержит следующие составные части (рис.10.1).
Различают встроенные и пользовательские функции пакета MATHCAD.
Встроенная функция в среде пакета MathCAD кодируется в виде:
<имя функции>(<список аргументов>);
Для каждой встроенной функции число аргументов фиксировано. Встроенные функции разбиты на следующие категории: тригонометрические функции; гиперболические функции и др.
Пример использования встроенных функций:
1. Поместите курсор в нужное место создаваемого документа.
2. Выберите пункты меню — Math/Insert Function... - появится окно Insert Function. В левой части окна (Function name is...) перечислены все встроенные функции пакета MathCAD. В правой части окна (Return...) содержится краткое описание характеристик функции, имя которой выделено в левой части окна.
3. Выделите нужную функцию, нажмите кнопку Insert.
Пользовательская функция должна быть предварительно определена локально или глобально следующим способом:
<имя функции>(<список аргументов>){:= ½º}<выражение>;
где <список аргументов> — содержит имена переменных, разделенных запятыми; <имя функции> — любое допустимое имя.
При глобальном определении пользовательской функции все входящие в нее переменные (кроме аргументов) должны быть предварительно определены глобальными, или перед каждым использованием функции они должны быть определены любым способом. Иначе будет зафиксирована ошибка.
Пример. Определение функции пользователя
F(x,y):=x2∙cos(x+y)
В MathCAD различают два типа массивов:
- векторы (одноиндексные массивы), матрицы (двухиндексные) и тензоры (многоиндексные);
- ранжированные переменные – векторы, элементы которых определенным образом зависят от их индекса.
Пример. Одномерный массив (вектор) a0=14 a1=1.4 a2=4.7 Пример. Двумерный массив (матрица) a0,0=0.1 a1,0=3.7 a1,1=0 | Пример. Вывод ранжированной переменной Пример. Использование переменных и функций при определении матрицы |
Создание двухмерных графиков в среде пакета MathСad.
Для построения двухмерного графика необходимо установить курсор на свободное место в документе и нажать клавишу “ @ ” или выбрать команду Graphics / CreateX-YPlot главного меню. На экране будет отображена пустая графическая область (ГО) с 6 указателями. В ГО одна ось отводится под значения р-переменной, другая - под соответствующие значения р-выражения, являющегося функцией этой переменной (рис.10.1).
|
Рис.10.1- Создание двухмерных графиков в среде пакета MathСad
Вывод графика в документе:
1. Определить р-переменную и р-выражение, на место указателей ввести их имена и нажать клавишу F9 (если пакет находится в M — режиме).
. Если в (2) или (5) помещены имена р-переменной и выходной таблицы, то диапазоны изменения их значений можно не указывать — пакет расставляет их автоматически (помечая их уголками снизу) после вывода курсора из ГО или нажатия клавиши F9. Можно чередовать частичное определение значений диапазонов с их автоматическим доопределением. В качестве диапазонов значений должны быть скалярные действительные выражения (предварительно определенные).
2. Вывести курсор из ГО или нажать F9. Пакет вычислит точки искомого графика (“WAIT”), выведет их на экран (соединяя по умолчанию прямыми линиями) и сформирует недостающие значения диапазонов на осях графика (позиции (1), (3), (4) и (6)).
Пример. Построение графика для функции f(x)=x3+x-3
Для изменения графического формата надо дважды щелкнуть мышью на ГО. С помощью опций появившейся таблицы можно наносить сетку на график; менять разбиение осей графика с линейного на логарифмическое; автоматически или вручную менять частоту линий сетки; менять параметры и внешний вид любого из 16 графиков, которые могут быть построены одновременно в одной ГО.
Для выключения графиков из процесса вычисления надо выделить любую область документа (кроме текстовой) и выполнить команды Math / ToggleEquation. Повторное выполнение этих команд включает в вычислительный процесс ранее выключенную область.
Численное вычисление производных
1. Определите точку х, в которой будет вычислена производная.
2. Выведите оператор дифференцирования нажатием кнопки Derivative (Производная) на панели Calculus (Вычисления) или введите с клавиатуры вопросительный знак (“? ”).
3. В появившихся местозаполнителях введите функцию, зависящую от аргумента, и имя самого аргумента.
4. Введите оператор <=>.
Пример дифференцирования | функции пользователя |
В качестве переменных дифференцирования, констант и переменных дифференцируемой функции могут выступать р-переменные. В этом случае результатом дифференцирования является выходная таблица (или вектор), содержащая значения производной по всей совокупности значений р-переменных.
Пакет позволяет выводить график производной любой плоской функции или частной производной в заданной секущей плоскости.
Пример:
При проведении приближенных вычислений пакет использует значение предопределенной переменной TOL (по умолчанию TOL = 0.001). Процесс вычисления прекращается, если <TOL.
Задание
1. Изучите интерфейс пользователя пакета MathCad.
2. Настройте внешний вид панелей инструментов.
3. Реализуйте задачи на ЭВМ (задание согласовать с преподавателем).
Пример.
1. Вычислить функцию в MathСad .
Решение:
: |
Пример 2. Вычислить
.
Решение:
Контрольные вопросы:
1. Опишите интерфейс пользователя пакета MathCad.
2. Назовите функции пакета MathCad.
3. Как выполнять аналитические вычисления?
4. Как получать точные решения задач, содержащих переменные параметры?
5. Как представлять полученные результаты расчетов в виде графиков?
6. Назовите операции с векторами и матрицами.
7. Как решать уравнения, системы уравнений и неравенств?
Лабораторная работа №11
РЕШЕНИЕ СИСТЕМ ЛИНЕЙНЫХ АЛГЕБРАИЧЕСКИХ УРАВНЕНИЙ
Цель:
- изучить основные методы решения систем линейных алгебраических уравнений (СЛАУ);
- научиться составлять блок-схемы алгоритмов методов решения систем линейных алгебраических уравнений и реализовывать их на ЭВМ.
Общие сведения:
Дана система из n линейных уравнений вида
(11.1)
Коэффициенты aij и свободные члены ai0 можно представить как элементы расширенной матрицы
Решением системы называются числа x 1, x 2, …, xn, которые преобразуют каждое уравнение в тождество.
Систему (11.1) можно решать численными методами решения СЛАУ, которые делятся на точные и итерационные методы. Точные методы дают точное решение за конечное число операций, если они выполнены без погрешности. К точным методам относятся метод Гаусса, метод Крамера, метод вращения и др. У итерационных методов число операций зависит от заданной погрешности вычислений. Итерационные методы – метод итераций, метод Зейделя и др.
Метод Гаусса или метод последовательного исключения неизвестных основан на приведении матрицы коэффициентов аij к треугольному виду. Метод состоит из прямого и обратного ходов. Метод Гаусса с выбором главного элемента заключается в том, что при прямом ходе производится выбор наибольшего по модулю (главного) элемента и перестановка строк или столбцов. Последнее исключает деление на 0, если матрица А содержит нулевые элементы.
Алгоритм решения СЛАУ методом Гаусса.
Прямой ход.
1-й шаг. Исключаем неизвестную х1. Для этого выбираем разрешающий элемент al 1¹0, где l значение i, для которого , вводим преобразование Гаусса для вышеописанной системы: l-е уравнение делим на al 1 и получаем
где
умножаем последнее уравнение на ai 1, вычитаем из i -го уравнения системы и получаем
где
В последней системе не содержится x 1, т. е. получена система n -1 уравнений с n -1 неизвестным х 1,..., хn. К этой системе применяем преобразование Гаусса для исключения х 2 и т.д.
Пусть проведено k шагов, т. е. последовательно исключались неизвестные х 1,..., хk и получена система уравнений
где М – множество номеров уравнений i, которые остались послe k последовательных преобразований Гаусса, и уравнение для хk
Затем проводят k +1-й шаг. Среди i Î М выбирают значение i = р, для которого , делят р -е уравнение на и получают
где
Обратный ход.
Последнее уравнение умножают на , и вычитают из i -ro уравнения и получают
где
Процесс заканчивается, когда дальнейшее исключение неизвестных невозможно, т. е. нельзя найти такое хj, при котором коэффициент aij ¹0.
В конце процесса возможны три случая.
1. На последнем k -м шаге получают одно уравнение с одним неизвестным
и уравнение для xn -1
Тогда система имеет единственное решение, в котором
остальные решения хn -1, хn -2,..., х 1 получают с помощью последовательных обратных шагов:
2. На некотором k -м шаге k < n и в системе уравнений получится строка s, в которой все коэффициенты при неизвестных и свободный член равны нулю:
Тогда исходная система уравнений имеет бесконечно много решений.
3. На некотором k -м шаге k < n в системе уравнений получится строка s, в которой все коэффициенты при неизвестных равны нулю, а свободный член не равен нулю, т.е.
Это значит, что исходная система уравнений не имеет решения. Решение удобно проводить с помощью таблицы, где означает контрольную сумму:
Блок-схема алгоритма решения СЛАУ методом Гаусса приведена на рис.11.1.
Решение системы линейных уравнений методом Зейделя
При начальных приближениях xi 0 (i = 1, 2, …, n) вычисляют последовательные приближения по формуле итерационного процесса
до тех пор, пока , где j – номер итерации, e - заданная погрешность
вычислений. Итерационный процесс сходится, если величина модуля каждого диагонального элемента матрицы A больше суммы модулей остальных элементов. Начальные приближения задают в виде вектора [ xi 0].
Блок-схема алгоритма по методу Зейделя приведена на рис.11.2.
Решение системы линейных уравнений с помощью пакета MathСad.
В MathСad СЛАУ можно решить как в более наглядной форме с использованием вычислительного блока Given/Find, так и в более удобной для записи форме с помощью встроенной функции lsolve(A,b), где A – матрица коэффициентов системы; b – вектор правых частей.
Пример. Решить систему линейных уравнений
Решение СЛАУ
с помощью вычислительного блока |
Задание:
1. Изучите метод Гаусса и метод Зейделя и их модификации для решения СЛАУ.
2. Изучите блок-схемы алгоритмов метода Гаусса и метода Зейделя.
3. Решите систему линейных уравнений по заданному методу в среде Delphi (задание взять у преподавателя).
4. Решите систему линейных уравнений с помощью пакета MathСad.
|
Контрольные вопросы:
1. На какие группы делятся численные методы решения СЛАУ?
2. В чем заключается метод Гаусса?
3. Может ли разрешающий элемент равняться нулю?
4. Что такое расширенная матрица?
5. Какое назначение прямого и обратного хода метода Гаусса?
6. Какие преобразования осуществляются при прямом и обратном ходе?
7. В каком случае исходная система уравнений не имеет решения?
8. В каком случае исходная система уравнений имеет бесконечно много решений?
9. В чем заключается метод Жордана-Гаусса?
10. Поясните блок-схему алгоритма решения СЛАУ по методу Гаусса.
11. Опишите итерационные методы решения СЛАУ.
12. В чем заключается метод Зейделя?
13. Поясните блок-схему алгоритма решения СЛАУ по методу Зейделя.
14. Особенности реализации алгоритмов методов Гаусса и Зейделя на ЭВМ.
15. Как выполнить решение СЛАУ с помощью пакета Mathcad?
Лабораторная работа №12
Дата добавления: 2015-11-14; просмотров: 34 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
edit1.Clear;end; | | | ОБРАБОТКА ОПЫТНЫХ ДАННЫХ С ПОМОЩЬЮ ИНТЕРПОЛИРОВАНИЯ |