Глава 9. Оператор цикла арифметического типа.

Глава 9
Оператор цикла арифметического типа

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

for (А; В; I){S}

Выражение А служит для инициализации параметра цикла и вычисляется один раз в начале выполнения цикла. Выражение в (условие продолжения) управляет работой цикла. Если значение выражения ложно, то выполнение цикла завершается, если истинно, то выполняется оператор s, составляющий тело цикла. Выражение i служит для изменения значения параметра цикла. После выполнения тела цикла s вычисляется значение выражения i, затем опять вычисляется значение выражения вит. д. Цикл может прекратить свою работу в результате выполнения оператора break в теле цикла. Опишем функцию sumdei, которая находит сумму делителей числа п, не считая самого числа.

function sumdei (n) 

{ var s=l;

for (var i=2; i <= n/2; i++)

{ if (n % i == 0) s += i } 

return s 

}

Параметр цикла i описывается с помощью оператора var i = 2. Условие продолжения выполнения цикла i <= n/2. Все делители натуральных чисел находятся в интервале [1; п]. Параметр цикла i увеличивается на 1 при выполнении 1++. Тело цикла состоит из условного оператора. Если очередное число является делителем, то оно добавляется к переменной s, служащей для "накапливания" суммы делителей числа п. До цикла переменной s присваивается значение 1, т. к. 1 — делитель любого натурального числа.

  Совершенные числа

Напишем программу, определяющую, является ли заданное число п совершенным.

Совершенным называется число п, равное сумме своих делителей, не считая самого числа. Например, число 6 является совершенным, т. к. верно 6 = 1 + 2 + 3, где 1, 2, 3 — делители числа 6. Число 28 также является совершенным, справедливо равенство 28 = 1 + 2 + 4 + 7 + 14. При решении задачи воспользуемся только что описанной функцией sumdei (листинг 9.1).

 Листинг 9.1. Итерационные методы. Совершенные числа 

<HTML> 

<HEAD>

<TITLE>Итерационные методы. Совершенные числа</TITLE> 

<script language="JavaScript"> 

<!—- //

function sumdei(n) 

{ var s=l;

for (var i=2; i<=n/2; i++)

{ if (n % i == 0) s += i }

 return s 

}

function sov(obj) 

{ var n=obj.numb.value; 

var s=""

if (n==sumdel(n)) s="совершенное" 

else s="не является совершенным" 

return s 

}

//--> 

</script> 

</HEAD> 

<BODY>

<P> Итерационные методы. Совершенные числа</Р> 

<FORM name="form0">

Введите натуральное число: <input type="text" size=8 name="nurnb"> 

<input type="button" value=Выполнить

onClick="this.form.res.value=sov(form0)"><hr>

Данное число: <input type="text" size=24 name="res"><hr> 

<input type="reset" value=Отменить> 

</FORM> 

</BODY> 

</HTML>

Обратите внимание на значение параметра обработки события. В данном случае это оператор присваивания, в правой части которого вызов функции sov.

  Дружественные числа

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

Очевидно, что если число п является совершенным, то пара (п, п) является дружественной. Интересно рассмотреть случаи, когда числа пит различны. При решении задачи удобно использовать функцию sumdei, которая для каждого натурального числа находит сумму его делителей без самого числа. Так как функция sumdei используется для решения разных задач, то разумно ее описание вынести во внешний файл. Пусть fsumdel.js — имя файла, в котором хранится описание функции sumdei на языке JavaScript. Описание функции dr, определяющей, являются ли два числа дружественными, может быть таким:

function dr (n,m) 

{ var s = ""

if (n==sumdel(m) && m==sumdel(n)) s="дружественные" 

else з="не являются дружественными" 

return s 

}

 Полностью создать программу читателю предлагается в качестве упражнения.

  Нахождение дружественных чисел из заданного диапазона

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

