20.11.2023

Срезы в PascalABC.NET (примеры использования в задачах)

Срез - это набор элементов списка, массива или строки.

Приведем в пример программу, демонстрирующую срезы в PascalABC.NET, а также решения задач с использованием срезов.

begin

  var a:=Arr(10, 11, 12, 13, 14, 15, 16, 17, 18);

  a.Println(); // вывод массива // [10, 11, 12, 13, 14, 15, 16, 17, 18]

  a[1:3].Println(); // срез по индексам [1, 3) с шагом 1 // [11, 12]

  a[2:8:3].println(); // срез по индексам [2, 8) с шагом 3 // [12, 15]

  a[7:2:-1].Println(); // срез по индексам [7, 2) с шагом -1 // [17, 16, 15, 14, 13]

  a[::-1].Println(); // реверс массива

 end.

 Задача 1. В массиве удалить каждый второй элемент.

  Пусть имеется массив [12, 13, 14, 15, 16]

  Результат [12, 14, 16]

begin

   var a:=Arr(12, 13, 14, 15, 16);

   a:=a[::2];

   a.Println();

end.

Задача 2. В массиве найти минимальный элемент среди элементов, у которых индексы кратны 3.

 Пусть имеется массив [100, 12, 14, 23, 45, 200, 27, 21]

 То есть среди элементов 100, 23, 27 найти минимальный.

begin

  var a:=Arr(100, 12, 14, 23, 45, 200, 27, 21);

  var m:=a[0::3].Min;

  println(m);

end.

Задача 3. В массиве удалить элемент с индексом k (k меньше количества элементов массива).

begin

  var a:=Arr(100, 12, 14, 23, 45, 200, 27, 21);

  var k:=random(a.Length);//k зададим случайно

  if k < a.Length-1 then a:=a[:k]+a[k+1:]

                     else a:=a[:a.Length-1];

  a.Println;

  println('удалили элемент с индексом ',k);

end.

Задача 4. В массив вставить элемент на место с индексом k (k меньше количества элементов массива).

begin

var a:=Arr(100, 12, 14, 23, 45, 200, 27, 21);

  var k:=random(a.Length);//зададим случайно

  setlength(a, a.Length);

  var d:=Random(100); //число зададим случайно

  if k < a.Length then a:=a[:k] + Arr(d) + a[k:]

                  else a:=a[:a.Length-1] + Arr(d);

  a.Println;

  println('вставили число ',d,' на место с индексом ',k);

end.


Динамические массивы в Паскале

Читать

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

Читать

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

Читать

Массивы в языке Паскаль. Решение задач. 8 класс (сумма, произведение, среднее арифметическое, минимум/максимум с условием)

Читать

Язык Паскаль. Найти количество различных чисел в массиве из N элементов (2 способа решения)

Читать

15.11.2023

Решаем уравнение с помощью программы на языке Паскаль и Python

 Задача. Имеется уравнение вида ax + b = 0. По введенным коэффициентам a и b найти корень уравнения (значение x).

Необходимо рассмотреть несколько случаев:

если а ≠ 0 — уравнение имеет единственный корень: х = -b / а;

если а = 0 — уравнение корней не имеет;

если а и b равны нулю, то корнем уравнения является любое число. 

Воспользуемся оператором ветвления.

if a<>0 then println('корень уравнения: ',-b/a)

          else

              if b=0 then println('любое число')

                     else println('корней нет');

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

var a, b, x: real;

begin

  print('Введите коэффициенты a и b:');

  raedln(a,b);

  if a<>0 then println('корень уравнения: ',-b/a)

          else

              if b=0 then println('любое число')

                     else println('корней нет');

end.

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

результат запуска

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

a, b = map(float, input('Введите коэффициенты a и b ').split())

if a!=0:

    print('корень уравнения: ',-b/a)

elif b == 0:

    print('любое число')

else:

    print('корней нет')


Задан проходной балл. Запрашиваются оценки абитуриента на трех экзаменах и сообщается о результате приема в институт.

Читать

Определить, делителем каких целых чисел из А, В и С является целое число N.

Читать

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

Читать

Является ли число двузначным

Читать

Известен рост трех человек. Определить, одинаков ли их рост?

Читать

