07.04.2023

Как инвертировать двоичный код. На примере задачи. Язык Паскаль. PascalABC.NET

 Задача. Автомат обрабатывает натуральное число N (1<=N<=255) по следующему алгоритму:

  • Строится восьмибитная двоичная запись числа.
  • Все цифры двоичной записи заменяются на противоположные (1 на 0, 0 на 1).
  • Полученное число переводится в десятичную запись.
  • Из нового числа вычитается исходное, полученная разность выводится на экран.

Какое число нужно ввести в автомат, чтобы в результате получилось 125?

В первую очередь разберемся, как инвертировать двоичную строку.

Воспользуемся методом Replace для того, чтобы заменить все подстроки на другие.

Пример:

s:='ОРИСОРИС';

s:=s.replace('РИС','ЛА');

Результат: s = ОЛАОЛА

Все подстроки РИС заменились на подстроки ЛА.

Тогда чтобы инвертировать двоичный код, нужно заменить все символы 1 на *, затем все символы 0 на символы 1, а затем все символы * на символы 0.

Пусть s = 101

1) все символы 1 заменим на *

s = *0*

2) все символы 0 заменим на 1

s = *1*

3) все символы * заменим на 0

s = 010

Сделаем это в одну строку:

s:=s.replace('1','*').replace('0','1').replace('*','0');

Как будем решать задачу

  • Запустим цикл по числам N
  • Выполним перевод числа N в двоичную систему счисления
  • Доведем разрядность двоичного кода до 8 (число восьмибитное)
  • Инвертируем полученное двоичное число
  • Выполним перевод полученной строки в десятичную систему счисления
  • Вычислим разность нового числа и исходного
  • Выполним проверку, если разность равна 125, то выводим число N на экран
Программа решения задачи на языке Паскаль

uses school;

var n,n1:integer; s,s1:string;

begin

 for n:=1 to 255 do

   begin

  s:=bin(n);

  s:='0'*(8-s.Length)+s;

  s1:=s.Replace('1','*').Replace('0','1').Replace('*','0');

  n1:=dec(s1,2);

  //println(s,s1);

  if n1-n=125 then println(n);

  end;

end.

Ответ: 65

15.03.2023

Найти сумму цифр трехзначного числа N. Программа на языке Паскаль. PascalABC.NET

 Задача. С клавиатуры вводится натуральное трехзначное число N. Найти сумму его цифр.

Данную задачу можно решать разными способами с использованием различных средств языка программирования. 

Разберем способ с использованием операций целочисленного деления div и mod.

Вспомним состав числа. В трехзначном числе первая цифра показывает количество сотен, вторая - количество десятков, третья - количество единиц.

Например, N = 297 = 200 + 90 + 7 (2 сотни, 9 десятков и 7 единиц)

Для вычисления количества сотен необходимо число N разделить на 100 и взять целую часть, это будет 2. Чтобы вычислить количество десятков, нужно число N разделить на 100 и взять целый остаток, это будет 97,  а затем полученное значение разделить на 10 и взять целую часть, это будет 9. Чтобы вычислить последнюю цифру (количество единиц), нужно число N разделить на 10 и взять целый остаток, это будет 7 (либо полученное число на предыдущем шаге 97 разделить на 10 и взять целый остаток).

Цифры трехзначного числа

Введем обозначения цифр. Пусть a - это сотни, b - десятки, c - единицы.

Операция деления нацело это div, операция деления с остатком это mod.

Тогда выражения для вычисления цифр числа будут такими:

a:=N div 100;

b:=N mod 100 div 10;

c:=N mod 10;

Это не единственный путь решения данной задачи с использованием операций div и mod, предложите в комментариях свой способ.

Для дальнейшего решения задачи необходимо вычислить сумму полученных цифр.

s:=a+b+c;

Программа решения задачи на языке Паскаль

var N,a,b,c,s:integer;

begin

  print('Введите трехзначное натуральное число N:');

  readln(N);

  a:=N div 100;

  b:=N mod 100 div 10;

  c:=N mod 10;

  s:=a+b+c;

  println('Сумма цифр числа:',s);

end.

Результат запуска программы

Найти сумму цифр трехзначного числа N


14.03.2023

Найти число пар соседних элементов массива, оканчивающихся нулем. Язык Паскаль. PascalABC.NET

 В этой публикации разберем задачу о парах соседних элементов массива.

Задача. В массиве целых чисел из N элементов найти число пар соседних элементов массива, оканчивающихся нулем.

Пусть дан массив a из 5 элементов:

4, 10, 20, 80, 10

Все пары соседних элементов это:

4 и 10

10 и 20

20 и 80

80 и 10

Три пары соседних элементов, в которых оба числа оканчиваются на 0.

