НазадСодержаниеВперед

Повторяющиеся вычисления

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

while (В) {5}

где в — выражение логического типа; s — операторы, называемые телом цикла. Операторы s в фигурных скобках выполняются до тех пор, пока условие в не станет ложным.

  Нахождение общего делителя

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

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

НОД(n, 0) = п.

В остальных случаях верно следующее соотношение:

НОД(n, т) = НОД(m, п%т).

В функции nod переменная р используется для получения остатка от деления чисел п и m (листинг 8.1). Выполнение цикла продолжается до тех пор, пока значение р не станет равным нулю. Последнее вычисленное значение m равно наибольшему общему делителю.

Листинг 8.1. Наибольший общий делитель двух чисел

<HTML> 

<HEAD>

<TITLE>Наибольший общий делитель двух чисел</TITLE>

<script language="JavaScript">

<!-— //

function nod(obj)

( var n=obj.numl.value 

var m=obj.num2.value 

var p = n%m 

while (p!=0) 

{ n=m 

m=p 

p=n%m 

}

obj.res.value=m 

}

//-—>

</script>

</HEAD>

<BODY>

Наибольший общий делитель двух заданных чисел 

<FORM name="forml">

Введите число <input type="text" name="numl" size="8"><br> 

Введите число <input type="text" name="num2" size="8"><br> 

<input type="button" value="Вычислить" onClick="nod(forml)"><br> 

Наибольший общий делитель <input type="text" name="res"

size="8"><hr>

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

</FORM> 

</BODY> 

</HTML>

На рис. 8.1 приведен результат выполнения сценария для заданных натуральных чисел.

Рис 8.1. Наибольший общий делитель двух натуральных чисел

  Определение наименьшего общего кратного

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

Для того чтобы определить наименьшее общее кратное, вычислим наибольший общий делитель и воспользуемся следующим равенством:

НОК(n, m) = п х т/НОД(п, т).

В отличие от предыдущего варианта опишем функцию nod с двумя параметрами. Вычисленное значение наибольшего общего делителя будет выдаваться в качестве результата функции. Функция nok простая, ее действия состоят в вызове функции nod и выдаче в качестве результата функции значения выражения. Значением параметра обработки события в данном случае является оператор присваивания, обеспечивающий запись вычисленного значения в соответствующее поле формы (листинг 8.2).

Листинг 8.2. Наименьшее общее кратное двух натуральных чисел

<HTML> 

<HEAD>

<TITLE>Наименьшее общее кратное двух натуральных чисел</TITLE>

<script language="JavaScript">

<!-— //

function nod(n,m) 