30.09.2023

Как ввести с клавиатуры в питоне несколько чисел. Метод split и функция map

Задача. Участники парусной регаты стартовали одновременно. На финише фиксировалось время прохождения маршрута каждой яхтой (в часах и минутах). Определите время победителя регаты (в часах и минутах). Известно, что соревнования проходили в течение 12 часов.

Программа получает на вход количество яхт, принимавших участие в регате N (1<=N<=50), затем для каждой яхты вводится два числа: часы и минуты, затраченные на прохождение маршрута.

Входные данные:

4

2 55

3 40

2 35

3 10

Выходные данные:

2 35

Исходные данные: N - количество яхт

h, m - количество часов и минут

Выходные данные: 

hw, mw - результат победителя

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

  1. Введем с клавиатуры число N.
  2. В цикле от 0 до N-1 введем пары чисел, переведем введенное время в минуты, определим минимум в минутах.
  3. Выполним перевод найденного минимального времени в часы и минуты.

Как ввести с клавиатуры несколько чисел? В нашей задаче в каждой строке вводится пара чисел.

Мы знаем, что input вводит строку. Мы также понимаем, что пара чисел разделена в строке одним пробелом. Необходимо разделить строку на две по пробелу. Для этого будем использовать метод split.

input().split()

Затем функцией map применим int к полученным строкам и сохраним в переменных h и m.

h, m = map(int, input().split())

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

n = int(input())

tmin = 12*60

for k in range(n):

    h, m = map(int, input().split())

    t = h*60+m

    if t < tmin:

        tmin = t

hw = tmin // 60

mw = tmin % 60

print(hw, mw)

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





24.09.2023

Как ввести с клавиатуры целое число. Функция input. Python

Для ввода данных с клавиатуры будем использовать функцию input.

n = input()

В результате выполнения данной программы мы увидим приглашение к вводу данных, а именно строки.

Для того, чтобы увидеть текстовый комментарий, сделаем так:

n = input('Введи строку ')

Можно вывести строку на экран:

print('Вы ввели строку ',n)

Убедимся, что это строка:

n = n + ', а не число' #выполним сложение строк

print('Вы ввели строку ',n)



Но, как ввести число в Python?

Необходимо использовать функцию int для преобразования введенной строки к числу.

n = int(input('Введи число '))

Можно вывести число на экран:

print('Вы ввели число ',n)

ввод целого числа. Python

Убедимся, что это число:

n = n + 100  #увеличим число на 100

print('Введенное число увеличили на 100  и получилось: ',n)




19.07.2023

Дано три целых числа. Определить, сколько из них отрицательных? (Паскаль, Python)

Задача. Дано три целых числа. Определить, сколько из них отрицательных?

Приведем решение задачи на языках программирования Паскаль и Python.

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

  • введем с клавиатуры три целых числа (a, b, c)
  • обнулим счетчик отрицательных чисел (k)
  • над каждым числом выполним проверку: если число отрицательно (строго меньше 0), то счетчик k увеличим на 1 (будем использовать ветвление и соответственно условный оператор в краткой форме)
    if a<0 then k:=k+1;
  • выведем ответ на экран

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

var a,b,c,k:integer;

begin

  println('Введите три целых числа:');

  readln(a,b,c);

  k:=0;

  if a<0 then k:=k+1;

  if b<0 then k:=k+1;

  if c<0 then k:=k+1;

  println('Количество отрицательных чисел:',k);

end.

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

Запуск программы

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

a,b,c = map(int, input('Введите три целых числа: ').split())

k = 0

if a<0: k+=1

if b<0: k+=1

if c<0: k+=1

print('Количество отрицательных чисел:',k)

Заметим, что по сути нужно повторить три одинаковых действия: ввести число и выполнить проверку, поэтому можно использовать следующий код (это позволит приблизиться к теме Циклы)

k = 0

a = int(input('Введите целое число: '))

if a<0: k+=1

a = int(input('Введите целое число: '))

if a<0: k+=1

a = int(input('Введите целое число: '))

if a<0: k+=1

print('Количество отрицательных чисел:',k)

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


Дано натуральное число N. Есть ли в нем четная цифра

Читать

Определить, одинаков ли рост трех человек

Читать

