Курс лекций по дисциплине "Программирование и комьпютеры"

Автор работы: Пользователь скрыл имя, 11 Декабря 2013 в 22:12, курс лекций

Краткое описание

Delphi – это среда быстрой разработки, в которой в качестве языка про-граммирования используется язык Delphi. Язык Delphi – строго типизиро-ванный объектно-ориентированный язык, в основе которого лежит хорошо знакомый программистам Object Pascal. В настоящее время программистам стала доступна очередная версия пакета Delphi – Borland Delphi 7 Studio.

Вложенные файлы: 1 файл

лекции по проге.doc

— 748.50 Кб (Скачать файл)

Рассмотрим программу, которая вычисляет значение числа p с точностью, задаваемой пользователем во время работы программы. В основе алгоритма лежит тот факт, что сумма ряда 1 – 1/3 + 1/5 – 1/7 + 1/9 + … приближается к значению p/4 при достаточно большом количестве членов ряда. Каждый член ряда с номером i вычисляется по формуле 1/(2*i – 1) и умножается на минус единицу, если i – четное (определить, является ли i четным, можно проверкой остатка от деления на 2). Вычисление заканчивается тогда, когда значение очередного члена ряда становится меньше, чем заданная точность вычисления.

Вид диалогового окна программы  во время ее работы приведен на рис. 19. Текст программы приведен в листинге 10.

 

 

 

procedure TForm1.Button1Click(Sender: TObject); Листинг 10

var

   pi,t,e:real;

   i:integer;

begin

   t:=StrToFloat(edit1.Text);  // точность

   pi:=0;

   i:=1;

   e:=1;  { чтобы начать  цикл }

   while e>=t do

      begin

         e:=1/(2*i-1);

         if i mod 2 =0 then pi:=pi-e

                       else pi:=pi+e;

         i:=i+1;

      end;

      pi:=4*pi;

      label3.Caption:='ПИ равно '+FloatToStr(pi)+#13+

                      'Просуммировано '+IntToStr(i)+' членов ряда';

end;


Инструкция repeat

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

В общем виде инструкция repeat записывается в следующем виде:

repeat

   // тело цикла

until условие;

где условие – выражение логического типа, определяющее условие завершения цикла.

Инструкции тела цикла выполняются как минимум один раз. Для того чтобы цикл завершился, необходимо чтобы инструкции тела цикла изменяли значение переменных, входящих в выражение условие.

Попробуйте самостоятельно, не заглядывая в листинг 11, переделать программу, вычисляющую число p, используя инструкцию repeat.

procedure TForm1.Button1Click(Sender: TObject); Листинг 11

var

   pi,t,e:real;

   i:integer;

begin

   t:=StrToFloat(edit1.Text);  // точность

   pi:=0;

   i:=1;

   e:=1;  { чтобы начать цикл }

   repeat

      begin

         e:=1/(2*i-1);

         if i mod 2 =0 then pi:=pi-e

                       else pi:=pi+e;

         i:=i+1;

      end;

      until e<t;

      pi:=4*pi;

      label3.Caption:=' ПИ равно '+FloatToStr(pi)+#13+

                      ' Просуммировано '+IntToStr(i)+' членов ряда ';

end;


 

Контрольные вопросы  к лекции 4

  1. Для чего нужны циклы?
  2. при помощи каких инструкций в программе может быть реализован цикл?
  3. Сколько раз будет выполнена последовательность операторов между begin и end, если в инструкции for начальное значение счетчика больше конечного?
  4. Как поведет себя значение счетчика цикла, если в инструкции for вместо слова to записать downto?
  5. Когда используется инструкция while?
  6. Какое значение должно иметь условие перед выполнением инструкции while, чтобы инструкции цикла, которые находятся между словами begin и end были выполнены хотя бы один раз?
  7. Когда прекращается выполнение тела цикла в инструкции repeat?

 

МАССИВЫ


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

Имя: array[нижний_индекс..верхний_индекс] of тип;

где

  • Имя – имя массива;
  • аrray – зарезервированное слово, обозначающее массив;
  • нижний_индекс и верхний_индекс – целые константы, определяющие диапазон изменения индекса массива;
  • тип – тип элементов массива.

Примера объявления массивов:

t: array[1..31] of real;     k: array[0..2] of integer;     name: array[1..30] of string[25];

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

Имя: array [нижний_индекс..верхний_индекс] of тип = (список);

где список – разделенные запятыми значения элементов массива.

 

Например:

Team: array[1..5] of string[10] = (‘Зенит’,’Динамо’,’Спартак’,’Ротор’,’СКА’);

Обратите внимание, что  количество элементов списка инициализации должно соответствовать размерности массива.

Локальный массив можно  инициализировать только во время работ  программы, например, так:

for i:=1 to 10 do

   a[i]:=0;

Для ввода массива удобно использовать компонент StringGrid, значок которого находится на вкладке Fdditional (Рис. 20).

Компонент StringGrid представляет собой таблицу, ячейки которой содержат строки символов. В табл. 4 перечислены некоторые свойства компонента StringGrid.

 

 

 

Таблица 4

Свойство

Определяет

ColCount

RowCount

Cells

 

 

FixedCols

 

 

FixedRows

 

 

Options.goTab

 

Font

ParentFont

Количество колонок  таблицы

Количество строк таблицы

Соответствующий таблице  двумерный массив. Ячейка таблицы, находящаяся на пересечении столбца номер col и строки номер row определяется элементом Cells[col,row]

Количество зафиксированных  слева колонок таблицы. Зафиксированные колонки выделяются цветом и при горизонтальной прокрутке таблицы остаются на месте

Количество зафиксированных  сверху строк таблицы. Зафиксированные строки выделяются цветом и при вертикальной прокрутке таблицы остаются на месте

Разрешает (True) или запрещает (False) использование клавиши <Tab> для перемещения курсора в следующую ячейку таблицы.

Шрифт содержимого таблицы.

Признак наследования характеристик  шрифта формы


Пример вывода массива приведен в листинге 12. Форма проекта в  процессе его работы показана на рис. 21.

В этом примере следует  обратить внимание на то, что массив tabl строкового типа объявлен как глобальный, т.е. не внутри описания процедуры TForm1.Button1Click, а до нее. Кроме того, размер массива nt=5 и длина слов (элементов массива) sn=10 описаны как инициализированные константы перед объявлением массива.

const nt=5; sn=10; Листинг 12

var

   tabl:array[1..nt] of string[sn]=

        ('Зенит','Динамо','Ротор','Спартак','СКА');

procedure TForm1.Button1Click(Sender: TObject);

var

   st:string;  // список команд

   i:integer;

begin

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

   for i:=1 to nt do st:=st+IntToStr(i)+'  '+tabl[i]+#13;

   // вывод списка

   label1.Caption:=st;

end;


В качестве примера использования  компонента StringGrid для ввода массива рассмотрим программу, которая вычисляет среднее арифметическое значение элементов массива. Диалоговое окно программы приведено на рис. 22, текст программы – в листинге 13.

В табл. 5 показаны некоторые  свойства компонента StringGrid. Нужно учитывать, что колонки и строки таблицы нумеруются с нуля.

Табл. 5


Свойство Значение


ColCount  5

FixedCols  0

RowCount  1

Options.goTabs True


 

 

procedure TForm1.Button1Click(Sender: TObject); Листинг 13

var

   a:array[0..4] of real;

   s:real;

   i:integer;

begin

   s:=0;         

   for i:=0 to 4 do

      begin

         if Length(StringGrid1.Cells[i,0])<>0

            then a[i]:=StrToFloat(StringGrid1.Cells[i,0])

            else a[i]:=0; // если ячейка пустая,

                                  то соответствующий элемент массива равен 0

         s:=s+a[i];

      end;

   s:=s/5;

   label2.Caption:='Среднее  арифметическое '+FloatToStr(s);

end;


Использование компонента Memo

Для ввода массива можно использовать компонент Memo, который позволяет вводить текст, состоящий из большого количества строк, поэтому его удобно использовать для ввода символьного массива. Значок компонента Memo находится на вкладке Standard (Рис. 23).

В табл. 6 перечислены  некоторые свойства компонента Memo.

Таблица 6

Свойство

Определяет

Text

Lines

Текст, находящийся в  поле Memo. Рассматривается как единое целое

Текст, находящийся в  поле Memo. Рассматривается как совокупность строк. Доступ к строке осуществляется по номеру


 

Получить доступ к  находящейся в поле Memo строке текста можно при помощи свойства Lines, указав в квадратных скобках номер нужной строки (строки нумеруются с нуля). Основной цикл процедуры ввода символьного массива из компонентов Memo может выглядеть так:

for i:=1 to SIZE do

   a[i]:= Memo1.Lines[i];

где

    • SIZE – именованная константа, определяющая размер массива;
    • а – массив;
    • Memo1 – имя Memo-компонентов;
  • Lines – свойство компонента Memo, представляющее собой массив, каждый элемент которого содержит одну строку находящегося в поле Memo текста.

