Персональная страничка
Диканева Тараса
Викторовича

Главная \ Преподавательское \ Программирование для начинающих

1. Линейные программы: арифметические операторы, стандартные функции и ввод/вывод в текстовом режиме

Предыдущий раздел:

Следующий раздел:

1.7. Задачи на составление арифметических выражений

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

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

В данном случае мы имеем дело с простейшей ситуацией – по сути, требуется придумать программу, состоящую из одной строки. Набор операций дан, требуется их скомбинировать так, чтобы получился требуемый результат. Решение данных задач позволит выработать правильный подход и настрой для работы в ситуации когда «неизвестно что делать».

Задания:

Используя арифметические операторы (+, -, *, /, div, mod), а также функции round(), trunc() и abs(), составьте арифметические выражения для вычисления следующих величин:

1. n-е четное число (первым считается 2, вторым 4 и т.д.)

2. n-е нечетное число (первое равно 1, второе 3 и т.д.)

3. В очереди стоят n людей, сколько человек находится между i-м и k-м в очереди.

4. Сколько нечетных чисел на отрезке (a, b), если a и b – четные? Если a и b – нечетные? a –четное, b – нечетное?

5. Сколько полных минут и часов содержится в x секундах?

6. В доме 9 этажей, на каждом этаже одного подъезда по 4 квартиры. В каком подъезде, и на каком этаже находится n-я квартира.

7. Старинными русскими денежными единицами являются: 1 рубль – 100 копеек, 1 гривна — 10 копеек, 1 алтын — 3 копейки, 1 полушка — 0,25 копейки. Имеется А копеек. Запишите выражения для представления имеющейся суммы в рублях, гривнах, алтынах и полушках.

8. Стрелка прибора вращается с постоянной скоростью, совершая w оборотов в секунду (не обязательно стрелка прибора, может быть это волчок в игре «Что? Где? Когда?» и т.п.) Угол поворота стрелки в нулевой момент времени примем за 0. Каков будет угол поворота через t секунд?

9. Вы стоите на краю дороги и от вас до ближайшего фонарного столба x метров. Расстояние между столбами y метров. На каком расстоянии от вас находится n-й столб?

10. Та же ситуация, что и в предыдущей задаче. Длина вашего шага z метров. Мимо скольких столбов вы пройдете, сделав n шагов.

11. x – вещественное число. Запишите выражение, позволяющее выделить его дробную часть.

12. x – вещественное число. Запишите выражение, которое округлит его до сотых долей (останется только два знака после запятой).

13. n – целое число. Запишите выражение, позволяющее узнать его последнюю цифру.

14. n – четырехзначное целое число. Запишите выражение, позволяющее узнать его первую цифру.

15. Оператор div в Паскале работает только для целых чисел. Составьте выражение, позволяющее получать целую часть от деления вещественных чисел.

16. Выразите операцию mod через другие арифметические операции.

17. x – вещественное число. Запишите выражение, которое даст +1, если x>0 и -1, если x<0 (при x=0 выражение будет неопределено).

18. n и m – целые числа. Запишите выражение, которое давало бы 0, если n кратно m и 1, если не кратно.

19. От бревна длиной L отпиливают куски длиной x. Сколько кусков максимально удастся отпилить.

20. Бревно длиной L распилили в n местах. Какова средняя длина получившихся кусков?

21. Резиновое кольцо диаметром d разрезали в n местах. Какова средняя длина получившихся кусков?

22. На прямой через равные промежутки располагается n точек. Расстояние от первой до последней равно L. Чему равно расстояние от первой точки до i-й? А от k-й до последней? А от i-й до k-й?

23. Известно, что приближенные формулы для вычисления синуса и косинуса работают тем точнее, чем меньше значение аргумента. Поскольку синус и косинус 2π-периодические функции (sin(x) = sin(x+2πn) , где n – любое целое число), то можно вычисление синуса от любого аргумента привести к вычислению синуса от аргумента, лежащего в диапазоне от 0 до 2π. Запишите формулы, позволяющие:
(а) привести положительный угол x в диапазон от 0 до 2π.
(б) аналогично для отрицательного угла.

24. Пусть дано трехзначное число x (например, 123). Составьте выражения, которые позволят вычислить первую, вторую и третью цифру этого числа (числа 1, 2 и 3 в примере). Для облегчения поиска решения имейте в виду, что для двузначного числа первая цифра дается выражением

  d1:=x div 10;