Определить, делителем каких целых чисел является целое число

Читать

07.07.2023

ЕГЭ по информатике. Задание 8. Сколько существует шестнадцатеричных трехзначных чисел, в которых все цифры различны и никакие две четные или две нечетные цифры не стоят рядом? Решение на языке Python

Задача. Сколько существует шестнадцатеричных трехзначных чисел, в которых все цифры различны и никакие две четные или две нечетные цифры не стоят рядом?

Приведем решение задачи на языке Python

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

Получим все возможные трехзначные шестнадцатеричные числа функцией product - кортеж цифр x:

abc = '0123456789ABCDEF'

for x in product(abc, repeat = 3):

Функция product аналогична функции cartesian в PascalABC.NET.

Выполним проверку

  • первая цифра числа не равна 0 (число должно быть трехзначным): x[0]!='0'
  • все цифры числа различны (длина множества цифр равна количеству цифр в числе): len(set(x)) == len(x)
  • четность у соседних цифр различна: int(x[0],16) % 2 != int(x[1],16) % 2 and int(x[1],16) % 2 != int(x[2],16) % 2

Если все условия выполняются, будем копить счетчик k

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

from itertools import *

abc = '0123456789ABCDEF'

k = 0

for x in product(abc, repeat = 3):

    if x[0]!='0':

        if len(set(x)) == len(x):

            if int(x[0],16) % 2 != int(x[1],16) % 2 and int(x[1],16) % 2 != int(x[2],16) % 2:

                k+=1

print(k)

Ответ: 840


Как решить комбинаторную задачу про слова. Валя составляет шестибуквенные слова из букв слова ГРОЗА

Читать

Лера составляет 5-буквенные слова из букв слова ЛОГАРИФМ (перестановки)

Читать

Все шестибуквенные слова, составленные из букв МАНГУСТ, записаны в алфавитном порядке и пронумерованы (декартово произведение)

Читать

04.07.2023

Все шестибуквенные слова, составленные из букв МАНГУСТ, записаны в алфавитном порядке и пронумерованы. Комбинаторная задача. ЕГЭ по информатике. Решение на Python

Задача. Все шестибуквенные слова, составленные из букв МАНГУСТ, записаны в алфавитном порядке и пронумерованы.

Вот начало списка:

1. АААААА

2. АААААГ

3. АААААМ

4. АААААН

5. АААААС

6. АААААТ

7. АААААУ

...

Под каким номером в списке стоит последнее слово, которое не начинается с буквы У, содержит только две буквы М и не более одной буквы Г?

 Приведем решение данной задачи на языке Python.

Из букв алфавита МАНГУСТ составляются шестибуквенные слова. На каждом месте может встретиться любая буква. Получим все возможные слова функцией product (декартово произведение). 

Заведем счетчик - порядковый номер слова t. И если слово подходит под условие, то в переменную k сохраним значение порядкового номера слова. Таким образом значение переменной k будет обновляться и в итоге сохранит необходимый номер последнего подходящего слова.

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

from itertools import *

s = 'АГМНСТУ'

k = t = 0

for x in product(s, repeat = 6):

    t+=1 #порядковый номер слова

    if x[0]!='У' and x.count('М')==2 and x.count('Г')<=1:

        k = t #номер подходящего слова

print(k)

Ответ: 100810

Сколько существует шестнадцатеричных трехзначных чисел, в которых все цифры различны и никакие две четные или две нечетные цифры не стоят рядом

Читать

Настя составляет коды из букв слова НАСТЯ. Код должен состоять из 7 букв, буква Н должна встречаться в нём ровно два раза, буква А – как минимум один раз. Сколько различных кодов может составить Настя

Читать

Алексей составляет 5-буквенные слова из букв М, А, Г, И, С, Т, Р. Каждую букву можно использовать не более одного раза, при этом в слове нельзя использовать более одной гласной. Сколько различных кодов может составить Алексей

Читать

24.05.2023

Дано натуральное число N, есть ли в нем четная цифра. Язык Паскаль. PascalABC.NET

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

Задача. С клавиатуры вводится натуральное число N. Определить, есть ли в нем четные цифры?

Четные цифры это: 0, 2, 4, 6, 8

1 способ

f:=false;