Следующая программа, текст  которой приведен в листинге 14, демонстрирует использование компонента Memo для ввода символьного массива.

Форма программы в процессе ее работы приведена на рис. 24, а.

Поле Memo1 первоначально пусто, оно заполняется, когда программа запущена.

Процедура TForm1.Button1Click, обрабатывающая щелчок по кнопке Ввод, сначала проверяет, есть ли в поле Memo1 текст. Если текст есть (в этом случае значение свойства Lines.Count больше нуля), то процедура сравнивает количество введенных строк и размер массива (массив а объявлен перед описанием процедур как глобальный массив, имеющий 5 строк). Если количество введенных строк превышает размер массива, то программа изменяет значение n, подготавливая ввод только первых пяти строк. Появляется окно (рис. 24, б), которое содержит значения элементов массива, полученные из Memo-поля. Введенный массив обрабатывается процедурой TForm1.Button2Click, осуществляющей поиск по введенному в поле Edit1 образцу. Если одна из строк массива совпадает с образцом, программа выводит окно с соответствующим сообщением (рис. 24 в).

var a:array[1..5] of string[30]; Листинг 14

 

procedure TForm1.Button1Click(Sender: TObject);

var

   n:integer;  // количество строк

   i:integer;

   st:string;

begin

   n:=Memo1.Lines.Count;

   if n=0 then

      begin

         ShowMessage('Исходные данные не введены!');

         Exit;  // Выход из процедуры

      end;

   if n>5 then

      begin

         ShowMessage('Количество строк превышает размер массива');

         n:=5;  // будем вводить только  первые 5 строк

      end;

   for i:=1 to n do

   a[i]:=Memo1.Lines[i-1]; // строки Memo пронумерованы с нуля

   st:='Введенный  массив:'+#13;

   for i:=1 to n do st:=st+IntToStr(i)+' '+a[i]+#13;

   ShowMessage(st);

end;

 

procedure TForm1.Button2Click(Sender: TObject);

var

   obr:string; // образец для поиска

   found:boolean; // TRUE - совпадение образца с элементом  массива

   i:integer;

begin

   obr:=edit1.text;

   found:=false; // пусть нужного элементата в массиве нет

   i:=1;

   repeat

      if a[i]=obr then found:=TRUE else i:=i+1;

   until (i>5) or (found=TRUE);

   if found then ShowMessage('Совпадение с элементом № '+

                             IntToStr(i))

            else ShowMessage('Совпадений с образцом нет');

end;

 

procedure TForm1.Button3Click(Sender: TObject);

begin

   Close;

end;


Для закрепления материала  составьте программу ввода массива  действительных чисел и поиска в нем максимального. Форма может иметь вид, показанный на рис. 25.

Для нахождения максимального  числа в массиве воспользуйтесь дополнительной переменной, которой присвойте заведомо маленькое значение, например (-124). Затем в цикле сравнивайте эту переменную с каждым элементом массива и, если она меньше очередного элемента массива, присвойте ей значение этого элемента.

Если возникнут трудности  в составлении программы, загляните  в листинг 14.

procedure TForm1.Button1Click(Sender: TObject);                          Листинг 14

var

   a:array[1..100] of real;

   n,i,j:integer;

   b:real;

   s:string;

begin

   b:=-1E24;      // заведомо маленькое число

   n:=Memo1.Lines.Count;

   for i:=1 to n do

   begin

      { строки Memo пронумерованы с нуля }

      a[i]:=StrToFloat(Memo1.Lines[i-1]);

      if a[i]>=b then

         begin

            b:=a[i];

            j:=i;

         end;

   end;

   s:='Максимальное число'+#13+FloatToStr(b)+#13+'имеет номер '+IntToStr(j);

   label1.Caption:=s;

end;


Многомерные массивы

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

Имя: array[Нижняя_граница1..Верхняя_граница1,

                   Нижняя_граница2.. Верхняя_граница2]  of Тип

где:

  • Имя – имя массива;
  • array – слово, указывающее, что объявленный элемент является массивом;
  • Нижняя_граница1, Верхняя_граница1, Нижняя_граница2, Верхняя_граница2 – целые константы, определяющие диапазон изменения индексов;
  • Тип – тип элементов масси<span class="dash041e_0441_043d_043e_0432_043d_043e_0439_0020_0442

Информация о работе Курс лекций по дисциплине "Программирование и комьпютеры"