Вы - -й посетитель этой странички
Основы программирования
С.М. Окулов, г.Киров
Продолжение. См. № 42, 43, 44, 45, 46, 47, 48/2000
Занятие 8. Оператор Repeat... Until
План занятия:
• обсуждение оператора;
• эксперименты с программами
определения простота числа и нахождения
наибольшего общего делителя двух чисел с
помощью алгоритма Евклида;
• выполнение самостоятельной
работы.
Оператор Repeat (повторять) ... Until (до тех пор, пока не) содержит логическое выражение (после Until), которое управляет повторением последовательности операторов, записанных между Repeat и Until. Повторение продолжается до тех пор, пока логическое выражение не примет значение True. Последовательность операторов выполняется по меньшей мере один раз, ибо логическое выражение вычисляется после выполнения данной последовательности (поэтому данный цикл называют циклом с постусловием).
Repeat
<оператор1>;
<оператор2>;
...
<операторn>;
Until <логическое выражение>
При использовании оператора
Repeat ... Until необходимо учитывать следующее:
• последобательность операторов
должна содержать хотя бы один оператор,
влияющий на значение логического выражения;
• для того чтобы цикл завершился,
логическое выражение рано или поздно
должно принять значение True.
Приведем простейший пример
бесконечною цикла: Repeat ... Until False;
Экспериментальный раздел занятия
1. Натуральное число р
называется простым, если оно делится только
на 1 и на себя. По соглашению 1 не считают
простым числом. Начало последовательности
простых чисел имеет вид: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, ...
В программе Му8_1 определяется,
является ли данное число простым. Мы ищем
делители числа п в интервале от 2 до п
div 2, хотя можно было бы ограничиться
интервалом от 2 до целой части Ön
(почему?).
Program My8_l;
Var i, n : LongInt;
Begin
WriteLn ('Введите
натуральное число');
ReadLn (n);
i : = l;
Repeat
Inc(i)
Until (i > n div 2) Or (n mod i =
0);
If i > n div 2 Then Writeln ('
Число ',n, ' простое '}
Else WriteLn ('Число ' ,i, ' -
первый делитель числа' ,n, ', больший 1');
ReadLn
End.
Эту задачу можно решить и с
использованием оператора While (см.
предыдущее занятие). Сделайте это. Затем
измените программу так, чтобы в ней
осуществлялся вывод всех делителей числа п.
Подсказка. Логическое выражение в операторе Repeat ... Until упростится, в нем останется только условие i > n div 2, а в теле цикла появится оператор If n mod i = 0 Then WriteLn (..., i).
Основная теорема арифметики. Всякое натуральное число п > 1 разлагается на произведения простых чисел. Это разложение однозначно с точностью до порядка записи простых чисел в произведении.
Выберите интервал чисел (не очень большой, например, от 101 до 120) и, используя модифицированную программу Му1_8, найдите разложения этих чисел на произведения простых. Ваши записи должны иметь вид:
n = p1a1 • p2a2 • ... • pqaq
— где (ai >= 0), рi —
простые числа, например, 168= 23 • 31
• 50 • 71.
2. Наибольший общий делитель (НОД)
двух целых чисел а и b — это
наибольшее целое число, которое делит
нацело оба числа. Далее мы будем
рассматривать лишь неотрицательные числа,
но это не влияет на общность рассуждений.
Для нахождения НОД чисел а и b можно
представить оба числа в виде:
a = p1a1 • p2a2 • ... • pqaq и b = p1b1 • p2b2 • ... • prbr
— а затем найти НОД (а, b) в виде:
p1min(a1,b1) • p2min(a2,b2) • ... • pmmin(am,bm).
Отложим исследование этого метода нахождения НОД и рассмотрим другой способ, который называется алгоритмом Евклида. Пусть а и b одновременно не равные нулю целые неотрицательные числа и a >= b. Если b = 0, то НОД (а, b) = a, а если b 0, то для чисел а, b и r, где r — остаток от деления а на b, выполняется равенство НОД (а, b) = НОД (b, r). Действительно, r = a mod b = а — (a div b) • b. Если какое-то число делит нацело и а, и b, то из приведенного равенства следует, что оно делит нацело и число r.
Например, пусть а = 48, а b = 18. Приведем ручную трассировку алгоритма Евклида.
а |
b |
Результаты |
48 |
18 |
— |
48 mod 18 =12 |
18 |
НОД (48, 18) = НОД (12, 18) |
12 |
18 mod 12 = 6 |
НОД (12, 18) = НОД (12, б) |
12 mod 6 = 0 |
6 |
НОД (12, 6) = НОД (0, 6) |
0 |
6 |
НОД (0, 6) = 6 |
Таким образом, НОД(48, 18) =
б.
Программная реализация
алгоритма Евклида с использованием
оператора Repeat ... Until имеет вид:
Program My8_2;
Var a, b: LongInt;
Begin
WriteLn ('Введите два
числа');
ReadLn (a, b) ;
Repeat
If a>b Then a:=a mod b
Else b:=b mod a
Until (a=0) or (b=0) ;
WriteLn ('НОД=', а+b) ;
ReadLn
End.
Измените программу так, чтобы
вместо оператора Repeat . . . Until
использовался оператор While. Какое
ограничение в этом случае можно убрать?
Элементы еi
последовательности
е1 = 1 + 1 = 2,
е2 = 2 + 1 = 3,
е3 = 2 • 3 + 1 = 7,
е4 = 2 • 3 • 7 + 1 = 43,
е5 = 2 • 3 • 7 • 43 + 1 =
1807,
е6 = 2 • 3 • 7 • 1807 + 1 =
3263443,
е7 = 2 • 3 • 7 • 1807 •
3263443 + 1 = 547 • 607 • 1033 • 31051 и т.д.
называют числами Евклида. По первым четырем
числам кажется, что числа Евклида простые.
Однако это не так, уже е5 является
составным — 1807 = 13 • 139. Известно, что
евклидовы числа взаимно простые — НОД(ei,
еj) = 1 при i
j. Проверьте этот факт с помощью программы
Му8_2 для первых шести чисел Евклида.
Используя программу Му8_1, покажите, что
число е6 простое.
3. В теории чисел доказывается
следующая теорема. Если а и b
одновременно не равны нулю, то существуют
целые числа х и у, такие, что НОД(а, b)
= а • х + b • у. Теорема не
утверждает, что х и у определены
однозначно, в ней лишь говорится о том, что
НОД(а, b) может быть выражен в таком виде.
Например,
6 = НОД (12, 30)= 12 • 3 + 30 • -1.
Рассмотрим последовательность:
a0 = a • x0 + b
• y0, где x0 = 1, y0
= 0;
a1 = a • x1 + b
• y1, где x1 = 0, y1
= 1;
a2 = a0 - a1•
q1, где q1 = a0 div a1;
подставляя значения a0 и a1
получаем:
a2 = a • x0 + b
• y0 - (a • x1 + b •
y1) • q1 = a • (x0 -
x1 • q1) + b • ( y0 -
y1 • q1) = a • x2
+ b • y2
a3 = a1 - a2
• q2, где q2 = a1
div a2
подставляя значения a1 и a2
получаем:
a3 = a • x1 + b •
y1 - (a • x2 + b • y2)
• q2 = a • (x1 - x2
• q2) + b •(y1 - y2
• q2) = a • x3 + b •
y3;
...
ai = ai-2 - ai-1 •
qi-1, где qi-1 = ai-2
div ai-1,
ai = a • xi-2
+ b • yi-2 - (a • xi-1 + b
• yi-1) • qi-1 = a • xi
+ b • yi;
...
0 = ak-1 - ak • qk,
где qk = ak-1 div ak,
... 0 = a • xk+1 + b • yk+1.
Таким образом, значения qi,
ai, xi , yi,
определяются рекуррентными соотношениями:
qi-1 = ai-2 div ai-1;
ai = qi-2 - ai-1 •
qi-1;
xi = xi-2 - xi-1
• qi-1;
yi = yi-2 - yi-1 •
qi-1;
Рассмотрим данный процесс на примере чисел а = 48 и b= 18.
i |
ai |
xi |
yi |
qi |
0 |
48 |
1 |
0 |
— |
1 |
18 |
0 |
1 |
— |
2 |
12 |
1 |
—2 |
2 |
3 |
6 |
-1 |
3 |
2 |
4 |
0 |
— |
— |
— |
Итак, d = НОД(48,18) = 6 и 6 = 48 •
(-1)+18 • 3.
Описанный алгоритм реализован в
программе My 8_3.
Program Му8__3;
Var a, b, a0, a1, x0, x1, y0, y1, q, t : Integer;
Begin
WriteLn('Введите два числа, первое
должно быть больше второго ');
ReadLn(а, b) ;
a0:=a; a1:=b; x0:=1; x1:=0; у0:=0; у1:=1;
Repeat
q:=a0 div a1;
t:=a0; a0:=a1; a1:=t-a1*q;
t:=x0; x0:=x1; x1:=t-x1*q;
t:=y0; y0:=y1; y1:=t-y1*q
Until a1=0;
WriteLn (a0, '=',а, '*(', x0,') + ',b,' * (', y0, ')
');
ReadLn
End.
Сравните результаты, полученные с помощью ручной трассировки, с результатами работы программы при тех же исходных данных.
Задания для самостоятельной работы
1. Числа вида 2P — 1,
где р — простое число, называются числами
Мерсенна. Являются ли числа Мерсенна при
значениях р 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31
простыми? Для ответа на этот вопрос
напишите соответствующую программу.
Программа должна состоять из двух частей: в
первой вычисляется число Мерсенна для
значения р (р вводится с клавиатуры), во
второй проверяется, является ли оно простым.
2. Линейные уравнения от двух
переменных (линейные диофантовые уравнения),
т.е. уравнения вида:
а•х + b•у = с, — в которых а и b
не равны нулю одновременно, имеют целые
решения тогда и только тогда, когда d =
НОД(а, b) делит нацело число с. Причем,
если x0, y0 — некоторое (частное)
решение, то все решения имеют вид:
х = x0 — п • (b
div d),
у = y0 + n • (а div d)
для всех п.
Пример: 12 • х — 30 • y = 84,
НОД(12, —30) = 6, 84 делится нацело на 6.
Уравнение разрешимо. Одним из его решений
является (х, у) = (2, —2). Все остальные
решения имеют вид: х= 2+ 5 • n, у =
—2+ 2 • n.
Даны целые числа а, b, с.
Написать программу определения
разрешимости соответствующего
диофантового уравнения и, если оно
разрешимо, поиска частного решения.
3. Пусть а и b —
ненулевые целые числа. Целое число т > 0
называется наименьшим общим кратным (НОК)
чисел а и b, если т делится и на а,
и на b нацело, а также любое с, которое
делится нацело и на a, и на b, делится
нацело и на т.
Если a и b — ненулевые
числа, то их наименьшее общее кратное
существует и справедливо равенство НОК(а,
b) = |а • b| div НОД(a, b).
Написать программу нахождения НОК двух
ненулевых чисел.
4. Числа Фибоначчи (fn)
определяются формулами: f0 = f1
= 1; fn = fn-1
+ fn-2 при n >= 2.
Начало последовательности Фибоначчи имеет
вид: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,... Составить
программы:
• определения номера последнего
числа Фибоначчи, которое входит в диапазон
типа Integer (LongInt);
• вычисления s — суммы первых
чисел Фибоначчи, таких, что значение s не
превышает диапазона типа Integer (LongInt).
5. Совершенным называется
число, равное сумме всех своих делителей,
меньших, чем оно само. Например:
6 = 1 + 2 + 3, 28 = 1 + 2 + 4 + 7 + 14. Составьте программу,
проверяющую, является ли заданное
натуральное число совершенным.
Примечание.
Евклидом доказано, что каждое число вида 2p-1•
(2P — 1) является совершенным, если 2p
— 1 — простое число. Л.Эйлер доказал, что все
четные совершенные числа находятся по
формуле Евклида, а относительно нечетных
совершенных чисел ничего неизвестно до сих
пор.
6. Автоморфным называется
число, равное последним цифрам своего
квадрата. Например: 52 = 25, 252 =
625. Очевидно, что автоморфные числа должны
оканчиваться либо на 1, либо на 5, либо на 6.
Составьте программу нахождения
автоморфных чисел (с учетом приведенного
факта), не превышающих значения 999.
Примечание.
Не забывайте о диапазонах переменных
целого типа, 9992 = 998001.
7. Кубические автоморфные
числа равны последним цифрам своих кубов.
Например: б3 = 216. Верно ли, что и такие
числа должны оканчиваться либо на 1, либо на
5, либо на б? Составьте программу нахождения
двузначных и трехзначных кубических
автоморфных чисел.
Материал для чтения
1. Продолжим наше знакомство
с основными понятиями технологий
программирования. Познакомимся с понятием
модели жизненного цикла программы. В
настоящее время понятие жизненного цикла
программы является одним из базовых
понятий в технологии программирования.
Жизненный цикл программы начинается с
момента принятия решения о необходимости
ее создания и заканчивается в момент
полного изъятия программы из эксплуатации.
Основным нормативным документом,
регламентирующим жизненный цикл программы,
является международный стандарт ISO / IEC 12207 (ISO
— International Organisation of Standardisation
— Международная организация по
стандартизации, IEC — International Electrotechnical
Commission — Международная комиссия по
электротехнике). Он определяет структуру
жизненного цикла, которая базируется на
трех группах процессов:
• основные процессы (приобретение,
поставка, разработка, эксплуатация,
сопровождение);
• вспомогательные процессы,
обеспечивающие выполнение основных
процессов (документирование, управление
конфигурацией, обеспечение качества,
верификация, аттестация, оценка, аудит);
• организационные процессы (управление
проектами, создание инфраструктуры проекта,
обучение). К настоящему времени известны
две основные модели жизненного цикла:
• каскадная — см. рис. 1—2;
• спиральная — см. рис. 3.
Анализ | ||||
Проектирование | ||||
Реализация | ||||
Внедрение | ||||
Сопровождение |
Рис. 1
Рис. 2
Каскадный подход хорошо зарекомендовал себя при построении программ, к которым в самом начале разработки можно достаточно точно и полно сформулировать все требования. Пример — расчетные задачи. В случае неточного изложения требований или их изменения получается программа, не отвечающая потребностям пользователя, заказчика, поэтому реальный процесс разработки представлен на рис. 2.
Для преодоления недостатков
каскадной схемы была предложена спиральная
модель жизненного цикла программы (рис.
3). Каждый виток спирали соответствует
созданию очередной версии программы. При
этом уточняются цели и требования,
определяется качество и планируются работы
по созданию следующей версии. Таким образом,
последовательно конкретизируются детали
программы и выбирается окончательная
версия, которая доводится до реализации.
Сходящий вид спирали подчеркивает "размытость"
первоначальных требований и их последующее
уточнение.
2. Ошибки в программах принято
разделять на синтаксические, семантические
и логические. С первыми мы встречались на
предыдущих занятиях. Они достаточно просто
устраняются и говорят о несоответствии
текста программы правилам языка. Вторые
возникают на стадии выполнения программы.
Например, деление на ноль не устраняется на
стадии компиляции, а приводит к ошибке на
стадии выполнения, ибо зависит от
конкретного значения переменной. Третий
тип ошибок самый сложный в обнаружении.
Программа работает так, как написана, но не
так, как предполагалось. Такие ошибки часто
сложно обнаружить. В системе Турбо Паскаль
имеется достаточно мощный отладчик,
позволяющий находить ошибки третьего типа
в программах. Он работает с исходным
текстом программы, позволяет выполнять
программу по шагам и отслеживать изменение
переменных программы в процессе работы
последней.
Перечислим основные команды
отладчика и соответствующие им клавиши,
позволяющие выполнять программу по шагам и
отслеживать значения переменных. Шагом при
отладке является строка программы. Так,
если в строке исходного текста программы
записано несколько операторов, то они будут
выполнены за один шаг.
Команда меню |
Функциональная клавиша |
Назначение |
Run/Run |
<Ctrl> + <F9> |
Запуск программы |
Run/Go to cursor |
<F4> |
Выполняет программу до строки, в которой находится курсор |
Run/Trace into |
<F7> |
Выполняет оператор (операторы), записанный в текущей строке. Если в этой строке записан вызов процедуры или функции, то осуществляется вход в эту процедуру или функцию |
Run/Step over |
<F8> |
Выполняется оператор, записанный в текущей строке без захода в процедуры или функции |
Debug/Watch |
|
Открывает окно для наблюдения за значениями переменных (окно Watches) |
Debug/ Breakpoints |
|
Открывает окно для работы с точками останова |
Debug/Evaluate... |
<Ctrl> + <F4> |
Открывается окно Evaluate and Modify. В нем можно вычислить значение выражения (в выражении могут использоваться и переменные программы) |
Debug/Add watch |
<Ctrl> + <F7> |
Открывает окно Add watch для ввода отслеживаемых значений выражений или переменных. Эти действия можно выполнить и другим способом: сделать окно Watch активным и использовать клавиши <Insert> и <Delete> для вставки и удаления выражений и переменных |
Debug/Add breakpoint |
<Ctrl> + <F8> |
Текущая строка (в которой находится курсор) становится точкой останова программы |
Занятие
9. Вложенные циклы
План
занятия
• эксперименты с программами (с
использованием отладчика системы
программирования) вычисления выражения 1k
+ 2k + ... + nk ;
нахождения цифрового корня числа; решения
старинной задачи о быках, коровах и телятах;
нахождения натуральных чисел,
удовлетворяющих определенному условию;
сведение чисел, кратных 3, к числу 153;
• выполнение самостоятельной
работы.
Для решения задачи достаточно
часто требуется использовать две и более
циклические конструкции, одна из которых
расположена внутри другой (других). Такие
конструкции называют вложенными циклами.
Какие именно циклы при этом используются,
роли не играет, они могут быть организованы
посредством любых рассмотренных ранее
операторов (For, While, Repeat ... Until).
Экспериментальный раздел работы
1. Даны натуральные числа n и k.
Составить программу вычисления выражения 1
k + 2 k + ... + n k .
Для вычисления указанной суммы
целесообразноиспользовать оператор For с
управляющей переменной i, изменяющейся от 1
до n. В теле цикла вычисляется очередное
значение y = ik
и накапливается
искомая сумма
s = s + y.
Program
My9_1;
Var n, k, y, i, s, j : Integer;
Begin
s:=0;
For
i:=1 To n Do Begin
y:=1;
For
j:=1 To k Do y:=y*i;
s:=s+y
WriteLn
('Сумма: ',s)
End.
А сейчас попробуем работать с отладчиком
системы
предыдущего занятия, пункт 4.
• Выполните
команду Debug/Watch. Появится окно Watches.
•
Используя клавишу <Insert>
(при этом открывается окно
• Измените положение и размер
окна Watches на экране. Оно должно находиться в
правом верхнем углу и быть таким, чтобы все
введенные переменные были видны. С этой
целью выполните команду Window/Size/Move ( <Ctrl> +
<F5> ) и используйте клавиши <Shift> + <¬>
,<®>
, <¯>,
<> для
изменения размеров окна и клавиши <¬>
,<®>
, <¯>,
<> для
его перемещения.
• Выполните команду Run/Step over
(<F8>). При этом строка с оператором Begin
выделяется другим цветом. При нажатии на
<F8> управление передается на следующую
строку (эта строка становится выделенной).
• Выполните программу в
пошаговом режиме (посредством
последовательных нажатий на клавишу <F8>),
отслеживая изменение значений переменных
в окне Watches. При выполнении оператора
Продолжим
изучение отладчика.
•
Установите курсор на строку программы с
оператором s:=s+y. Выполните команду Debug/Add
•
Выполните один шаг программы (нажмите
клавишу <F8>).
•
Выполните команду Debug/Evaluate... В
строке
Методические
рекомендации
Рекомендуется максимально использовать
отладчик
Измените программу так, чтобы в ней
вычислялась
Решите следующую задачу. Пусть значение k
зафиксировано,
например, равно 5. Требуется определить
значение
n,
при котором диапазона целого типа данных Integer
окажется
недостаточно для хранения
2. Сложим все
цифры какого-либо числа. Получим
Program
My9_2;
Var n, k, s : LongInt;
Begin
s:=n;
While
s>9 Do Begin
k:=s;
s:=0;
Repeat
s:=s
+ k mod 10;
k:=k
div 10
End;
WriteLn ('Цифровой корень числа ',n,' равен ',s)
End.
3. Старинная
задача. Сколько можно купить быков,
5 рублей, теленок — полтинник (0,5 рубля),
при условии, что на 100 рублей надо купить 100
голов скота.
Преобразуем их:
20b
+ 10k
+ t
= 200 и b
+ k
+ t
= 100.
На 100
рублей можно купить:
· не
более 10 быков, т.е. 0 £
b £
10,
· не
более 20 коров, т.е. 0 £
k £
20,
· не
более 200 телят, т.е. 0 £
t £
200.
Таким образом, получаем:
Program
My9_3;
Var b, k, t: Integer;
Begin
For
b:=0 To 10 Do
For k:=0 To 20 Do
For t:=0 To 200 Do
WriteLn
('быков
',b,' коров
',k,'телят
',t)
End.
Сколько
раз будет проверяться условие в данной
программе (сколько раз будет выполняться
оператор If)?
Переменная b
принимает 11
различных значений (от 0
Program
My9_3m;
Var b, k, t: Integer;
Begin
For
b:=0 To 10 Do
t:=100-(b+k);
If (20*b+10*k+t=200)
Then WriteLn ('быков',
End
End.
В этой программе условие проверяется 11•21 =
231 раз.
4. Написать
программу, которая находит все
четырехзначные числа abcd
(a, b, c, d —
цифры числа, причем все они различны), для
которых выполняется условие: ab
— cd
= a
+ b
+ c
+ d.
Другими словами,
10 • a + b
— (10 • c + d) = a + b
+ c + d
получаем
или
(a — c)/(c + d)
= 2/9,
a
= c +
2, d = 9 — c и
0 £ c
£ 7.
Program
My9_4;
Var a, b, c, d:Integer;
Begin
For
c:=0 To 7 Do Begin
a:=c+2;
d:=9-c;
For
b:=0 To 9 Do
If
(b<>c)and(b<>a)and(b<>d) Then
End.
5. Дано
натуральное число, кратное 3. Найдем сумму
кубов цифр данного числа. Получим новое
число.
Program
My9_5;
Var n, m, t, s, q:LongInt;
Begin
WriteLn
('Введите число, оно умножается
m:=3*n;Write(m,'
');
Repeat
s:=0;t:=m;
While
m>0 Do Begin
q:=m
mod 10;
s:=s+q*q*q;
m:=m
div 10
End;
m:=s;
Write (m,' ')
Until
m=t;
ReadLn
End.
Задания для самостоятельной работы
1. Что будет
напечатано в результате выполнения
следующего фрагмента программы при n
= 6?
a:=1;
b:=1;
For i:=0 To n Do Begin
For j:=1 To b Do Write ('*');
WriteLn;
c:=a+b; a:=b; b:=c
Какая задача решается в этом фрагменте
программы?
2. Что
будет напечатано в результате выполнения
b:=0;
While a<>0 Do Begin
b:=b*10+a mod 10
a:=a div 10;
End;
Write (b);
Какая задача решается в этом фрагменте
программы?
3. Дано
натуральное число q.
Требуется написать
4. Составить
программу для иллюстрации делимости
2++
3++
4+++
5. Дано
натуральное число n.
Требуется выяснить,
· указать
все тройки x, y,
z таких
натуральных чисел,
6. Найти
натуральное число от 1 до 10 000 с максимальной
суммой делителей.
7. Даны
натуральные числа a, b (a <
b).
Получить
8. Даны
натуральные числа n, m.
Получить все натуральные числа, меньшие n,
квадрат суммы цифр которых равен m.
9. Даны
натуральные числа n
и m.
Найти все пары
10. Переставить
цифры данного натурального числа
· 1123581321...,
в которой выписаны подряд все числа
12. Составить
программу возведения заданного числа в
третью степень, используя следующую
закономерность:
13 = 1
23 = 3 + 5
33 = 7 + 9 + 11
43 = 13 + 15 + 17 + 19
53 = 21 + 23 + 25 + 27 + 29
13. Составить
программу для нахождения всех натуральных
чисел n, m,
k из
интервала [1, 10], удовлетворяющих
соотношению n2
+ m2
= k2
.
Примечание.
Решения, которые получаются перестановкой n
14. Написать
фрагмент программы для решения каждой из
указанных ниже задач и обосновать, почему
вами
· вычислить
факториал некоторого числа p;
· задано
число p,
определить, является ли оно факториалом
некоторого числа, если “да”, то найти это
· вычислить
xn ,
где n —
целое положительное число;
· вычислить
значения x1
, x2
, x3
, ..., xn .
15. Дано
трехзначное число. Найти все трехзначные
· состоящих
из тех же цифр, что и исходное число;
· равные
среднему арифметическому всех трехзначных
чисел (включая данное), состоящих из тех же
16. Стороны
прямоугольника заданы натуральными
17. Даны
натуральные числа N
и p.
Получить все
18. Даны целые
числа p и
q.
Получить все делители
19. Сумма
квадратов длин катетов a
и b
прямоугольного
треугольника равна квадрату длины
гипотенузы с:
a
= u•v; b =
(u•u —
v•v)
div 2,
c
= (u•u + v•v) div 2,
— где u
и v
— взаимно простые
нечетные натуральные
20. Найти
наименьшее натуральное число N,
представимое двумя различными способами в
виде суммы
21. Даны
натуральные числа m, n1
, n2
, ..., nm (m
³ 2).
22. Найти все
простые несократимые дроби, заключенные
между 0 и 1, знаменатели которых не превышают
7 (дробь задается двумя натуральными
числами — числителем и знаменателем).
Заключение
В первой части учебника рассмотрены
основные операторы языка программирования
Турбо Паскаль. Разобраны 23 задачи и 116
предложено для самостоятельной работы.
Предметной областью для выбора задач
является “Теория чисел”. Знание этого
раздела математики — необходимая
компонента математической
Дополнительно можно
порекомендовать следующие
1. О системах
счисления и представлении чисел в
2. О
математической логике можно почитать во
второй главе учебно-справочного издания А.И.
Гусевой
3. По теории
чисел трудно найти что-либо лучше
4. О профессии
программиста с большим юмором
5. О технологиях
программирования лучше всего
6. Много
полезных примеров из истории
программирования можно найти в уникальной
книге компьютерного провидца (так его
называют) Д.Васкевича (Васкевич
Д. Стратегия
клиент/сервер. Руководство по выживанию для
специалистов по реорганизации бизнеса.
К сожалению, несмотря на их
огромное количество,
Продолжение
Предисловие
ко второй части
В первой части книги “Основы
программирования”
Вторая часть учебника посвящена
второму “кирпичику” нашего фундамента —
механизму использования процедур и функций.
Материал, так же, как и в первой
части, разбит на
Program
My4_3;
Begin
WriteLn (1365 And 2730);
WriteLn (1365 Or 2730);
WriteLn (1365 Xor 2730);
WriteLn (1365 And $FF);
WriteLn (1365 And $FF0);
WriteLn (1365 And $FF00);
End.
В целом, на наш взгляд, содержание учебника
и стиль
Занятие
10. Одномерные массивы.
Работа с элементами
План
занятия
· простой
пример нахождения суммы чисел;
· эксперименты
с программами поиска суммы элементов
массива, кратных заданному числу;
нахождения элементов с определенными
свойствами в
Описание
типов данных
На предыдущих занятиях мы рассматривали
только
Type
<имя
типа>=<тип
данных>;
После этого в разделе описаний переменных
можно
Var
<имя
переменной>:<имя
типа>;
Рассмотрим простой пример. Необходимо
найти
Program
My10_1;
Var a1,a2,a3,a4,a5,s: Integer;
Begin
WriteLn ('Введите пять целых чисел');
ReadLn(a1,a2,a3,a4,a5);
s:=a1+a2+a3+a4+a5;
WriteLn ('Их
сумма равна ',s)
ReadLn
End.
А если требуется найти сумму 30 целых чисел?
Аналогичное решение потребует введения 30
однотипных
Одномерный
массив — это
фиксированное количество элементов одного
типа, объединенных одним именем. Каждый
элемент имеет свой номер. Обращение к
Опишем новый тип — одномерный
массив, состоящий из 30 целых чисел.
Type MyArray = Array [1..30] Of Integer;
Напомним,
что раздел описания типов начинается
Program
My10_1m;
Const n=30;
Type MyArray=Array[1..n] Of Integer;
Var A : MyArray;
s,i:
Integer;
Begin
For
i:=11 To n Do ReadLn (A[i]);
s:=0;
For i:=1 To n Do s:=s+A[i];
WriteLn ('Их сумма равна ',s);
ReadLn
End.
Экспериментальный
раздел занятия
1. Найдем сумму
элементов массива, кратных заданному числу.
Для
этого потребуется внести незначительные
изменения в решение предыдущей задачи.
Добавляется описание еще одной переменной
для хранения значения
WriteLn
('Введите число ');
ReadLn(k);
и
изменяется оператор из тела цикла
If
A[i] Mod k=0 Then s:=s+A[i];
Примечание. Не
забудьте изменить значение n.
Вводить при
Изменим теперь программу так, чтобы в ней
определялось количество положительных и
отрицательных
pos,
neg:Integer;
pos:=0;neg:=0;
If A[i]>0 Then Inc (pos)
Else If A[i]<0 Then Inc (neg);
WriteLn(pos:4,neg:4);
Модифицируйте программу таким образом,
чтобы в
Затем измените программу так,
чтобы в массив
Примечание. Обратите
внимание на то, что мы записываем не
Program
My10_2;
Const n=10;
Type MyArray=Array[1..n] Of Integer;
Var A,B: MyArray;
i,j :
Integer;
WriteLn ('Введите
',n, ' чисел');
For
i:=1 To n Do ReadLn (A[i]);
j:=0;
For i:=1 To n Do
Inc(j);
B[j]:=i
End;
For
i:=1 To j Do Write (B[i]:3);
WriteLn;
ReadLn
End.
2. Научимся
определять, есть ли в массиве элемент с
k:=0;
For i:=1 To n Do
If A[i]<0 Then k:=i;
Это решение плохое. Действительно, если
единственный отрицательный элемент в
массиве находится на
If A[i]<0 Then Begin k:=i; Break End;
решает возникший
вопрос, но… Это изменение приводит к тому,
что наш небольшой фрагмент кода имеет
i:=n;
While (i>=1) And (A[i]>0) Do Dec(i);
If i<1 Then <отрицательных
элементов в массиве нет>
Else <последний
отрицательный элемент имеет номер i >;
Чуть изменим задачу. Пусть нам требуется
найти
{$R+}
Program My10_3;
Const n=7;
Type MyArray=Array[1..n] Of Integer;
Var A:MyArray;
i:Integer;
Begin
WriteLn ('Ввод
элементов
массива.
For i:=1 To n Do Read (A[i]);
WriteLn ('Вывод отрицательных элементов
If A[i]<0
Then WriteLn (A[i]:5,i:5);
Readln
End.
В тексте программы поиска номеров всех
отрицательных элементов в массиве имеются
строки:
For
i:=1 To n
Измените во второй строке n
на n+1
и поставьте
Директивы компилятора управляют режимами
Примечание. При
работе с массивами настоятельно рекомендуется
использовать эту директиву при отладке
3. Формирование
значений элементов массива путем
Функция
Random Описание: Random[ (range:Word) ]. Напомним, Тип результата: Real или Word — в зависимости от наличия параметра. Если параметр не задан, то результатом является |
Примечание.
С типом Real
мы еще
не работали.
{$R-}
Program My10_4;
Const n=10;
Type MyArray=Array[1..n] Of Integer;
Var A:MyArray;
i:Integer;
Begin
{Randomize;}
WriteLn ('Формирование значений элементов
For
i:=1 To n Do A[i]:=Random (21) {-10};
WriteLn ('Вывод');
For i:=1 To n Do Write (A[i]:5);
ReadLn
End.
Запустите эту программу несколько раз. На
экран
Рассмотрим еще одну программу:
{$R+}
Program My10_4m;
Const n=10;
Var i:Integer;
Begin
WriteLn ('Вывод 10 случайных чисел в диапазоне от
–10 до 10');
For
i:=1 To n Do WriteLn (Random (21)-10);
ReadLn
End.
После запуска этой программы на экране
появятся не числа из интервала от —10 до 10, а
какая-то странная
4. Научимся
вычислять факториал натурального числа N.
Факториал числа N
равен произведению
чисел
A[0] |
A[1] |
A[2] |
A[3] |
A[4] |
A[5] |
A[6] |
A[7] |
A[8] |
8 |
0 |
0 |
8 |
6 |
1 |
9 |
9 |
3 |
В массиве записано значение 11! = 39916800. В A[0]
фиксируется число занятых элементов
массива, в A[1]
{$R+}
Program My10_5;
Uses Crt;
Const MaxN=300;
Type MyArray=Array[0..MaxN] Of Integer;
Var A:MyArray;
Var i,j,r,w,N:Integer;
Begin
ClrScr;
FillChar (A,SizeOf (A),0);
{Заполняем массив А нулями.}
WriteLn ('Введите число, факториал которого
необходимо найти.');
A[0]:=1;A[1]:=1;j:=2;{Начальные
присваивания, начинаем вычислять 2!.}
While
(j<=N) аnd (A[0]<MaxN) Do Begin {Второе условие
фиксирует факт выхода за пределы массива.}
r:=0;i:=1;{r – перенос из
разряда в разряд при выполнении умножения
числа j на очередную
A[i]:=w mod 10;{Находим новую
цифру с номером i.}
r:=w div 10;{Вычисляем
значение переноса.}
If A[A[0]+1]<>0 Then Inc(A[0]);{Изменяем, если
необходимо, количество задействованных
Inc(i)
End;
Inc(j)
End;
For
i:=A[0] DownTo 1 Do Write(A[i]);{Вывод результата.}
WriteLn;
ReadLn
End.
Найдите число N,
при котором трехсот элементов массива A
окажется
недостаточно для хранения результата.
Измените программу так, чтобы
выводились факториалы всех чисел в
интервале от 1 до N.
Измените
программу так, чтобы в ней вычислялись
Задания
для самостоятельной работы
1. Дан массив
целых чисел. Найти:
· сумму
элементов массива, больших данного числа А,
А вводится
с клавиатуры;
· сумму
элементов массива, принадлежащих
промежутку от А
до В
(А
и В вводятся с
клавиатуры);
· максимальный
элемент массива и его номер, при
· сумму
элементов массива с k1-го по k2-й,
k1 и k2
вводятся с клавиатуры;
· количество
нечетных элементов массива;
· количество
отрицательных элементов массива;
· сумму
первых пяти элементов массива;
· все
элементы, кратные 3 или 5, и их количество;
· сумму
всех четных элементов массива, стоящих на
· сумму
элементов, имеющих нечетное значение;
· сумму
элементов, имеющих нечетные индексы;
· удвоенную
сумму положительных элементов;
· сумму
отрицательных элементов;
· индексы
тех элементов, значения которых больше
· количество
элементов массива, значения которых
· индексы
тех элементов, значения которых кратны
· пару
соседних элементов с суммой, равной
заданному числу.
2. Определить:
· сколько
элементов массива превосходят по модулю
· есть
ли в данном массиве два соседних
положительных элемента? Найти номера
первой (последней) такой пары;
· есть
ли в данном массиве элементы, равные
заданному числу? Если есть, то вывести номер
одного из них;
· есть
ли в данном массиве положительные элементы,
кратные k, k вводится
с клавиатуры;
· номер
первого отрицательного элемента, дающего
3. Измените
программу вычисления факториала числа
4. Измените
программу вычисления степени числа так,
чтобы была возможность вычислять степени
отрицательных целых чисел.
5. Измените
программу вычисления степени числа
Материал
для чтения
1.
Одномерный массив —
это конечное упорядоченное множество
элементов. За первым элементом
Имя | A |
Адрес начального элемента |
Определяется
системой, |
Индекс начального элемента | 1 |
Индекс последнего элемента | 10 |
Тип элемента | Integer |
Длина элемента | 2
байта |
Адрес
элемента A[i] находится
по формуле:
Addr(A[i])=Addr(A[1])+(i-1)*2
2. Общие
сведения по организации ЭВМ. Структура
“Мозгом” вычислительной машины
является центральный процессор. Его
функция состоит в выполнении программ,
находящихся в основной памяти, путем
выборки, проверки и последовательного
выполнения составляющих их команд.
Центральный процессор состоит из
· изменение
счетчика команд таким образом, чтобы
· проверка,
требуются ли для выполнения выбранной
команды какие-либо данные, и если они нужны,
то определение их адресов в памяти;
· загрузка
во внутренние регистры центрального
процессора требуемых данных из памяти;
· выполнение
команды;
· запоминание
результатов выполнения команды в
Память — это часть ЭВМ, где
хранятся программы и
ЭВМ, в основы их заложены некоторые общие
принципы. Эти принципы были сформулированы
в 40-х годах ХХ столетия выдающимся
американским математиком Джоном фон
Нейманом и позволили создать
Второй фундаментальный принцип
Джона фон Ней
Продолжение
следует