while N<>0 do

 begin

  d:=N mod 10;

  if d in [0,2,4,6,8] then f:=true;

  N:=N div 10;

 end;

 if f then println('Да, четные цифры есть в числе') else println('Нет, четных цифр нет в числе');

За значение флага f приняли ЛОЖЬ - четных цифр нет в числе. Выделили цифры числа оператором цикла while. Если цифра принадлежит множеству четных цифр, то значение флага изменяем на ИСТИНУ.

За циклом осуществляется проверка флага. Если флаг принял значение ИСТИНА, то в числе есть четные цифры, в противном случае нет.

Комментарии

  • логическое значение ЛОЖЬ - false
  • логическое значение ИСТИНА - true
  • для хранения логических значений используются переменные типа boolean
  • оператор вхождения элемента в множество - in

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

var N,d:integer;

    f:boolean;

begin

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

  readln(N);

  f:=false;

  while N<>0 do

  begin

    d:=N mod 10;

    if d in [0,2,4,6,8] then f:=true;

    N:=N div 10;

  end;

  if f then println('Да, четные цифры есть в числе') else println('Нет, четных цифр нет в числе');

end.

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


2 способ

Используем модуль School, функцию digits и методы динамических массивов.

С помощью функции digits получим список цифр числа, преобразуем список к массиву, найдем в полученном массиве четные цифры, преобразуем полученную последовательность в массив и вычислим его длину. Если длина полученного массива четных цифр не равна 0, то ответ Да, иначе Нет.

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

uses school;

var N,p:integer;

begin

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

  readln(N);

  p:=digits(N).ToArray.Where(k -> k in [0,2,4,6,8]).ToArray.Length;

  if p<>0 then println('Да, четные цифры есть в числе') else println('Нет, четных цифр нет в числе');

end.

Комментарии:

  • Условие k in [0,2,4,6,8] можно изменить на обычную проверку: остаток от деления на 2 равен 0? k mod 2 = 0
  • Данная программа является линейной и не использует цикл для выделения цифр числа.

3 способ

Преобразуем число в строку. Выполним проверку вхождения символов '0', '2', '4', '6', '8' в полученную строку.

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

n = int(input())

n = str(n) #функция str преобразует числовое значение в строковое

f = ('0' in n) or ('2' in n) or ('4' in n) or ('6' in n) or ('8' in n)

if f:

    print('yes')

else:

    print('no')


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];

Дано натуральное число N. Вывести его последнюю цифру. Программа на языке Паскаль. PascalABC.NET (3 способа)

 Задача. Дано натуральное число N. Вывести его последнюю цифру. 

Приведем 3 способа решения данной задачи:

  • с использованием операции mod;
  • с использованием строкового типа данных string;
  • с использованием функции digits из модуля School.

Способ 1 (с использованием операции mod)

Последняя цифра натурального числа показывает количество единиц в числе. Вычислим эту цифру делением на 10. 

Воспользуемся операцией целочисленного деления mod.

Покажем деление нацело на схеме:

Деление нацело. Последняя цифра

Если вычислить целый остаток от деления числа на 10 - это и будет последняя цифра числа.

Операция вычисления целого остатка от деления в языке Паскаль - это mod.

Запишем выражение для вычисления последней цифры натурального числа N:

d:=N mod 10;

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

var N,d:integer;

begin

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

  readln(N);

  d:=N mod 10; //целый остаток от деления числа N на 10

  println('Последняя цифра числа',d);

end.

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

Запуск программы. Последняя цифра числа

Дополнительно об операциях целочисленного деления div и mod (читать).

Способ 2 (с использованием строкового типа данных string)

var N,d:integer; str:string; c:char;

begin

  println('Введите натуральное число');

  readln(N);

  str:=N.ToString; //преобразовать число N  в строку str

  c:=str[str.length]; //последний символ строки str

  d:=c.ToDigit; //преобразовать символ в цифру

  println('Последняя цифра числа',d);

end.

Способ 3 (с использованием функции digits из модуля School)

uses school;

var N,d:integer;

    mas:array of integer;

begin

  println('Введите натуральное число');

  readln(N);

  mas:=digits(N).toArray;//получение списка цифр и преобразование списка в массив

  d:=mas[mas.Length-1];//последний элемент массива mas

  println('Последняя цифра числа',d);