Параметр цикла j "пробегает" все числа от а до ь из заданного диапазона. Для каждого числа j находится число, являющееся суммой делителей j. Если это число попадает в рассматриваемый диапазон, то рассчитывается его сумма делителей и сравнивается с числом j. В текстовой переменной st формируется ответ в виде пар дружественных чисел. Сформированная строка st выводится в текстовое поле формы, предназначенное для отображения результата, как показано на рис. 9.1.

Рис 9.1. Дружественные числа из заданного диапазона HTML-код документа представлен в листинге 9.2.

Листинг 9.2. Итерационные методы. Дружественные числа

<HTML> 

<HEAD>

<TITLE> Итерационные методы. Дружественные числа</TITLE> 

<script LANGUAG="JavaScript"> 

<!-— //

function sumdel (number) 

{ var s=l; 

var i=l; 

for (i=2; i <= number/2; i++)

{ if ( number % i = 0)  s += i } 

return s 

}

var st="" 

function dr(obj) 

{ var a= obj.numl.value 

var b= obj.num2.value 

var k

for (var j=a; j <=b; j++) 

{ k=sumdel (j)

if (k >=a && k <= b) 

{ if (sumdel (k) == j)

{ st+= j+" и " +k+"\r\n" } 

}

//-—> 

</script> 

</HEAD> 

<BODY>

<H4> Итерационные методы. Дружественные числа</Н4> 

<FORM name="form0"> 

<pre>

Левый конец интервала: <input type="text" size=8 name="num1"> 

Правый конец интервала: <input type="text" size=8 name="num2"><br> 

<input type="button" value=Bьшoлнить

onClick="dr(formO); if (st==''){st='HeT'}; 

this.form.res.value=st"><br>

Пары дружественных чисел<br>

<textarea cols=30 rows=4 name="res"> </textarea><P> 

<input type="reset" value=Отменить onClick="st=''"> 

</pre> 

</FORM> 

</BODY> 

</HTML>

При выполнения сценария в качестве ответа поступают все совершенные числа, и каждая из пар дружественных чисел встречается два раза. Для того чтобы исключить такие ситуации, изменим функцию dr, добавив в нее дополнительную проверку: k>j. Теперь в случае, когда задан интервал от 1 до 500, будет выведена лишь одна дружественная пара: 220 и 284.

  Вычисление факториала: вариант 1

Напишем программу, определяющую значение факториала заданного натурального числа.

Напомним, что п! = 1х2х...х(n - 1)хn. Будем использовать переменную f для накапливания сомножителей. До выполнения цикла переменной f присваивается значение 1, затем в теле цикла полученное значение f умножается на i. После того как параметр цикла i "пробежит" все значения от 2 до п в переменной f будет вычислено значение п!.

HTML-код представлен в листинге 9.3.

Листинг 9.3. Итерационные методы. Вычисление факториала

<HTML> 

<HEAD>

<TITLE>Вьмисление факториала</TITLE> 

<script language="JavaScript"> 

<!—- //

function fact1 (obj ) 

{ n=obj.num.value 

var f=l

for (var i=2; i <= n; i++) {f = f*i} 

obj.res.value=f 

}

//-—> 

</script> 

</HEAD> 

<BODY>

<P> Итерационные методы. Вычисление факториала</Р> 

<FORM name="forml">

Введите натуральное: <input type="text" size=8 name="num"> 

Вычисленное значение: <input type="text" size=8 name="res"><hr> 

<input type="button" value=Bыпoлнить ondick="factl(forml)"><hr> 

<input type="reset" value=Отменить> 

</FORM> 

</BODY> 

</HTML>

  Вычисление факториала: вариант 2

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

function fact2 (n) 

{ var f=1

for (var i=n; i > 1; i-—) 

{f = f*i};

return f 

}

В функцию fact2 передается значение параметра (а не имя формы, как в предыдущем примере), полученный после выполнения функции результат записывается в соответствующее поле.формы. Значение параметра обработки события получается с помощью оператора присваивания, при помощи которого осуществляется запись в поле результата. Полностью программа выглядит так, как представлено в листинге 9.4.

Листинг 9.4. Вычисление n!

<HTML> 

<HEAD>

<TITLE>Вычисление n!</TITLE> 

Ocript language="JavaScript"> 

<!-- //

function fact2 (n) 

{ var f=1

for (var i=n; i >= 1; i-=l)

{ f = f*i } 

return f 

}

//-—> 

</script> 

</HEAD> 

<BODY>

<P> Итерационные методы. Вычисление факториала n!</Р> 

<FORM name="form1">

Введите натуральное: <input type="text" size=8 name="num"> 

Вычисленное значение: <input type="text" size=8 name="res"><hr>

<input type="button" value=Выполнить

onClick="forml.res.value=fact2(forml.num.value)"><hr> 

<input type="reset" value=Отменить> 

</FORM> 

</BODY> 

</HTML>

  Вычисление n!!

Напишем сценарий, который по заданному натуральному числу п вычисляет n!!

Напомним, что n!! = 1хЗх...хn, если л нечетно, и n!! = 2х4х...хn, если п четно. Опишем функцию facts, решающую задачу:

function fact3 (n) 

{ var f=1

for (var i=n; i>l; i-=2) {f = f*i};

return f 

}

Обратите внимание на выражение, в результате выполнения которого должно меняться значение параметра цикла. На каждом шаге итерации значение параметра уменьшается на 2. Полностью сценарий представлен в листинге 9.5.

Листинг 9.5. Вычисление значения n!!

<HTML> 

<HEAD>

<TITLE>Вычисление значения n!!</TITLE> 

<script language="JavaScript"> 

<!-— //

function fact3(n) 

{ var f=1

for (var i=n; i >= 1; i-=2) {f = f*i} 

return f 

}

//--> 

</script> 

</HEAD> 

<BODY>

<P> Итерационные методы. Вьмисление n!!</Р> 

<FORM name="form1">

Введите натуральное: <input type="text" size=10 name="num"> 

Вычисленное значение: <input type="text" size=10 name="res"><hr> 

<input type="button" value=Bыполнить

onClick="forml.res.value=facts(forml.num.value)"><hr> 

<input type="reset" value=Отменить> 

</FORM> 

</BODY> 

</HTML>

  Движение точки вдоль ломаной

Точка движется по линии, изображенной на рис. 9.2, перемещаясь за один шаг на одну клетку. Известны целочисленные координаты (х, у) точки в некоторый момент времени. Напишем программу, определяющую координаты точки через заданное число шагов.

Рис 9.2. Траектория движения точки вдоль ломаной

Проведем прямые, соединяющие точки ломаной. Если значения координат х и у совпадают, следовательно, точка лежит на прямой, описываемой уравнением у = х, и следующий шаг вдоль ломаной должен быть вправо. Если же значения координат х и у связаны соотношением у = х — 1, то точка вдоль ломаной должна сместиться вверх. Мы описали только один шаг передвижения. Чтобы узнать координаты точки через несколько шагов, в программе используется цикл. В функции step вычисляются и записываются в нужные поля формы конечные координаты (листинг 9.6).

Листинг 9.6. Движение точки вдоль ломаной

<HTML> 

<HEAD>

<TITLE>Движение точки вдоль ломаной</TITLE> 

<script language="JavaScript"> 

<!-- //

function step(obj) 

{ var x=Number(obj.x.value) 

var y=Number(obj.y.value) 

var n=obj.n.value 

for (var i=l; i <= n; i++) 

{ if (y==x) x += 1

else if (y==x-l) y+=l } 

obj.newx.value=x 

obj.newy.value=y 

}

//--> 

</script> 

</HEAD> 

<BODY>

<Р>Движение точки вдоль ломаной</Р> 

<pre>

<FORM name="forml">

Введите координату по оси x: <input type="text" size=8 name="x"><hr> 

Введите координату по оси у: <input type="text" size=8 name="y"><hr> 

Введите число шагов: <input type="text" size=8 name="n"><hr>

<input type="button" value=Bьшoлнить onClick="step (forml) "><hr> 

<Р>Координаты точки в конце шага</Р> 

По оси x: <input type="text" size=8 name="newx"><hr> 

По оси у: <input type="text" size=8 name="newy"><hr> 

<input type="reset" value=Отменить> 

</FORM></pre>

</BODY> 

</HTML>

  Вычисление суммы чисел, кратных 7

Напишите функцию, которая определяет сумму всех чисел, кратных 7 в заданном интервале [т; п].

В качестве начального значения параметра цикла в функции step выбирается ближайшее целое к значению правого конца промежутка. На каждом шаге выполнения тела цикла значение параметра уменьшается на 7. Цикл завершает свою работу, когда значение параметра цикла меньше значения левого промежутка. Полностью программа описана в листинге 9.7.

Листинг 9.7. Сумма чисел, кратных 7, в заданном интервале

<HTML> 

<HEAD>

<TITLE>Сумма чисел, кратных 7, в заданном интервале </TITLE> 

<script language="JavaScript">

<!—- //

function sum7(m,n) 

{ var s=0

for (var i=n-n%7; i >=m; i-=7)

{ s += i } 

return s 

}

//-—> 

</script> 

</HEAD> 

<BODY>

<Р>Определение суммы чисел, кратных 7, в заданном интервале</Р>

<рrе>

<FORM name="forml">

Введите левую границу интервала: <input type="text" size=8

name="lef"><hr>

Введите правую границу интервала: <input type="text" size=8

name="rig"><hr>

Вычисленная сумма: <input type="text" size=8

name="res"><hr>

<input type="button" value=Выполнить 

onClick="form1.res.value=sum7(form1.lef.value.form1.rig.value)"><hr>

<input type="reset" value=0тменить> 

</FORM> 

</pre>

</BODY>

</HTML>

  Сумма элементов последовательности

Напишем программу, которая по заданному целому значению « и вещественному х находит сумму . Предположим, что уже найдена сумма первых п—1 элементов, последнее слагаемое обозначим через а. Следующий элемент последовательности определяется по формуле а х х / п .

HTML-код представлен в листинге 9.8.

Листинг 9.8. Сумма элементов последовательности

<HTML> 

<HEAD>

<TITLE>Сумма элементов последовательности</TITLE> 

<script language="JavaScript"> 

<!-— //

function sum(x,n) 

{ var s=0 

var a=l

for (var i=l; i <= n; i++) 

{ a=a*x/i; s += a }

return s 

}

//-—> 

</script> 

</HEAD> 

<BODY>

<Р>Сумма элементов последовательности </Р> 

<pre>

<FORM name="form1">

Введите значение x: <input type="text" size=8 name="lef"><hr> 

Введите число элементов: <input type="text" size=8 name="rig"><hr> 

Вычисленная сумма: <input type="text" size=12 name="res"><hr> 

<input type="button" value=Выполнить

onClick="forml. res. value = sum(forml. lef. value, forml. rig. value)"><hr>

<input type="reset" value=Отменить> 

</FORM> 

</pre>

</BODY> 

</HTML>

  Выбор и размещение изображений

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

После щелчка мышью по названию изображения в левой части экрана в свободном окне появляется соответствующее изображение. Если все места заняты как на рис. 9.3, а пользователь выбирает название изображение, то происходит замена в текущем окне.

Рис 9.3. Выбор изображения из заданного списка

Названия изображений задаются с помощью тега oeiectx При выборе варианта соответствующее изображение загружается в свободную область просмотра. Значение глобальной переменной k определяет номер свободной области. Если заполнены все области просмотра, то очередное изображение опять помещается в первую область, замещая находящееся там изображение. Переменная len используется при вычислении числа названий изображений, т. е. элементов в теге <seiect>.

Функция ref очищает все окна. Сценарий решения задачи приведен в листинге 9.9.

Листинг 9.9. Выбор и размещение изображений

<HTML> 

<HEAD>

<TITLE>Bbi6op и размещение изображений</TITLE>

<script>

<!-—

var k=0 

var len

function ch_pict(num)

{ len=((document.forml).elements[0]).length-1 

var m=num*100

document./images/[k].src="picture"+num+".gif" 

document.forms [0].elements[k+1].value=m 

if (k < len-1) k+=l 

else k=0

}

function ref()

{ len={(document.forml).elements[0]).length-1 

k=0

for (var i=0; i < len; i++) 

{ document./images/[i].src="pictureO.gif"

document.forms [0].elements[i+1].value=''} 

}

//-—> 

</script> 

</HEAD> 

<BODY bgcolor="#eaf5ef">

<H4 align=center>Выберите рисунки в порядке предпочтения</Н4> 

<FORM name="form1"> 

<TABLE border=1> 

<TR> 

<TD>

<select name="pict" size="7"

onChange="ch_pict(forml.pict.value)"> 

<option value="0">Heт    </option> 

<option value="l">Дом    </option> 

<option value="2">Книги  </option> 

<option value="3">Письмо </option> 

<option value="4">Kpacки </option> 

<option value="5">Bonpoc </option> 

<option value="6">Дерево </option> 

</select> 

</TD>

<TD align=center><img src="picture0.gif" width=70></TD> 

<TD align=center><img src="picture0.gif" width=70></TD> 

<TD align=center><img src="picture0.gif" width=70></TD> 

<TD align=center><img src="picture0.gif" width=70></TD> 

<TD align=center><img src="picture0.gif" width=70></TD>

<TD align=center><img src="picture0.gif" width=70></TD> 

</TR> 

<TR>

<TD width=50>стоимости</TD>

<TD width=50><input type="text" name="resl" size=8></TD> 

<TD width=50><input type="text" name="res2" size=8></TD> 

<TD width=50><input type="text" name="res3" size=8></TD> 

<TD width=50><input type="text" name="res4" size=8></TD> 

<TD width=50><input type="text" name="res5" size=8></TD> 

<TD width=50><input type="text" name="res6" size=8></TD> 

</TR>

</TABLE><br>

<input type="button" value="Обновить" onClick="ref()"> 

</BODY> 

</HTML>

  Выбор критериев качества чтения лекций

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

Рис 9.4. Качество чтения лекций

Критерии оценки качества задаются с помощью тега <seiect>. Как только пользователь выбирает очередное значение качества, оно переносится в правое поле, как на рис. 9.4.

Разрешено выбрать не более пяти значений качеств, при попытке указать шестое выводится предупреждающее сообщение. Кроме того, в сценарии предусматривается, что все выбранные качества различны. Если делается попытка повторно выбрать некоторый критерий, то пользователь об этом будет предупрежден. HTML-код со сценарием представлен в листинге 9.10.

Листинг 9.10. Выбор пяти критериев качества чтения лекций

<HTML> 

<HEAD>

<TITLE>Выбор пяти критериев качества чтения лекций</TITLE> 

<script language="JavaScript"> 

<!-—// 

var n=0

function mov(obj,m) 

{ var s=((obj.elements[0])[m]).text 

var s1

var p= false

if (n<=(obj.elements[1]).length-1) 

{ for (var i=0; i <= n-1; i++)

{ s1= ((obj.elements[1])[i]).text 

if (s==sl)

{ alert ("Вы уже выбирали этот критерий"); р= TRue; break } 

}

if(!p)

((obj.elements[1])[n]).text=((obj.elements[0])[m]).text; n=n+1 

}

else alert ("Вы уже выбрали необходимое число критериев") 

}

function ref(obj) 

{ n=0

for (var i=0; i <= (obj.elements[1]).length-1; i++)

{ ((obj.elements[1])[i]).text=" "} 

}

//-—> 

</script> 

</HEAD>

<BODY bgcolor="#eaf5ef" onLoad="ref(forml)"> 

<FORM name="form1">

<H3 align=center>Kaчecтво чтения лекций</Н3> 

<Р>Выберите пять основных критериев качества чтения

лекций из предложенного списка. 

<br>Перечислите их в порядке важности.</р> 

<select name="formdata" size=6

onChange=mov(forml,forml.formdata.value)> 

<option value=0>Cooтвeтствие программе 

<option value=l>Дoкaзaтeльнocть изложения 

<option value=2>Учет специфики аудитории 

<option value=3>Целостность и логичность 

<option value=4>Пoлнoтa изложения материала 

<option value=5>Иcпoльзoвaниe эффективных методов 

<option value=б>0тpaжeниe современного уровня 

<option value=7>Bлaдeниe терминологией 

<option value=8>Полнота использования времени 

<option value=9>Тематическая завершенность 

<option value=10>Иcпoльзoвaниe современных технологий 

</select>

<select name="formres" size=6> 

<option value="n1"> 

<option value="n2"> 

<option value="n3"> 

<option value="n4"> 

<option value="n5"> 

</select>

<hr>

<input type="reset" value=Обновить onClick="ref(form1)"> 

</FORM> 

</BODY> 

</HTML>

  Анкета читателя

Напишем сценарий обработки анкеты читателя. Исследуемые характеристики журнала задаются в левом столбце анкеты. Для работы с анкетой читатель должен выделить характеристику и нажать кнопку Добавить. В правом столбце должен появиться соответствующий текст. Если из правого столбца требуется удалить текст, то его надо выделить и нажать кнопку Удалить. Ееcли в правом столбце нет выделенного текста, то при нажатии кнопки Удалить из списка убирается первый элемент. Если правый столбец пустой, то при нажатии кнопки Удалить выдается сообщение о том, что список пуст. На рис. 9.5 изображен вид анкеты читателя с уже выбранными характеристиками.

Рис 9.5. Работа с анкетой читателя

Функция add помещает в правый список на свободное место выбранный элемент левого списка. Функция del удаляет из второго списка выбранный элемент. При этом ,с помощью цикла все остальные элементы списка сдвигаются вверх, и изменяется длина .второго списка.

Листинг 9.11. Работа со списками: добавление и удаление элементов

<HTML> 

<HEAD>

<TITLE>Работа со списками. Карасев A.</TITLE>

<script>

<!—-

function add(ob)

{ ob.List2.1ength++;

ob.List2[ob.List2.length-l].text=ob.List1[Number(ob.List1.value)].text;

ob.List2[ob.List2.length-1].value=ob.List2.length-1} 

function del(ob)

{ if (!(ob.List2.1ength==0))

{ for(i=Number(ob.List2.value);i+Kob.List2.length;i++) 

ob.List2[i].text=ob.List2[i+l].text; 

ob. List2. length—-} 

else

alert("В списке нет элементов для удаления") 

}

//--> 

</script> 

</HEAD>

<BODY bgcolor="F8F8FF"> 

<FORM name=List>

<h3 align=center>Анкета читателя</hЗ> 

<P align=justify>

В левом столбце представлены некоторые характеристики журнала. 

Сформируйте в правом столбце в порядке предпочтения 

те характеристики, которые Вас привлекают. 

</Р>

<TABLE border=2 cellspacing=3> 

<TR>

<TD rowspan=2>

<select name=List1 size=6>

<option value=0>Достоверность информации 

<option value=l>Стиль подачи материала 

<option value=2>Kaчество информации 

<option value=3>Репутация издания 

<option value=4>Дизaйн и оформление 

<option value=5>Peгyляpнocть издания 

<option value=6>Связь с читателями</орtion> 

</select> 

<TD align=middle><input type=button value="Добавить"

onClick=add(List)> 

<TD rowspan=2>

<select name=List2 size=6> 

</select> 

<TR>

<TD align=middlexinput type=button value="Удaлить"

onClick=del(List)></TD></TR>

</TABLE> 

</FORM> 

</BODY> 

</HTML>

  Упражнения

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

2. Напишите сценарий, в котором определяется количество "счастливых" шестизначных автобусных билетов, т. е. таких, в номерах которых сумма первых трех цифр равна сумме трех последних.

3. Напишите сценарий, в котором определяется, можно ли натуральное число п представить в виде суммы двух квадратов.



Опубликовал admin
12 Авг, Четверг 2004г.



Программирование для чайников.