Страницы

Уроки 41, 42 Решение задач с использованием файлового ввода

В программировании часто используют запись программы блоками: ввод исходных данных, решение, вывод результатов. Блоки реализуют в виде процедур. Рассмотрим реализацию на примере.
Заданы две линейные таблицы (n<=20). Первая таблица содержит названия населенных пунктов, а другая - расстояния от каждого из них до столицы (расстояния - целые числа, меньшие 1000). Вывести на экран название того населенного пункта, который ближе всего к столице.

Формат ввода:
Ввод из файла 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.
В строке НОД чисел



Пример
input.txt
output.txt
12 18
6

       Тесты         Посмотреть решение       

Задание 2. Даны два числа a и b, не равные нулю одновременно. Найти НОК(a,b) – наименьшее общее кратное.

Формат ввода:
Ввод из файла input.txt.
В строке находятся числа a и b.
Формат вывода:
Запись в файл output.txt.
В строке НОK чисел


Пример
input.txt
output.txt
12 18
36

       Тесты         Посмотреть решение       


Задание 3. Дано число а. Определить простое оно или составное.

Формат ввода:
Ввод из файла input.txt.
В строке находится число a.

Формат вывода:
Запись в файл output.txt.
В строке слово «prostoe» или «sostavnoe»


Пример
input.txt
output.txt
31
prostoe

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»


Пример
input.txt
output.txt
15
sostavnoe
1 3 5 15

       Тесты         Посмотреть решение       


Задание 5. Написать программу для нахождения всех простых чисел до числа N.

Указание:
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

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.


       Тесты         Посмотреть решение       

Задание 6. Два натуральных числа называют дружественными, если каждое из них равно сумме всех делителей другого, кроме самого этого числа. Найти все пары дружественных чисел, лежащих в диапазоне от n до k.

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


Формат ввода:
Ввод из файла input.txt.
В строке находятся числа n и k.

Формат вывода:
Запись в файл output.txt.
В строках выводятся по одной паре дружественных чисел.

Пример
input.txt
output.txt
200 300
220 284

       Тесты         Посмотреть решение       


Задание 7. Найти натуральное число из диапазона от n до k, которое имеет наибольшее число делителей.

Указание: 
Воспользуемся процедурой, которая считает количество делителей числа.
Считаем наибольшим количество делителей 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