end.

Каким способом следует воспользоваться для решения следующей задачи:

Дано натуральное число. Вычислить сумму его цифр.

21.02.2023

С клавиатуры вводится натуральное число N. Найти сумму и произведение его цифр. Линейный код. Модуль School. PascalABC.NET. Функция Digits

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

Воспользуемся функцией digits из модуля School для решения данной задачи.

Функция digits получает список цифр числа. 

Формат использования: digits(n:int64)

Пример:

n:=4507;

println(digits(n));

Вывод: [4,5,0,7]

Для вычисления суммы цифр воспользуемся методом sum: digits(n).sum

Для вычисления произведения цифр воспользуемся методом product: digits(n).product

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

uses school;

var n,s,p:integer;

begin

  println('Введите натуральное число');

  readln(n);

  println('Список цифр числа',digits(n));

  s:=digits(n).Sum;

  p:=digits(n).Product;

  println('Сумма цифр',s);

  print('Произведение цифр',p);

end.

Сумма и произведение цифр числа

Эта программа имеет линейную структуру в отличие от программы с использованием оператора цикла while.


Модуль School. PascalABC.NET. Функция isPrime

 Найдем количество простых чисел на промежутке [ 2 000 000, 10 000 000].

Воспользуемся функцией модуля School. Функция isPrime возвращает логическое True, если число простое.

Формат использования: n.isPrime

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

uses school;

var n,p:integer;

begin

  p:=0;

  for n:=2000000 to 10000000 do

  begin

    if n.IsPrime then p+=1;

  end;

  print(p);

end.

Код выполнился за 17 секунд.

Количество простых чисел на промежутке чисел [2000000, 10000000] равно: 515646

Функция isPrime избавляет от необходимости писать код самостоятельно.

Приведем программу, которая ищет сразу два делителя для текущего числа n.

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

var n,p,t,k:integer;

begin

  p:=0;

  for n:=2000000 to 10000000 do

  begin

    t:=0;

    for k:=2 to trunc(sqrt(n)) do

    begin

      if n mod k=0 then 

        if k<>n div k then t+=2

                      else t+=1;

         

    end;

    if t=0 then p+=1;

  end;

  print(p);

end.

Код выполнился примерно за 6 мин

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

08.02.2023

Массивы в языке Паскаль. Решение задач. 8 класс (сумма, произведение, среднее арифметическое, минимум/максимум с условием)

Список задач для решения

Задача 1. Дан целочисленный массив из N элементов. Элементы массива могут принимать целые значения от 0 до 100. Найти и вывести произведение элементов массива, которые имеют чётное значение и не оканчиваются на 0. Гарантируется, что в исходном массиве есть хотя бы один элемент, значение которого чётно и не оканчиваются на 0. 

Задача 2. Дан массив, содержащий N неотрицательных целых чисел, не превышающих 10 000. Найти и вывести сумму всех содержащихся в массиве трёхзначных чисел, которые оканчиваются на 9, но не на 99. 

Задача 3. Дан целочисленный массив из N элементов. Элементы массива могут принимать значения от –1000 до 1000. Найти среднее арифметическое всех элементов массива, оканчивающихся цифрой 5. Гарантируется, что хотя бы один такое элемент в массиве есть.
 
Задача 4. Дан целочисленный массив из N элементов, все элементы которого – целые числа в интервале от -1000 до 1000. Найти минимальное значение из всех нечетных элементов массива, которые делятся на 5. Гарантируется, что хотя бы один такой элемент существует. 

Задача 5. Дан целочисленный массив из N элементов, все элементы которого – неотрицательные числа, не превосходящие 10 000. Найти минимальное трехзначное число, записанное в этом массиве, если таких чисел нет, нужно вывести сообщение "Таких чисел нет".

Программы решений

Задача 1. Дан целочисленный массив из N элементов. Элементы массива могут принимать целые значения от 0 до 100. Найти и вывести произведение элементов массива, которые имеют чётное значение и не оканчиваются на 0. Гарантируется, что в исходном массиве есть хотя бы один элемент, значение которого чётно и не оканчиваются на 0.