Если ввести нумерацию ячеек с 1, то обращение к парам будет таким:

a[1] и a[2]

a[2] и a[3]

a[3] и a[4]

a[4] и a[5]

Заметим, что всего пар соседних элементов четыре.

Если всего элементов в массиве будет 6, то пар будет 5.

В общем случае если число элементов массива N, то пар соседних элементов N-1.

Если ввести счетчик пар k, то обращение к парам будет таким:

a[k] и a[k+1]

Чтобы обратиться ко всем парам, нужно запустить цикл по всем парам, то есть от первой до последней:

for k:=1 to N-1 do

Как будем решать задачу

  • Сформируем массив целых чисел из N элементов случайным образом (возьмем диапазон от 10 до 30)
  • Выведем массив
  • Обратимся ко всем парам соседних элементов массива и будем узнавать, каждое ли число из пары оканчивается цифрой 0, если да, то будем копить счетчик искомых пар p.

if (a[k] mod 10 = 0) and (a[k+1] mod 10=0) then p:=p+1;

Публикация про последнюю цифру числа (читать).

Программа решения задачи на языке Паскаль

var a:array[1..100] of integer;

    k,p,N:integer;

begin

  print('Введите количество элементов массива:');

  readln(N);

  for k:=1 to N do

  begin

    a[k]:=random(10,30);

    print(a[k]);

  end;

  println;

  p:=0;

  for k:=1 to N-1 do

  begin

    if (a[k] mod 10 = 0) and (a[k+1] mod 10=0) then p:=p+1;

  end;

  print('количество пар соседних элементов, оканчивающихся цифрой 0:',p);

end.

Результат запуска программы

Пары соседних элементов массива, оканчивающихся цифрой 0

В нашем примере получилось две пары, это числа 10 и 10, 20 и 30.

Для проверки можно выводить все пары соседних элементов:

for k:=1 to N-1 do

  begin

    println(a[k],a[k+1]);

    if (a[k] mod 10 = 0) and (a[k+1] mod 10=0) then p:=p+1;

  end;

Пары соседних элементов массива

09.03.2023

Язык Паскаль. Найти площадь круга. PascalABC.NET

 Задача. С клавиатуры вводится радиус круга. Найти площадь круга.

Площадь круга рассчитывается по формуле: S = πr2, где r - это радиус круга.

Исходные данные: r - радиус круга

Результативные данные: S - площадь круга

Число π будем использовать в виде константы Pi.

Чтобы возвести число r в квадрат, будем использовать операцию возведения в степень, это: **

Например, 23 будет записываться так: 2**3. Результатом возведения в степень будет вещественное число.

Программа решения задачи на языке Паскаль

var r:integer; s:real;

begin

  println('Введите радиус круга');

  readln(r);

  s:=Pi*r**2;

 println('Площадь круга',s);

 writeln(s:10:3);//вывод в формате s:10:3, 10 позиций на все число и 3 знака после запятой

end.

Результат запуска программы

Площадь круга

Это еще один пример линейной программы.




28.02.2023

Найти максимум/минимум в массиве. Программа на языке Паскаль. PascalABC.NET

 Задача. Дан массив целых чисел из N элементов. Найти максимум.

Максимум - это самое большое число, сохраненное в массиве.

Алгоритм поиска заключается в следующем:

  • за начальное значение максимума взять самое маленькое число, которое может быть сохранено в массиве;
  • обращаясь к каждому элементу массива выполнять проверку: значение элемента больше, чем значение максимума, если да, что значение максимума заменить на значение элемента.

Предположим, что в массиве a из N элементов могут храниться числа из промежутка от 1 до 100. Заполним массив случайными числами (прочитать статью "Сформировать массив случайных чисел")

За начальное значение максимума возьмем число 1:

m:=1;

Осуществим обращение к каждому элементу массива оператором цикла:

for k:=1 to N do

begin

обращение к элементу a[k]

end;

Выполнять проверку и изменение максимума будем оператором:

if a[k]>m then m:=a[k];

Программа решения задачи на языке Паскаль

var a:array[1..30] of integer;

    N,k,m:integer;

begin

  print('Введите количество элементов массива N =');

  readln(N);

  println('Массив чисел');

  m:=1;

  for k:=1 to N do

  begin

    a[k]:=random(1,100);

    print(a[k]);

    if a[k]>m then m:=a[k];

  end;

  println;

  println('Максимум в массиве:',m);

end.

Результат запуска программы

Максимум в массиве. Паскаль

Для наглядности можно выводить текущее значение максимума в цикле.

Максимум в массиве. Паскаль

Для поиска минимума начальное значение следует взять за самое большое число в массиве (в нашем случае это число 100). А проверка условия и изменение минимума будет таким:

if a[k]<m then m:=a[k];