Имеется такое задание: Хозяин хочет оклеить обоями квартиру. Определить количество необходимых рулонов и затрат на их приобретение.
Мне очень стыдно, но не могу решить ее используя линейный алгоритм Как я прнимаю, отношение площади стен к площади рулона даст количество рулонов, но количество рулонов должно быть целым числом...
volvo
17.06.2010 11:57
Ну, так вот и проверь, делится ли площадь комнаты нацело на площадь рулона (перефразируем: нулевой ли остаток от деления площади стен на площадь рулона; для получения остатка целочисленного деления есть MOD). Если остаток НЕнулевой, то к частному (целочисленное деление - это DIV) придется прибавить еще 1.
Это все верно только если площади (и стен и рулонов) - целочисленные. Поскольку ты никаких вводных не дал, я трактую это так, как нравится мне, а мне удобнее считать все данные именно целочисленными, а не вещественными.
TarasBer
17.06.2010 12:05
Цитата(volvo @ 17.06.2010 12:57)
Ну, так вот и проверь, делится ли площадь комнаты нацело на площадь рулона (перефразируем: нулевой ли остаток от деления площади стен на площадь рулона; для получения остатка целочисленного деления есть MOD). Если остаток НЕнулевой, то к частному (целочисленное деление - это DIV) придется прибавить еще 1.
Может, вместо взятия остатка проще сразу считать (a+b-1) div b?
volvo
17.06.2010 12:14
Ну, чего и следовало ожидать, оптимизация начинается... ПРОЩЕ - с div/mod... Тебе БЫСТРЕЕ и КОРОЧЕ надо? Пиши в маш. кодах, на кой тебе компилятор? Человек только начинает изучать язык, нет, тебе надо обязательно прийти и написать какую-то хрень, чтоб отбить у него желание начинать разбираться. Додумается сам до такого "упрощения" (я бы за такие "упрощения" руки отрывал) - сделает. Не додумается - значит ему же лучше...
TarasBer
17.06.2010 13:08
> Ну, чего и следовало ожидать, оптимизация начинается...
Это плохо? Да, статью ту я читал. Опасная статья. Слишком модно стало размахивать ей, как библией, отрицая вообще любую оптимизацию.
> ПРОЩЕ - с div/mod...
Кто сказал? Это твоё субъективное мнение, не более. А моё субъективное мнение, что с одним div проще. А вот то, что div/mod вынудит процессор делать лишние действия, это объективная реальность.
> Пиши в маш. кодах, на кой тебе компилятор?
Ну компилятору тоже надо помогать. Зачем его путать?
> я бы за такие "упрощения" руки отрывал
А я бы - за усложнения.
Зачем делать сложно, когда логичнее, читаемее итд делать просто?
OneDose
17.06.2010 19:59
volvo, я правильно Вас понял?
Program steny; uses crt; var S,S1:integer; {площадь стен, площадь рулона} N:integer; {Необходимое количество рулонов} D,K:real; {Стоимость рулона, общая цена}
Begin clrscr; writeln('Введите площадь оклеимаевой поверхности'); read(S); writeln('Введите площадь рулона'); read(S1); writeln('Введите цену рулона'); read(D); if((S mod s1) <> 0) then N:=(S div S1)+1 else N:=S div S1; writeln('Необходимо ',N,' рулонов'); K:=D*N; writeln('Затраты на приобретение необходимого количества рулонов: ',K:8:3); readln; readln; end.
Я начинающий и не знаю, можно ли назвать это линейным алгоритмом, или это алгоритм с ветвлением. Не могли бы Вы объяснить, почему это решение будет неверно для S,S1 : real ? Текст задачи -это все что есть, никаких вводных данных не прилагается
TarasBer, не могли бы вы расписать Ваш вариант в констекте написанного выше кода, я, к сожалению, не совсем понимаю что Вы имеете ввиду...
Есть вариант решения данной задачи, на который я не смею ссылаться ввиду отсутствия представления о принципах его работы( начиная с того, что я понятия не имею, откуда взялся раздел описания констант)
Спойлер(Показать/Скрыть)
Program Ex_1; uses crt; const d = 10; {длинна рулона и его стоимость} s1 =200; var r1,r2,r3,r4 : real;{размеры стен}
i,i1,i2 : integer;{количество стен и рулонов} d1,d2 : real;{размеры рулона} S,S1 : real;{стоимость обоев}
k,k1,k2,k3:real; k4,k5,k6:real;
Begin; ClrScr; S:=0; k3:=0; Writeln('Введи размер стены'); Read(r1,r2); Writeln('введи размер второй стены'); Read(r3,r4); writeln('1 рулон'); read(d1,d2); read(i1,i2); k :=r1 div d1; k1:=r2 div d2; k4:=r3 div d1; k5:=r4 div d2; k6:=k4 * k5; k3:=i1 * (k2/10)+i2*(k6/10); writeln('количество рулонов = ', k3); S:= S1*k3; writeln('стоимость рулона = ', S,'руб'); readln; End.
Спасибо за помошь и поддержку!
TarasBer
18.06.2010 9:23
> Не могли бы Вы объяснить, почему это решение будет неверно для S,S1 : real ?
Для этого типа не определена операция mod. Тогда придётся писать N := upRound(S/S1); (вот это точно самый читаемый вариант). Функцию upRound придётся отдельно определить:
function upRound(r: real): longint; var res: longint; begin res := round®; if res < r then inc(res); upRound := res; end;
> TarasBer, не могли бы вы расписать Ваш вариант в констекте написанного выше кода, я, к сожалению, не совсем понимаю что Вы имеете ввиду...
Ну просто заменяешь 2 строчки
if((S mod s1) <> 0) then N:=(S div S1)+1 else N:=S div S1;
На одну:
N := (S + S1 - 1) div S1;
OneDose
18.06.2010 16:36
Огромное спасибо, в одну строчку - это как раз то,что нужно!
Lapp
18.06.2010 22:06
М
Просьба обратить внимание на Правила Форума, п.1.13.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.