Сформируем массив случайным образом так, чтобы значения элементов были равны числам от 0 до 100 и выведем массив на экран.

for k:=1 to N do

begin

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

print(a[k]);

end;

Произведение элементов примем за 1. Пройдем циклом по массиву и проверим: не оканчивается ли элемент на 0, и является ли он четным.

p:=1;

for k:=1 to N do

begin

if (a[k] mod 10 <> 0) and (a[k] mod 2=0) then p:=p*a[k];

end;

print(p);

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

var a:array[1..100] of integer; N,k,p:integer;

begin 

   readln(N);

   for k:=1 to N do

    begin

     a[k]:=random(0,100):

     print(a[k]);

    end;

    p:=1;

   for k:=1 to N do

    begin

     if (a[k] mod 10 <> 0) and (a[k] mod 2=0) then p:=p*a[k];

    end;

  print('Произведение четных элементов, не оканчивающихся на 0',p);

end.

Задача 2. Дан массив, содержащий N неотрицательных целых чисел, не превышающих 10 000. Найти и вывести сумму всех содержащихся в массиве трёхзначных чисел, которые оканчиваются на 9, но не на 99. 

Сформируем массив случайным образом так, чтобы значения элементов были равны числам от 0 до 10000 и выведем массив на экран.

for k:=1 to N do

begin

 a[k]:=random(0,10000);

print(a[k]);

end;

Сумму элементов примем за 0. Пройдем циклом по массиву и проверим: является ли элемент трехзначным числом, оканчивающимся на 9, но не на 99.

s:=0;

for k:=1 to N do

  begin

   if (a[k]>=100) and (a[k]<=999) and (a[k] mod 10=9) and (a[k] mod 100<>99) then s:=s+a[k];

  end;

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

var a:array[1..100] of integer; N,k,s:integer;

begin 

   readln(N);

   for k:=1 to N do

    begin

     a[k]:=random(0,10000):

     print(a[k]);

    end;

   s:=0;

   for k:=1 to N do

    begin

     if (a[k]>=100) and (a[k]<=999) and (a[k] mod 10=9) and (a[k] mod 100<>99) then s:=s+a[k];

    end;

  print('Сумма элементов',s);

end.

Задача 3. Дан целочисленный массив из N элементов. Элементы массива могут принимать значения от –1000 до 1000. Найти среднее арифметическое всех элементов массива, оканчивающихся цифрой 5. Гарантируется, что хотя бы один такое элемент в массиве есть.

 Для вычисления среднего арифметического значения элементов, оканчивающихся цифрой 5, необходимо найти сумму таких элементов и их количество. Поскольку числа могут быть отрицательными, следует взять модуль числа при проверке abs(a[k]).

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

var a:array[1..100] of integer; N,k,s,t:integer;

Sr:real;

begin 

   readln(N);

   for k:=1 to N do

    begin

     a[k]:=random(-1000,1000):

     print(a[k]);

    end;

   s:=0; t:=0;

   for k:=1 to N do

    begin

    if abs(a[k]) mod 10 = 5 then

        begin

         s:=s+a[k];

         t:=t+1;

        end;

    end;

  sr:=s/t;

  print('Среднее арифметическое элементов, оканчивающихся на 5',Sr);

end.

Задача 4. Дан целочисленный массив из N элементов, все элементы которого – целые числа в интервале от -1000 до 1000. Найти минимальное значение из всех нечетных элементов массива, которые делятся на 5. Гарантируется, что хотя бы один такой элемент существует. 

Поскольку есть гарантия, что такой элемент в массиве есть, то за искомый минимум возьмем самое большое возможное число 1000.

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

var a:array[1..100] of integer; N,k,m:integer;

begin 

   readln(N);

   for k:=1 to N do

    begin

     a[k]:=random(-1000,1000):

     print(a[k]);

    end;

   m:=1000;

   for k:=1 to N do

    begin

    if (a[k] mod 2<>0) and (a[k] mod 5 = 0) and (a[k]<m) then m:=a[k];     

    end;

  print('Минимальный нечетный элемент, кратный 5',m);

end.

Задача 5. Дан целочисленный массив из N элементов, все элементы которого – неотрицательные числа, не превосходящие 10 000. Найти минимальное трехзначное число, записанное в этом массиве, если таких чисел нет, нужно вывести сообщение "Таких чисел нет".

