Начала Паскаля: линейные программы, целые и вещественные типы

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

Вот ещё несколько бонусных задач

Вот несколько бонусных задач на целочисленную арифметику. Предполагается их решение на Паскале, без использования условных и циклических операторов. Рассматриваются только те решения, которые правильно оформлены как программный код. Бонусные баллы будут начисляться как за сами решения, так и за их содержательное обсуждение. Задачи рассчитаны на первокурсников. При большом желании поучаствовать, другие люди свои материалы могут публиковать либо в своих группах, либо посылать мне на почту.

Задача 1. Дано натуральное N. Вывести 1, если оно чётное и 0, если нечётное.

Задача 2. Дано значение типа Byte. Подсчитать число нулевых битов его внутреннего двоичного представления.

Задача 3. Дано трёхзначное в десятичной записи натуральное число N. Вывести 1, если две последние его десятичные цифры равны и вывести 0, в противном случае.

Задача 4. Дано целое неотрицательное число M < 10. Вывести следующее за ним по порядку целое число, при этом считая, что за значением 9 снова следует значение 0.

Задача 5. Дано шестизначное в десятичной записи натуральное число N. Вывести 1, если оно представляет “счастливый билет” (т.е. сумма первых трёх цифр совпадает с суммой следующих трёх его цифр) и вывести 0, в противном случае.

Решения Ярослава и Романа

"Решения" отвергнуты:
1. Как неверно оформленные (см. требования выше)
2. Как просто неверные.

Задача2

  1. program bit0;
  2.  var m,k:byte;
  3. begin
  4.  read(k);
  5.  m:=0;
  6.  while k<>0 do begin
  7.   m:= m + (k mod 2);
  8.   k:= k div 2;
  9.  end;
  10.  write (8-m)
  11. end.

Задача1

  1. program a1;
  2.  var a:word;
  3. begin
  4.  readln(a);
  5.  a:=1 - (a mod 2);
  6.  writeln(a)
  7. end.

Sorry!

Моё решение Задачи 2 неправильное. Упустил тот факт, что нельзя использовать операторы цикла.

Задача3

  1. program a3;
  2.  var n:word;
  3. begin
  4.  read(n);
  5.  n:=abs(((n mod 100) div 10) - ((n mod 100) mod 10));
  6.  n:=trunc (n/(n-0.1));
  7.  write(1-n)
  8. end.

