Перейти к содержимому


Фото

Программирование


  • Please log in to reply
81 ответов в этой теме

#51 Ласточка ада

Ласточка ада

    a vegetable wanna be the best

  • Members2
  • PipPipPipPip
  • 1186 сообщений

Отправлено 16 November 2010 - 11:14

Я в расстройстве. На горолимпиаде 3 задачи из 5 были на строки и массивы, а я о них в паскале тупо ничего не знаю ибо не проходили.Обидно. С горя не решила вот что:
Пожалуйста, объясните овощу чисто для интереса:
Паскаль.
Дано n дипломов, w ширина, h высота. Все одинакового размера. Нужно найти минимальную длину/ширину квадратной полки, на которую все эти дипломы уместились бы. Разумеется, дипломы не могут пересекаться.
Например:
input: 2(ширина), 3(длина), 10(количество)
output: 9.


Буду благодарна, если объясните решение математически (и можно код под спойлером).
No chance for fate - it's unnatural selection. I want the truth!

#52 Ласточка ада

Ласточка ада

    a vegetable wanna be the best

  • Members2
  • PipPipPipPip
  • 1186 сообщений

Отправлено 16 November 2010 - 13:24

Да, вращать не нужно.
Спасибо, смысл понятен.
Вопрос: массивы всё-таки тут нужны, или я что-то не догоняю?
No chance for fate - it's unnatural selection. I want the truth!

#53 Invisible

Invisible

    Археолог

  • Validating
  • PipPipPip
  • 750 сообщений

Отправлено 13 November 2010 - 22:42


var
    x,f:real;

begin
   writeln('Введите действ. число х: ');
   readln(x);
   f:=x*x+4*x+5;
   writeln('If...then');
   if x<=(2+0.001)
      then writeln('Значение функции f(x): ',f:6:2)
      else writeln('Значение функции f(x): ', (1/f):6:2);
   writeln('Case...of');
   case x<=(2+0.001) of
      0: writeln('Значение функции f(x): ', (1/f):6:2);
      1: writeln('Значение функции f(x): ',f:6:2)
   end;
   readln
end.


Насчет case не уверена, никогда вроде бы для логического типа не использовала.


"Given enough eyeballs, all bugs are shallow". Э. Рэймонд


#54 Invisible

Invisible

    Археолог

  • Validating
  • PipPipPip
  • 750 сообщений

Отправлено 16 November 2010 - 20:43

Ок. Тогда так попробуй:


var
   x,f:real;
   flag:boolean;    

begin
   writeln('Введите действ. число х: ');
   readln(x);
   f:=x*x+4*x+5;
   flag:=false;
   writeln('If...then');
   if x<2.001
      then 
         begin
           writeln('Значение функции f(x): ',f:6:2);
           flag:=true
         end
      else writeln('Значение функции f(x): ', (1/f):6:2);
   writeln('Case...of');
   case flag of
      0: writeln('Значение функции f(x): ', (1/f):6:2);
      1: writeln('Значение функции f(x): ',f:6:2)
   end;
   readln
end.'

Сообщение изменено: Invisible (16 November 2010 - 20:49)

"Given enough eyeballs, all bugs are shallow". Э. Рэймонд


#55 Invisible

Invisible

    Археолог

  • Validating
  • PipPipPip
  • 750 сообщений

Отправлено 16 November 2010 - 20:53

Может, вместо 0 - false, 1 - true?

"Given enough eyeballs, all bugs are shallow". Э. Рэймонд


#56 Invisible

Invisible

    Археолог

  • Validating
  • PipPipPip
  • 750 сообщений

Отправлено 16 November 2010 - 21:31

Блин, case так и не удался? Я думала, вариант такой будет работать:


   case flag of
      false: writeln('Значение функции f(x): ', (1/f):6:2);
      true: writeln('Значение функции f(x): ',f:6:2)
   end;


Печально.


"Given enough eyeballs, all bugs are shallow". Э. Рэймонд


#57 Invisible

Invisible

    Археолог

  • Validating
  • PipPipPip
  • 750 сообщений

Отправлено 16 November 2010 - 22:27

Ну вообще-то я в прошлом сообщении уже все сказала про true и false, разве трудно было 0 и 1 поменять на данные значения?

