Поиск

Полнотекстовый поиск:
Где искать:
везде
только в названии
только в тексте
Выводить:
описание
слова в тексте
только заголовок

Рекомендуем ознакомиться

Информатика, программирование->Контрольная работа
В языке C блоком считается последовательность объявлений, определений и операторов, заключенная в фигурные скобки. Объект языка C может быть объявлен ...полностью>>
Информатика, программирование->Контрольная работа
Препроцессор языка C – это программа, выполняющая обработку исходного кода для передачи его компилятору, в процессе которой происходит подстановка дир...полностью>>
Информатика, программирование->Контрольная работа
Для изменения порядка интерпретации можно использовать круглые скобки. Если при выполнении пункта 2 справа встречается закрывающая круглая скобка, то ...полностью>>
Информатика, программирование->Контрольная работа
Поле имя_типа определяет имя нового перечислимого типа. Поле список_названий определяет имена констант перечислимого типа и их значения. Имена констан...полностью>>

Главная > Лекция >Информатика, программирование

Сохрани ссылку в одной из сетей:

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

type

TForm1 = class(TForm)

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Edit1: TEdit; // спортсмен

ComboBox1: TComboBox; // страна

ComboBox2: TComboBox; // вид спорта

RadioGroup1: TRadioGroup; // медаль

Button1: TButton; // кнопка Добавить

Label5: TLabel;

Label4: TLabel;

