Книга программиста/Задачи на ввод и вывод
К оглавлению | Назад | Вперёд
Все программы, код которых выложен здесь, являются работоспособными. На момент написания программ использовалась среда PascalABC.Net 3.0.
Вывод числа 1 или 2
правитьВывести 2, если пользователь ввел 1. Вывести 1, если пользователь ввел 2.
begin
Writeln(3 - ReadlnInteger());
end.
Вывод диапазона чисел
правитьbegin
for var i := ReadlnInteger('A:') to ReadlnInteger('B:') do WriteLn(i);
end.
Сначала установится последнее значение счётчика цикла, затем - первое.
Сравнение площадей кругов
правитьfunction Square(r: real) := Pi * Sqr(r);
begin
WritelnFormat('Первый круг {0} второго.', Square(ReadlnInteger('R1:')) > Square(ReadlnInteger('R2:')) ? 'больше' : 'меньше');
end.
Вывод диапазона чисел (вариант 2)
правитьvar
N: integer;
begin
N := 5;
for N := 1 to N do WriteLn(N);
end.
Сначала вычислится последнее значение счётчика, которое примет значение 5. Затем - первое, которое будет иметь значение 1.
Выражение с модулем
правитьbegin
WritelnFormat('|ax - b| = {0}.', Abs((ReadlnReal('A:') * ReadlnReal('X:')) - ReadlnReal('B:')));
end.
Максимум из трех чисел
правитьbegin
var A := ReadlnInteger('A:');
var B := ReadlnInteger('B:');
var C := ReadlnInteger('C:');
var max:=A;
if B > max then max:=B;
if C > max then max:=C;
Writeln(max)
end.
Таймер
правитьuses Crt;
var
T1, T2: integer;
begin
while true do
begin
Writeln('Введите время:');
while T2 <= 0 do
begin
try
Readln(T2)
except
on System.Exception do
begin
Writeln('Недопустимое значение.');
continue;
end;
end;
if T2 <= 0 then Writeln('Число меньше или равно 0.');
end;
while T1 <= T2 do
begin
ClrScr();
WritelnFormat('Прошло {0} секунд.', T1);
Sleep(1000);
Inc(T1);
end;
ClrScr();
Writeln('Время истекло. Для продолжения нажмите клавишу.');
Readln();ClrScr();
T1 := 0;T2 := 0;
ClrScr();
end;
end.
Чтение массива
правитьconst
N = 10;
var
A: array of integer;
begin
SetLength(A, N);
for var i := 0 to N - 1 do Readln(A[i]);
Writeln(A);
end.
//Аналог через ReadArrInteger(10).
begin
var A := ReadArrInteger(10);
end.
Заполнение и вывод массива процедурами
правитьconst
N = 3;
type
IntArray = array [0..N - 1] of integer;
var
A: IntArray;
procedure EnterArray(var a: IntArray; m: integer);
begin
for var i := 0 to m - 1 do
Readln(A[i]);
end;
procedure ShowArray(d: integer);
begin
for var i := 0 to N - 1 do
Write(A[i]:d);
Writeln();
end;
begin
EnterArray(A, 3);
ShowArray(3);
end.
Поиск минимума
правитьconst
N = 10;
var
A: array of integer;
Min: integer;
begin
SetLength(A, N);
for var i := 0 to N - 1 do A[i] := Random(100);
Min := integer.MaxValue;
for var i := 0 to N - 1 do
if A[i] < Min then Min := A[i];
Writeln(A);
Writeln(Min);
end.
//Аналог через ReadArrInteger(10).Min().
begin
var Min := ReadArrInteger(10).Min();
end.
Минимум среди положительных чисел
правитьconst
N = 4;
var
A: array of integer;
Min: integer;
Found: boolean;
begin
SetLength(A, N);
for var i := 0 to N - 1 do Readln(A[i]);
Found := false;
Min := integer.MaxValue;
for var i := 0 to N - 1 do
if (A[i] > 0) and (A[i] < Min) then
begin
Min := A[i];
Found := true;
end;
Writeln(A);
if Found then
Writeln(Min)
else
Writeln('Нет положительных элементов.');
end.
Поиск максимума
правитьconst
N = 10;
var
A: array of integer;
Max: integer;
begin
SetLength(A, N);
for var i := 0 to N - 1 do A[i] := Random(100);
Max := integer.MinValue;
for var i := 0 to N - 1 do
if A[i] > Max then Max := A[i];
Writeln(A);
Writeln(Max);
end.
//Аналог через ReadArrInteger(10).Max().
begin
var Max := ReadArrInteger(10).Max();
end.
Максимум среди положительных элементов
правитьconst
N = 4;
var
A: array of integer;
Max: integer;
Found: boolean;
begin
SetLength(A, N);
for var i := 0 to N - 1 do Readln(A[i]);
Found := false;
Max := integer.MinValue;
for var i := 0 to N - 1 do
if (A[i] > 0) and (A[i] > Max) then
begin
Max := A[i];
Found := true;
end;
Writeln(A);
if Found then
Writeln(Max)
else
Writeln('Нет положительных элементов.');
end.
Числа с делителями 2, 3 и 5
правитьbegin
var N := ReadlnInteger();
var Count := 0;
var A := 1;
while Count < N do
begin
if (A mod 2 = 0) and (A mod 3 = 0) and (A mod 5 = 0) then
begin
WritelnFormat('Число {0} имеет делители 2, 3 и 5.', A);
Inc(Count);
end;
Inc(A);
end;
end.
//Аналог через готовые методы.
begin
Writeln(ReadArrInteger(ReadlnInteger()).Where(x -> x mod 2 + x mod 3 + x mod 5 = 0).Count());
end.
Задача о среднем арифметическом
править- Вывести среднее арифметическое элементов больших A с чётными индексами.
- Вывести количество ненулевых элементов.
begin
var A := ReadlnInteger();
var Numbers := ReadArrInteger(10);
var M := Numbers.Where((x, i) -> (i mod 2 = 0) and (x <= A));
if M.Count() > 0 then
WritelnFormat('Среднее арифметическое равно {0}.', M.Average())
else
Writeln('Не найдено элементов, удовлетворяющих предикату.');
WritelnFormat('Количество ненулевых чисел равно {0}.', Numbers.Where(x -> x <> 0).Count());
end.
Обычный и високосный года
правитьbegin
var Y := ReadlnInteger();
if (Y mod 4 <> 0) or (Y mod 100 = 0) and (Y mod 400 <> 0) then
WritelnFormat('{0} - обычный год.', Y)
else
WritelnFormat('{0} - високосный год.', Y);
end.
Запись чисел в типизированный файл
правитьvar
F: file of integer;
begin
Assign(F, 'C:\Ilya\AlgoРитмы\Файл1.txt');
Reset(F);
for var i := 0 to 9 do
Write(F, i);
Close(F);
end.
Задача про шкафы
правитьДаны длины ребер шкафа A, B и C. Дана ширина и высота дверного проема. Узнать можно ли протолкнуть шкаф сквозь дверной проем.
function F(a1, a2, b1, b2: real) := ((a1 < b1) and (a2 < b2)) or ((a2 < b1) and (a1 < b2));
begin
var A := ReadlnReal();
var B := ReadlnReal();
var C := ReadlnReal();
var X := ReadlnReal();
var Y := ReadlnReal();
WritelnFormat('Протолкнуть шкаф в отверстие {0}возможно.', (F(A, B, X, Y) or F(B, C, X, Y) or F(A, C, X, Y)) ? '' : 'не');
end.
Вставка элемента
правитьВставить после элемента, равного K, элемент со значением последнего.
const
N = 5;
var
A: array [0..N] of integer;
K: integer;
j: integer;
Found: boolean;
begin
Found := false;
K := ReadInteger('K:');
for var i := 0 to N - 1 do
begin
if not Found then
Readln(A[i])
else
Readln(A[i + 1]);
if not Found and (A[i] = K) then
begin
Found := true;
j := i + 1;
end;
end;
A[j] := A[N];
for var i := 0 to N do
WriteFormat('{0} ', A[i]);
end.
//Аналог через готовые методы.
begin
var A := ReadArrInteger(ReadlnInteger('N:')).ToList();
Writeln(A);
A.Insert(A.IndexOf(ReadlnInteger('K:')) + 1, A.Last());
Writeln(A);
end.
Числа Фибонанччи
правитьbegin
var N := ReadlnInteger('N:');
var K := 3;
var A := 0;
var B := 1;
if N >= 1 then WriteFormat('{0} ', A);
if N >= 2 then WriteFormat('{0} ', B);
if N > 2 then
while K <= N do
begin
var c := A + B;
A := B;
B := c;
WriteFormat('{0} ', B);
Inc(K)
end;
Writeln();
end.
Шахматная доска
правитьВ сказочном городе BykhovTown праздник! Приехали герои всеми любимых мультфильмов. Мудрая Сова привезла с собой шахматы. Но выслушать и запомнить правила игры полностью смог только Кролик. В связи с этим, Сова решила упростить правила. В результате нововведений на доске остались только 2 фигуры, которые, для простоты запоминания, было решено назвать в честь жителей городка. Одна из фигур – это «Кубыш». А вторую фигуру единогласно было решено назвать Мишка. Мишка недоволен ходами существующих фигур и хочет ходить (а точнее прыгать), по-своему. А точнее он хочет, чтобы его фигура могла прыгать либо на две клетки по вертикали или горизонтали, либо на одну клетку по диагонали. Так же Сова решила, что будет справедливо, если фигура «Кубыш» не будет ходить, поскольку настоящий «Кубыш» обычно прячется в засаде и не двигается, чтобы его не заметили. Помогите жителям города понять, сумеет ли Мишка схватить, то есть попасть в одну клетку с Кубышом в ходе шахматной партии за один ход.
begin
var C := (ReadlnInteger('X:'), ReadlnInteger('Y:'));
var Target := (ReadlnInteger('X:'), ReadlnInteger('Y:'));
WritelnFormat('Достигнуть цели за 1 шаг {0} удасться.',
((Abs(C.Item1 - Target.Item1) = 2) xor (Abs(C.Item2 - Target.Item2) = 2)) or
((Abs(C.Item1 - Target.Item1) = 1) and (Abs(C.Item2 - Target.Item2) = 1)) ? '' : 'не');
end.
Месяцы и дни
правитьВывести словами дату, записанную в формате: DD:MM, где DD - день, а MM - месяц. Числа меньше 10 вводятся подобно следующему: 01.
var
Date: string[5];
Day, Month: integer;
function ToString(d, m: integer): string;
begin
case d of
1, 21, 31: Result := 'первое';
2, 22: Result := 'второе';
3, 23: Result := 'третье';
4, 24: Result := 'четвертое';
5, 25: Result := 'пятое';
6, 26: Result := 'шестое';
7, 27: Result := 'седьмое';
8, 28: Result := 'восьмое';
9, 29: Result := 'девятое';
end;
case d of
10: Result := 'десятое';
11: Result := 'одиннадцатое';
12: Result := 'двенадцатое';
13: Result := 'тринадцатое';
14: Result := 'четырнадцатое';
15: Result := 'пятнадцатое';
16: Result := 'шестнадцатое';
17: Result := 'семнадцатое';
18: Result := 'восемнадцатое';
19: Result := 'девятнадцатое';
20: Result := 'двадцатое';
30: Result := 'тридцатое';
end;
if (d > 20) and (d <> 30) then
if d div 10 = 2 then Result := 'двадцать ' + Result else Result := 'тридцать ' + Result;
Result += ' ';
case m of
1: Result += 'января';
2: Result += 'февраля';
3: Result += 'марта';
4: Result += 'апреля';
5: Result += 'мая';
6: Result += 'июня';
7: Result += 'июля';
8: Result += 'августа';
9: Result += 'сентября';
10: Result += 'октября';
11: Result += 'ноября';
12: Result += 'декабря';
end;
end;
begin
Readln(Date);
Day := StrToInt(Date.Chars[1] + Date.Chars[2]);
Month := StrToInt(Date.Chars[4] + Date.Chars[5]);
if (Day in [1..31]) and (Month in [1..12]) then
Writeln(ToString(Day, Month))
else
Writeln('Либо Day, либо Month принимает значение, не принадлежащее [1..31] или [1..12] соответственно.');
end.