
- •Смоленский гуманитарный университет
- •Часть 1. Основы алгоритмизации
- •Тема 1 «Алгоритмы линейной структуры»
- •Ход работы
- •Тема 2 «Алгоритмы разветвляющейся структуры»
- •Ход работы
- •Тема 3 «Алгоритмы циклической структуры»
- •Ход работы
- •Тема 4 «Вложенные циклы»
- •Ход работы
- •Тема 5 «Массивы»
- •Ход работы
- •Часть 2. Программирование
- •Тема 6 «Линейная структура программы»
- •Примеры решения задач
- •Ход работы
- •Тема 7 «Разветвляющая структура программы»
- •Примеры решения задач
- •Ход работы
- •Тема 8 «Циклическая структура программы»
- •Примеры решения задач
- •1 Способ
- •2 Способ.
- •1 Способ
- •2 Способ
- •1 Способ
- •2 Способ
- •1 Способ
- •2 Способ
- •Ход работы
- •Тема 9 «Понятие подпрограммы. Организация процедур и функций»
- •Примеры решения задач
- •Ход работы
- •Тема 10 «Рекурсия»
- •Примеры решения задач
- •Ход работы
- •Тема 11 «Строковый тип данных. Методы работы со строками»
- •Ход работы
- •Тема 12 «Тип данных массив»
- •Примеры решения задач
- •1 Способ
- •2 Способ
- •1 Способ
- •2 Способ
- •1 Способ
- •2 Способ
- •Алгоритм
- •1 Способ
- •2 Способ
- •1 Способ
- •2 Способ
- •Алгоритм
- •Работа программы
- •Ход работы
- •Тема 13 «Тип данных - запись»
- •Ход работы
- •Тема 14 «Файлы. Типы файлов. Методы работы с файлами»
- •Примеры решения задач
- •1 Способ
- •2 Способ
- •Ход работы
- •Тема 15 «Множества»
- •Ход работы
- •Тема 16 «Работа с мультимедиа»
- •Ход работы
- •Максимова Наталья Адександровна Основы программирования
- •214014, Г. Смоленск, ул. Герцена, 2
1 Способ
Program Problem11; { Простой алгоритм. 1 - способ }
uses Crt;
var
n, d : integer;
begin
write('Введите целое число '); readln(n);
d := 1;
writeln('Делители числа ', n);
repeat
if n mod d = 0 then write(d, ' ');
d := d + 1
until d > n div 2;
write(n)
end.
2 Способ
Program Problem11a; { Делители числа. 2 - способ }
uses Crt;
var
n, d : integer;
begin
write('Введите целое число '); readln(n);
writeln('Делители числа ', n);
d := 1;
while d*d < n do
begin
if n mod d=0 then write(d, ' ', n div d, ' ');
d := d + 1
end;
if d*d = n then write(d); writeln
end.
Задача 12. Найти НОД двух чисел по алгоритму Евклида
Решение
Алгоритм решения. Пусть a b 0 и a > 0. Тогда применение алгоритма Евклида происходит так: если b = 0, то НОД(a, b) = a. Иначе вычисляем r, равное остатку от деления a на b, и сводим задачу отыскания НОД(a, b) к задаче отыскания НОД(r, b). При r>0 этот процесс можно продолжить. Имеем: b > r > r1 > r2 > r3 >, ..., но так как b, r, r1, r2, r3 - неотрицательные целые числа, то найдется n такое, что rn = 0. В соответствии с высказанным утверждением
НОД(a, b) = НОД(b, r) = НОД(r1, r) = ... = НОД(rn-1, 0) = rn-1.
Практически это выглядит так. Надо найти НОД чисел 888 и 351.
Большим из них является 888, a = 888, b = 351.
Находим остаток от деления a на b: 888 mod 351 = 186, r = 186;
заменим a на b и b на остаток r, получим: a = 351, b = 186;
снова находим остаток от деления a на b: 351 mod 186 = 165, r = 165;
заменим a на b и b на остаток r, получим: a = 186, b = 165;
находим остаток от деления a на b: 186 mod 165 = 21, r = 21;
заменим a на b и b на остаток r, получим: a = 165, b = 21;
находим остаток от деления a на b; 165 mod 21 = 18, r = 18;
заменим a на b и b на остаток r, получим: a = 21, b = 18;
находим остаток от деления a на b; 21 mod 18 = 3, r = 3;
заменим a на b и b на остаток r, получим: a = 18, b = 3;
находим остаток от деления a на b: 18 mod 3 = 0, r = 0;
заменим a на b и b на остаток r, получим: a = 3, b = 0.
Как только b стало равным нулю, цикл заканчивается, выдается значение a, которое и является наибольшим общим делителем, НОД(888, 351) = a = 3.
Этот процесс можно записать в виде следующей цепочки, которая в общем виде была записана выше:
НОД(888, 351) = НОД(351, 186) = НОД(186, 165) =
= НОД(165, 21) = НОД(21, 18) = НОД(18, 3) = НОД(3, 0) = 3.
Program Problem12; { Алгоритм Евклида }
uses WinCrt;
var
a, b, r, a1, b1 : integer;
begin
write('Введите первое число '); readln(a);
write('Введите второе, не равное нулю, число ');
readln(b);
a1 := a; b1 := b;
repeat
r := a mod b;
a := b; b := r
until b = 0;
writeln('НОД чисел ', a1, ' и ', b1, ' равен ', a)
end.
Задача 13. Составить программу, которая определяет является ли данное число n простым.
Решение
Program Problem13;
uses Crt;
var
n, i, k : integer;
begin
write('Введите натуральное число большее 2 ');
readln(n);
i := 2; k := 0;
repeat
if n mod i=0 then k := k + 1;
i := i + 1
until i>n div 2;
if k = 0 then writeln('Число ', n, ' является простым')
else writeln('Число ', n, ' составное')
end.
Задача 14. Составить программу нахождения всех простых чисел из заданного промежутка [n, m].
Решение
Program Problem14; { Простые числа из промежутка [n; m] }
uses Crt;
var
n, m, p, i, k : integer;
begin
write('Введите левую границу промежутка '); readln(n);
write('Введите правую границу промежутка '); readln(m);
writeln('Простые числа из промежутка [', n, ' ', m, ']');
p := n; if p = 1 then p := p + 1;
repeat
if p = 2 then write(p:4, ' ')
else if p = 3
then write(p:4, ' ')
else
if p mod 2 <> 0
then
begin
i := 3; k := 0;
repeat
if p mod i = 0 then k := k + 1;
i := i + 2
until i > p div 2;
if k = 0 then write(p:4, ' ')
end;
p := p + 1
until p = m;
writeln
end.
Задача 15. Составить программу вычисления факториала числа n, т. е. n!.
Решение