Книга программиста/Задачи на ввод и вывод: различия между версиями

Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
Нет описания правки
м орфография
Строка 452: Строка 452:
case d of
case d of
10: Result := 'десятое';
10: Result := 'десятое';
11: Result := 'одинадцатое';
11: Result := 'одиннадцатое';
12: Result := 'двенадцатое';
12: Result := 'двенадцатое';
13: Result := 'тринадцатое';
13: Result := 'тринадцатое';
Строка 458: Строка 458:
15: Result := 'пятнадцатое';
15: Result := 'пятнадцатое';
16: Result := 'шестнадцатое';
16: Result := 'шестнадцатое';
17: Result := 'семьнадцатое';
17: Result := 'семнадцатое';
18: Result := 'восемьнадцатое';
18: Result := 'восемнадцатое';
19: Result := 'девятнадцатое';
19: Result := 'девятнадцатое';
20: Result := 'двадцатое';
20: Result := 'двадцатое';

Версия от 09:31, 30 января 2019

К оглавлению | Назад | Вперёд

Все программы, код которых выложен здесь, являются работоспособными. На момент написания программ использовалась среда 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:');
  
  if A > B then
    if A > C then Writeln(A) else Writeln(C)
  else
    if B > C then Writeln(B) else Writeln(C);
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.

Задача о среднем арифметическом

  1. Вывести среднее арифметическое элементов больших A с чётными индексами.
  2. Вывести количество ненулевых элементов.
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.