Действительные числа - множество, в которое также входят и целочисленные, разве нет?

И насчет данного условия не уверена: x<=2. Вообще-то, если преподаватели не врут - вещественные числа вообще не стоит приравнивать друг к другу, ибо вряд ли переменная станет точно равной двум. Поэтому для того, чтобы наверняка попадало в диапазон, я и прибавила погрешность. Можно и меньше сделать, не спорю - 0.0000....01.


"Given enough eyeballs, all bugs are shallow". Э. Рэймонд


#58 NyK2104

NyK2104

    Профессор

  • Members2
  • PipPipPipPip
  • 1080 сообщений

Отправлено 12 October 2010 - 19:35

Искал, вот что нашёл, скажешь подходит ли.
Диаметр описанной окружности равно отношению стороны к синусу противоположного угла, если в формуле, то, по идее
2R= ?/sinA

Спасибо большое, и Andariel, и Robert Langdon :)
Пока формулы искал, вот, поздно запостил :)
Better to be hated than loved for what you're not

#59 NyK2104

NyK2104

    Профессор

  • Members2
  • PipPipPipPip
  • 1080 сообщений

Отправлено 12 October 2010 - 20:09

Я полный ноль, повторюсь. Что значит Error 26: Type Dismatch, и как от неё избавиться?
Размещенное изображение
Писал на инглише, только для проверки, в школе русский есть, так что :)
Better to be hated than loved for what you're not

#60 NyK2104

NyK2104

    Профессор

  • Members2
  • PipPipPipPip
  • 1080 сообщений

Отправлено 12 October 2010 - 20:20

Все, получилось. Спасибо :)
Better to be hated than loved for what you're not

#61 NyK2104

NyK2104

    Профессор

  • Members2
  • PipPipPipPip
  • 1080 сообщений

Отправлено 13 November 2010 - 21:58

Опять, #!@
Информатика, помогите, пожалуйста =_=
Дано действительное число x. Вычислить f(x), если
Размещенное изображение
Желательно сделать и в if/then и в case, НО даже если в одном сделаете, то буду много-премного благодарен :cray:

Сообщение изменено: Tomb_and_Jerry (13 November 2010 - 21:58)

Better to be hated than loved for what you're not

#62 NyK2104

NyK2104

    Профессор

  • Members2
  • PipPipPipPip
  • 1080 сообщений

Отправлено 13 November 2010 - 23:15

Спасиб тебе большое, щас проверю (:
Better to be hated than loved for what you're not

#63 NyK2104

NyK2104

    Профессор

  • Members2
  • PipPipPipPip
  • 1080 сообщений

Отправлено 16 November 2010 - 20:22

Размещенное изображение
74: Constant and case types do not match. Что делать?
Better to be hated than loved for what you're not

#64 NyK2104

NyK2104

    Профессор

  • Members2
  • PipPipPipPip
  • 1080 сообщений

Отправлено 16 November 2010 - 20:50

Всё равно №74
Прям и не знаю что делать
курсор ставит на строчку
0: writeln('Значение функции f(x): ', (1/f):6:2);
Better to be hated than loved for what you're not

#65 NyK2104

NyK2104

    Профессор

  • Members2
  • PipPipPipPip
  • 1080 сообщений

Отправлено 16 November 2010 - 21:25

Ура! Получилось. Сделал по твоей самой первой версии, в таком виде:

var 
x, f: real;
BEGIN
   writeln('Введите действительное значение x: ');
   readln(x);
   f:= x*x + 4x + 5;
   if x<= (2+0.001)
      then
      writeln ('Значение функции f(x): ', f:6:2)
      else writeln('Значение функции f(x): ', (1/f):6:2);
END.

Better to be hated than loved for what you're not

#66 NyK2104

NyK2104

    Профессор

  • Members2
  • PipPipPipPip
  • 1080 сообщений

Отправлено 17 November 2010 - 17:05

нет, почему, я попробовал, только там чуть лишнего было :)
всё правильно получилось, просто я сомневался, писать или нет, так как мы еще формально flag не учили, а у меня учитель еще конечно...
спасиб, "отлично" получил)

Better to be hated than loved for what you're not

#67 WinterWolf

WinterWolf

    Странный зверь

  • Members2
  • PipPipPipPip
  • 1036 сообщений

