Среда программирования delfi 2.0☛Уроки программирования ✎ |
В Delphi визуальная часть просто "лепится", как скульптор из кусков глины лепит фигуру. Центром "лепки", холстом, где будут разворачиваться все события программы является форма (Form), а уже в форме "лепим" компоненты, которые доступны в Delphi.
Сначала будем считать, что каждой форме соответствует один модуль. Еще раз заметим, что в форме создается интерфейс, то есть "лепятся" компоненты, а в модуле описываются события, которые могут происходить с этими компонентами
Type TForm1 = class (TForm) - создана форма относится к классу Tform. Tform - абстрактный объект, в котором описаны все события и возможности управления всеми элементами формы. Он является наследником класса Tform, то есть, наследует его свойства и методы, добавляя к ним собственные.
Если в перечне свойств объекта встречается свойство, в которой слева есть символ +, то это значит, что это свойство имеет группу параметров, к которым можно добраться дважды щелкнув левой кнопкой мыши в это свойство.
- Вставить текст, поясняющий назначение элементов на форме (надписи или метки) или просто текст. Также может использоваться для вывода информации на экран. Достаточно щелкнуть мышкой в и затем щелкнуть где-то на поле формы. На экране это отразится следующим образом:
Но главным для кнопки являются не ее внешний вид, но то, что будет происходить при, например, нажатии на нее, двойном нажатии и др. Понятно, что для каждого объекту должно быть главное событие.
• Для формы главным событием является создание форме компонент и изменение параметров как своих, так и компонент. Все действия происходят при запуске формы.
• Для кнопки, как и для статического текста, главным событием является нажатие на кнопку или текст соответственно.
Далее, двигаясь вниз мы будем прибавлять подпункты меню (следует указывать их названия), и вправо - пункты меню. Если щелкнуть на любой из подпунктов меню дважды левой кнопкой мыши, то автоматически создастся подпрограмма, в которой надо указать последовательность операторов, которые будут выполняться при выборе соответствующего пункта меню при работе программы. Меню располагается в программе автоматически в левом верхнем углу окна программы.
текстовое окно. Используется для вывода более одной строки текста в окно с возможностью просмотра (прокрутки) текста вверх-вниз. Видимая ширина строке зависит от ширины окна ListBox. На экране выглядит
Например, нужно с помощью полосы прокрутки установить значение целой переменной и, что может принимать значения от 10 до 100 с шагом 5 (т.е. может принимать значения 10, 15, 20, 25, 30 ,..., 90, 95, 100).
Для установки значений следует указать начальные значения. Для этого надо сделать это либо через параметр Radiogroup1.Items (как это делалось в ListBox) или программно. В первом случае на экран будет выведено окно, в котором можно ввести строки. Например введем 3 строки
порядковый номер выбранного значения в списке. По умолчанию он имеет значение -1. Нумерация строк осуществляется от 0. То есть при выборе первой строки значения RadioGroup1.ItemIndex будет 0.
Уничтожение, добавление и вставка строке осуществляется так же, как и в ListBox, только названием объекта является не ListBox, а RadioGroup. То есть используются процедуры RadioGroup1.Items.Append, RadioGroup1.Items.Clear, RadioGroup1.Items.Delete, RadioGroup1.Items.Insert соответственно.
Все ячейки таблицы образуют двумерный массив строк (см. типы переменных). Программное обращение к каждой клеточке ведется по номеру столбца и строки. Нумерация строк и столбцов ведется с 0. Например ячейка, расположенная в 3-й строке 2-го столбца имеет значение StringGrid1.Cells [nc, nr], где nc - номер столбца, nr - номер строки.
количество строк и столбцов соответственно, имеющие серый (более темный) цвет, чем другие ячейки и используются только для вывода информации программой (т.е. в эти ячейки невозможно внести изменения направления в таблице с клавиатуры). Как правило это строки с описанием колонок или строк. В нашем случае оба значения равны 1. Если, например установить FixedCols = 2 и FixedRows = 3, то таблица в форме будет иметь вид
По умолчанию таблица StringGrid используется только для вывода информации на экран. Чтобы значения, записанные в ячейках (кроме обособленных через FixedCols и FixedRows), необходимо установить дважды щелкнув левой кнопкой мыши в и в открывшемся окне, установить для параметра значение True. Можно это сделать в программе при выполнении
Активизации диалога можно достичь с помощью проверки параметра execute, который принимает значение True (правда), если файл был выбран, и False, если нет. Имя выбранного файла присваивается параметру FileName, что строчный тип (см. Строки).
Например, если у нас есть объект OpenDialog1, то с помощью запуска условного оператора if (см. раздел Работа с текстовыми файлами) мы получим имя выбранного файла в OpenDialog1.FileName есть:
Под описанием символов понимают перечень всех допустимых символов, под описанием элементарных конструкции - правила их создания, описание выражений правила создания выражений, имеющих смысл в конкретном языке, а описание операторов является рассмотрением всех типов операторов, допустимых в данном языке. Описание каждого элемента языка задается его синтаксисом и семантикой.
Оператор определяет полное описание некоторого действия, которую необходимо выполнить. Для описания сложных действий может потребоваться даже группа операторов. В этих случаях операторы объединяются в сложные операторы и блоки.
1. Буквы латиницы - большие и маленькие (pascal при выполнении программы не различает большая буква имела - размер букв используется только для удобства написании программы)
Имя - это последовательность букв и цифр, начинается всегда с буквы. В именах допускается символ подчеркивания _. Имя может состоять из произвольного количества символов, хотя значимой является только последовательность из не более чем 63 символов. В Pascal запрещено использовать служебные слова и стандартные константы, типы, процедуры, функции как имена файлов.
Для улучшения наглядности программы в Pascal можно вставлять пробелы и пустые строки. По крайней мере один пробел необходимо вставлять между двумя последовательными именами, числами или стандартными или служебными именами. Пробелы не допускается вставлять внутри имен и чисел.
В математике переменные классифицируются в соответствии с их главных характеристик. Осуществляется строгое разграничение между действительными, комплексными и логическими переменными, между переменными, является отдельной переменной и множеством переменных и т.д.
• Любой тип данных определяет множество значений, к которому принадлежит константа, которые могут принимать переменные и функции, или генерировать операция или функция;
• К произвольному порядкового типа можно применить стандартную функцию Ord, которая, как результат, возвращает порядковый номер конкретного значения в данном типе
• К произвольному порядкового типа можно применить стандарте функции Pred и Succ, возвращающих, как результат, следующее или предыдущее значение соответственно
• К произвольному порядкового типа можно применить стандартные функции Low и High, возвращающих наибольшее и наименьшее значения величин данного типа
Символьный тип, или тип Char, определяет упорядоченную совокупность символов, допустимых в данной ЭВМ. Значение символьной переменной или константы - это один символ из допустимого набора. Символьную константу можно записать в программе тремя методами:
• С помощью конструкции # N, где N - код соответствующего символа, причем значение кода должна быть в пределах 0 .. 255 (# 48 # 55 # 128)
Тип констант определяется по их виду: Константы целого типа - это целые числа, не имеющие десятичной точки, константы действительного типа - действительные числа, логические константы - True или False, символьные - или строки длиной в один символ, либо конструкции вида # K или ^ K и др.
Переликовий тип ограничена упорядоченной последовательностью однотипных скалярных констант, и составляют этот тип. Значение каждой константы задается ее именем. Имена отдельных констант отделяют друг от друга запятыми, а вся совокупность констант, составляет переликовий тип, ограничивается круглыми скобками.
Каждое значение является константой своего типа и может принадлежать только одному из перечисленных типов, заданные в программе. Например типы turn не может быть определенным в одной программе с типом move за того, что оба типа содержат одинаковые константы left и right.
Упорядоченная последовательность значений, составляет переликовий тип, автоматически нумеруется, начиная с 0 и далее через 1. Отсюда следует, что к переликових переменных и констант можно применять стандартные функции Pred, Succ и Ord.
Отрезок произвольного порядкового типа может быть определено как интервальный или ограниченный тип. Отрезок задается диапазоном от маленького до самого большого значения констант, разделенных двумя точками "..". Константы могут использоваться целого, символьного, логического (булевские) и переликового типов. Скалярное тип, на котором базируется отрезок, называется базовым типом.
Для задания начальных значений (инициализация переменных) Delphi Pascal, как и все предыдущие версии Pascal, позволяет присваивать значения переменным одновременно с их описанием. Для этого используется конструкция
Массив - это ограниченная упорядоченная совокупность однотипных величин. Каждая отдельная величина называется компонентой массива. Тип компонент массива может быть произвольным, из тех, которые применимы в Delphi, кроме файлового типа. Тип компонент называется базовым типом. Вся совокупность компонент определяется одним именем. Для определения отдельных компонент используется конструкция, называемая переменной с индексом или индексами.
Заметим, что при работе с массивами надо внимательно следить, чтобы в программе не происходило обращение к несуществующему элементу массива. Например, если массив А у нас состоит из 100 элементов с номерами от 1 до 100, то обращение к a [0] или a [101] является недопустимым.
Особое место в Delphi занимают массивы символов, или строки String. Стандартные переменные элементов формы, используемые для ввода или вывода информации, такие как Label.Caption, Form.Caption, Edit.Text, Button.Caption и другие имеют строковый тип.
Символьная строка может быть либо строчной константой, или строчной переменной. Строчная константа, или строка, является совокупностью символов, ограниченной апострофами. Строка - элементарная конструкция языка Delphi Pascal.
Если размер текстового строке при присвоении превышает допустимую описанную количество символов для данной переменной, то Delphi сохранит только столько первых символов строки, какое количество указана при описании переменного (типа).
Отметим, что при использовании строчной переменной, как массива символов, нижняя граница индекса равен 1. Кроме того 0-й элемент строке содержит информацию о длине всей строки в виде конструкции # N, где N - число в диапазоне от 0 до 255.
Для сравнения строк можно применять все операции отношения. Сравнение строк осуществляется посимвольно, начиная с первого символа. Строки считаем одинаковыми, если они имеют одинаковую длину и совпадают посимвольно.
При введении строчных переменных, количество символов в строке может быть как больше, чем описанная длина строки (рассмотрено выше), так и меньше. В последнем случае символы, которые были введены, расположатся в начале, остальные же строке будет заполнена пробелами.
Еще одним важнейшим компонентом программы на Delphi есть процедуры и функции. Как уже отмечалось выше, главный файл проекта просто запускает на выполнение форму со всеми ее событиями, поэтому тела программы, как такового (как это было в предыдущих версиях языка Pascal) уже нет.
Подпрограмма - это поименована (т.е. каждая подпрограмма имеет свое уникальное для данной программы или модуля имя) последовательность операторов, которые определены и записаны только в одном месте программы (модуля), так что их можно использовать при выполнении одного или нескольких фрагментов программы (модуля ). Это делается в двух случаях:
1. Одинаковая последовательность операторов используется во многих моментах реализации алгоритма. Тогда для экономии места и объема программы эту последовательность операторов "выносят" до подпрограммы, а потом просто вызывают эту подпрограмму в соответствующих моментах.
Последовательность текстов процедур и функций должно идти в порядке возрастания вложенности. То есть сначала описываются процедуры, которые не используют нестандартных процедур и функций, затем те, которые могут использовать написанную подпрограммы, описанные выше в программе.
Переменные, константы, и другие описательные блоки подпрограммы "работают" только в этой подпрограмме (локальные переменные, локальные типы и др.). Кроме того подпрограмма может использовать все переменные, типы и др., описанные в самом модуле (перед текстом подпрограммы).
Функция extent имеет 3 параметра, которые передаются ему управляющей программой, модулем или иной подпрограммой. Первые два параметра a и b (действительный и целый) передаются в функцию для использования, причем их значения функцией не возвращаются в родительский подпрограмму (т.е. подпрограмму, откуда вызывается эта функция). Третий параметр (булевские или логического типа) также используется в функции, но его значение возвращается в родительский подпрограммы.
Недопустимость вызова проистекает из того, что после выполнения всех операторов функции extent в родительскую подпрограмму передается кроме самого значения функции еще и значение параметра (в нашем случае это третий параметр bb: boolean), которое не может передаться через то, что третьим параметром выступает не переменная , а ее значение.
В отличие от функции, в ее заголовке нет имени типа для значений, порождаемых в результате вызова, потому что никакие значения не порождаются. По этой же причине в теле функции не может быть операторов присваивания с ее именем в левой части. Вызов процедуры состоит из имени и аргументов в скобках и записывается как отдельный оператор.
Процедуры целесообразно использовать в тех случаях, когда в разных местах программы необходимо выполнить одинаковую последовательность операций с разными параметрами. Например, во многих алгоритмах сортировки часто используется последовательность операторов которые меняют значения двух переменных местами. В этом случае целесообразно вынести эту последовательность операторов в отдельную процедуру. Это будет иметь вид:
Как уже отмечалось выше, программа на Delphi состоит из трех файлов, но алгоритмическая часть записывается в одном файле, по умолчанию который называется unit1.pas. Этот файл не является самостоятельной программой, а модулем, который вызывается главной программой, текст которой расположен в файле, который по умолчанию носит имя Project1.dpr. Приведем текст файла Project1.dpr.
Раздел описания модулей определяется служебным словом USES и содержит имена подключаемых модулей, как входящих в состав среды Delphi, так и тех, что написаны пользователем. Раздел описания модулей должно предшествовать всем описательным разделам программы.
Модуль (Unit) в Delphi является алгоритмической частью проекта. Текст его записывается в отдельный файл, которому по умолчанию присваивается имя unit1.pas. Модуль, в отличие от главной части проекта, которая записана в файле project1.dpr, не может выполняться самостоятельно, он может только принимать участие в выполнении программы. Но главная часть проекта project1.dpr передает управление событиями проекта модулю. Модули позволяют строить персональные библиотеки процедур и функций, что дает возможность создавать программы любого размера и сложности. Кроме того в Delphi можно создавать внешние модули (гром главного, автоматически создается), которые затем подключаются к проекту и могут использоваться несколькими проектами одновременно.
В общем случае модуль - это совокупность программных ресурсов, предназначенных для использования другими программами (в нашем случае - для использования проектами и другими модулями, ведь каждый модуль использует другие модули, как стандартные, так и написанные пользователем). Например, модуль unit1.pas по умолчанию уже использует набор стандартных модулей. Это легко видеть из строке инициализации модулей файла unit1.pas
• Программные элементы, предназначенные для использования другими приложениями и модулями (проектами и модулями). Такие элементы называют видимыми вне модулем.
Использование в модуле процедур и функций имеет свои особенности. Заголовок подпрограммы содержит все сведения, необходимые для ее вызова: имя, перечень и тип параметров, тип результата для функции. Если к подпрограмме будет вестись обращения из других модулей, то эта информация должна быть расположена в implementation, то есть в интерфейсную часть модуля, если же подпрограмма использоваться только подпрограммами текущего модуля, то ее описание следует размещать после implementation. Само тело подпрограммы (ее текст), где реализован ее алгоритм, записывается в части реализации модуля.
В случае, когда имена переменных интерфейсной части модуля и в самой программе совпадать, обращение будет вестись до переменных, описанных в программе. Для обращения к переменной модуля следует использовать составное имя, состоящее из имени модуля и имени переменной, разделенных точкой.
Перейдем теперь непосредственно к созданию программы. Сначала создадим форму, т.е. визуальную часть программы. В отличие от более старых версий языков программирования, Delphi значительно облегчает работу с интерфейсной частью. Чтобы добавить кнопку в форму достаточно мышкой выбрать в стандартной части (Standard) палитры компонентов кнопку и щелкнуть затем на форме. На палитре формы появится
Вспомним свойства кнопки. Во-первых, надпись на кнопке, за который отвечает переменная caption или, если быть точным, Button1.Caption. Тип этой переменной - string, первоначальное значение - 'Button1'. Это значение можно менять как в самой программе, так и в свойствах объекта. Рассмотрим пример, когда при нажатии на кнопку, надпись на ней будет меняться на 'Pressed'.
Далее, вся последовательность действий, что будет происходить при нажатии на эту кнопку, должно быть расположено в алгоритмическом части процедуры между служебными словами begin и end;, образующих сложный оператор.
Заметим, что часть "заготовок" для подпрограмм создается автоматически при установке какого-то события (например события, которые происходят при нажатии на клавишу) для объекта формы. В нашем примере красным цветом отмечена часть, написанная "вручную" программистом, остальные создается автоматически. Кроме того, для использования событий, например кнопок, сначала их нужно расположить в форме.
Исходя из того, что пара begin - end есть одним оператором, то довольно часто его еще применяют в циклах, условных операторах и др., когда синтаксически выполняется только один оператор, а за алгоритмом необходимо выполнить несколько. Тогда количество операторов располагают между begin и end. Формально выполняется в этом случае только один оператор begin-end, а в действительности для выполнения этого оператора "приходится" выполнять все, расположенных между begin и end.
Delphi, как и предыдущие версии Pascal, позволяет читать и записывать в файлы информацию. Это касается и текстовых файлов. Delphi позволяет открывать файл или для чтения или записи. Если файл открывается для чтения из него информации, то вся информация в нем хранится. Если же файл открывается (создается) для записи, то информация в нем уничтожается, если такой файл уже существует.
Прежде чем начинать работу с текстовым файлом в Delphi, нужно подготовить его к этому. Сначала необходимо описать переменную типа textfile в блоке описания переменных и поставить в соответствие этой переменной имя файла на диске. Это можно сделать посредством процедуры assignfile. Синтаксис этой процедуры имеет вид:
Закрытие файла после использования rewrite или reset. Эту процедуру обязательно нужно устанавливать в программе, когда мы работаем с файлами. В противном случае, в особенности когда мы записываем информацию в файл, может быть потеря информации или файл невозможно будет открыть второй раз для чтения или записи.
В этом примере открывается (или создается если такого файла на диске не существует) для записи файла a.txt с диска С, записывается текстовая строка s1 (в нашем случае значения s1 является 'Текстовая строка ", т.е. в файле a.txt будет записан один строка с текстом Текстовая строка) и закрывается файл.
Исходя из вида оператору следует отметить, что за выполнение условия или нет может выполняться только один оператор (оператор1 или оператор2). Если необходимо выполнение нескольких операторов, то следует использовать сложный оператор begin - end. Тогда все необходимые команды будут располагаться между begin и end, как это отмечалось выше.
Пусть нам нужно написать программу, которая по клику на клавишу Button1, считывает с строке редактирования Edit1 текст и, если этим текстом является строка "автотекст", то надпись на клавише меняется на "введите текст", в противном случае - на клавишу выводится текст , введенный пользователем в Edit1, и в Edit1 выводится текст "автотекст".
Для этого нам сначала нужно на форме расположить два объекта: кнопку Button1 и строка редактирования Edit1. После этого установить главное событие для кнопки Button1 двойным нажатием на нее. Далее, в автоматически генерируемые процедуре
Определим главное событие для клавиши Button1. Эта клавиша будет начинать работу программы, т.е. мы организуем работу программы таким образом, чтобы сначала в рабочем окне программы просматривалась лишь клавиша Button1, а по нажатию ее Button1 исчезала с экрана, а Button2 и Edit1 - выводились. Сначала установим начальные значения параметров visible для объектов формы. Для этого обратимся к Object inspector и последовательно для всем объектам (Button1, Button2 и Edit1) установим значение следующим образом:
Выше мы рассматривали использование условного оператора IF с простой условием, то есть сама условие состояла из одного сравнения. Но частой есть необходимость проверять более сложные условия. Возникает вопрос: как их записать?
Если условие является составной (т.е. осуществляется несколько сравнений одновременно), то лучше ее всю взять в скобки. Для одновременного выполнения двух условий между ними ставится "and", для выполнения одного из двух условий между ними ставится "or"
и выражение (a
Сначала нужно формализовать заштрихованной области. Легко видеть, что в заштрихованной области относятся те точки, расстояние от которых до точки пересечения осей координат (0,0) не больше 1 и не меньше 1 / 2. То есть, если записать это формально, то для того, чтобы точка попадала в заштрихованной области, достаточно, чтобы для ее координат одновременно выполнялись неравенства и.
Теперь определимся с объектами на форме. Очевидно, что нам нужно 2 объекта Edit (для ввода координат x и y соответственно), объект Label для вывода результата на экран и объект Button для самой проверки.
Оператор IF удобен, когда проверяется несколько множественных условий, т.е. условий, когда сравниваются переменные. В случае, когда в зависимости от значения одной переменной (выражения) надо выполнить то или иное действие, особенно если надо проверить несколько значений этой переменной, логично использовать оператор выбора CASE. Например исходя из значения целой переменной и, где и изменяется от 1 до 5, вывести на экран в Label1 соответствующий каждому значению текст.
Сначала создадим форму и расположим на ней объекты RadioGroup1, Button1, Shape1 и заполним RadioGroup1 значениями "желтый, красный и синий" следующим образом: дважды щелкаем левой кнопкой мыши на компоненту Items объекта RadioGroup1 (в Object Inspector) и вводим в окне , что открылось 3 строки (желтый, красный и синий). Получим:
Так как событие установки цвета происходит при нажатии на клавишу Button1, то укажем для объекта Button1 главное событие дважды щелкнув левой кнопкой мыши на объект Button1 в форме. Получим:
То есть автоматически была объявлена и создана пустая процедура procedure TForm1.Button1Click, в которой и будет алгоритмически реализована событие, что произойдет при нажатии на клавишу Button1 при работе программы. Опишем это событие.
После запуска этой функции целой переменной будет присвоен случайное значение в диапазоне от 0 до циле_число-1. Подробнее использование этой функции рассмотрены в "Пример использования цикла for to do для сортировки числового массива (пузырьковая сортировка)".
Этот метод можно использовать, если сумма значений переменных не превышает допустимое значение для данного типа переменных. Например, если меняем значение двух целых переменных и = 30000 и j = 25000, то их сумма будет 55000, что превышает максимально допустимое значение 32767, то использование этого алгоритма является невозможным.
Циклы используются в случае, когда какое-то действие или группа действий повторяется определенное количество раз. Каждое выполнение всех действий, указанных в цикле называется итерацией. Каждый цикл должен иметь условие, при котором он заканчивает свою работу. Циклы могут быть с фиксированным количеством итераций и нет. К циклам с фиксированным количеством итераций (т.е. сразу указывается их количество) относится цикл For - to - do. Другие относятся циклы while - do и repeat - until.
Как уже отмечалось выше, цикл for - to do относится к циклам с конечной фиксированным количеством итераций. Вследствие этого для работы цикла необходима переменная, которая будет "отвечать" за номер итерации, т.е. индикатор цикла. Индикатором цикла может быть произвольная, интервальная, целая, булевская или символьная переменная. Зачастую для индекса цикла используется переменная целого типа. Общая структура цикла for to do имеет вид
В этом случае значение индикатора возрастает от начальное_значение_инд каждой итерации автоматически увеличиваясь на единицу пока не достигнет конечное_значение_инд. Т.е. есть начальное условие цикла, где переменной инд_циклу фиксированное начальное значение начальное_значение_инд условие завершения работы цикла когда инд_циклу достигает значения конечное_значение_инд _инд.
Нужно сгенерировать случайным образом значения массива из 100 целых чисел, каждое число должно быть в диапазоне от 0 до 16, вывести массив на экран в ListBox1, отсортировать значения элементов массива за ростом и вывести их в ListBox2.
Далее, разобьем выполнение алгоритма на две части: клавиша Button1 отвечать за заполнение массива значение и вывод его на экран не сортированный в ListBox1. Клавиша Button2 отвечать за сортировку массива и вывода его сортированный в ListBox2.
Сформулируем сначала главное событие для клавиши Button1. По нажатию этой клавиши сначала у нас должен заполняться массив цилимы случайными числами в диапазоне от 0 до 16, поэтому эта часть подпрограммы будет иметь вид:
В ListBox1.Items.Append (inttostr (a [i])); мы используем функцию inttostr за того, что элемент массива "а" имеет целый тип, а добавить к ListBox можно только строка (или иначе строчную переменную). Поэтому нам и приходится конвертировать целое значение в строковое, используя inttostr.
Далее опишем главное событие для клавиши Button2. Сначала здесь массив имеет сортироваться по возрастанию (т.е. элементы массива должны быть переставлены таким образом, чтобы в начале массива находилось наименьшее значение из элементов массива, потом больше и т.д. вплоть до последнего элемента, где находится наибольшее значение). Сформулируем алгоритм пузырьковой сортировки.
Алгоритм пузырьковой сортировки действует следующим образом: последовательно сравниваются соседние элементы последовательности (массива) и, если то, что расположено левее, является большим за то, что расположено правее - их значение переставляют местами. Так надо проверить все последовательные соседние пары в массиве. В нашем случае это будет иметь вид:
Таким образом на первом этапе применения пузырькового метода сортировки мы "выставили" наибольший элемент массива на свое место (т.е. в хвост массива). Следующим шагом является проверка уже не всех четырех соседних последовательных пар элементов, а лишь первых трех (последний элемент уже является крупнейшим и проверять его нет необходимости). Итак:
Заметим, что в примере у нас массив состоит из 5 элементов а цикл для прохода по массиву мы организуем от 1 до 4. Это делается потому, что мы сравниваем на каждой итерации текущий элемент массива со следующим. Если бы мы организовали цикл от 1 до 5, то на последнем шаге происходило сравнению 5-го элемента с 5 +1- м, то есть 6-м, а такого нет.
И наконец, исходя из того, что при работе программы мы можем генерировать массив А любое число раз и он будет подаваться ListBox1 и сортированный у ListBox2, то каждый раз ново сгенерированный массив будет дописываться у конец ListBox1 и ListBox2 соответственно, то есть со временем у ListBox1 и ListBox2 начнется путаница. Чтобы предотвратить это достаточно просто очищать содержимое ListBox1 и ListBox2 перед каждой записью массива в них. Осуществить это легко с помощью процедуры ListBox1.Items.Clear и ListBox2.Items.Clear.
В отличие от цикла for - to - do, в цикле repeat - until не указывается количество итераций и начальное условие цикла. В этом цикле есть только конечная условие, по выполнению которой цикл завершает свою работу.
Используя этот цикл следует формировать последовательность операторов и условие выхода из цикла так, чтобы условие выхода могла быть достигнута. В противном случае цикл будет бесконечным. Условием выхода может быть произвольное условие или переменная булевские типа.
Теперь нужно считывать из файла по строкам информацию (например в переменную s) и добавлять эти строки в ListBox1, причем делать это пока не достигнем конца файла. Для этого нам придется организовать цикл (например repeat - until). Текст процедуры будет иметь вид:
Но теперь, если при работе программы дважды нажать клавишу Button1 и выбрать файл, то содержание ListBox1 будет состоять из двух файлов, которые были открыты. Чтобы предотвратить это нам нужно добавить оператор очистки окна ListBox1 - ListBox1.Items.Clear; Тогда текст процедуры будет иметь вид:
Как и для repeat - until в цикле while - do не указывается количество итераций и начальное условие цикла. В отличие от repeat - until для цикла while - do указывается условие, при котором работает, и, если условие не выполняется, то цикл завершает свою работу. Поэтому логично использовать его либо в тех случаях, когда указать условия работы цикла проще, чем в язык выхода из цикла (как в repeat - until), или когда сначала нужно проверить условие, а затем выполнять операторы цикла.
Используя этот цикл следует формировать последовательность операторов и условие работы цикла так, чтобы мог быть достигнут момент, когда условие работы цикла не выполнится (т.е. цикл закончит свою работу). В противном случае цикл будет бесконечным. Условием работы цикла может быть произвольное условие или переменная булевские типа.
В этом случае использование всех циклов является допустимым, хотя использование for to - do является неэффективным из-за того, что могут выполняться много лишних операций (если сумма превысит 200 в самом начале цикла).
В этом примере использовать можно только циклы repeat - until и while - do, причем если известно, что в файле есть хоть одна строчка, то можно использовать оба циклы, а если же эта информация отсутствует, то только цикл while do;
У нас есть последовательность из 150 изображений, называются a001.gif, a002.gif ... a150.gif. Нам нужно создать последовательность html - файлов, в каждом из которых имеет располагаться фотография, над и под рисунком должны быть переходы к предыдущему по номеру файла, к следующему и к файлу содержания (content.html). Имена html файлов должны соответствовать именам файлов с рисунком по номеру и выглядеть a001.html, a002.html ... a150.html. Кроме того в начале каждого файла должен стоять какой-то определенный текст (например "Текст заголовка"). То есть, например, файл а003.html должен иметь вид
Перейдем теперь к написанию программы. Сначала напишем программу, которая генерирует одну страницу заданного содержания. Пусть это и будет третья страница. Сначала нам нужна лишь одна клавиша button1 для запуска программы и одна переменная типа textfile. Текст подпрограммы procedure TForm1.Button1Click иметь вид
Теперь, нам нужно это сделать для всех файлов с именами от a001.html к a150.html. То есть имена файлов отличаются только номером. Таким образом, применяя цикл for - to - do от 1 до 150 мы получим желаемое. Но возникает проблема: число 1 и 150 имеют разное количество цифр и, для того, чтобы 1 записывалась как 001, 10 - как 010 И т.д., нужно применить алгоритм преобразования длины числа. Он имеет вид:
где i - переменная, которая изменяется в цикле от 1 до 150 s2 = текстовую строку из трех символов, в который превращается число с помощью функции inttostr. Похоже преобразования надо делать в местах, где укладывается переход на следующую и предыдущую страницы. Для перехода на предыдущую:
Для того чтобы программа была более универсальной, то есть можно было задавать диапазон страниц, текст заголовка и имя файла (или хотя неизменную часть имени до цифр) добавим к форме еще 4 поля Edit: Edit1, Edit2, Edit3 и Edit4
Другие материалы по теме:
- Использование языков и сред программирования как средств обучения- Среда программирования delfi 2.0
- Средства доступа к базам данных
- Case-технология проектирования программного обеспечения информационных систем
- Построение алгоритмов
