Персональная страничка
| ||
Предыдущий раздел:
Следующий раздел:
Хотя для наглядности речь в задачах может идти о столбах, шагах или распиливания бревна, полностью аналогичные задачи программистам приходится решать на каждом шагу (при работе с массивами, при вычислении количества шагов в циклах и т.д.) Все выражения, которые вам требуется составить, взяты из реальной программистской практики.
Прорешать данные задачи также полезно в связи с тем, что многие не умеют решать задачи в общем виде, когда вместо конкретных чисел используются буквенные обозначения. Кроме того, большинство выпускников обычных школ плохо представляют себе, что значит думать над задачей. Они могут прилежно заучить правила написания и смысл операторов языка, но когда надо изобрести способ решить задачу с их помощью, не понимают, что же им делать.
В данном случае мы имеем дело с простейшей ситуацией – по сути, требуется придумать программу, состоящую из одной строки. Набор операций дан, требуется их скомбинировать так, чтобы получился требуемый результат. Решение данных задач позволит выработать правильный подход и настрой для работы в ситуации когда «неизвестно что делать».
Используя арифметические операторы (+, -, *, /, 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;
Следующий раздел:
Предыдущий раздел:
div — целая часть от деления
mod — остаток
Например,
writeln(x div 3600,’час’,x div 60,’мин’); — это мое решение,но после х = 3600 она работает неверно.Как изменить — не знаю пока.Личное.А вы,Тарас,турист и шахматист,оказывается — меня эта тематика очень интересует.Где можем пообщаться?
[Было правильно. Удалил.
Тарас]
По почте можно пообщаться: tvdikanev@yandex.ru
Лично, пока затруднительно — сильно занят.
Да понял, что занят, не отвечали долго, значит времени нет. А что с 5 задачей — так и не знаю, не доходит правильный вариант. Там, видимо с if»ами надо работать!?!?!?
Нет, с if’ами здесь нигде не надо. В 5-й у тебя не получается, когда в x больше одного полного часа. Ну так надо преобразовать x, чтобы привести его к значению, когда у тебя все работает.
Здравствуйте,Тарас.Хотел вам(или тебе!?, я 1976г.) в почту написать, а вылезает Outlook 2003 надо настраивать. Зачем и почему это? Другим ведь пишу! Не подскажите? А 5-ю так и не решил,или до часа выходит правильно,или после — может намек какой в нужном направлении???
«Тебе», нормально.
Outlook — это при нажатии на ссылку? Значит он — почта по умолчанию. Вылезает — и ладно, можно закрыть и писать, как привыкли.
По 5-й. В некотором смысле твое решение правильно. Полных минут в x секундах действительно x div 60. Но если хочется, чтобы число минут показывалось меньше 60-ти, надо избавиться от всех полных часов иксе. Оставить только часть меньше часа.
Неужели чудо свершилось — я ее решил. writeln(x div 3600,’час’,(x-(x div 3600)*3600) div 60,’мин’);
Удалите,просто не мог не прислать — все работает!!!Хоть больше часа,хоть меньше.
Здравствуй, Тарас. Написал программку к 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.
Здравствуй, Тарас. Считаю,что улучшил программку,по крайней мере для целых чисел.
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.
Прошу оценки и комментария.)
к шестой. вопрос: как можно упростить последнее выражение?
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,’ этаж.’);
Сколько нечетных чисел на отрезке (a, b)….
Числа а и b учитываются?? Я правильно понимаю? ведь они лежат в области отрезка как начальная и конечная точка.
тогда выходит так:
n:= k mod 2;
x:= (k-i) div 2 + n;
Прошу подтвердить и удалить или поправить.
Вы хотите одной программой все три решения написать, Владимир?
ну если учитывать что a и b (я заменил их на i и k) лежат в области отрезка как начальная и конечная точка, тогда можно решить одним уравнением. Или я не прав?
Давай работать вместе, Владимир? Поможем друг другу, если что. У меня ума не хватило одной программой все сделать. А вы ее испытывали? Я лично на 3-и варианта три программки написал. А a и b принадлежат отрезку, это правильно.
Согласен работать вместе. Изначально я тоже написал три разных, а потом почитав комментарии, наткнулся на обьяснения Тараса с возможным решением в две разные. Тогда потестил и вышло в один.
Я тестил ее до 20. По идее должно работать и выше. Алгоритм ведь простой. Вот с квартирами были проблемы на переходах с 9 на 1 этаж следующего, но в итоге разрешил. Потратил около трех часов на 6 задачу.
Я особо не силен в программировании. Всегда хотел научится. Вот терь после работы тренируюсь. Хочу потом на С++ перейти. А переходить нужно от простого к сложному.
Я так вижу, что мы тут последние два ученика ))
Помогу чем смогу.
Я тоже совсем не силен, пробовал в LibertyBasic, но бросил, практически впервые начал копаться в этом, а раньше и поступать пробовал на «вычислительные машины, комплексы,системы и сети», но неудачно. Сейчас что решаешь? Давай в Одноклассниках пересечемся, а то я смотрю, сайт мало посещают и Тараса нет последнее время, спросить не у кого, если трудности будут.
Да. Тараса нет, и пусто здесь.
Я не имею акка на Однокласниках. И Вконтактах тоже. Считаю то пустой тратой времени. Может оттого, что много сидел там когда то? Сейчас в нахожусь в Англии. Пробую заработать деньги, а когда свободное время, захожу сюда учиться. Тоже когда то хотел стать программистом, но на учебу не было денег. Вот решился как то сам.
Эх.. Так и не смог решить 8 без подглядки (((
А Скайп есть? Я тоже решился сам, по крайней мере пока. Я ей еще не занимался даже. Вроде и не очень сложные задачки, а подумать приходится! Давай в Скайпе пересечемся?
Давай. uncle.vasia
ой! наоборот слова поставь. вася точка анкл
вот 6 задача правильно или нет
var
n,x,a:integer;
begin
write(‘номер квартиры -‘)
readln(n);
… [Подъезд вычислен правильно. Удалил. Тарас]
a:=n div 4 mod 9;
writeln (‘подъезд -‘,x);
writeln (‘этаж’,a)
end.
Вот какой результат получается от твоей программы. проверял на Pascal.ABC —
номер квартиры -36
подъезд — 1
этаж 0
думаю нашел ошибку.Вот исправленный вариант:
[Было правильно. Удалил.
Тарас]
[Было правильно. Удалил.
Тарас]
как альтернативный вариант
Я так и не пойму как начать решать 1-е задание
Ответом в первом задании является формула: 2*n
Первое четное число получается при n = 1, второе при n = 2 и т.д.
Ну, или в виде программы:
Но достаточно просто формулы.
Тарас проверь задачку 7 ( выбирал по принципу : кажись могу )).
var
y: real;
begin
write(‘копеек = ‘);
readln(y);
writeln(y / 100, ‘ рублей’);
writeln(y / 10, ‘ гривен’);
writeln(y / 3, ‘ алтын’);
write(y * 4, ‘ полушка’);
end.
Правильно, можешь ))
Как на счет остальных 23-х?
На работе всё не успеваю, ))) вот 9 задача
var
x, y, n: real;
begin
write(‘расстояние до ближайшего столба ‘);
readln(x);
write(‘расстояние между столбами ‘);
readln(y);
write(‘столб номер ‘);
readln(n);
write(y * n + x — y);
write(‘ метров’);
end.
Верно )
Для простоты лучше: y * (n − 1) + x
Пожалуйста, объясните 6 не могу понять и все, почему понижаем на один n-0,1 вот не могу понять и все но не такой же я нуб
«trunc(n − 0.1)» это просто плохой, запутывающий способ написать «n − 1», то есть просто вычесть единицу. Единицу вычитаем, чтобы перейти к нумерации, начинающейся с нуля.
Все огромное спасибо понял
Добрый день не могу понять как делать 17 если можно помогите
По сути, нужно выделить знак числа. Подсказать так, чтобы практически не решить задачу, даже как-то затрудняюсь. Может быть, вы еще подумаете?
Здравствуите Тарас.
подскажи по поводу 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.
а первую я вот как решил((
program nm ;
var
m: integer;
begin
write(‘m= ‘);
readln(m);
if m mod 2=0 then
write(‘m= ‘, m)
else
write(‘Oshibka’);
end.
В первой вы делает проверку, является ли 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) стоит еще один человек.
Здравствуйте, Тарас, посмотрите 17 пожалуйста. Правильно, нет?
var
x:real;
begin
write(‘x= ‘);
readln(x);
write(‘при х>0: ‘,x+1,’, при х<0: ',-1+x,', при х=0: ',0/x,'.');
end.
по 17 так наверно
var
x:real;
begin
write(‘x= ‘);
readln(x);
write(‘при х>0: ‘,x+1,’, при х<0: ',-1+x,', при х=0: ',x/0,'.');
end.
доброго времени суток, Тарас!!!
на сколько корректно использовать вместо операции x_div_y операцию trunc(x/y)? дело в том, может я сразу не обратил внимание на div, поэтому решал задачи через trunc и решение выходило. сейчас уперся в решение задачи №17(в момент написания комента)
В 17-й надо выводить только одно число, которое может оказаться равно 1 или -1.
x_div_y и trunc(x/y) дадут один и тот же результат. При этом div работает только с целыми числами, а trunc(x/y) также и с вещественными. div выполняется быстрее (за меньшее число тактов процессора). Если бы ты считал его миллиард раз, то, может быть, даже заметил разницу.
В общем, если заранее знаешь, что числа целые, то div предпочтительнее.
то есть выходит что решением 16-й задачи является просто замена x_div_y на trunc(x/y)???!
*ошибся 15-й
17-я
program dd_2;
var
x:real;
begin
write (‘chislo x ‘);
readln (x);
writeln (abs(x)/x);
end.
условие 0 не выполняется, пишет NaN
решение 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.