{ var p=n%m 

while (p!=0) 

{ n=m 

m=p 

p=n%m 

}

return m 

function nok(n,m)

{ return n*m/nod(n,m) } 

//-—>

</script>

</HEAD>

<BODY>

Наименьшее общее кратное двух заданных натуральных чисел

<FORM name="form1">

Введите число <input type="text" name="numl" size="8"><br>

Введите число <input type="text" name="num2" size="8"><br>

<input type="button" value="Вычислить"

onClick="form1.res.value=nok(form1.num1.value,form1.num2.value)">

<br>

Наименьшее общее кратное <input type="text" name="res"

size="8"><hr>

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

</FORM>

</BODY>

</HTML>

  Определение взаимно простых чисел

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

При рассмотрении предыдущих примеров описаны функции, которые помогают решить поставленную задачу. Для двух данных чисел можно найти наибольший общий делитель и проверить, равен ли он нулю. Если наибольший общий делитель равен нулю, то числа являются взаимно простыми (листинг 8.3, а).

Листинг 8.3, а. Взаимно простые числа

<HTML> 

<HEAD>

<TITLE>Взаимно простые числа</TITLE>

<script language="JavaScript">

<!-— //

function nod(n,m) 

{ var p=n%m 

while (p!=0) 

{ n=m 

m=p 

p=n%m 

}

return m 

}

function numsim(n,m)

{ return (nod(n,m)==l) } 

function ans(n,m) 

{ if (numsim(n,m))

{ forml.res.value='Да'} 

else

{ forml.res.value='Heт'} 

}

//--> 

</script> 

</HEAD> 

<BODY>

Являются ли заданные натуральные числа взаимно простыми? 

<FORM name="form1">

Введите число <input type="text" name="numl" size="8"><br> 

Введите число <input type="text" name="num2" size="8"><br> 

<input type="button" value="Вычислить"

onClick="ans(forml.numl.value,forml.num2.value)"><br> 

Числа взаимно-просты? <input type="text" name="res" size="8"><hr> 

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

</FORM>

</BODY>

</HTML>

В трех предыдущих примерах при решении задачи использовалась функция nod. В каждом из документов приводилось ее описание. Можно описание функции nod вынести во внешний файл, а там, где требуется ее использование, подключать внешний файл к документу. Пусть в файле nnod.js содержится следующее описание функции nod:

function nod(n,m) 

{ var p=n%m 

while (p!=0) 

{ n=m 

m=p 

p=n%m 

}

return m 

}

Для того чтобы данный файл связать с документами, содержащими вызов функции nod, требуется указать имя внешнего файла в качестве значения параметра src тега <script>. Документ, использующий внешний файл для рассматриваемой задачи, представлен в листинге 8.3, б.

Листинг 8.3, б. Описание функции nod во внешнем файле

<HTML> 

<HEAD>

<TITLE>Наибольший общий делитель двух чисел</TITLE> 

<script language="JavaScript" src=nnod.js> 

<!—-//

document.alert("Проверьте файл со сценарием") 

//-—> 

</script> 

</HEAD> 

<BODY>

Наибольший общий делитель двух заданных чисел 

<FORM name="form1">

Введите число <input type="text" name="numl" size="8"><br>

Введите число <input type="text" name="num2" size="8"><hr>

<input type="button" value="Вычислить"

onClick="form1.res.value=nod(form1.num1.value,form1.num2.value)">

<br>

Наибольший общий делитель <input type="text" name="res"

size="8"><hr>

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

</FORM> 

</BODY> 

</HTML>

Строка <script language="JavaScript" src=nnod.js> обеспечивает подключение внешнего файла к документу.

При решении задачи нахождения наименьшего общего кратного использовали две функции nod и nok. Пусть функция nod хранится во внешнем файле, а функция nok — в том же документе, в котором производится ее вызов. При описании первого тега <script> указывался источник с помощью значения параметра src, второй тег содержал описание функции nok. HTML-код документа представлен в листинге 8.3, в.

Листинг 8.3, в. Наименьшее общее кратное. Функция nod во внешнем файле

<HTML> 

<HEAD>

<TITLE>Наименьшее общее кратное двух натуральных чисел</TITLE> 

<script language="JavaScript" src=nnod.js> 

<!—- //

document.alert("Проверьте файл со сценарием") 

//-—> 

</script>

<script language="JavaScript"> 

<!-— //

function nok(n,m)

{ return n*m/ nod(n,m) } 

//-—> 

</script> 

</HEAD> 

<BODY>

Наименьшее общее кратное двух заданных натуральных чисел 

<FORM name="form1">

Введите число <input type="text" name="numl" size="8"><br>

Введите число <input type="text" name="num2" size="8"><br>

<input type="button" value="Вычислить"

onClick="forml.res.v.alue=nok(forml.numl.value, forml.num2.value)">

<br>

Наименьшее общее кратное <input type="text" name="res"

size="8"><hr>

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

</FORM> 

</BODY> 

</HTML>

При определении, являются ли два числа взаимно простыми, используются две функции, хранящиеся в отдельных внешних файлах. Для каждой из функций в документе используется свой тег <script>, в котором задаются имена внешних файлов (листинг 8.3, г).

Листинг 8.3, г. Определение взаимно простых чисел. Java Script-функции хранятся во внешних файлах

<HTML> 

<HEAD>

<TITLE>Взаимно простые числа</TITLE> 

<script language="JavaScript" src=nnod.js> 

<!—- //

document.alert("Проверьте файл со сценарием") 

//--> 

</script>

<script language="JavaScript" src=nnumsim.js> 

<!-- //

document.alert("Проверьте файл со сценарием") 

//-—> 

</script> 

</HEAD> 

<BODY>

Являются ли заданные натуральные числа взаимно простыми? 

<FORM name="form1">

Введите число <input type="text" name="numl" size="8"><br> 

Введите число <input type="text" name="num2" size="8"><br> 

<input type="button" value="Вычислить"

onClick="ans(forml.numl.value,forml.num2.value)"><br> 

Числа взаимно просты? <input type="text" name="res" size="8"><hr> 

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

</FORM> 

</BODY> 

</HTML>

  Принятие решения о простом и составном числе

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

В функции simple (листинг 8.4) для того, чтобы выяснить, является ли число п простым, проверяется остаток от деления п на i. Переменная i может изменяться от 2 до г = л/2. Если при каком-либо значении остаток от деления п на i равен нулю, то отсюда следует, что i — делитель п, а, следовательно, число п — составное. Выполнение цикла тогда следует прекратить. С этой целью переменной р будет присвоено значение false. Если же переменная i "пробежала" все значения от 2 до г, и при каждом значении i остаток от деления п на i был отличен от нуля, то исполнение цикла завершится, как только значение i станет больше г. Значение переменной р не изменится. В этом случае п — простое число.

Листинг 8.4. Число простое или составное

<HTML> 

<HEAD>

<TITLE>Число простое или составное</TITLE> 

<script language="JavaScript"> 

<!-— //

function simple(obj) 

{ var n=obj.num.value 

var p = True 

if (n > 3) 

{ var i=2; 

var r=n/2 

while ((i<=r) && p)

{ p=(n%i!=0); i +=1} 

}

if (p) obj.result.value="простое" 

else obj.result.value="cocтавное" 

}

//-—> 

</script> 

</HEAD> 

<BODY>

Является введенное число простым или составным? 

<FORM name="form1">

<input type="text" name="num" size="8">

<input type="button" value="Определить" onClick="simple(form1)"> 

<input type="text" name="result" size="10"><hr> 

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

</FORM> 

</BODY> 

</HTML>

Функцию simple можно улучшить, если делители числа искать из интервала [2, n 1/2 ]. Кроме того, имеет смысл искать делители только для нечетных чисел.

  Числа-близнецы

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

Два натуральных числа называются близнецами, если они оба просты и разница между ними равна 2, например, числа 11 и 13 и 17 и 19 являются близнецами. При решении данной задачи воспользуемся функцией simple, определяющей, является ли число простым. Функция будет иметь один параметр-число и выдавать логический результат true, если число простое, и false, если число составное. Функция numeq для заданных двух чисел проверяет, являются ли числа простыми и верно ли, что разность между числами равна 2. Результат работы функции numeq служит для формирования ответа, который помещается в соответствующее поле формы (листинг 8.5).

Листинг 8.5. Числа-близнецы

<HTML> 

<HEAD>

<TITLE>Числа-близнецы</TITLE> 

<script language="JavaScript"> 

<!-- //

function simple(n) 

{ var p=true 

if (n>3) 

{ var i=2; 

var r=n/2 

while ((i<=r) && p)

{ p=(n%i!=0); i += 1} 

}

return p 

function numeq (n,m)

return (simple(n) && simple(m) && Math.abs(n-m)==2) } 

function ans(n,m) 

{ if (numeq(n,m))

{ form1.res.уаlue="близнецы" } 

else

{ form1.res.value="He являются близнецами" } 

}

//-—> 

</script> 

</HEAD> 

<BODY>

Являются ли заданные натуральные числа близнецами? 

<FORM name="form1">

Введите число <input type="text" name="numl" size="8"><br> 

Введите число <input type="text" name="num2" size="8"><br> 

<input type="button" value="Вычислить"

onClick="ans(forml.numl.value,forml.num2.value)"><br> 

Заданные числа <input type="text" name="res" size="25"><hr> 

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

</FORM> 

</BODY> 

</HTML>

  Числа Фибоначчи

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

Элементы числовой последовательности 1, 1,2, 3, 5, 8, 13, 21, ..., в которой первые два элемента равны 1, а каждый следующий элемент представляет собой сумму двух предыдущих, называются числами Фибоначчи. В функции fib в результате работы цикла формируется очередное число последовательности до тех пор, пока сформированное число не станет больше или равным заданному числу. После выполнения цикла определяется, принадлежит ли заданное число последовательности чисел Фибоначчи (листинг 8.6).

Листинг 8.6. Числа Фибоначчи

<HTML> 

<HEAD>

<TITLE> </TITLE>

<script language="JavaScript">

<!-- //

function fib(obj)

{ var num=obj.data.value 

var f1=1 

var f2=l 

var f3=l 

while (num>f3)

{ f3=fl+f2; fl=f2; f2=f3 } 

if (num==f3) obj.result.value="Да" 

else obj.result.value="HeT" 

}

//-->

</script> 

</HEAD> 

<BODY>

Является ли введенное значение числом Фибоначчи? 

<FORM name="form1">

<input type="text" name="data" size="8">

<input type="button" value="Определить" onClick="fib(form1)"> 

<input type="text" name="result" size="5"><hr> 

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

</FORM> 

</BODY> 

</HTML>

  Решение уравнения методом итераций

Необходимо написать программу, которая находит корень уравнения sin(x 2 + 1) методом итераций при заданном начальном приближении t и точности eps. Методом итераций решается уравнение вида

x =f(x), |f(x)<1|.

Последовательные приближения к корню задаются по формуле x r = f(x k-1 ),  k=1, 2, ..., x 0 = t. Если | x k - x k-1 | < eps, то значение x k-1 можно считать приближенным корнем уравнения, т. к. выполнено:

x r = f(x k-1 ) и |f(x k-1 )-x k-1 | < eps.

Два последних вычисленных значения отличаются по модулю на величину, меньшую заданной точности eps.

В функции iter используются переменные х и у для хранения двух последовательных значений (листинг 8.7).

Листинг 8.7. Решение уравнения методом итераций

<HTML> 

<HEAD>

<TITLE>Решение уравнения методом итераций</TITLE> 

<script language="JavaScript"> 

<!—- //

function iter(obj) 

{ var t=obj.prib.value 

var eps=obj.teps.value 

var x=t

var y=Math.sin(x*x+l) 

while (Math.abs (y-x)>=eps)

{ x=y; y= Math.sin(x*x+l) } 

obj.result.value=y 

}

//--> 

</script> 

</HEAD> 

<BODY>

Решение уравнения sin(x*x+l)=0 методом итераций 

<FORM name="form1">

Введите начальное приближение <input type="text" name="prib"

size="8"><br> 

Введите требуемую точность <input type="text" name="teps"

size="8"><br>

<input type="button" value="Найти корень" onClick="iter(form)"> 

Корень уравнения <input type="text" name="result" size="18"><hr> 

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

</FORM> 

</BODY> 

</HTML>

  Свойства пар натуральных чисел

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

Рис 8.2. Свойства пар натуральных чисел

Две функции: вычисляющая наименьшее общее кратное и проверяющая, являются ли два числа взаимно простыми, используют функцию определения наибольшего общего делителя. Функция принятия решения, являются ли два значения числами-близнецами, использует функцию определения простого числа. Все функции поместим в отдельный файл. Этот файл не будет содержать тегов HTML и должен иметь расширение js. В нашем случае во внешнем файле хранятся следующие описания переменных и функций:

var s1="наибольший общий делитель: " 

var s2="наименьшее общее кратное: " 

var sЗ="числа взаимно простые: " 

var s4="числа-близнецы: " 

function nod(n,m) 

{ var p = n%m 

while (p !=0) 

{ n=m 

m=p 

p=n%m 

}

return m 

function nok(n,m)

{ return n*m/nod(n,m) } 

function simple(n) 

{ var p=true 

if (n>3)

{ var i=2; 

var r=n/2 

while ((i<=r) && p)

{ p=(n%i != 0); i+=l} 

}

return p 

}

function numeq(n,m) 

{ var r="нет"

if ( simple(n) && simple(m) && Math.abs(n-m)==2 )

r="да" 

return r 

}

function numsim(n,m) 

{ var r= "нет" 

if (nod(n,m)==l)

r="да" return r 

}

function grant(obj) 

{ var s=""

var n=obj.numl.value

var m=obj.num2.value

if ((obj.elements [2]) .checked) {s=s+sl+nod(n,m)+"\r\n"; ans(s)}

if ((obj.elements[3]).checked) {s=s+s2+nok(n,m)+"\r\n"; ans(s)}

if ((obj.elements[4]).checked) {s=s+s3+numsim(n,m)+"\r\n"; ans(s)}

if ((obj.elements[5]).checked) {s=s+s4+numeq(n,m)+"\r\n"; ans(s)}

}

function ans(s) 

{ document.form1.res.value =s }

Для того чтобы этот файл связать с документом, содержащим вызов функций, описанных во внешнем файле, требуется имя файла задать в качестве значения параметра src тега <script>. Документ, использующий внешний файл для рассматриваемой задачи, представлен в листинге 8.8.

Листинг 8.8. Определение некоторых свойств пары натуральных чисел

<HTML> 

<HEAD>

<TITLE>Определение некоторых свойств пары чисел</TITLE> 

<script language="JavaScript"- src="8ex8func.js">

<!-—

document.alert("Проверьте файл со сценариями!") 

//--> 

</script> 

</HEAD> 

<BODY background="fon3.gif">

<H4 align=center>0пpeдeлeниe свойств пары натуральных чисел </Н4> 

<CENTER>

<FORM name="form1"> 

Введите два числа:

<input type="text" name="numl" size=10> 

и <input type="text" name="num2" size=10><br> 

Выберите свойства и нажмите кнопку <В>Определить</В><Р> 

<TABLE border=3 bgcolor=silver align=center> 

<ТR><ТН>Свойства</ТН><ТН>Результат</ТН></ТR> 

<TR> 

<TD>

<input type="checkbox" name="n" value=l>

наибольший общий делитель<br> 

<input type="checkbox" name="n" value=2>

наименьшее общее кратное<br>

<input type="checkbox" name="n" value=3>взаимно просты<br> 

<input type="checkbox" name="n" value=4>чиcлa-близнeцы<br> 

</TD>

<TD><textarea name=res cols=30 rows=4></textarea><br></TD> 

</TR>

</TABLE><P>

<input type="button" value=0пpeдeлить onClick="grant(forml)"> 

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

</FORM> 

</BODY> 

</HTML>

  Упражнения

1. Напишите программу, которая "переворачивает" заданное натуральное число.

2. Напишите сценарий, который определяет все числа-палиндромы из заданного пользователем диапазона чисел.


НазадСодержаниеВперед
Сайт создан в системе uCoz