В программировании часто используют запись программы блоками: ввод исходных данных, решение, вывод результатов. Блоки реализуют в виде процедур. Рассмотрим реализацию на примере.
Заданы две линейные таблицы (n<=20). Первая таблица содержит названия населенных пунктов, а другая - расстояния от каждого из них до столицы (расстояния - целые числа, меньшие 1000). Вывести на экран название того населенного пункта, который ближе всего к столице.
Формат ввода:
Ввод из файла input.txt.
В первой строке число n - количество населенных пунктов
В четных строках - название населенного пункта
В нечетных строках - число - расстояние до столицы
Формат вывода:
Запись в файл output.txt.
В строке название населенного пункта
Указание:
Найдем в таблице с расстояниями минимальный элемент и его номер, выведем на экран элемент таблицы с названиями с соответствующим номером.
Ввод из файла input.txt.
В первой строке число n - количество населенных пунктов
В четных строках - название населенного пункта
В нечетных строках - число - расстояние до столицы
Формат вывода:
Запись в файл output.txt.
В строке название населенного пункта
Пример
input.txt
|
output.txt
|
5
Барановичи 147 Могилев 198 Брест 354 Пинск 303 Несвиж 123 |
Несвиж
|
Указание:
Найдем в таблице с расстояниями минимальный элемент и его номер, выведем на экран элемент таблицы с названиями с соответствующим номером.
program primer;
var n, k,min:integer;
name:array[1..20] of string[20];
r:array[1..20] of integer;
procedure vvod;
var i:integer;
begin
assign(input,'input.txt');
reset(input);
readln(n);
for i:=1 to n do
readln(name[i],r[i]);
close(input);
end;
procedure resh;
var i:integer;
begin
min:=r[1]; k:=1;
for i:=2 to n do
if min>r[i] then begin min:=r[i]; k:=i end;
end;
procedure vyvod;
begin
assign(output,'output.txt');
rewrite(output);
write(name[k]);
close(output);
end;
begin
vvod;
resh;
vyvod;
end.
Задания
Задание 1. Даны два числа a и b, не равные нулю одновременно. Вычислить НОД(a,b) – наибольший общий делитель.
Формат ввода:
Ввод из файла input.txt.
В строке находятся числа a и b.
Формат вывода:
Запись в файл output.txt.
В строке НОД чисел
Тесты Посмотреть решение
Задание 2. Даны два числа a и b, не равные нулю одновременно. Найти НОК(a,b) – наименьшее общее кратное.
Формат ввода:
Ввод из файла input.txt.
В строке находятся числа a и b.
Тесты Посмотреть решение
Задание 3. Дано число а. Определить простое оно или составное.
Формат ввода:
Ввод из файла input.txt.
В строке находится число a.
Формат вывода:
Запись в файл output.txt.
В строке слово «prostoe» или «sostavnoe»
program primer;
var n:integer;
procedure vvod;
begin
assign(input,'input.txt');
reset(input);
readln(n);
close(input);
end;
function prost(n:integer):boolean;
var i,k:integer;
begin
k:=0;
for i:=2 to n div 2 do
if n mod i=0 then k:=k+1;
if k>0 then prost:=false else prost:=true;
end;
procedure vyvod;
begin
assign(output,'output.txt');
rewrite(output);
if prost(n) then write('prostoe') else writeln('sostavnoe');
close(output);
end;
begin
vvod;
vyvod;
end.
Тесты Посмотреть решение
Задание 4. Дано число а. Определить простое оно или составное. Определить все делители числа, если оно составное.
Формат ввода:
Ввод из файла input.txt.
В строке находится число a.
Формат вывода:
Запись в файл output.txt.
В первой строке делители, если число составное
Во второй строке слово «prostoe» или «sostavnoe»
Тесты Посмотреть решение
Задание 5. Написать программу для нахождения всех простых чисел до числа N.
Указание:
1. Выпишем все числа от 1 до N;
2. Вычеркиваем 1;
3. 2 – простое число, вычеркиваем все числа, которые делятся на 2.
4. 3 - простое число, вычеркиваем все числа, которые делятся на 3 и т.д.
Для хранения чисел определим массив B, в который занесем 2 и все нечетные числа. Просмотрим все элементы и кратные заменим 0.
Формат ввода:
Ввод из файла input.txt.
В строке находится число n.
Формат вывода:
Запись в файл output.txt.
В строке все простые числа до n.
program pr;
var n,i,j:longint;
b:array[1..1000] of integer;
begin
assign(input,'input.txt'); reset(input); read(n); close(input);
n:=(n+1) div 2;
b[1]:=2; for i:=2 to n do b[i]:=2*i-1; {заполнение массива нечетными числами}
j:=2;
while j<=n do
begin
i:=j+b[j]; {номер следующего кратного числу b[j]}
while i<=n do
begin
b[i]:=0;
i:=i+b[j]; {все кратные заменяем на ноль}
end;
j:=j+1;
while (j<=n) and (b[j]=0) do {перемещаемся к следующему элементу ≠0}
j:=j+1;
end;
assign(output,'output.txt');
rewrite(output);
for i:=1 to n do
if b[i]<>0 then write(b[i],' ');
close(output);
end.
Указание:
Тесты Посмотреть решение
Задание 7. Найти натуральное число из диапазона от n до k, которое имеет наибольшее число делителей.
Указание:
Формат
ввода:
2. Привести дроби p/q и m/n к общему знаменателю (p,q,m,n – натуральные числа < 32000).
Формат ввода:
Ввод из файла input.txt.
В 1 –ой строке находятся числа p и q.
Во 2-ой строке находятся числа m и n.
Формат вывода:
Запись в файл output.txt.
В 1-ой строке запись a/b, где a и b новые числитель и знаменатель дроби p/q.
Во второй строке запись c/b, где c и b новые числитель и знаменатель дроби m/n.
3. Для натурального числа n <2000000000 вычислить число m, записываемое теми же цифрами, что и n, но в обратном порядке.
Формат ввода:
Ввод из файла input.txt.
В строке находится число n.
Формат вывода:
Запись в файл output.txt.
В строке число m.
Формат ввода:
Ввод из файла input.txt.
В строке находятся числа a и b.
Формат вывода:
Запись в файл output.txt.
В строке НОД чисел
Пример
input.txt
|
output.txt
|
12 18
|
6
|
Тесты Посмотреть решение
Формат ввода:
Ввод из файла input.txt.
В строке находятся числа a и b.
Формат вывода:
Запись в файл output.txt.
В строке НОK чисел
Запись в файл output.txt.
В строке НОK чисел
Пример
input.txt
|
output.txt
|
12 18
|
36
|
Тесты Посмотреть решение
Задание 3. Дано число а. Определить простое оно или составное.
Формат ввода:
Ввод из файла input.txt.
В строке находится число a.
Формат вывода:
Запись в файл output.txt.
В строке слово «prostoe» или «sostavnoe»
Пример
input.txt
|
output.txt
|
31
|
prostoe
|
var n:integer;
procedure vvod;
begin
assign(input,'input.txt');
reset(input);
readln(n);
close(input);
end;
function prost(n:integer):boolean;
var i,k:integer;
begin
k:=0;
for i:=2 to n div 2 do
if n mod i=0 then k:=k+1;
if k>0 then prost:=false else prost:=true;
end;
procedure vyvod;
begin
assign(output,'output.txt');
rewrite(output);
if prost(n) then write('prostoe') else writeln('sostavnoe');
close(output);
end;
begin
vvod;
vyvod;
end.
Тесты Посмотреть решение
Формат ввода:
Ввод из файла input.txt.
В строке находится число a.
Формат вывода:
Запись в файл output.txt.
В первой строке делители, если число составное
Во второй строке слово «prostoe» или «sostavnoe»
Пример
input.txt
|
output.txt
|
15
|
sostavnoe
1 3 5 15
|
Указание:
1. Выпишем все числа от 1 до N;
2. Вычеркиваем 1;
3. 2 – простое число, вычеркиваем все числа, которые делятся на 2.
4. 3 - простое число, вычеркиваем все числа, которые делятся на 3 и т.д.
Для хранения чисел определим массив B, в который занесем 2 и все нечетные числа. Просмотрим все элементы и кратные заменим 0.
Формат ввода:
Ввод из файла input.txt.
В строке находится число n.
Формат вывода:
Запись в файл output.txt.
В строке все простые числа до n.
Пример
input.txt
|
output.txt
|
18
|
2 3 5 7 11 13 17
|
var n,i,j:longint;
b:array[1..1000] of integer;
begin
assign(input,'input.txt'); reset(input); read(n); close(input);
n:=(n+1) div 2;
b[1]:=2; for i:=2 to n do b[i]:=2*i-1; {заполнение массива нечетными числами}
j:=2;
while j<=n do
begin
i:=j+b[j]; {номер следующего кратного числу b[j]}
while i<=n do
begin
b[i]:=0;
i:=i+b[j]; {все кратные заменяем на ноль}
end;
j:=j+1;
while (j<=n) and (b[j]=0) do {перемещаемся к следующему элементу ≠0}
j:=j+1;
end;
assign(output,'output.txt');
rewrite(output);
for i:=1 to n do
if b[i]<>0 then write(b[i],' ');
close(output);
end.
Тесты Посмотреть решение
Задание 6. Два натуральных числа называют дружественными, если каждое из них равно сумме всех делителей другого, кроме самого этого числа. Найти все пары дружественных чисел, лежащих в диапазоне от n до k.Указание:
Напишем подпрограмму, которая будет находить сумму делителей числа.
Находим сумму а делителей каждого числа i, затем находим сумму s делителей числа а. И если i окажется равным s выводим пару чисел i и а.
Формат ввода:
Ввод из файла input.txt.
В строке находятся числа n и k.
Формат вывода:
Запись в файл output.txt.
В строках выводятся по одной паре дружественных чисел.
Находим сумму а делителей каждого числа i, затем находим сумму s делителей числа а. И если i окажется равным s выводим пару чисел i и а.
Формат ввода:
Ввод из файла input.txt.
В строке находятся числа n и k.
Формат вывода:
Запись в файл output.txt.
В строках выводятся по одной паре дружественных чисел.
Пример
input.txt
|
output.txt
|
200 300
|
220 284
|
Указание:
Воспользуемся процедурой, которая считает количество делителей числа.
Считаем наибольшим количество делителей kmax равным 1.
Рассматривая все числа промежутка сравниваем количество делителей числа i (обозначим m) с числом kmax.
А – число, которое имеет наибольшее количество делителей.
Программа находит последнее число, которое имеет наибольшее число делителей.
Формат ввода:
Ввод из файла input.txt.
В строке находятся числа n и k.
Формат вывода:
Запись в файл output.txt.
В строке число, которое имеет наибольшее число делителей.
Считаем наибольшим количество делителей kmax равным 1.
Рассматривая все числа промежутка сравниваем количество делителей числа i (обозначим m) с числом kmax.
А – число, которое имеет наибольшее количество делителей.
Программа находит последнее число, которое имеет наибольшее число делителей.
Формат ввода:
Ввод из файла input.txt.
В строке находятся числа n и k.
Формат вывода:
Запись в файл output.txt.
В строке число, которое имеет наибольшее число делителей.
Пример
input.txt
|
output.txt
|
100 200
|
180
|
Тесты Посмотреть решение
Задания для самостоятельного решения
1. Напишите
программу сокращения дроби p/q (p, q – натуральные числа <2000000000).
Ввод из файла input.txt.
В строке находятся числа p и q.
Формат
вывода:
Запись в файл output.txt.
В строке запись a/b, где
a и b, сокращенные числитель и знаменатель.
Пример
input.txt
|
output.txt
|
12 18
|
2/3
|
2. Привести дроби p/q и m/n к общему знаменателю (p,q,m,n – натуральные числа < 32000).
Формат ввода:
Ввод из файла input.txt.
В 1 –ой строке находятся числа p и q.
Во 2-ой строке находятся числа m и n.
Формат вывода:
Запись в файл output.txt.
В 1-ой строке запись a/b, где a и b новые числитель и знаменатель дроби p/q.
Во второй строке запись c/b, где c и b новые числитель и знаменатель дроби m/n.
Пример
input.txt
|
output.txt
|
3 10
2 15
|
9/30
4/30
|
3. Для натурального числа n <2000000000 вычислить число m, записываемое теми же цифрами, что и n, но в обратном порядке.
Формат ввода:
Ввод из файла input.txt.
В строке находится число n.
Формат вывода:
Запись в файл output.txt.
В строке число m.
Пример
input.txt
|
output.txt
|
127
|
721
|