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

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

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. Аноним

    Сколько голову не ломал, никак не могу понять какой алгоритм действий в 6-й задаче… Как сделать чтобы показывал правильно подъезд и этаж и для 1-й и для 2892 квартиры

  2. Аноним

    writeln(‘подъезд’, ((x div 36)+1)) (но не подходит в тех случаях, когда х делится на 36 нацело

  3. Аноним

    Та же проблема, лол

  4. Аноним

    Таки справился.

  5. Аноним

    Можно хотя бы намёк, как найти подъезд ?) Чтобы подходило для любого номера квартиры

  6. Никита

    Народ, обьясните пожалуйста тугодуму, как написать программу к 1 и 2 задаче?

  7. Taras

    В принципе, в этих заданиях программу писать не надо. Просто составляешь выражение и все. Но если очень хочешь, то как-то так:

    var
      n, x: integer;
    begin
      readln(n);
      x := ... {Составленное тобой выражение};
      writeln('Ответ: ', x);
    end.
    
  8. Максим

    Кстати к разговору о «7» и «8». Не знаю, то ли я программу не правильно составил, то ли это она и есть это роковая компьютерная ошибка, но в задаче №13, если вводишь любое число, на конце которого будет сначало 7, а потом 8, (….78), при этом не имеет значения столько цифр было до, то последная цифра показывает «7». со всеми другими вариантами, такого бага нет. Все работает. Моя ли в этом ошибка, или все-таки этой двойчной системы?

  9. Taras

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

  10. Максим

    Тогда посмотрите, где ошибка:

    var
      x: integer;
      q: real;
    begin
      writeln('х=: '); 
      readln(x);
      q:=x/10;
      writeln('последняя цифра: ', trunc((q-trunc(q))*10));
    end.
    
  11. Максим

    вопрос отпал. Упрастил решение.

    <Стер>

    но ради интереса, все равно любопытно, в чем же была ошибка?

  12. Taras

    Тут действительно, x/10 — вещественное число, которое не может быть точно представлено конечной двоичной дробью и на самом деле (q-trunc(q))*10 дает не точное целое число, а что-то чуть меньшее или большее. Дальше отбрасывающий дробную часть trunc и ошибка (если результат был чуть меньше целого) вырастает до единицы. Выход в том, чтобы либо вообще убрать внешний trunc, либо заменить его на round.

    Само собой твое второе решение предпочтительней.

  13. Kevlarik

    Тарас подскажи пожалуйста в задании №3 для чего дано общее количество в очереди если можно k-i-1= между ними, я просто врубится не могу. Заранее благодарен.

  14. Taras

    Вообще-то, ни для чего. Оно, действительно, не нужно ))

    PS. Если быть совсем точным, то между ними abs(k-i)-1, потому что не известно, что больше i или k.

  15. Аноним

    var c,b,n:integer;
    begin
    write(‘номер квартиры ‘);
    readln(n);
    b:=((trunc(n-0.1) div 36)+1);
    writeln(b ,’ подъезд’);
    c:=((trunc(n-0.1) div 4)+1);
    if c>9 then
    begin
    c:=c mod 9;
    end
    else
    c:=((trunc(n-0.1) div 4)+1);
    writeln(c,’ этаж ‘);

    end.

    Ввожу номер квартиры всё работает вроде бы, пока не ввёл 1150. И показывать начал этаж 0. Хотя во всём остальном ошибок не было. Почему ?

  16. Аноним

    if c>9 then
    begin
    c:=(trunc(c-0.1) mod 9)+1;
    end
    Если заменить вот на это, будет правильно ?

  17. Taras

    Правильно.

    Хотя решение можно немного упростить: trunc(n-0.1) выглядит ненужным усложнением. Ведь в итоге это очень простая операция, только записанная не очевидным способом.

  18. Артур

    Тарас Викторович, подскажите, пожалуйста.
    Вот я написал «программу» к третьему заданию. У меня вопрос не к самой задачи, а в общем. Вот код

    Program tretie_zadanie;
    var
      n,i,k,x: integer;   //целый тип переменных.
    begin
      writeln('Программа покажет сколько стоит человек в очереди между некоторыми людьми,впиши-те 
         количество человек"n", стоящих в очереди, затем любого человека ближе к началу очереди "i" 
         и человека ближе к концу очереди "k"');   // Выв.текс.на экр.и пер.стр
      write('введите количество человек в очереди  n = ');   //вывод текста на экран.
      readln(n);   //ввод количества человек и перенос курсора на след. строку.
      write('введите номер человека, перед которым стоят люди i = ');   //вывод на экран текста.
      readln(i);   //ввод номера человека, перед которым стоит народ и перенос курсора на след. строку.
      write('Введите номер человека, за которым стоят люди k = ');   //вывод текста на экран
      readln(k);   //ввод номера человека, за которым стоит народ и перенос курсора на след. строку.
      x:=k-i-1;    //выражение для вычисления количества человек перед определенными лицами
      writeln(x, ' человек стоит между введенными Вами людьми');   //вывод ответа и текста на экран и перенос курсора на след. строку.
      write('нажмите enter для завершения программы');   //вывод текста на экран
      readln;   //ожидание нажатия клавиши enter, после чего произойдет завершение программы.
    end.
    

    У меня вот первый writeln много текста, и коммментарий вконце пришлось сокращать т.к. уже не вмещалось.. Как сделать чтобы можно было написать больше? делать несколько команд write или есть метод по-проще? И еще, строчка получается длинная, и неудобно постоянно двигать ползунок в компилляторе, если нажму интер на последнем слове возле границы окна компиллятора, след. слова пойдут на вторую строку, но тогда компиллятор не компилирует… Еще один вопрос, запускаю от компилированный файл, запускается программа, всё работает, но окно программы всегда одного размера, и хотелось бы его сделать по-больше, можно как-то задать размер окна программы?

  19. Taras

    Закрывай кавычки, когда переносишь выводимый текст на следующую строку:

      writeln('Программа покажет сколько стоит человек в очереди между '
        'некоторыми людьми,впиши-те количество человек"n", стоящих в '
        'очереди, затем любого человека ближе к началу очереди "i" и '
        'человека ближе к концу очереди "k"');   // Выв.текс.на экр.и пер.стр
    

    На счет изменения размера окна — free pascal под рукой нет, так что проверить не могу, но попробуй:

    fpSystem('mode con cols=126 lines=59');
    

    Вместо 126 и 59 — желаемой количество столбцов и строк.

    А лучше всего не парься и пиши короче ))

  20. Артур

    Спасибо)) перенос строки сработал, но надо еще запятые после каждой закрытой кавычки поставить.

    А с размером окна странности у меня творятся. Команда не сработала, но я нашел как его изменить в настройках компилятора, и тут опять проблема… В окне компилятора, вверху, на полоске возле кнопок закрыть, свернуть, развернуть(не помню как правильно она называется) жму правой кнопкой мыши и нажимаю умолчания, в закладке расположения есть «размер буфера окна» и «размер окна», меняю размеры, и откомпилированный программы запускаются в новом размере окна, НО с этим размером открываются и программы, давно откомпилированные…. тогда получается размер окна где-то в системе заложен? И ведь он вероятно на каждой системе может быть разным… А как же тогда отлаживать программу, я все напишу под один размер окна (перенос строк в нужных местах и тп.), а открыв программу на другом компе, и там если будет другой размер по умолчанию, то тогда все перекосится…. Значит надо принудительно задать размер этого окна… Но как.. в инете пробовал поискать и не нашел..

  21. Taras

    Размер окна консольного приложения действительно задается операционной системой. Похоже, простого способа программно менять его нет.

  22. Артур

    Здравствуйте, у меня с каждым заданием возникает мелочный вопрос, все работает, НО некоторые нюансы не дают покоя.. если не составит особого труда, подскажите. Вот код программы к заданию 4:
    Program chetvertoe_zadanie;

    var
    a,b,d,x: integer;
    c: real;

    const
    e=(‘ — Нечетное число в Вашем отрезке’);
    f=(‘ — Нечетных числа в Вашем отрезке’);
    g=(‘ — Нечетных чисел в Вашем отрезке’);

    begin
    writeln(‘Программа посчитает сколько находится нечетных чисел в отрезке (a,b)’);
    writeln(‘Если «a» и «b» четные числа введите «1», если «a» и «b» нечетные введите «2», если «a» четное и «b» нечетное введите «3»‘);
    readln(x); //Ожидание ввода вариантов расчета чисел.

    if x=1 then
    begin
    write(‘a = ‘);
    readln(a);
    write(‘b = ‘);
    readln(b);
    c:=(b-a-1)/2;
    d:=trunc(c+1);
    write(d);
    if d=1 then
    writeln(e);
    if d=2 then
    writeln(f);
    if d=3 then
    writeln(f);
    if d=4 then
    writeln(f);
    if d>4 then
    writeln(g)
    end;

    if x=2 then
    begin
    write(‘a = ‘);
    readln(a);
    write(‘b = ‘);
    readln(b);
    c:=(b-a-1)/2;
    d:=trunc(c);
    write(d);
    if d=1 then
    writeln(e);
    if d=2 then
    writeln(f);
    if d=3 then
    writeln(f);
    if d=4 then
    writeln(f);
    if d>4 then
    writeln(g)
    end;

    if x=3 then
    begin
    write(‘a = ‘);
    readln(a);
    write(‘b = ‘);
    readln(b);
    c:=(b-a-1)/2;
    d:=trunc(c);
    write(d);
    if d=1 then
    writeln(e);
    if d=2 then
    writeln(f);
    if d=3 then
    writeln(f);
    if d=4 then
    writeln(f);
    if d>4 then
    writeln(g)
    end;

    if x>3 then
    writeln(‘Вы ввели не верные данные’);

    writeln(‘Нажмите enter для завершения’);
    readln
    end.

    можно ли как-то сделать двойное условие?
    чтобы не писать
    if d=2 then
    writeln(f);
    if d=3 then
    writeln(f);
    if d=4 then

    а, например, что-то типа
    if 1<d<5 then
    writeln(f);

    но так не работает…
    это мне тут 3 условия всего, а если бы с десяток! не писать же столько условий! должен быть метод по-проще, но какой??

  23. Taras

    Составные условия можно делать с помощью логических операторов. То есть, например так:

      if (d > 1)and(d < 5) then
        ...
    

    Или поместив один if внутрь другого:

      if d > 1 then
        if d < 5 then
          ...
    

    Маленькое замечание по сути задания. Ты сначала делишь, а потом берешь целую часть. Можно сразу воспользоваться оператором "div", дающим целую часть от деления:

      d := (b-a-1) div 2 + 1;
    

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

      d := (abs(b-a)-1) div 2 + 1;
    

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

  24. Артур

    Спасибо большое за ответ, очень полезные замечания. А почему, если переменная вещественного типа, например С, и потом после разных действий я хочу вывести на экран значение этой переменной, появляется значение, например, 2.00000000000000Е+000, я нашел выход из этой ситуации только введя новую переменную целового типа, например d, и сделать функцию d:=trunc(c); writeln(d), тогда как и нужно появляется просто 2… есть еще какие способы?

    а насчет окончаний я что-то ничего не придумал толкового, писать условия на каждый десяток не выход…

    достал я уже наверное своими вопросами..))

  25. Taras

    Если хочешь обрубить длинный десятичный «хвост» вещественного числа, можно во WriteLn указывать после переменой общее количество выводимых цифр и количество цифр дробной части. Например:

      writeln(d:3:2); 
    

    выведет не больше 3-х значащих цифр всего и не больше 2-х цифр в дробной части.

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


    >> а насчет окончаний я что-то ничего не придумал толкового, писать условия на каждый десяток не выход…

    Все-таки должна быть общая закономерность.

  26. Артур

    Посмотрел, что ребятам по поводу задачи 6 так и нет ответа. Сам сегодня часа 4 бился над пару моментами и.. вот что получилось)))

    Program Shestoe_zadanie;   // Имя программы.
    Var
      n, x, y, z, m: integer;   // n - квартира, x - подъезд, y - этаж, z - дополнительная переменная для вычисления номера подъезда, m - дополнительная переменная для вычисления номера квартиры.
    Begin
      writeln('Программа покажет в каком подъезде и на каком этаже находится интересующая Вас  квартира, с учетом того, что в доме 9 этажей и на каждом этаже по 4 квартиры.');   // Вывод текста.
      writeln('Введите номер квартиры и нажмите "enter"');   // Вывод текста.
      write('Квартира № ');
      readln(n);   // Ввод номера квартиры.
                                      //ПОДЪЕЗД
      z:=n div 36;   // Выражение, с помощью которого вычисляется доп.переменная "z", для правильного поиска подъезда при вводе номера последней квартиры каждого из подъездов.
      if n=36*z then   // Если введенный номер квартиры после вычисления "z" будет соответствовать данному выражению, то номер подъезда будет вычисляться по выражению ниже.
      x:=n div 36
      else   // Иначе, номер подъезда вычисляется по выражению ниже.
      x:=n div 36+1;
      write('Подъезд № ');
      writeln(x);   // Вывод номера подъезда на экран.
                                      //ЭТАЖ
      m:=n div 4;   // Выражение, с помощью которого вычисляется доп.переменная "m", для правильного поиска этажа при вводе номера последней квартиры каждого из этажей.
      if n=4*m then   // Если введенный номер квартиры после вычисления "m" будет соответствовать данному выражению, то номер подъезда будет вычисляться по выражению ниже.
      y:=n div 4
      else   // Иначе, номер этажа вычисляется по выражению ниже.
      y:=n div 4 + 1;
      if y>9 then   // Если после расчетов, изложенных выше, получается этаж от 10-го и выше, выполняется выражение ниже.
      y:=y-9*(x-1);
      write('Этаж № ');   // Вывод текста на экран.
      writeln(y);   // Вывод на экран номера этажа.
      writeln('Нажмите "enter" для завершения программы');   // Вывод текста на экран.
      readln   // Ожидание нажатия клавиши enter.
    end.
  27. Артур

    блин… пробелы все сместились… в компиляторе все было красивее…

  28. Taras

    Пробелы вернул ))

    Мелкие замечания:
    1) Можно избежать повторных вычислений «n div 36»:

      z:=n div 36;   
      if n=36*z then   
        x:=z
      else   
        x:=z+1;
    

    Или даже не вводить дополнительную переменную и тогда сократить программу до

      z:=n div 36;   
      if n<>36*z then   // Если не делится на 36
        x:=x+1;
    

    2) Проверка условия в

      if y>9 then   // Если после расчетов, изложенных выше, получается этаж от 10-го и выше, выполняется выражение ниже.
        y:=y-9*(x-1);
    

    лишняя. Если этаж ниже 10-го, то это 1-й подъезд и x-1 равно 0.

    Ну, и, в принципе, существует простое решение без if’ов. n div 36 + 1 дает дает почти всегда правильный результат. Но иногда врет. Ты предусматриваешь эту ситуацию if’ом. Можно подумать, как поправить выражение, чтобы оно давало правильный результат всегда.

  29. Артур

    Спасибо за замечания и ответ. Кстати, насчет второго я не согласен немного. Вы говорите если первый подъезд, и этаж ниже десятого, то получится ноль. Ноль не получится ! )) я же сделал условие, чтобы данная формула сработала только от 10-го и выше.Во втором подъезде с каждого этажа отнимется 9, в третьем 18 и тд. Я пробовал вводить квартиры последнюю на этаже, последнюю в подъезде, первую, вроде показывает все правильно.
    Я еще совсем новичок, и задания на этой странице мои самые первые программы, так что без недочетов никак. . .

  30. Артур

    Не подскажите, а в 7 задании нужно чтобы отдельно вычислилось рубли полушки и тд. например 100копеек это 1 рубль, 10 гривен, 400 полушек . . .
    или же чтобы точно показал, например, 101 копейка это 1рубль и 4 полушки.

  31. Taras

    Я говорил, не про то, что у тебя что-то неправильно, а что if просто не нужен. Формула

      y:=y-9*(x-1);

    будет работать, даже если этаж меньше или равен 9.

    >>Я еще совсем новичок, и задания на этой странице мои самые первые программы, так что без недочетов никак. . .
    Да, все нормально ))

    >>Не подскажите, а в 7 задании…
    Первый вариант.

  32. Артур

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

    Тарас Викторович… пожалуйста, помогите! Я решил догадаться как же все-таки составить программу, чтобы при вводе числа она правильно показывала окончания. Сделал на примере годов, 1 год, 5 лет и тп.
    все заработало НО, как же сделать, чтобы слово появлялось после введения цифры РЯДОМ, а не на след. строке… Сейчас покажу просто пример, саму программу писать не буду т.к. еще надо упрощать.

    Program Sklonenie_let;
    Const
    a=(‘год’);
    b=(‘года’);
    c=(‘лет’);
    Var
    d: integer
    Begin
    read(d); // ввод числа, и я написал read а не readln, чтобы курсор не уходил на след. строку.
    writeln(a); // вывод константы
    readln // ОЖИДАНИЕ НАЖАТИЯ enter.
    end.

    и вот.. стоит только ввести число и нажать интер, так выводится константа НА СЛЕД. СТРОКЕ и сразу программа закрывается… Добавляю еще один readln вконце, программа ждет тогда закрытия.. но вывод константы на след. строке. . . Как же его сделать рядом с введенным числом…?? Обидно на такой ерунде стопориться…

  33. Taras

    Артур, лучшие умы человечества много лет бились над этой загадкой )) Однако, по-видимому, консольный режим просто не предназначен для таких красивостей. Идеология консольного режима это диалог с программой, где каждая строка это либо ввод пользователя, либо сообщение программы. Даже если программа ничего в ответ не сообщает, переход на новую строку говорит, что ввод произошел успешно.

    С твоими запросами надо быстрее переходить к написанию программ с графическим интерфейсом. Там ты сможешь размещать ввод/вывод, где угодно, и как хочешь его форматировать.

  34. Артур

    вот емае… а я пол дня бился, думал я что-то не так делаю… Спасибо)))

  35. Артур

    Здравствуйте. Решал я вот 7 задание, что-то код получился дуже большой..но сокращать ВРОДЕ уже некуда, если не затрудните посмотрите:
    Program sedmoe_zadanie;
    Var
    A, f1, f2, f3, f4, g1, g2, g3, g4, h1, h2, h3, h4, h5, h6, h7, j1, j2, j3, j4, j5, j6, j7: integer;
    Const
    a1=(‘Рубль’);
    a2=(‘Рубля’);
    a3=(‘Рублей’);
    b1=(‘Гривна’);
    b2=(‘Гривны’);
    b3=(‘Гривен’);
    c1=(‘Алтын’);
    c2=(‘Алтына’);
    c3=(‘Алтынов’);
    d1=(‘Полушка’);
    d2=(‘Полушки’);
    d3=(‘Полушек’);
    e1=(‘Копейка’);
    e2=(‘Копейки’);
    e3=(‘Копеек’);

    Begin
    writeln(‘Программа посчитает сколько рублей, гривен, алтын и полушек в введенных Вами копейках, учитывая, что 1р.=100коп, 1грн.=10коп, 1алт=3коп, 1полушка=0,25коп.’);
    write(‘Копеек = ‘);
    readln(A);
    writeln;
    // РУБЛИ
    f1:=trunc(A/100); // Целых рублей.

    h1:=round(frac(f1/100)*100);
    j1:=round(frac(f1/10)*10);

    write(f1,’ ‘);
    if (h1>10) and (h11) and (j110) and (h21) and (j210) and (h31) and (j310) and (h41) and (j410) and (h51) and (j510) and (h61) and (j610) and (h71) and (j7<5) then
    writeln(d2)
    else
    writeln(d3);
    writeln;
    write('Нажмите "enter" для завершения программы.');
    readln
    end.

    кстати, еще хотел спросить, ввести количество копеек получается не более 8191, я так понял, это из-за того что количество полушек превысит 32767, я думал ограничения целого типа распространяются только на ввод, а оказывается и на вывод… Можно ли что-то сделать, чтобы можно было ввести более 8191?

  36. Артур

    емае… а код не весь поместился, начало и конец почему-то, снова написать или вы должны сами поправить?

  37. Артур

    а с 8-ым заданием я что-то вообще не пойму что делать… (((
    В секунду стрелка делает «w» оборотов, если даже предположить, что это один оборот… Сколько бы секунд не задать (как просится в вопросе) будут целые обороты, и о каком же угле тогда идет речь, если в любую секунду стрелка будет в начальном положении… Что я не так понимаю?

  38. Taras

    >> а код не весь поместился

    Попробуй написать еще раз. Есть версия, что это из-за знаков «<«. В качестве временного решения попробуй заменить их на &lt;

    По тому куску, что вставился, могу сказать следующее:

    1) Хранить слова в константах — не очень хорошая идея. Я читаю программу, вижу writeln(d2) и вынужден лезть в таблицу, чтобы понять, что это значит. Было бы гораздо проще, если без затей было написано writeln(‘Полушки’). Удобочитаемость — это очень важное качество программы.

    2) «trunc(A/100)» снова хочется заменить на «A div 100», а выделение последних цифр числа на «f1 mod 100» и «f1 mod 10».

    Чтобы работать с большими целыми можно вместо integer использовать longint (до 231-1 = 2147483647) или int64 (до 263-1 = 9223372036854775807).

    >> а с 8-ым заданием я что-то вообще не пойму что делать… (((

    Считай, что w и t не целые.

  39. Артур

    Спасибо! Я всё забываю о операторах div и mod, эт ж блин надо было все так усложнять, для правильного окончания вычислял последнюю цифру j1:=round(frac(f1/10)*10); а можно всего лишь j1:=f1 mod 10 . . . И константы убрал, чего-то думал с ними проще в данном случае будет, но сейчас вижу обратное. счас еще раз попробую написать код. Если каряво будет, удалите, чтоб не хламить комментарии.

  40. Артур

    Program sedmoe_zadanie;
    Var
    h1, h2, h3, h4, h5, h6, h7, j1, j2, j3, j4, j5, j6, j7: integer;
    A, f1, f2, f3, f4, g1, g2, g3: int64;

    Begin
    writeln(‘Программа посчитает сколько рублей, гривен, алтын и полушек в введенных Вами копейках, учитывая, что 1р.=100коп, 1грн.=10коп, 1алт=3коп, 1полушка=0,25коп.’);
    write(‘Копеек = ‘);
    readln(A);
    writeln;
    // РУБЛИ
    f1:=A div 100; // Целых рублей.

    h1:=f1 mod 100;
    j1:=f1 mod 10;

    write(f1,’ ‘);
    if (h1>10) and (h11) and (j110) and (h21) and (j210) and (h31) and (j310) and (h41) and (j410) and (h51) and (j510) and (h61) and (j610) and (h71) and (j7<5) then
    writeln('Полушки')
    else
    writeln('Полушек');
    writeln;
    write('Нажмите "enter" для завершения программы.');
    readln
    end.

  41. Артур

    Program sedmoe_zadanie;
    Var
    h1, h2, h3, h4, h5, h6, h7, j1, j2, j3, j4, j5, j6, j7: integer;
    A, f1, f2, f3, f4, g1, g2, g3: int64;

    Begin
    writeln(‘Программа посчитает сколько рублей, гривен, алтын и полушек в введенных Вами копейках, учитывая, что 1р.=100коп, 1грн.=10коп, 1алт=3коп, 1полушка=0,25коп.’);
    write(‘Копеек = ‘);
    readln(A);
    writeln;
    // РУБЛИ
    f1:=A div 100; // Целых рублей.

    h1:=f1 mod 100;
    j1:=f1 mod 10;

    write(f1,’ ‘);
    if (h1<10) and (h1&rt15) then
    write(‘Рублей’)
    else
    if j1=1 then
    write(‘Рубль’)
    else
    if (j1<1) and (j1&rt;5) then
    write(‘Рубля’)
    else
    write(‘Рублей’);

    //копейки
    g1:=A-(f1*100); // Остаток копеек
    h2:=g1 mod 100;
    j2:=g1 mod 10;
    if g1=0 then
    write(‘ ‘)
    else
    write(‘ и ‘, g1, ‘ ‘);
    if (h2&lt10) and (h2&rt15) then
    writeln(‘Копеек’)
    else
    if j2=1 then
    writeln(‘Копейка’)
    else
    if (j2<1) and (j2&rt;5) then
    writeln(‘Копейки’)
    else
    if g1=0 then
    writeln(‘ ‘)
    else
    writeln(‘Копеек’);
    writeln;
    // ГРИВНЫ
    f2:=A div 10; // Целых гривен.

    h3:=f2 mod 100;
    j3:=f2 mod 10;

    write(f2,’ ‘);
    if (h3<10) and (h3&rt;15) then
    write(‘Гривен’)
    else
    if j3=1 then
    write(‘Гривна’)
    else
    if (j3<1) and (j3&rt;5) then
    write(‘Гривны’)
    else
    write(‘Гривен’);
    // копейки
    g2:=A-(f2*10); // Остаток копеек

    h4:=g2 mod 100;
    j4:=g2 mod 10;

    if g2=0 then
    write(‘ ‘)
    else
    write(‘ и ‘, g2, ‘ ‘);
    if (h4<10) and (h4&rt;15) then
    writeln(‘Копеек’)
    else
    if j4=1 then
    writeln(‘Копейка’)
    else
    if (j4<1) and (j4&rt;5) then
    writeln(‘Копейки’)
    else
    if g2=0 then
    writeln(‘ ‘)
    else
    writeln(‘Копеек’);
    writeln;
    // АЛТЫНЫ
    f3:=A div 3; // Целых алтын.

    h5:=f3 mod 100;
    j5:=f3 mod 10;

    write(f3,’ ‘);
    if (h5&lt10) and (h5&rt15) then
    write(‘Алтынов’)
    else
    if j5=1 then
    write(‘Алтын’)
    else
    if (j5<1) and (j5&rt;5) then
    write(‘Алтына’)
    else
    write(‘Алтынов’);
    // копейки
    g3:=A-(f3*3); // Остаток копеек

    h6:=g3 mod 100;
    j6:=g3 mod 10;

    if g3=0 then
    write(‘ ‘)
    else
    write(‘ и ‘, g3, ‘ ‘);
    if (h6&lt10) and (h6&rt15) then
    writeln(‘Копеек’)
    else
    if j6=1 then
    writeln(‘Копейка’)
    else
    if (j6<1) and (j6&rt;5) then
    writeln(‘Копейки’)
    else
    if g3=0 then
    writeln(‘ ‘)
    else
    writeln(‘Копеек’);
    writeln;
    // ПОЛУШКИ
    f4:=A*4; // Целых полушек.
    h7:=f4 mod 100;
    j7:=f4 mod 10;
    write(f4, ‘ ‘);
    if (h7<10) and (h7&rt;15) then
    writeln(‘Полушек’)
    else
    if (j7<1) and (j7&rt;5) then
    writeln(‘Полушки’)
    else
    writeln(‘Полушек’);
    writeln;
    write(‘Нажмите «enter» для завершения программы.’);
    readln
    end.

  42. Артур

    вот, знаки больше/меньше заменил и вроде ничего не отрезалось. заменил вот так > — &lt < — &rt.
    А чего эти знаки помешали вдруг? Выше я уже писал коды других програм с использованием отношений и все без проблем было…

  43. Аноним

    program otchet;
    var
    n :integer;
    begin
    write(‘ n =,’);
    readln(n);
    writeln (‘summa = ‘, n+2);
    end.
    ошибки или правильное составление формулы плиз!:)

  44. Аноним

    проблемы составление программы у меня возникают когда пишу формулу!:)
    на каждое задание брать состовлять формулы из аналогичных которые в математике!?:)

  45. Артур

    Аноним, у тебя из-за апострофа — ‘ — ошибка,нажимай его на клавише с русской букве «э», в твоей программе просто к введенному числу должно прибавиться 2? тогда все правильно и формулы никакие не нужны. Вконце только добавь оператор readln, чтоб программа ожидала нажатия клавиши ентер

    Program otchet;
    var
    n:integer;
    begin
    write(‘ n = ‘);
    readln(n);
    writeln (‘summa =’, n+2);
    readln
    end.

  46. Артур

    а насчет формул… почти в каждой задаче, конечно, нужно составлять выражения))

  47. Алексей

    что-то я не пойму.Почему многие решают через if и т.д.? Подразумевается ведь, что мы ещё не знаем логических выражений и условных операторов. И решать задачи нужно без них.
    Вот моё решение 6 задания. Не подскажите, может номер этажа можно как-то попроще вычислить?
    program zad6;
    var
    n,y,x: integer;
    begin
    write(‘Введите номер квартиры n = ‘);
    readln(n);
    x :=trunc((n-(36*((trunc((n-1)/36)+1)-1))-1)/4)+1;
    writeln(‘номер этажа х = ‘, x);
    y := 1+trunc((n-1)/36) ;
    writeln(‘номер подъезда y = ‘, y);
    end.

  48. Артур

    Алексей, у меня тоже такая мысль была, по поводу условного оператора, но 6 задачу я никак иначе решение не мог придумать, удивил ты меня даже))) а упростить можно, я думаю, если избавиться от функции trunc и сразу делить нацело оператором div, вот так

    program zad6;
    var
    n,y,x: integer;
    begin
    write(‘Введите номер квартиры n = ‘);
    readln(n);
    x :=(n-(36*(((n-1) div 36 +1)-1))-1) div 4+1;
    writeln(‘номер этажа х = ‘, x);
    y := 1+((n-1) div 36) ;
    writeln(‘номер подъезда y = ‘, y);
    readln
    end.

    я сначала аж запутался в скобках твоих, но выражение круто придумал, я до такого не догадался…

  49. Алексей

    Артур, спасибо). Со скобками я и сам запутался.Пока на листике не написал и не перенёс в программу. Плохо, что нельзя писать скобки разных размеров)). Да, и чтобы не так много скобок было, можно сделать так:
    program zad6;
    var
    n,y,x: integer;
    begin
    write(‘Введите номер квартиры n = ‘);
    readln(n);
    y := 1+((n-1) div 36) ;
    writeln(‘номер подъезда y = ‘, y);
    x :=(n-(36*(y-1))-1) div 4+1;
    writeln(‘номер этажа х = ‘, x);
    readln
    end.

  50. Артур

    не за что, Алексей, а со скобками знаешь как можно, чтоб не запутаться. в word 2007 (в 2010 может тоже можно, но я не пользовался им) жмешь вкладку вставка и нажимаешь формула, появляется окошечко куда пишешь выражение, и он меняет размер скобок, чем глубже выражение тем размер скобки меньше, а крайние увеличиваются))))

  51. Алексей

    а как решить 17 задачку без ifов?

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