2. В программе My7_2 реализован процесс, относительно которого выдвинута так называемая гипотеза Сиракуз. Это
процесс последовательного преобразования натурального
числа n в 1. Запустив программу, проверяем ее работу при не-
скольких значениях n и видим, что предусмотренный резуль-
тат каждый раз достигается. Отсюда мы делаем предположе-
ние, что работа программы завершится, то есть результат
будет получен при любом значении n. Однако с достовернос-
тью это неизвестно, доказательство факта завершения работы
программы (алгоритма) при любом значении n до сих пор ни-
кем не получено7
. Другими словами, есть алгоритм (програм-
ма), но его конечность, завершаемость работы во времени —
открытый вопрос, требующий своего обоснования. Мораль:
проверка циклов типа While требует особо тщательной рабо-
ты, ибо подобные циклы «потенциально бесконечны во време-
ни».
Program My7_2;
Var n:Integer;
Begin
WriteLn('Введите натуральное число:');
ReadLn(n);
Write(n);
While n<>1 Do Begin
If n Mod 2=0 Then n:=n Div 2
Else n:=(3*n+1) Div 2;
Write(' - ',n);
End;
ReadLn;
End.
Последовательно запуская программу, оцените среднюю
длину получаемых цепочек чисел при изменении n от 2 до 20.
Как избавиться от этой ручной работы по многократному
запуску программы?
Рассматривая полученные цепочки чисел, нетрудно заме-
тить, что фрагменты этих цепочек часто повторяются. Напри-
мер, 8421, 5168421. Как использовать этот
факт при подсчете средней длины цепочек для чисел (n) из
большого интервала, например типа Integer? Потребуется ли в
этом случае что-либо изменять в приведенном фрагменте про-
граммы?
const
m=100; { максимальное количество чисел в файле }
var
f:Text;
i,j,n,k:integer;
a:array[1..m] of integer;
begin
{ читаем данные из файла в массив }
Assign(f,'SuperFile.txt'); Reset(f);
i:=0;
while not Eof(f) do begin Inc(i); Readln(f,a[i]) end;
Close(f);
n:=i;
{ сортируем массив по возрастанию методом пузырька }
for i := 1 to n-1 do
for j := 1 to n-i do
if a[j] > a[j+1] then
begin k := a[j]; a[j] := a[j+1]; a[j+1] := k end;
{ заполняем файл из массива }
Rewrite(f);
for i:=1 to n do Writeln(f,a[i],' ');
Close(f)
end.
'При добавлении записей формулу вычисления задолженности добавлять не надо
'Запускаете макрос - результат (отчет) на втором листе
'На первом листе формулы пересчитывается - результаты обновляются
'Форма в этом случае -излишне
Dim i, j, s, a
Sub Othet ()
Dim info As Variant
'Clear OTHET(2 list)
Sheets(2).Select
Range("A1:I1").Select
With Selection
.HorizontalAlignment = xlGeneral: .VerticalAlignment = xlBottom
.AddIndent = False: .IndentLevel = 0: .ShrinkToFit = False: .MergeCells = True
End With
Selection.Font.Bold = True
With Selection
End With
Sheets(2).Cells(1, 1) = "ОТЧЕТ"
'Shapka 1 list
Sheets(1).Select
info = Array("", "фамилия", "адрес", "дата", "стоимость заказа", "сумма аванса", "задолженность", "вид заказа")
For i = 1 To UBound(info)
Cells(1, i) = info(i)
Next
i = 2
'Расчет долга
While Cells(i, 1) <> ""
Cells(i, 5) = "=D" + Chr(48 + i) + "-E" + Chr(48 + i)
i = i + 1
Wend
Rows("1:1").Select
Selection.AutoFilter
a = "" + ">" + InputBox("Укажите задолженность", "", 0) + ""
Selection.AutoFilter field:=5, Criteria1:=a, Operator:=xlAnd
Range("A1:G" + Chr(48 + i) + "").Copy Sheets(2).Range("a2")
Sheets(1).Select
Selection.AutoFilter
End Sub