procedure FormActivate(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

// тип медали

TKind = (GOLD, SILVER, BRONZE);

// запись файла

TMedal=record

country: string[20]; // страна

sport: string[20]; // вид спорта

person: string[40]; // спортсмен

kind: TKind; // медаль

end;

var

Form1: TForm1;

f: file of TMedal; // файл записей – база данных

implementation

{$R *.DFM}

// активация формы

procedure TForm1.FormActivate(Sender: TObject);

var

resp : word; // ответ пользователя

begin

AssignFile(f, 'a:\medals.db');

{$I-}

Reset(f); // открыть файл

Seek( f, FileSize(f)); // указатель записи в конец файла

{$I+}

if IOResult = 0 then button1.enabled:=TRUE // теперь кнопка Добавить доступна

else

begin

resp:=MessageDlg('Файл базы данных не найден.' +

'Создать новую базу данных?', mtInformation,[mbYes,mbNo],0);

if resp = mrYes then

begin

{$I-}

rewrite(f);

{$I+}

if IOResult = 0 then button1.enabled:=TRUE

else ShowMessage('Ошибка создания файла БД.');

end;

end;

end;

// щелчок на кнопке Добавить

procedure TForm1.Button1Click(Sender: TObject);

var

medal: TMedal;

begin

with medal do

begin

country := ComboBox1.Text;

sport := ComboBox2.Text;

person := Edit1.Text;

case RadioGroup1.ItemIndex of

0: kind := GOLD;

1: kind := SILVER;

2: kind := BRONZE;

end;

end;

write(f, medal); // записать содержимое полей записи в файл

end;

// завершение работы программы

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

CloseFile( f ); // закрыть файл

end;

end.

Процедура TForm1.FormActivate открывает файл базы данных для добавления. Здесь следует обратить внимание на то, как это реализовано. Процедуру AppendFile, которая открывает файл для добавления в конец, использовать нельзя, т. к. файл не является текстовым. Поэтому файл сначала открывается процедурой Rewrite в режиме перезаписи, а затем процедура Seek устанавливает указатель чтения/записи в конец файла. Параметром процедуры seek является функция Fiiesize, значение которой равно размеру файла (в байтах).

Процедура TForm1.Button1Click, которая запускается нажатием кнопки Добавить (Button1), выполняет непосредственное добавление записи в файл. Поля country и sport добавляемой записи заполняются из свойства Text комбинированных списков Страна (comboBox1) и Вид спорта (ComboBox2).

Поле person формируемой записи заполняется из поля ввода Спортсмен (компонент Edit1), а содержимое поля medal определяется выбранной кнопкой компонента RadioGroup1.

Процедура TForm1. FormClose закрывает файл базы данных поскольку тип TMedal используется двумя процедурами (TForm1.FormActivate и TForm1.Button1Сlick), то его описание помещено в раздел type модуля формы. Объявление файловой переменной f по этой же причине помещено в раздел объявления переменных модуля формы.

В приведенном варианте программы предполагается, что списки стран и названий видов спорта формируются при помощи редактора списка строк во время разработки формы. Вместе с тем, список можно сформировать во время разработки программы. Для этого надо к свойству items применить метод Add. Например, список стран может быть сформирован при помощи следующих инструкций (их нужно поместить в процедуру Tform1.FormActivate):

Form1.ComboBox1.Item.Add('Россия');

Form1.ComboBox1.Item.Add('Австрия');

Form1.ComboBox1.Item.Add('Германия');

Form1.ComboBox1.Item.Add('Франция');

Чтение записи из файла

Рассмотрим программу, демонстрирующую процесс чтения и обработки записей файла. Программа Чтение записей из файла открывает файл, сформированный программой Добавление записи в файл, и, в зависимости от того, какой из переключателей все или выбрать – установлен, выводит список медалей, выигранных соответственно представителями всех стран или страны, название которой введено в поле Страна. Для вывода результата чтения из файла используется компонент Memo1. В табл. 2 приведены значения свойств компонентов формы. Так как компонент Memo1 предназначен только для просмотра информации, то свойству Readonly (только чтение, просмотр) присвоено значение True. Свойство scrollBars (полосы прокрутки) компонента Memo позволяет задавать отображаемые полосы прокрутки. По умолчанию свойству scrollBars присвоено значение ssNone, т. е. полосы прокрутки не отображаются. В рассматриваемом примере выводится вертикальная полоса, поэтому свойству ScrollBars присвоено значение ssVertical.

Таблица 2. Значения свойств компонентов

Свойство

Значение

RadioButton1 . Checked

True

Label1 .Enabled

False

ComboBox1 . Enabled

False

Memo1 . Readonly

True

Memo1. ScrollBars

ssVertical

Для ввода названия страны используется компонент ComboBox1, что позволяет задавать имя не только прямым вводом названия, но и выбором из списка. Список стран нужно сформировать во время создания формы путем присвоения значения свойству items. Чтобы сразу после запуска программы список выбора страны был недоступен (т. к. выбран переключатель все группы Показать), свойству Enabled компонентов ComboBox1 и Label1 во время создания формы нужно присвоить значение False.

Список ввода-выбора названия страны (ComboBox1) становится доступным в результате выбора во время работы программы переключателя выбрать. Процедура обработки события Onclick на переключателе RadioButton2 делает доступным поле ComboBox1.

Листинг 2. Чтение записей из файла

unit rdrec_;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TForm1 = class(TForm)

RadioButton1: TRadioButton; // переключатель Все

RadioButton2: TRadioButton; // переключатель Выбрать

ComboBox1: TComboBox; // комбинированный список для ввода названия страны

Memo1: TMemo; // поле вывода записей, удовлетворяющих условию запроса

Button1: TButton; // кнопка ОК

GroupBox1: TGroupBox;

Label1: TLabel; // текст Страна

procedure Button1Click(Sender: TObject);

procedure RadioButton2Click(Sender: TObject);

procedure RadioButton1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

type

// тип медали

TKind = (GOLD,SILVER,BRONZE);

// запись файла

TMedal = record

country:string[20];

sport:string[20];

person:string[40];

kind:TKind;

end;

var

f: file of TMedal; // файл записей

rec: TMedal; // запись, прочитанная из файла

n: integer; // количество записей, удовлетворяющих запросу

st: string[80];

begin

AssignFile(f,'a:\medals.db');

{$I-}

Reset(f); // открыть файл для чтения

{$I-}

if IOResult <> 0 then

begin

ShowMessage('Ошибка открытия файла БД.');

Exit;

end;

// обработка БД

if RadioButton2.Checked then

Memo1.Lines.Add('*** ' + ComboBox1.Text + ' ***');

n := 0;

Memo1.Clear; // очистить список поля Memo

while not EOF(f) do

begin

read(f, rec); // прочитать запись

if RadioButton1.Checked or (rec.country = ComboBox1.Text) then

begin

n := n + 1;

st := rec.person + ', ' + rec.sport;

if RadioButton1.Checked then

st := st + ', '+ rec.country;

case rec.kind of

GOLD: st := st+ ', золото';

SILVER:st := st+ ', серебро';

BRONZE:st := st+ ', бронза';

end;

Memo1.Lines.Add(st);

end;

end;

CloseFile(f);

if n = 0 then

ShowMessage('В БД нет запрашиваемой информации.');

end;

// переключатель Выбрать

procedure TForm1.RadioButton2Click(Sender: TObject);

begin

Label1.Enabled := True;

ComboBox1.Enabled := True; // теперь поле Страна доступно

ComboBox1.SetFocus; // курсор в поле Страна

end;

// переключатель Все

procedure TForm1.RadioButton1Click(Sender: TObject);

begin

Label1.Enabled := False;

ComboBox1.Enabled := False; // теперь поле Страна не доступно

end;

end.

Процедура TForm1.Button1Click открывает файл и последовательно считывает находящиеся в нем записи. Содержимое записи добавляется в поле Memo1, если прочитанная запись удовлетворяет условию запроса, т. е. содержимое поля country совпадает с названием страны, введенным пользователем в поле редактирования компонента ComboBox1, или если выбран переключатель RadioButton1. Информация в поле Memo добавляется инструкцией Memo1.Lines.Add(st), которая является инструкцией применения метода Add (Добавить) к компоненту Memo1.

Динамические структуры данных

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

Указатели

Обычно переменная хранит некоторые данные. Однако помимо обычных, существуют переменные, которые ссылаются на другие переменные. Такие переменные называются указателями. Указатель – это переменная, значением которой является адрес другой переменной или структуры данных.

Указатель, как и любая другая переменная программы, должен быть объявлен в разделе объявления переменных. В общем виде объявление указателя выглядит следующим образом:

Имя: ^ Тип;

где:

  • имя – имя переменной-указателя;

  • Тип – тип переменной, на которую указывает переменная-указатель;

значок ^ показывает, что объявляемая переменная является указателем.

Примеры объявления указателей:

p1: ^integer;

р2: ^real;

В приведенном примере переменная p1 – это указатель на переменную типа integer, a p2 – указатель на переменную типа real. Тип переменной, на которую ссылается указатель, называют типом указателя. Например, если в программе объявлен указатель р: ^integer, то говорят: ^р – указатель целого типа" или "р – это указатель на целое".

В начале работы программы переменная-указатель "ни на что не указывает". В этом случае говорят, что значение указателя равно NIL. Зарезервированное слово NIL соответствует значению указателя, который ни на что не указывает. Идентификатор NIL можно использовать в инструкциях присваивания и в условиях. Например, если переменные pi и р2 объявлены как указатели, то инструкция

p1 := NIL;

устанавливает значение переменной, а инструкция

if р2 = NIL then ShowMessage('Указатель р2 не инициализирован!');

проверяет, инициализирован ли указатель р2.

Указателю можно присвоить значение – адрес переменной соответствующего типа (в тексте программы адрес переменной – это имя переменной, перед которым стоит оператор @). Ниже приведена инструкция, после выполнения которой переменная р будет содержать адрес переменной n.

р := @n;

Помимо адреса переменной, указателю можно присвоить значение другого указателя при условии, что они являются указателями на переменную одного типа. Например, если переменные p1 и р2 являются указателями типа integer, то в результате выполнения инструкции

p2 := p1;

переменные pi и р2 указывают на одну и ту же переменную.

Указатель можно использовать для доступа к переменной, адрес которой содержит указатель. Например, если р указывает на переменную 1, то в результате выполнения инструкции

р^ : = 5;

значение переменной i будет равно пяти. В приведенном примере значок ^ показывает, что значение пять присваивается переменной, на которую указывает переменная-указатель.



Загрузить файл

Похожие страницы:

  1. Типы данных, определяемые пользователем (агрегативные типы данных)

    Контрольная работа >> Информатика, программирование
    Типы данных, определяемые пользователем (агрегативные типы данных) Язык C позволяет программисту создавать следующие типы данных: переименование типов перечислимый тип структура битовые поля ...
  2. Способы описания различных типов данных в программах на языке Delphi

    Практическая работа >> Информатика, программирование
    ... типов данных Object Pascal поддерживает простые типы данных, определяемые самим программистом. К ним относятся перечислимый и интервальный типы. Данные этих типов ...
  3. Типы данных в языке Паскаль

    Реферат >> Информатика
    ... значений, принадлежащим типу. Предикатной функцией, определяющей принадлежность объекта к данному типу Необходимость использования типов данных Типы данных различаются начиная ...
  4. Информационные данные

    Контрольная работа >> Информатика
    ... ASCII таблицы. Перечислимый тип Перечислимый тип представляет собой упорядоченный тип данных, определяемый программистом, т.е. программист перечисляет все значения ...
  5. Структурные типы данных

    Лекция >> Информатика, программирование
    ... данных, определяемые программистом, описываются в специальном разделе - разделе типов. Раздел типов определен синтаксической диаграммой: Раздел типов Перечисляемый тип данных ...

Хочу больше похожих работ...

Generated in 0.0019609928131104