Отправлено 16 November 2010 - 21:55

А вы уверены, что в задаче x должен быть real, а не целочисленным? (а то в case можно было бы диапазон значений использовать)
В любом случае, для вещественного типа x я бы подкорректировал условие. Почему точность лишь до тысячных? Ну и про true/false верно ибо на это компилятор и ругается.
Немного измененный ваш же код:
var 
   x,f:real; 
   flag:boolean;     
 
begin 
   writeln('Введите действ. число х: '); 
   readln(x); 
   f:=x*x+4*x+5; 
   flag:=false;
   writeln('If...then'); 
   if x<=2 
      then  
         begin 
           writeln('Значение функции f(x): ',f:6:2); 
           flag:=true; 
         end 
      else writeln('Значение функции f(x): ', (1/f):6:2); 
   writeln('Case...of'); 
   case flag of 
      false: writeln('Значение функции f(x): ', (1/f):6:2); 
      true: writeln('Значение функции f(x): ',f:6:2); 
   end; 
   readln; 
end.
Все замечательно работает.
Слова - лакмусовая бумажка, определяющая тип сознания.

#68 WinterWolf

WinterWolf

    Странный зверь

  • Members2
  • PipPipPipPip
  • 1036 сообщений

Отправлено 17 November 2010 - 12:57

Ну вообще-то я в прошлом сообщении уже все сказала про true и false, разве трудно было 0 и 1 поменять на данные значения?

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

Действительные числа - множество, в которое также входят и целочисленные, разве нет?

Согласен, просто неясно, в таком случае, зачем в задании просят использовать case, если с ним все равно в паре нужен if для определения состояния flag'а. Какая-то нерациональная задача. А вот если x использует тип от byte до longint, то, зная пределы этих типов, в case можно было бы включить лишь диапазоны:
[нижний предел]..2
3..[верхний предел]

И насчет данного условия не уверена: x<=2. Вообще-то, если преподаватели не врут - вещественные числа вообще не стоит приравнивать друг к другу, ибо вряд ли переменная станет точно равной двум. Поэтому для того, чтобы наверняка попадало в диапазон, я и прибавила погрешность. Можно и меньше сделать, не спорю - 0.0000....01.

Почему переменная не может быть равна точно двум? Чем это обусловлено? Под переменную real определяется 4 байта и если задать двойку в real, то она занесется в память как 2.0(0)E0, т.е. остальные биты информации останутся нулями. В задании условие четкое, поэтому его, мне кажется, и нужно соблюсти. Если не верите, вот попробуйте выполнить:
var i: integer;
    r1,r2: real;

begin
 i:=2;
 r1:=2;
 r2:=2.0000000;
 if i=r1 then writeln(i,' =',r1) else writeln(i,' <>',r1);
 if i=r2 then writeln(i,' =',r2) else writeln(i,' <>',r2);
 if r1=r2 then writeln(r1,' =',r2) else writeln(r1,' <>',r2);
 readln;
end.
Результат:
Размещенное изображение
Значения для наглядности специально без округления.
Возможно, в другом языке программирования кроме непосредственно значения сравниваются еще и типы переменных, но не в Turbo Pascal 7.0.

Сообщение изменено: WinterWolf (17 November 2010 - 13:06)

Слова - лакмусовая бумажка, определяющая тип сознания.

#69 WinterWolf

WinterWolf

    Странный зверь

  • Members2
  • PipPipPipPip
  • 1036 сообщений

Отправлено 17 November 2010 - 18:14

:) flag - это просто название, которое Invisible дала переменной булева типа. При желании она вполне могла назвать его и по-другому, а вместо логики использовать любой целочисленный тип (тогда в case были бы, например, 0 и 1). Это стандартное алгоритмическое решение, обзываемое обычно "флагом", который, как известно, имеет два состояния - "опущен" и "поднят". Хотя флагами иногда называют и более сложные идентификаторы. Не знаю, проходят ли это вообще при изучении языка программирования, потому как оно вроде как должно быть известно еще до того, как приступают непосредственно к самому языку.
Слова - лакмусовая бумажка, определяющая тип сознания.

#70 Andariel

Andariel

    Расхититель

  • Members2
  • PipPipPipPipPip
  • 6450 сообщений

