Visual Basic_учебник (1108585), страница 5
Текст из файла (страница 5)
Цикл For … Next. Печать таблицызначений функцииПриведенная в конце предыдущего раздела программа рассчитываетпо формуле только одно значение. А что делать, если требуется посчитать таблицу значений, например, чтобы построить график функции?Решению подобных задач помогают программные циклы.Одно из предложений организации циклов – For … Next. Оно относится к числу составных, то есть включающих в себя несколько частей.Рассмотрим его синтаксис:For <переменная> [As <тип>] = <нач_знач> To <кон_знач> _[Step <шаг>]<блок предложений>Next [<переменная>]В этой конструкции первым должно быть предложение For, за нимследует блок предложений, составляющих тело цикла, а в завершении– предложение Next.Число повторений (итераций) определяют параметры <нач_знач> (начальное значение), <кон_знач> (конечное значение) и <шаг>.
Если онизаданы арифметическими выражениями, то, прежде всего, вычисляются значения этих выражений. Шаг указывать необязательно – в этомслучае по умолчанию он принимается равным единице. Другое значение шага нужно указывать явно.После того, как все три параметра определены, переменная циклаинициализируется начальным значением, и вступает в силу основнойэтап – итерации цикла, каждая из которых включает проверку на вы34ход, исполнение тела цикла и автоматическое прибавление величинышага к значению переменной.Вот как может выглядеть программа, печатающая таблицу значенийфункции:Option Strict OnModule Module1Sub Main()Dim y As DoubleConsole.BackgroundColor = ConsoleColor.DarkBlueConsole.Clear()Console.ForegroundColor = ConsoleColor.YellowConsole.WriteLine("---------------------------")Console.WriteLine(" xsqrt(2Pi)exp(-x^2/2)")Console.WriteLine("---------------------------")Console.ForegroundColor = ConsoleColor.WhiteFor x As Double = -1.5 To 1.5 Step 0.2y = Math.Sqrt(2*Math.PI) * Math.Exp(-x^2/2)Console.WriteLine("{0}{1}", x, y)Next xConsole.ReadLine()End SubEnd ModuleВ данном случае переменная цикла обозначена x, в качестве типа выбран Double, начальное значение, конечное значение и шаг – числовые константы.
Тело цикла состоит из двух предложений: первое осуществляет вычисление очередного значения функции и присвоениеэтого значения переменной y, второе – печать строки таблицы.Проверка на выход - это сравнение текущего значения переменнойцикла с конечным значением. В нашем примере начальное значениепеременной цикла меньше конечного, шаг – положительное число.Поэтому, по правилам конструкции For … Next, на каждой итерациизначение x будет увеличиваться, и цикл повторяться до тех пор, покатекущее x меньше либо равно заданного конечного значения. Кактолько выполнится условие «строго больше», произойдет выход из35цикла - а именно переход к следующему за Next предложению программы.Наберите и запустите приведенную выше программу печати таблицызначений функции, чтобы проверить на практике, как работает цикл, иосмыслить результаты.
В девятой строке таблицы вместо ожидаемогоправильного значения 0,1 напечатано 0,0999999999999998 (ещеодно напоминание нам о том, что операции с числами типа Doubleпроизводятся с ограниченной точностью). Это отражается не толькопри выводе числовых результатов, но может сказаться и на исполнении For … Next. Действительно, если, последовательно прибавляяшаг к начальному значению, мы из-за ограниченной точности вычислений получим не строго конечное значение, а число, хотя бы немногоего превосходящее, то сравнение «меньше, либо равно» в начале последней итерации даст отрицательный результат.
Таким образом, телоцикла будет выполнено на один раз меньше, чем должно было бы. Замените в программе значение шага для переменной цикла на 0.1 ипосмотрите на получившуюся таблицу. Соответствует ли аргумент впоследней строке заданному конечному значению?Ликвидировать вероятность подобных ошибок можно переходом ктипу Integer для переменной цикла – с целыми числами все вычисления производятся точно. В качестве примера несколько лучшего стиля программирования предлагаем разобрать другую программу дляпечати таблицы функции.36Option Strict OnModule Module1Sub Main()Dim x, y As DoubleDim xMin As Double = -1.5Dim xMax As Double = 1.5Dim dx As Double = 0.2Console.WriteLine(" xsqrt(2Pi)exp(-x^2/2)")For i As Integer = 0 To CInt((xMax - xMin) / dx)x = xMin + i * dxy = Math.Sqrt(2*Math.PI) * Math.Exp(-x^2/2)Console.WriteLine("{0}{1}", x, y)Next iConsole.ReadLine()End SubEnd ModuleНаряду с рассмотренными примерами, правилами VB вполне допустимы конструкции For … Next, в которых начальное значение переменной цикла больше конечного.
Попробуем для только что «успешной»программы просто поменять местами начальное и конечное значенияпеременной цикла:For i As Integer = CInt((xMax - xMin) / dx) To 0Увы, блок предложений внутри цикла в этом случае не будет выполненни разу.
Причина в том, что шаг в таком варианте мы по-прежнему незадавали, а, значит, он остался равным единице. Если в конструкцииFor … Next начальное значение переменной цикла больше конечного, а шаг положителен, то тело цикла не будет выполнено ни разу, программа сразу перейдет к выполнению предложения, следующему заNext. Если же шаг для этого случая задать правильно – отрицательнымзначением – то на каждой итерации переменная цикла будет уменьшаться, а условием продолжения цикла станет для нее «больше илиравно» конечного значения. Для проверки сказанного внесите в предложение For корректные изменения:37Option Strict OnModule Module1Sub Main()Dim x, y As DoubleDim xMin As Double = -1.5Dim xMax As Double = 1.5Dim dx As Double = 0.2Console.WriteLine(" xsqrt(2Pi)exp(-x^2/2)")For i As Integer = CInt((xMax - xMin)/dx) To 0 _Step -1x = xMin + i * dxy = Math.Sqrt(2*Math.PI) * Math.Exp(-x^2/2)Console.WriteLine("{0}{1}", x, y)Next iConsole.ReadLine()End SubEnd ModuleУбедитесь в успешном выводе таблицы для заданного диапазона значений, но уже в убывающем порядке.Теперь поговорим о возможных вариантах описания переменной цикла.
В рассмотренных выше программах ее тип указывался явно в предложении For. Напомним, как это выглядело в самом первом нашемпримере:For x As Double = -1.5 To 1.5 Step 0.2Но переменную x вполне допустимо описать предложением Dim ещедо использования в предложении For, и тогда запись For станет «лаконичнее»:...Dim y As DoubleDim x As Double...For x = -1.5 To 1.5 Step 0.2...38Здесь x – обычная переменная подпрограммы Main, она может использоваться в любом предложении этой подпрограммы, в том числе впредложении For.Если же тип переменной указан прямо в предложении For, то эта переменная «создается» специально для использования внутри цикла, иее предложением Dim описывать не нужно. При этом и до For, и послесоответствующего ему Next данная переменная недоступна для другихпредложений программы.
Мы рекомендуем использовать именно этуформу задания счетчика цикла.Явно отметим строгое правило конструирования циклов – предложения, составляющие тело For … Next, не должны менять значение переменной цикла. Ее значение будет меняться в цикле автоматическина величину шага при каждом исполнении предложения Next.Кстати, в предложении Next указывать переменную цикла необязательно, хотя мы настоятельно рекомендуем это делать. По каким причинам? Как минимум, двум, тесно взаимосвязанным.
Во-первых, с указанием имени переменной цикла в предложениях Next программныйкод легче читается. Во-вторых, это элементарная перестраховка от ненужных ошибок при написании программы.В теле цикла могут быть составные предложения, в том числе конструкции For … Next со своими собственными переменными цикла.Требование языка VB состоит в том, что в качестве счетчика вложенного цикла нельзя использовать счетчик внешнего.
Но два следующихдруг за другом цикла могут использовать в качестве счетчика одну и туже переменную.39Глава 5. Тип String. Объекты. Ввод и выводтекстовой информацииНапомним, что типичное консольное приложение принимает на входтекстовую информацию, набираемую на клавиатуре, и производит вывод результатов вычислений в текстовом виде в консольное окно (см.рисунок 5).
В этой главе мы более подробно познакомимся с представлением и средствами манипулирования текстовой информацией, атакже со средствами ввода/вывода текста, предоставляемыми исполняющей системой Microsoft .Net Framework.Текстовые значения.
Тип StringТекстовая информация представлена в VB в виде строк – значений типа String. Строка представляет собой цепочку символов некоторойдлины. Элементами строки могут быть любые символы, определенныев стандарте UNICODE, например, буквы латинского, русского, греческого и других алфавитов, цифры, знаки препинания и математическихдействий, пробел.
Длина строки варьируется от нуля до несколькихмиллионов символов.Мы воспользовались словом строка для перевода английского термина string. Пожалуйста, будьте внимательны по отношению к этому слову. При описании расположения текста на экране, бумаге и т.п. в английском языке используют слово line. Но в русском ему тоже соответствует «строка». Чтобы преодолеть неоднозначность этого термина,следует более внимательно относиться к контексту.
Если речь идет обабстрактном компьютерном тексте, под строкой мы будем понимать целиком значение типа String. Если же речь идет об изображе-40нии конкретного текста, то значение типа String может расположиться и на нескольких «строках».В программах на VB строковые значения записываются при помощидвойных кавычек. Если требуется включить в строку сам символ двойной кавычки, используют специальное кодирование - в записи строкиуказывают два подряд символа кавычек.