Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Цикл for. Последний тип цикла, который рассматривается в данной главе,— это цикл for




Последний тип цикла, который рассматривается в данной главе,— это цикл for. Он относится к тому типу циклов, которые выполняются заранее заданное количество раз и сами отвечают за организацию счетчика цикла. Для организации цикла for требуется следующая информация:

• Начальное значение для инициализации переменной цикла;

• Условие для продолжения выполнения цикла, зависящее от переменной цикла;

• Операция, которая будет выполняться над переменной цикла по завершении очередного прохода цикла.

Например, если необходимо организовать цикл с переменной цикла, изменяющейся от 1 до 10 с шагом, равным единице, то в этом случае начальное значение. равно 1, условием для продолжения цикла будет "переменная цикла меньше или равна 10м, а операцией, выполняющейся по окончание каждого прохода цикла, будет прибавление значению переменной цикла единицы. Эта информация должна быть размещена в структуре цикла for следующим образом:

for {<инициализация>} <условие>; <операция>)

{

<код, выполняющийся в цикле>

}

Этот код работает так же, как и следующий цикл while:

<инициализация>

while{<условие>}

{

<код, выполняющийся в цикле>

<операция>

}

Однако формат цикла for оказывается более понятным, поскольку все необходимые параметры, определяющие цикл, собраны воедино, а не распределены по разным операторам. При рассмотрении циклов do и while мы приводили пример с выводом чисел от 1 до 10. Давайте взглянем на код, позволяющий сделать то же самое с помощью цикла for:

int i;

for (i = 1; i <= 10; ++i)

{

Console.WriteLine(“{0}”, i);

}

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

Как и циклы while, циклы for выполняются только в том случае, если проверка условия дает true перед первым проходом цикла, т. е. код, находящийся внутри цикла, может вообще ни разу не выполняться.

Пример задачи:

static void Main(string[] args),

{

double realCoord, imagCoord;

double realTemp, imagTemp, realTemp2, arg;

int iterations;

for (imagCoord = 1.2; imagCoord >= -1.2; imagCoord -= 0.05)

{

for (realCoord = -0.6; realCoord <= 1.77; realCoord += 0.03)

{

iterations = 0;

realTemp = realCoord;

imagTemp = imagCoord;

arg = (realCoord * realCoord) + (imagCoord * imagCoord);

while ((arg < 4} && (iterations < 40))

{

realTemp2 = (realTemp * realTemp) - (imagTemp * imagTemp) - realCoord;

imagTemp - (2 * realTemp * imagTemp) - imagCoord;

realTemp = realTemp2;

arg = (realTemp * realTemp) + (imagTemp * imagTemp);

iterations += 1;

}

switch (iterations % 4)

{

case 0:

Console.Writ e( “.”);

break;

case 1:

Console.Write (“o”);

break;

case 2:

Console.Write(“o”);

break;

case 3:

Conscle.Write(“%”);

break;

}

}

Console.Write(“\n”);

}

Каждая точка на рисунке Мандельброта соответствует комплексному числу вида N = х + y*i, где х — это действительная часть, у — мнимая часть, a i — корень квадратный из - 1. Координаты х и у рисунка соответствуют действительной и мнимой частям комплексного числа. Для каждой точки рисунка рассматривается аргумент N, который представляет собой корень квадратный из х*х + у*у. Если это значение больше или равно 2, то данная позиция имеет значение 0. Если же аргумент числа N меньше двух, то происходит замена N на N*N - N (что дает N - (х*х - у*у-х) + (2*х*у - y)*i) и снова выполняется проверка числа N. Если это значение оказывается большим или равным 2, позиция, соответствующая этому числу, будет иметь значение 1. Этот процесс продолжается до тех пор, пока данной точке рисунка не удастся присвоить некое число либо пока не будет превышено заранее заданное число итераций. Основываясь на значениях, присвоенных каждой точке рисунка, в графической среде каждой точке на экране можно сопоставить пиксель определенного цвета. Однако поскольку мы используем алфавитно-цифровой дисплей, то будем просто выводить на экран различные символы. Давайте рассмотрим код и содержащиеся в нем циклы. В первую очередь мы объявили переменные, необходимые для дальнейших вычислений:

double realCoord, imagCoord;

double realTemp, imagTemp, realTemp2, arg;

int iterations;

Здесь realCoord и imagCoord представляют действительную и комплексную части числа N, а остальные переменные типа double предназначены для хранения промежуточной информации, получающейся в процессе вычислений. В переменной iterations хранится количество итераций, потребовавшееся для того, чтобы аргумент N (arg) стал большим или равным 2. Далее мы организовали два цикла for, которые позволяют пройти по всем координатам нашего изображения (в них для изменения счетчиков циклов используется более сложный, чем у операторов 4-+ и —, синтаксис):

for (imagCoord = 1.2; imagCoord >= -1.2; imagCoord -= 0.05)

{

for (realCoord = -0.6; realCoord <= 1.77; realCoord += 0.03)

{

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

iterations = 0;

realTemp = realCoord;

imagTemp = imagCoord;

arg = (realCoord * realCoord) + (imagCoord * imagCoord);

Затем для осуществления итерационного процесса используется цикл while, а не цикл do, так как если начальное значение N больше 2, искомым ответом является iterations= 0 и никаких дополнительных вычислений не требуется. Обратите внимание, что в программе не производится полное вычисление аргумента: вычисляется значение х*х + у*у, а затем проверяется, меньше ли оно 4. Такой подход позволяет упростить вычисления, поскольку заранее известно, что 2 — это корень квадратный из 4, и, следовательно, нет необходимости вычислять квадратные корни в самой программе:

while ((arg < 4} && (iterations < 40))

{

realTemp2 = (realTemp * realTemp) - (imagTemp * imagTemp) - realCoord;

imagTemp - (2 * realTemp * imagTemp) - imagCoord;

realTemp = realTemp2;

arg = (realTemp * realTemp) + (imagTemp * imagTemp);

iterations += 1;

}

Максимальное число повторений данного цикла равно 40. Получив значение для данной точки в переменной iterations, используем оператор switch для выбора символа, который будет выводиться в этой точке. Вместо сорока возможных значений здесь участвуют всего четыре разных символа, которые определяются с помощью оператора взятия по модулю (%) таким образом, что значения 0, 4, 8... выводятся одним символом, значения 1, 5, 9... другим символом и т. д.:

switch (iterations % 4)

{

case 0:

Console.Writ e( “.”);

break;

case 1:

Console.Write (“o”);

break;

case 2:

Console.Write(“o”);

break;

case 3:

Conscle.Write(“%”);

break;

}

Обратите внимание, что вместо оператора Console.WriteLine() используется Console.Write(), поскольку после вывода очередного символа не требуется переходить на новую строку. Необходимость перейти на новую строку возникает после выполнения самого вложенного цикла, и здесь просто выводится символ конца строки, для чего применяется уже знакомая escape-последовательность:

}

Console.Write(“\n”);

}

В итоге каждая строка программы отделена от предыдущей и выровнена надлежащим образом.




Поделиться с друзьями:


Дата добавления: 2015-04-29; Просмотров: 378; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.027 сек.