За начальное значение минимума возьмем число -1 (число, которое не может присутствовать в массиве). Поскольку гарантии того, что трехзначное число присутствует в массиве, нет, то для дальнейшего поиска такого минимума, за его значение возьмем любое трехзначное число в массиве. 

Если после поиска значение минимума осталось равно -1, значит трехзначных чисел в массиве нет.

var a:array[1..100] of integer; N,k,m:integer;

begin 

   readln(N);

   for k:=1 to N do

    begin

     a[k]:=random(0,10000):

     print(a[k]);

    end;

   m:=-1;//число -1 выступает признаком того, что трехзначных чисел в массиве нет

   for k:=1 to N do

    begin

    if (a[k]>99) and (a[k]<1000) then m:=a[k];     

    end;

   for k:=1 to N do

    begin

    if (a[k]>99) and (a[k]<1000) and (a[k]<m) then m:=a[k];     

    end;

   if m=-1 then print('Таких чисел нет') else print('Минимальное трехзначное число',m);

end.

В решении задач с использованием массивов можно выделить следующие этапы:

  • формирование массива (ввод с клавиатуры или случайно)
  • вывод массива на экран
  • обработка массива
Каждый этап требует своего цикла для обращения к каждому элементу массива.

20.01.2023

N-ая декартова степень множества элементов, заданного массивом (Cartesian). PascalABC.NET

Применим функцию Cartesian к решению задачи на комбинаторику.

Перевод Cartesian (англ.) декартовский.

Задача. Настя составляет коды из букв слова НАСТЯ. Код должен состоять из 7 букв, буква Н должна встречаться в нём ровно два раза, буква А – как минимум один раз. Сколько различных кодов может составить Настя? 

Для составления слов длины 7 Настя использует 5 различных букв. Количество таких слов будет равно:

5*5*5*5*5*5*5 = 57

Для вычисления такого произведения в PascalABC.NET используется функция Cartesian.

Зададим символьный массив c:

c:=Arr('Н','А','С','Т','Я')

Вычислим 7-ю декартову степень множества элементов, заданного массивом с:

c.Cartesian(7)

Циклом foreach x in c.Cartesian(7) do получим все символьные последовательности в виде массивов x. Склеим символы массива x  в строку s:=x.JoinToString.

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

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

var c,x:array of char;  

    s:string;

    k:integer;

begin

  c:=Arr('Н','А','С','Т','Я');

  k:=0;

  foreach x in c.Cartesian(7) do

  begin

    s:=x.JoinToString;

    if (s.CountOf('Н')=2) and (s.CountOf('А')>=1) then k+=1;

  end;

  print(k);

end.

Ответ: 16401 

Демонстрация работы функции Cartesian

var c,x:array of char;  

    s:string;

begin

  c:=Arr('Т','О','К');

  foreach x in c.Cartesian(4) do

  begin

    s:=x.JoinToString;

    print(s,',');

  end;

end.

Вывод:

ТТТТ , ТТТО , ТТТК , ТТОТ , ТТОО , ТТОК , ТТКТ , ТТКО , ТТКК , ТОТТ , ТОТО , ТОТК , ТООТ , ТООО , ТООК , ТОКТ , ТОКО , ТОКК , ТКТТ , ТКТО , ТКТК , ТКОТ , ТКОО , ТКОК , ТККТ , ТККО , ТККК , ОТТТ , ОТТО , ОТТК , ОТОТ , ОТОО , ОТОК , ОТКТ , ОТКО , ОТКК , ООТТ , ООТО , ООТК , ОООТ , ОООО , ОООК , ООКТ , ООКО , ООКК , ОКТТ , ОКТО , ОКТК , ОКОТ , ОКОО , ОКОК , ОККТ , ОККО , ОККК , КТТТ , КТТО , КТТК , КТОТ , КТОО , КТОК , КТКТ , КТКО , КТКК , КОТТ , КОТО , КОТК , КООТ , КООО , КООК , КОКТ , КОКО , КОКК , ККТТ , ККТО , ККТК , ККОТ , ККОО , ККОК , КККТ , КККО , КККК 

Всего таких слов: 34 = 81