Visual Basic .NET для чайников - У. Вонг. Visual Basic .NET для чайников - У. Диалектикамосква СанктПетербург Киев
Скачать 7.1 Mb.
|
Глава 25. Циклы, которые умеют считать 257 Обратный порядок отсчета, или нестандартный шаг, следует использовать лишь в тех случаях, если значения счетчика как-то учитываются при выполне- нии инструкций на каждой итерации (т.е. если это действительно необходимо). В противном случае вы просто сделаете коды программы более сложными для понимания. В заключение этого раздела рассмотрим один пример. Как вы думаете, что произой- дет, если будет набран такой код: J As I n t e g e r For J = 1 7 Step 5 Набор инструкций Next J Этот код будет выполняться следующим образом. 1. Перед выполнением первой итерации переменной J присваивается значение 1. 2. Перед выполнением второй итерации переменной J присваивается значение 6 (шаг равен числу 5; 1 + = 6). 3. После того как выполнение второй итерации завершится, переменной J будет присвоено значение (6 + 5 = Поскольку число не принадлежит к диапазону J = 1 То 7, третьей итерации не будет, и выполнение цикла ос- тановится. и ее использование Если переменная, применяемая для отсчета количества итераций, не была ранее объявле- на, цикл For-Next создает ее самостоятельно. Так, приведенным ниже кодом создается пе- ременная значение которой изменяется с шагом 10: For XXL = 1 50 Step 10 ' Набор инструкций Next XXL Следующим кодом создается переменная значение которой изменяется с шагом For KLM = 1 7 Step 1.5 ' Набор инструкций Next KLM В циклах For-Next обычно задается шаг, равный целому числу (например, 1, 2, 5 или 28). В этом случае легче определить количество выполняемых итераций. В первом примере значение счетчика изменяется с шагом 10, поэтому нетрудно по- нять, что всего будет выполнено пять итераций. Во втором примере в качестве шага указано число 1,5. Поскольку это число дроб- ное, человеку определить количество итераций уже сложнее (компьютеру все рав- но, он и не такое может посчитать). Во втором примере, как и в тоже будет выполнено пять итераций, хотя это уже и не так чтобы не ус- ложнять без надобности коды программы, избегайте применения в качестве шага дробных чисел. 258 Часть V. Создание разветвлений и циклов Создавая циклы For-Next, никогда (повторяем, никогда!) не изменяйте в процес- се выполнения итерации значение счетчика. Это может привести к созданию бес- конечного цикла и к зависанию программы. Проиллюстрируем сказанное на таком примере: For X = 1 5 X = 3 Next X Вот к чему приведет выполнение этого кода. первой строке переменной X присваивается значение 1 и указывается, что цикл будет выполняться до тех пор, пока ей, переменной X, не будет присвое- но значение, превышающее 5. 2. Во второй строке переменной X присваивается значение 3. 3. В третьей строке значение переменной X увеличивается на единицу (оно ста- новится равным и цикл переходит на следующую итерацию. На каждой итерации переменной X будет присваиваться значение 3, по завершении ите- рации оно будет увеличиваться на единицу, поскольку число 4 меньше числа 5 (значение, при котором выполнение цикла останавливается), цикл будет повторяться снова и снова и без внешнего никогда не завершится. Поэтому при написании инструкций, пред- назначенных для выполнения на каждой итерации, убедитесь, что среди них нет тех, которые самостоятельно изменяют значение счетчики. нем Цикл For-Next разработан специально для таких случаев, когда количество итераций заранее известно. В подобных ситуациях можно, конечно, использовать и другие типы циклов. Например, ниже приведены два цикла, выполняющие ровно по шесть итераций: Dim X As I n t e g e r Dim X As I n t e g e r X = 0 For X = 1 6 Do While X < б ' Набор инструкций X = X + 1 Next X инструкций Loop Как видите, в данном случае цикл For-Next намного проще и понятней, чем цикл Do- While. Ранее уже было отмечено, что существует огромное множество способов написания кодов, корректно выполняющих одну и ту же задачу (наверное, их даже больше, чем спосо- бов написания неправильных кодов, которые не смогут выполнить задачу как надо). Но почти всегда самый простой является одновременно и самым лучшим. Глава 25. Циклы, которые умеют считать 259 Тест на проверку полученных вами знаний Сколько итераций выполнит такой цикл: For ID = 15 1 Step Набор инструкций Next ID а. Пятнадцать итераций. б. без калькулятора не обойдешься. в. Чего гадать? Надо набрать этот код и проследить за его выполнением. он вообще не будет выполняться! Он ведь набран на бумаге, на 2. Какой цикл лучше: F o r - N e x t или Do- а. Если заранее известно, сколько должно быть выполнено итераций, лучше использовать цикл F o r - N e x t . б. F o r - N e x t лучше, потому что он не похож на остальные циклы. Лучше D o - W h i l e . F o r - N e x t , наверное, настолько сложный, что под него выделена отдельная глава. г. Все циклы плохие, не стоит на них зацик- ливаться. 260 Часть V. Создание разветвлений и циклов Глава 26 Вложенные циклы V Создание вложенных циклов Советы по использованию вложенных циклов Быстрое завершение циклов ногда для решения особенно сложных или каких-то специфических задач приходит- ся создавать один цикл внутри другого. Цикл, который выполняется на каждой ите- рации другого цикла, называется вложенным. вложенные Если вы создаете один цикл внутри другого, итерация внешнего цикла не будет выпол- ненной, пока не будут выполнены все итерации вложенного цикла. Проиллюстрируем ска- занное на таком примере: Dim J I n t e g e r , Имя As S t r i n g Do While Имя = "Майкл" For J = 1 5 инструкций Next Loop Вот как этот код будет воспринят компьютером. первой строке создается переменная J типа I n t e g e r и переменная Имя па S t r i n g . 2. Вторая строка говорит компьютеру: "Сравни значение переменной Имя со строкой Майкл. Если они совпадают, переходи на третью строку. Если не совпадают — заканчивай выполнение данного цикла". 3. Третья строка дает указание: "Присвой переменной J значение 1, с каждой итерацией увеличивай его на единицу и продолжай выполнять набор инструк- ций цикла For-Next до тех пор, пока переменная J на примет значение больше 5". 4. Четвертая строка содержит набор инструкций, которые выполняются на каж- дой итерации цикла For-Next. 5. Пятая строка говорит: "Увеличь значение переменной J на единицу и снова переходи к третьей строке". 6. Шестая строка сообщает: "На этом выполнение очередной итерации цикла Do-While заканчивается. Переходи на вторую строку и снова сравнивай зна- чение переменной Имя со строкой Майкл". (Обратите внимание: если среди инструкций цикла Do-While нет команды, которая могла бы изменить значе- ние переменной Имя, цикл превратится в бесконечный и программа зависнет.) Глава 26. Вложенные циклы 261 Выполнение одной итерации внешнего цикла не закончится до тех пор, пока вло- женный цикл не выполнит все свои итерации. При выполнении следующей итера- ции внешнего цикла процесс выполнения вложенного цикла начинается заново. по использованию вложенных циклов Visual Basic позволяет вкладывать друг в друга любое количество циклов. Для вас как программиста главное — не запутаться в их кодах и видеть картину". Помочь в этом могут отступы, которые обозначат границы каждого цик- ла. Посмотрите на код, набранный без отступов: Do While Имя "Сэм" For К = 20 50 S t e p 10 Do Do U n t i l ID 13 Набор инструкций Loop Loop While Возраст > 21 Next К Loop U n t i l Код = 1234 Loop А теперь посмотрите на те же команды, оформленные с применением отступов: Do While Имя = "Сэм" Do For К = 20 50 S t e p 10 Do Do U n t i l ID = 13 Набор инструкций Loop Loop While Возраст > 21 Next К Loop U n t i l Код = 1234 Loop Для компьютера оба кода идентичны, но для человека намного предпочтительней второй вариант. Если начало и окончание циклов помечено посредством отступов, код становиться намного проще для чтения и понимания. Редактор кодов Visual Basic может автомати- чески добавлять отступы, но если вы хотите лично контролировать данный процесс, можете делать это вручную. Если вы создаете вложенные циклы, что команды вложенных циклов не из- меняют значения переменных, используемых в качестве счетчиков для внешних циклов. В противном случае может быть создан один большой бесконечный цикл, и в поисках ошибки вам придется просматривать коды всех внешних и вложенных циклов. Другой проблемой при создании вложенных циклов может стать выход одного цикла за пределы другого, например: 262 Часть V. Создание разветвлений и циклов For К = 1 4 For J 2 To 10 Step 2 Next К Next С На самом деле это уже превращается в попытку (надеюсь, непреднамеренную) создать не вложенные циклы, а пересекающиеся. Разумеется, такой код нелогичен и работать не будет. К счастью, Visual Basic автоматически отлавливает подобные ошибки, а их исправление не составляет большого труда. Циклы, которые начинаются с ключевого слова Do, продолжают выполнять итерации до тех пор, пока соответствующее проверяемому условию логическое значение не изменится на противоположное. Цикл For-Next выполняет заранее заданное количество итераций. Но что делать, если в процессе выполнения очередной итерации возникает необходимость не- медленно прекратить выполнение всего цикла? Специально для таких случаев существует команда E x i t (Выход). Чтобы немедленно завершить выполнение цикла, начинающегося со слова Do, наберите команду E x i t Do: Dim X As I n t e g e r X = 0 Do While X < 6 X = X + 1 If X = 4 Then E x i t Do Loop Цикл Do-While должен выполняться до тех пор, пока значение переменной X будет меньше 6. Но на самом деле он закончится еще раньше, поскольку по достижении перемен- ной X значения, равного 4, вступит в действие команда E x i t Do и цикл будет прерван. Для немедленной остановки цикла For-Next используется команда E x i t For 0 = 1 100 If = 50 Then Exit For Next Q Изначально этот цикл должен выполнить 100 итераций, но поскольку при значении равном 50, запускается команда E x i t For, произведено будет всего 50 итераций. Используйте команды немедленного выхода из циклов осторожно и только в тех слу- чаях, когда это действительно необходимо. Сразу же проверьте, не будут ли такие выхо- ды преждевременными и не приведет ли это к возникновению ошибок, чтобы при отлад- ке программы вы не ломали себе голову над вопросом почему она работает непра- При использовании команды E x i t для выхода из вложенного цикла завершается не весь цикл, а именно этот вложенный цикл, а далее продолжается выполнение итерации внешнего цикла. Глава 26. Вложенные циклы 263 Тест на проверку полученных вами знаний Сколько циклов может быть вложено друг в друга? а. Их вообще нельзя вкладывать. Это же не условные операторы. Теоретически количество вложенных циклов ничем не ограничено. Однако не забывайте, что чем больше циклов вы вложите друг в друга, тем сложнее будет потом понять, что каждый из них делает. Количество вложенных циклов ограничива- ется терпением и трудолюбием каждого от- дельно взятого программиста. г. Ничем, Если бы за каждый вложенный цикл платили деньги, это был бы хороший бизнес. 2. Что нужно сделать, чтобы вложенные друг в друга циклы стали легче для чтения и пони- мания? а. Нужно выучить на память эту главу, и то- гда картина начнет проясняться. б. О! Нужны годы практики, чтобы научиться наконец читать и понимать коды вложен- ных в. Нужно снабдить их обильными коммента- риями- тогда и "чайнику" все будет по- нятно. г. Нужно добавить отступы, чтобы лучше было видно, где каждый из циклов начи- нается и где заканчивается. 264 Часть V. Создание разветвлений и циклов Часть VI Создание подпрограмм Наконец пришло время узнать, как разбить одну большую про- грамму Visual Basic на много маленьких подпрограмм, чтобы она стала проще для написания, чтения, понимания и внесения из- менений. Вместо того чтобы писать одну огромную монолитную программу (похожую на каменное изваяние, вытесанное с огром- ным трудом из цельной скалы), намного разумней будет написать ряд маленьких подпрограмм и соединить их в одно целое (подобно тому как из маленьких кирпичиков складывается большое здание). Разделив программу на несколько вы без труда сможе- те протестировать каждую из проследить за ее выполнением. Решить маленькую задачу просто. Решить последовательно много маленьких задач тоже несложно, это лишь вопрос времени. Вот по- чему разработка подпрограмм — это путь, которым идут все опыт- ные создающие серьезные программные продукты. Глава 27 Общие процедуры Создание общих процедур Присвоение имен общим процедурам Использование общих процедур ж это небольшие подпрограммы, из которых состоит одна большая про- (аналогично тому, как из отдельных кирпичиков складывается здание). В Visual Basic есть два вида процедур: процедуры обработки событий и общие процедуры. обработки равно как и кнопки, флажки, переключатели, являются ча- стью интерфейса. Они сохраняются в файле формы и выполняются лишь при условии, что случается некоторое событие в отношении объекта, для которого они написаны (например, пользователь щелкает на кнопке или выбирает команду контекстного меню). Общие процедуры не относятся к какому-то конкретному объекту пользовательского ин- терфейса. Они ничего не делают до тех пор, пока процедуры обработки событий (или другие общие процедуры) не прикажут им начать работу. Итак, нужны ли процедуры обработки событий? Да. Они обеспечивают способность поль- зовательского интерфейса адекватно реагировать на действия пользователей. Нужны ли об- щие процедуры? Нет. Они создаются только из прихоти программистов. Но вот какая возникает проблема. Если одна или несколько процедур обработки событий должны осуществлять одинаковые или подобные действия (что случается довольно часто), коды для их выполнения придется набирать по нескольку раз для каждой отдельной процеду- ры, а это уже делает работу программиста довольно рутинной и скучной. Более того, при не- обходимости модифицировать коды для одного какого-то выполняемого действия вносить изменения придется во все процедуры обработки событий, где такие коды встречаются. Чтобы избавить себя от необходимости набирать одни и те же коды для разных процедур обра- ботки событий, сохраните их в общей процедуре. То есть общая процедура позволяет сохранять коды, общие для разных объектов и разных событий, в одном месте и в одном экземпляре. Теперь, если нужно будет их модифицировать, достаточно внести изменения только один раз. Любая написанная на языке Visual Basic состоит не менее чем из одного файла формы, а каждый файл формы содержит в процедуры обработки событий, кото- рые делают программу рабочей. Если же вы создаете общую процедуру, можете также сохра- нить ее в формы. Правда, сохраняя общие [[роцедуры и процедуры обработки событий в одном файле фор- мы, вы делаете коды программы запутанными и сложными для понимания. что было бы, если бы в один ящик своего стола вы складывали все свои тетрадки, дискеты, ком- пакт-диски, носовые платки, журналы и еще много всякой всячины. И в первом и во втором случае процесс поиска нужного компонента или вещи превращается в нелегкую задачу. В ка- честве альтернативного варианта Visual Basic предоставляет возможность сохранять общие процедуры отдельно, в файлах модулей. Глава 27. Общие процедуры 267 Многие программисты предпочитают сохранять общие процедуры, выполняющие один класс задач, в отдельных файлах. Например, процедуры, отвечающие за пе- чать документов, сохраняются в одном файле, а процедуры, отвечающие за их ре- дактирование,— в другом. Таким образом, если вдруг возникнут ошибки при вы- воде документа на печать, нетрудно будет понять, что искать их нужно в том фай- ле, где содержатся общие процедуры, отвечающие за данный процесс. На рис. 27.1 показана структура файла, в котором сохранены сразу все процедуры, выпол- няемые программой. При возникновении какой-либо ошибки найти таковую во всем этом обилии кодов будет крайне тяжело. Но если вы разобьете подобные процедуры на разные группы и сохраните их в отдельных файлах, как это показано на рис. 27.2, коды уже не будут казаться такими сложными и запутанными, а процесс поиска ошибок потребует меньшего времени и усилий. Коды для сохранения файлов Коды для проведения математических вычислений Коды для открытия файлов Коды для отображения графических элементов Коды для печати файлов Коды для отображения сообщений на экране Коды я обработки статистических данных Рис. 27.1. Если все коды вашей программы будут сохранены в одном файле, модифицировать их и исправлять ошибки будет очень тяжело 1 Коды для сохранения файлов Коды для печати Коды для открытия файлов Коды для отображения графических элементов Коды для отображения сообщений на экране Коды для проведения математических вычислений Коды для обработки статистических данных Рис. 27.2. Коды программы, разбитые по группам и сохраненные в отдельных файлах, более легки для понимания и внесения изменений 268 Часть VI. Создание подпрограмм Программа Visual Basic может состоять из любого количества файлов моду- лей или не иметь таковых вообще. Для создания нового файла модуля выполните следующие действия. 1. Выберите команду модуль). Откроется диалоговое окно Add New Item (Создание нового элемента), показан- ное на 27.3. Add New - Web Local User Control Hum: Open 27.3. Окно создания программы нового файла модуля 2. Щелкните на значке Module, а затем — в текстовом поле Name. 3. Наберите имя нового файла модулей. Не забудьте указать расширение . VB. 4. Щелкните на Open. Visual Basic отобразит в окне Solution Explorer название только что соз- данного файла (если в данный момент это окно открыто), а в окне кодов откроет пустой файл модулей, который будет выглядеть так, как показано ниже (вместо слова должно отображаться название файла, которое вы указали на третьем шаге): Module Modulel End Module n Код общей процедуры представлен ниже: P u b l i c Sub ' Инструкции End Sub |