а вторая выражением

  d2:=x mod 10;

Следующий раздел:

Предыдущий раздел:

327 комментариев

  1. Taras

    div — целая часть от деления
    mod — остаток

    Например,

     18 div 7 = 2
     18 mod 7 = 4
  2. Тимофей

    writeln(x div 3600,’час’,x div 60,’мин’); — это мое решение,но после х = 3600 она работает неверно.Как изменить — не знаю пока.Личное.А вы,Тарас,турист и шахматист,оказывается — меня эта тематика очень интересует.Где можем пообщаться?

  3. Тимофей

    [Было правильно. Удалил.
    Тарас]

  4. Taras

    По почте можно пообщаться: tvdikanev@yandex.ru
    Лично, пока затруднительно — сильно занят.

  5. Тимофей

    Да понял, что занят, не отвечали долго, значит времени нет. А что с 5 задачей — так и не знаю, не доходит правильный вариант. Там, видимо с if»ами надо работать!?!?!?

  6. Taras

    Нет, с if’ами здесь нигде не надо. В 5-й у тебя не получается, когда в x больше одного полного часа. Ну так надо преобразовать x, чтобы привести его к значению, когда у тебя все работает.

  7. Тимофей

    Здравствуйте,Тарас.Хотел вам(или тебе!?, я 1976г.) в почту написать, а вылезает Outlook 2003 надо настраивать. Зачем и почему это? Другим ведь пишу! Не подскажите? А 5-ю так и не решил,или до часа выходит правильно,или после — может намек какой в нужном направлении???

  8. Taras

    «Тебе», нормально.

    Outlook — это при нажатии на ссылку? Значит он — почта по умолчанию. Вылезает — и ладно, можно закрыть и писать, как привыкли.

    По 5-й. В некотором смысле твое решение правильно. Полных минут в x секундах действительно x div 60. Но если хочется, чтобы число минут показывалось меньше 60-ти, надо избавиться от всех полных часов иксе. Оставить только часть меньше часа.

  9. Тимофей

    Неужели чудо свершилось — я ее решил. writeln(x div 3600,’час’,(x-(x div 3600)*3600) div 60,’мин’);
    Удалите,просто не мог не прислать — все работает!!!Хоть больше часа,хоть меньше.

  10. Тимофей

    Здравствуй, Тарас. Написал программку к 10-й задаче.Если все верно, то удали. Но вот она же работает с целым числом шага, это недостаток. Прокомментируй, если можно.program zadanie_10;
    var
    x,y,n,z:integer;
    begin
    write(‘Расстояние до столба = ‘);
    readln(x);
    write(‘Расстояние между столбами = ‘);
    readln(y);
    write(‘Длина шага = ‘);readln(z);
    write(‘Кол-во шагов = ‘);
    readln(n);
    writeln(‘Я прошел мимо ‘,((z*n)-x) div y,’ столбов’);
    end.

  11. Тимофей

    Здравствуй, Тарас. Считаю,что улучшил программку,по крайней мере для целых чисел.
    program
    var
    x,y,n,z:integer;
    begin
    write(‘Расстояние до столба = ‘);
    readln(x);
    write(‘Расстояние между столбами = ‘);
    readln(y);
    write(‘Длина шага = ‘);readln(z);
    write(‘Кол-во шагов = ‘);
    readln(n);
    writeln(‘Я прошел мимо ‘,(((z*n)-x)+ y) div y,’ столбов’);
    end.

  12. Тимофей

    Прошу оценки и комментария.)

  13. Владимир

    к шестой. вопрос: как можно упростить последнее выражение?

    write(‘Введите номер квартиры — ‘);
    readln(i);
    k:= 4*9;
    n:= (i-1) div k;
    x:= n+1;
    x1:= (((i-1)-((x*k)-k))div 4)+1;
    write(x,’ подьезд и ‘,x1,’ этаж.’);

  14. Владимир

    Сколько нечетных чисел на отрезке (a, b)….
    Числа а и b учитываются?? Я правильно понимаю? ведь они лежат в области отрезка как начальная и конечная точка.

  15. Владимир

    тогда выходит так:

    n:= k mod 2;
    x:= (k-i) div 2 + n;

    Прошу подтвердить и удалить или поправить.

  16. Тимофей

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

  17. Владимир

    ну если учитывать что a и b (я заменил их на i и k) лежат в области отрезка как начальная и конечная точка, тогда можно решить одним уравнением. Или я не прав?

  18. Тимофей

    Давай работать вместе, Владимир? Поможем друг другу, если что. У меня ума не хватило одной программой все сделать. А вы ее испытывали? Я лично на 3-и варианта три программки написал. А a и b принадлежат отрезку, это правильно.

  19. Владимир

    Согласен работать вместе. Изначально я тоже написал три разных, а потом почитав комментарии, наткнулся на обьяснения Тараса с возможным решением в две разные. Тогда потестил и вышло в один.
    Я тестил ее до 20. По идее должно работать и выше. Алгоритм ведь простой. Вот с квартирами были проблемы на переходах с 9 на 1 этаж следующего, но в итоге разрешил. Потратил около трех часов на 6 задачу.
    Я особо не силен в программировании. Всегда хотел научится. Вот терь после работы тренируюсь. Хочу потом на С++ перейти. А переходить нужно от простого к сложному.
    Я так вижу, что мы тут последние два ученика ))
    Помогу чем смогу.

  20. Тимофей

    Я тоже совсем не силен, пробовал в LibertyBasic, но бросил, практически впервые начал копаться в этом, а раньше и поступать пробовал на «вычислительные машины, комплексы,системы и сети», но неудачно. Сейчас что решаешь? Давай в Одноклассниках пересечемся, а то я смотрю, сайт мало посещают и Тараса нет последнее время, спросить не у кого, если трудности будут.

  21. Владимир

    Да. Тараса нет, и пусто здесь.
    Я не имею акка на Однокласниках. И Вконтактах тоже. Считаю то пустой тратой времени. Может оттого, что много сидел там когда то? Сейчас в нахожусь в Англии. Пробую заработать деньги, а когда свободное время, захожу сюда учиться. Тоже когда то хотел стать программистом, но на учебу не было денег. Вот решился как то сам.

  22. Владимир

    Эх.. Так и не смог решить 8 без подглядки (((

  23. Тимофей

    А Скайп есть? Я тоже решился сам, по крайней мере пока. Я ей еще не занимался даже. Вроде и не очень сложные задачки, а подумать приходится! Давай в Скайпе пересечемся?

  24. Владимир

    Давай. uncle.vasia

  25. Владимир

    ой! наоборот слова поставь. вася точка анкл

  26. Аноним

    вот 6 задача правильно или нет
    var
    n,x,a:integer;
    begin
    write(‘номер квартиры -‘)
    readln(n);
    … [Подъезд вычислен правильно. Удалил. Тарас]
    a:=n div 4 mod 9;
    writeln (‘подъезд -‘,x);
    writeln (‘этаж’,a)
    end.

  27. владимир

    Вот какой результат получается от твоей программы. проверял на Pascal.ABC —
    номер квартиры -36
    подъезд — 1
    этаж 0

  28. Аноним

    думаю нашел ошибку.Вот исправленный вариант:
    [Было правильно. Удалил.
    Тарас]

  29. Вольнов

    [Было правильно. Удалил.
    Тарас]

    как альтернативный вариант

  30. Dron

    Я так и не пойму как начать решать 1-е задание

  31. Taras

    Ответом в первом задании является формула: 2*n
    Первое четное число получается при n = 1, второе при n = 2 и т.д.

    Ну, или в виде программы:

      var
        n, x: integer;
      begin
        write('n = '); readln(n);
        x := 2*n;
        writeln(n, '-е четное число: ', x);
      end.

    Но достаточно просто формулы.

  32. Максим

    Тарас проверь задачку 7 ( выбирал по принципу : кажись могу )).
    var
    y: real;

    begin
    write(‘копеек = ‘);
    readln(y);
    writeln(y / 100, ‘ рублей’);
    writeln(y / 10, ‘ гривен’);
    writeln(y / 3, ‘ алтын’);
    write(y * 4, ‘ полушка’);
    end.

  33. Taras

    Правильно, можешь ))

    Как на счет остальных 23-х?

  34. Максим

    На работе всё не успеваю, ))) вот 9 задача

    var
    x, y, n: real;

    begin
    write(‘расстояние до ближайшего столба ‘);
    readln(x);
    write(‘расстояние между столбами ‘);
    readln(y);
    write(‘столб номер ‘);
    readln(n);
    write(y * n + x — y);
    write(‘ метров’);
    end.

  35. Taras

    Верно )
    Для простоты лучше: y * (n − 1) + x

  36. Сергей

    Пожалуйста, объясните 6 не могу понять и все, почему понижаем на один n-0,1 вот не могу понять и все но не такой же я нуб

  37. Taras

    «trunc(n − 0.1)» это просто плохой, запутывающий способ написать «n − 1», то есть просто вычесть единицу. Единицу вычитаем, чтобы перейти к нумерации, начинающейся с нуля.

  38. Сергей

    Все огромное спасибо понял

  39. Сергей

    Добрый день не могу понять как делать 17 если можно помогите

  40. Taras

    По сути, нужно выделить знак числа. Подсказать так, чтобы практически не решить задачу, даже как-то затрудняюсь. Может быть, вы еще подумаете?

  41. Денис

    Здравствуите Тарас.
    подскажи по поводу 3го задания, вот,что я накалякал-не работает
    program niks ;
    var
    n,i,k,s: integer;
    begin
    writeln(‘n= ‘,’i= ‘,’k= ‘ );
    readln(n,i,k);
    if boolean n<i<k then
    writeln('ne vernie parametri');
    else
    s:=(k-i):
    readln (s);
    writeln('s= ', s)
    end.

  42. Денис

    а первую я вот как решил((
    program nm ;
    var
    m: integer;
    begin
    write(‘m= ‘);
    readln(m);
    if m mod 2=0 then
    write(‘m= ‘, m)
    else
    write(‘Oshibka’);
    end.

  43. Taras

    В первой вы делает проверку, является ли m четным, а нужно вывести m-е четное число. Скажем, m = 11. Это не ошибочный ввод, 11-е четное число это 22.

    Чтобы третья вообще запустилась нужно проверку условия записать как:

    if (n < i)and(i < k) then   writeln('ne vernie parametri') else   s:=(k-i);

    Ну, и прочитать следующий раздел про условный оператор.

    Но, вообще-то, я никаких проверок здесь не предполагал. Предлагаю исходить из того, что ввод всегда корректен и невозможных сочетаний параметров там нет. Кстати, требование i < k лишнее. Перечисленные в задании операторы и функции позволяют получить правильный результат независимо от того какой из номеров больше. s:=(k-i) - предполагает, что между 1-м (i = 1) и 2-м (k = 2) стоит еще один человек.

  44. Артем

    Здравствуйте, Тарас, посмотрите 17 пожалуйста. Правильно, нет?
    var
    x:real;
    begin
    write(‘x= ‘);
    readln(x);
    write(‘при х>0: ‘,x+1,’, при х<0: ',-1+x,', при х=0: ',0/x,'.');
    end.

  45. Артем

    по 17 так наверно
    var
    x:real;
    begin
    write(‘x= ‘);
    readln(x);
    write(‘при х>0: ‘,x+1,’, при х<0: ',-1+x,', при х=0: ',x/0,'.');
    end.

  46. Артем

    доброго времени суток, Тарас!!!
    на сколько корректно использовать вместо операции x_div_y операцию trunc(x/y)? дело в том, может я сразу не обратил внимание на div, поэтому решал задачи через trunc и решение выходило. сейчас уперся в решение задачи №17(в момент написания комента)

  47. Taras

    В 17-й надо выводить только одно число, которое может оказаться равно 1 или -1.

    x_div_y и trunc(x/y) дадут один и тот же результат. При этом div работает только с целыми числами, а trunc(x/y) также и с вещественными. div выполняется быстрее (за меньшее число тактов процессора). Если бы ты считал его миллиард раз, то, может быть, даже заметил разницу.

    В общем, если заранее знаешь, что числа целые, то div предпочтительнее.

  48. Артем

    то есть выходит что решением 16-й задачи является просто замена x_div_y на trunc(x/y)???!

  49. Артем

    *ошибся 15-й

  50. Артем

    17-я
    program dd_2;
    var
    x:real;
    begin
    write (‘chislo x ‘);
    readln (x);
    writeln (abs(x)/x);
    end.
    условие 0 не выполняется, пишет NaN

  51. Артем

    решение 18-й?
    program bb_3;
    var
    x,y:integer;
    begin
    write (‘pervoe ‘);
    readln (x);
    write (‘vtoroe ‘);
    readln (y);
    write (round((x mod y)/((x mod y)+0.1)));
    end.

Добавить комментарий