Отправлено 12 October 2010 - 19:49

Всё намного проще. Люблю гугл :)
Если известны углы и радиус описанной окружности, то используется формула герона: Размещенное изображение

Короче, вот наш труегольник (правда, без окружности):
Размещенное изображение

Теперь собсно код:

var a, b, c, r, AB, AC, BC: integer;

begin

write('Введите угол a: ');
readln(a); 
write('Введите угол b: ');
readln(<img src='http://tombraider.ru/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />; 
write('Введите угол c: ');
readln©; 
write('Введите радиус описанной окружности: ');
readln®; 
AB:=2*r*sin©;
AC:=2*r*sin(<img src='http://tombraider.ru/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />;
BC:=2*r*sin(a);
write('Длинна стороны AB=',AB,', длинна стороны AC=',AC,', длинна стороны BC=',BC,'.');
readln;
end.

Вроде так. Правда Паскаля под рукой нет, проверить код не могу. Будут ошибки при компиляции - пиши.

#71 Robert Langdon

Robert Langdon

    Археолог

  • Members2
  • PipPipPip
  • 918 сообщений

Отправлено 12 October 2010 - 19:58

Только надо бы в вещественных числах считать, а не в целых, особенно углы в радианах, да и третий угол треугольника вычисляется из первых двух

#72 Robert Langdon

Robert Langdon

    Археолог

  • Members2
  • PipPipPip
  • 918 сообщений

Отправлено 12 October 2010 - 20:20

integer меняй на real

а также убирай
write('Введите угол c: ');
readln©;
и меняй
AB:=2*r*sin©;
на
AB:=2*r*sin(pi - a - <img src='http://tombraider.ru/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />;
а если хочешь вводить углы не в радианах, а в градусах, то меняй
AB:=2*r*sin(pi - a - <img src='http://tombraider.ru/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />;
AC:=2*r*sin(<img src='http://tombraider.ru/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />;
BC:=2*r*sin(a);
на
AB:=2*r*sin((180 - a - <img src='http://tombraider.ru/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' /> / 180 * pi);
AC:=2*r*sin(b / 180 * pi);
BC:=2*r*sin(a / 180 * pi);


#73 Andariel

Andariel

    Расхититель

  • Members2
  • PipPipPipPipPip
  • 6450 сообщений

Отправлено 12 October 2010 - 21:49

Ага, с целыми числами протупила. Дожилась. Это старческое... :wacko:
А с третьим углом можно и так и так. Хотя да, в твоем варианте меньше вероятность получить что угодно кроме треугольника :)

#74 Robert Langdon

Robert Langdon

    Археолог

  • Members2
  • PipPipPip
  • 918 сообщений

Отправлено 16 November 2010 - 12:36

Я в расстройстве. На горолимпиаде 3 задачи из 5 были на строки и массивы, а я о них в паскале тупо ничего не знаю ибо не проходили.Обидно. С горя не решила вот что:
Пожалуйста, объясните овощу чисто для интереса:
Паскаль.
Дано n дипломов, w ширина, h высота. Все одинакового размера. Нужно найти минимальную длину/ширину квадратной полки, на которую все эти дипломы уместились бы. Разумеется, дипломы не могут пересекаться.
Например:
input: 2(ширина), 3(длина), 10(количество)
output: 9.


Буду благодарна, если объясните решение математически (и можно код под спойлером).

Думаю так:
Пробуем выложить в n столбцов, где n от 1 до 10 (количество). Для каждого числа столбцов считаем сколько будет получаться строк: т.е. если 1 столбец, то 10 строк, если 2, то 5 и т.д. где надо округляем к большему. Для каждого из вариантов считаем общую длину и ширину и запоминаем из них большее значение (это и будет ширина/длина квадратной полки). Соответственно из 10 получившихся вариантов выбираем меньшее значение.

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

#75 Robert Langdon

Robert Langdon

    Археолог

  • Members2
  • PipPipPip
  • 918 сообщений

Отправлено 16 November 2010 - 13:59

Да, вращать не нужно.
Спасибо, смысл понятен.
Вопрос: массивы всё-таки тут нужны, или я что-то не догоняю?

Тут не нужны




3 посетителей читают эту тему

0 пользователей, 3 гостей, 0 скрытых