Задача 5

  1. Program lucky;
  2.  var a,b,n:Integer;
  3. begin
  4.  read(n);
  5.  a:=((n div 100000)+((n div 10000) mod 10)+((n div 1000) mod 10);
  6.  b:=((n div 100) mod 10)+((n div 10) mod 10)+(n mod 10);
  7.  n:=a div b;
  8.  a:=b div a;
  9.  n:=a*n;
  10.  write(n)
  11. end.

Hе вижу замечаний, возражений, предложений ...

Hе вижу замечаний, возражений, предложений ...
Или всё идеально?

Замечание к задаче5

В случае, если b=0 (например число 123000), программа выдаст ошибку при выполнении

  1. n:= a div b

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

Ок, Дима.

Вы правы.

Замечание к 5 задаче

Точно! согласен с Димой, но мне что-то не приходит в голову, как исправить эту ошибку без условных оператаров.

Задачи

Как насчет 2 и 4 задачи? у кого-нибудь есть мысли по этому поводу? У меня в 4 задаче получаеться либо вывести следущее число, но 9 не обращаеться в 0, либо вывести из девятки 0. Однако совместить эти операции не получаеться.

Задача4

  1. program M10;
  2.  var a:byte;
  3. begin
  4.  read(a);
  5.  a:= (a mod 9) + ((a+9) div 9) mod 2;
  6.  write(a);
  7. end.

Замечание к Задаче 5

Ничего не изменится, если заменить

  1. n:= a div b;
  2. a:= b div a;
на
  1. n:= (a+1) div (b+1);
  2. a:= (b+1) div (a+1);

Но при этом программа должна работать правильно при b=0.

О пяти задачах ...

Задача1 - полностью закрыта Молчановым Димой.
Задача2 - не решена.
Задача3 - решена Молчановым Димой, но решение мне не нравится. Возможны лучшие варианты (не использующие арифметику плавающей точки) - задачу считаю ещё открытой.
Задача4 - так же решена Молчановым Димой, но строчку 5 в его решении можно упростить. Как?
Задача5 - большую часть работы здесь сделал Фирсов Евгений. Но Дима поставил "точку" в решении и этой задачи. Впрочем и здесь тоже возможны другие варианты. Задачу считаю открытой.

Промежуточный итог:
Молчанов Дмитрий (безусловный лидер этой сессии) - 5 рейтинговых баллов;
Фирсов Евгений - 2 балла.

Задача3

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

  1. program a3;
  2.  var n,i,j:word;
  3. begin
  4.  read(n);
  5.  i:= ((n mod 100) div 10);
  6.  j:= ((n mod 100) mod 10);
  7.  n:= (i+1) div (j+1);
  8.  i:= (j+1) div (i+1);
  9.  n:=n*i;
  10.  write(n)
  11. end.

Но это вариант решения основан на решении Фирсова Евгения(Задача5).

Дима...

А 6-ю строчку нельзя упростить?

Задача 2

  1. program bin;
  2. var
  3. s,x:byte;
  4. begin
  5.   readln(x);
  6.   s:=0;
  7.   s:=s + x mod 2; x:=x div 2;
  8.   s:=s + x mod 2; x:=x div 2;
  9.   s:=s + x mod 2; x:=x div 2;
  10.   s:=s + x mod 2; x:=x div 2;
  11.   s:=s + x mod 2; x:=x div 2;
  12.   s:=s + x mod 2; x:=x div 2;
  13.   s:=s + x mod 2; x:=x div 2;
  14.   s:=s + x mod 2; x:=x div 2;
  15.   s:=8-s;
  16.   writeln(s);
  17. end.

Программа основывается на том, что для типа byte зарезервировано 8 позиций в двоичном виде числа (0..255), следовательно, какое бы число из данного интервала ни было, его нужно поделить на 2 - 8 раз. (в конце деления мы будем получать нули, которые будут стоять в начальных ячейках).
Потом, чтобы подсчитать количество нулей, нужно просто вычесть из 8, количество единиц.

Так, Алексей

Так, Алексей.

Можно,пожалуйста

Можно,пожалуйста спросить,что-то я не понимаю,почему Алексей в решении 2 задачи S присвоил нулевое значение?счет же с нуля начитается?или все-таки с единицы?

Мария, s ведь счётчик

Мария, s ведь счётчик, а любой счётчик перед употреблением обнуляется. Далее, встреча каждой 1 текущее его значеие увеличит на единицу же. Прибавление нулей на текущее значение не влияет. Вот в конце и накопим ровно столько, сколько единиц.

Валерий Шахамболетович???А

Валерий Шахамболетович???А можно ещё задачек???то у меня наконец-то есть интернет...а всё уже порешали(((

спасибо большое,наконец-то я

спасибо большое,наконец-то я теперь поняла

Не переживайте, Серёжа...

Не переживайте, Серёжа. Я ценю Вашу нацеленность на знания - задачи обязательно будут, и даже сегодня (примерно через полчаса)

Спасибо...будем ждать

Спасибо...будем ждать

Новая задача (6)

Задача 6. Для двух целочисленных значений печатать:

  1. Результат целочисленного деления первого из них на второе (знак результата определяется по обычным алгебраическим законам);
  2. Положительный остаток целочисленного деления первого из них на второе;
  3. Остаток целочисленного деления первого из них на второе со знаком первого из заданных значений.
  4. Остаток целочисленного деления первого из них на второе со знаком второго из заданных значений.

Для осмысленного решения этой и нескольких следующих задач, полезно посмотреть, например, это.

Новые задачи (7-8)

Задача 7. По неотрицательному значению вещественной переменной печатать:

  1. Целую часть заданного значения (наибольшее целое, не превосходящее заданное);
  2. Результат округления заданного значения до ближайшего целого;
  3. Наименьшее целое, не меньшее, чем заданное значение;
  4. Результат «усечения» заданного значения, отбрасыванием его дробной части.

Задача 8. По отрицательному значению вещественной переменной печатать целое значение в вариантах 1-4 задачи 7.

можно уточнить?пожалуйста

можно уточнить?пожалуйста подскажите задачу 7(2) точно можно без условных операторов решить?

А в чём разница между "целой

А в чём разница между "целой частью заданного значения" и "результатом «усечения» заданного значения, отбрасыванием его дробной части"?

я думаю это как

я думаю это как продолжение,вывод "усеченного" числа и и вывод целой части числа одно и то же

No comments!

Подведение итогов завтра вечером ...

Задача 7

Если можно использовать операторы trunc и round, то я не пойму в чём тогда сложность.

  1. program a7;
  2.  var x:real;
  3. begin
  4.  readln(x);
  5.  writeln(trunc(x));
  6.  writeln(round(x));
  7.  writeln(trunc(x+1));
  8.  writeln(x:6:0);
  9. end.

Задача 6

  1. program Z6;
  2. var
  3. x,y:integer;
  4. begin
  5.   readln(x); readln(y);
  6.   writeln(x div y);
  7.   writeln(abs(x mod y));
  8.   writeln(abs(x mod y)* abs(x)/x:2:0);
  9.   writeln(abs(x mod y)* abs(y)/y:2:0);
  10. end.

6 Div даёт деление по алгебраическим законам.
7 Положительный остаток - использовать abs()
8 Положительный остаток * на модуль первого числа, делённого на число (число -6, следовательно 6/-6), а это единица со знаком данного числа (число -6, следовательно 6/-6 = -1). :2:0 - форматный вывод, ибо выражение получается типа - real
9 Соответственно со вторым числом...

Молчанов Дмитрий

если не трудно,можете пожалуйста пояснить как работают функции Trunc(x) и round(x) в решенной Вами 7 задаче?

Как работают функции Trunc(x)

Как работают функции Trunc(x) и round(x), Валерий Шахамболетович объяснял на лекции.
TRUNC(X) - отсечение дробной части
ROUND(X) - округление дробной части.

Дмитрий

обьясните на вашей решенной задаче пожалуйста?

дайте пожалуйста комментарии

дайте пожалуйста комментарии к решенной вами задаче,по шагам начиная с пятого шага,как например комментирует Алексей,что происходит на 5 шаге,зачем 6 шаг и что там происходит.....смотрю на код и ничего не понимаю....пожалуйста прокомментируйте,я думаю Вам это не соствит большой сложности

какую операцию обозначает 7

какую операцию обозначает 7 шаг?для чего это нужно?

Молчанову Дмитрию

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

На 7-ом шаге находим

На 7-ом шаге находим "наименьшее целое, не меньшее, чем заданное значение".
Например: Если ввести 12.3, то получим 13, т.к. trunc(12.3+1) = trunc(13.3) = 13.

зачем +1 прибавлять?

зачем +1 прибавлять?

наименьшим целым должно быть

наименьшим целым должно быть 12, а не 13

Тяжёлый случай. Перечитай

Тяжёлый случай. Перечитай внимательно 3-ий пункт условия задачи.

не меньше чем заданное

не меньше чем заданное значение,то есть значение может быть либо больше на 1 если дробная часть больше 0.5 либо само заданное число если дробная часть меньше о.5

и не понятно,почему Вы

и не понятно,почему Вы округляете 12.3 до 13,если округленное число 12.3 будет само число 12

Повторяю

TRUNC(X) - отсечение дробной части
ROUND(X) - округление дробной части.

ничего не понятно!!!!!сначала

ничего не понятно!!!!!сначала отсекаешь дробную часть,потом округляешь-это понятно,но зачем +1????

не меньше это либо больше

не меньше это либо больше ,либо равно самому числу!зачем округлять 12.3 до 13,если по правилам округленное число 12.3 это само число 12

Может так будет понятней

  1. program a7;
  2.  var x:real; a,b,c:integer;
  3. begin
  4.  readln(x);
  5.  a:= (trunc(x));
  6.  b:= (round(x));
  7.  c: = (trunc(x+1));
  8.  writeln (a);
  9.  writeln (b);
  10.  writeln (c);
  11.  writeln(x:6:0);
  12. end.

Программа выводит четыре числа:
1. Целую часть заданного значения (наибольшее целое, не превосходящее заданное);
2. Результат округления заданного значения до ближайшего целого;
3. Наименьшее целое, не меньшее, чем заданное значение;
4. Результат «усечения» заданного значения, отбрасыванием его дробной части.
Понимаешь?

так понятней....спасибо...не

так понятней....спасибо...не надо оскорблять тех кто не понимает программого кода,Благодарю Вас очень,не у всех же такие способности в программировании...