Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 26.07.2010, 18:37   #1 (permalink)
Жан
Member
 
Аватар для Жан
 
Регистрация: 18.04.2010
Сообщений: 744
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 639
По умолчанию Домашнее задание на лето.

Нам задали сделать программу на делфи для решения функций и + графики к ним помогите хоть с одним графиком разобратся y=kx+b, а то осенью преопод
Жан вне форума   Ответить с цитированием

Старый 26.07.2010, 18:37
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Так же на нашем форуме встречались темы, которые схожи с вашими

Домашнее телевидение и комп
Задание в Паскале
Дворняге домашнее тепло и дружбу.
Задание по циклам

Старый 27.07.2010, 22:01   #2 (permalink)
artes33
Member
 
Регистрация: 26.07.2010
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 60
По умолчанию

Нельзя решить функцию, можно подсчитать ее значение при заданных аргументах. А программу будем делать так: рисовать будет прямо на канве формы, для удобства возьмем самый естественный в данной ситуации масштаб: 1 ед. = 1 пиксель. Так проще. Начнем! Кидай на форму 1 TButton и 2 TLabeledEdit. Желательно разместить их в одном углу формы, чтобы потом не очень мешались. Надпись к LabeledEdit1 - "k", к LabeledEdit2 - "b". к едитам в OnKeyPress пиши:
Код:
  case key of
    '0'..'9', '-', #8:;
      else key := #0;
  end;
Это чтобы лишнего не вводили. В обработчике кнопки:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  W, H : cardinal;
  halfW, halfH, x, y : double;
  ixPrev, iyPrev, k, b : integer;
  ix, iy : cardinal;
begin
  repaint;
  W := Form1.Width;
  H := Form1.Height;
  k := StrToIntDef(Form1.LabeledEdit1.Text, 0);
  b := StrToIntDef(Form1.LabeledEdit2.Text, 0);
  halfW := W / 2;
  halfH := H / 2;
  Form1.Canvas.MoveTo(round(halfW), 0);
  Form1.Canvas.LineTo(round(halfW), H);
  Form1.Canvas.MoveTo(0, round(halfH));
  Form1.Canvas.LineTo(W, round(halfH));
  ixPrev := 0;
  iyPrev := round(halfH);
    for ix := 0 to W - 1 do
    begin
      x := (ix - halfW);
      y := k * x + b;
      iy := round(halfH - y);
      Form1.Canvas.MoveTo(ixPrev, iyPrev);
      Form1.Canvas.LineTo(ix, iy);
      ixPrev := ix;
      iyPrev := iy;
    end;
end;
В принципе y = kx + b можно решить и легче, но, как я понял, будут другие функции. Функцию задавать при присвоение значение переменной игрек: y := k * x + b;. ВАЖНО: т.к. масштаб 1 пиксель, то сложно будет отличить y = 3x + 2 и y = 3x + 3. Чтобы глаз человека мог это воспринимать надо либо увеличивать на десятки: y = 3x + 20 и y = 3x + 30, либо добавить в программу работу с масштабом иным.
artes33 вне форума   Ответить с цитированием
Старый 28.07.2010, 07:02   #3 (permalink)
Жан
Member
 
Аватар для Жан
 
Регистрация: 18.04.2010
Сообщений: 744
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 639
По умолчанию

Стоп, стоп, но здесь же ведь чистая математика и почему объявление переменных так много ведь помоему проще объявить так
Цитата:
var k,b,real;
x, y,:integer;
k, b,:integer;
begin
a:=StrToFloat(Edit1.Text);
b:=StrToFloat(Edit2.Text);
(тут задаем цвет и толщену пера)
Image1.Canvas.Pen.Color:=clBlack;
Image1.Canvas.Pen.Width:=2;
(а это закраска цветом фона предедущего графика)
Image1.Canvas.Brush.Color:=clWhite;
Image1.Canvas.Rectangle(0,0,Image1.Width,Image1.He ight)
(рисуем оси координат)
Ну, а дальше я застреваю знаю, что надо писать наверное в цикле for и математическую формулу нахождения x:=-b/k. И у меня не получается объявить, что y=0 первоначально, а если честно, то я запутался можете объяснить, где, что я не правильно начал.
Жан вне форума   Ответить с цитированием
Старый 28.07.2010, 07:50   #4 (permalink)
Long Cat
Banned
 
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
По умолчанию

От себя пять копеек добавлю. В цикле имеем:
Цитата:
Сообщение от artes33 Посмотреть сообщение
Код:
      Form1.Canvas.MoveTo(ixPrev, iyPrev);
      Form1.Canvas.LineTo(ix, iy);
Смысла в MoveTo нет, так как перо остается в той точке, куда его переместила LineTo.
Нет необходимости запоминать координаты пера в переменных ixPrev и iyPrev.
Long Cat вне форума   Ответить с цитированием
Старый 28.07.2010, 08:53   #5 (permalink)
Жан
Member
 
Аватар для Жан
 
Регистрация: 18.04.2010
Сообщений: 744
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 639
По умолчанию

Если честно в моей голове уже каша! А поточнее можно разжевать информацию.
Жан вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 29.07.2010, 01:37   #6 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,794
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
По умолчанию

В OnKeyPress еще желательно добавить код клавиши Backspace.
Цитата:
не получается объявить, что y=0 первоначально
y:=0;
Цитата:
x, y,:integer;
k, b,:integer;
Переменные для аргумента, приращения аргумента и значения функции желательно задавать вещественным типом, так как неизвестно, какие значения будет задавать пользователь при использовании вашей программы и что будет получено в результате вычислений.
__________________
Убить всех человеков!
AlexZir вне форума   Ответить с цитированием
Старый 29.07.2010, 18:42   #7 (permalink)
artes33
Member
 
Регистрация: 26.07.2010
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 60
По умолчанию

AlexZir, в OnKeyPress код бекспейса есть:

Код:
  case key of
    '0'..'9', '-', #8:;
      else key := #0;
  end;
#8 - Вот он.

Жан, начал ты, может быть, и правильно, однако цвет пера, его толщина и пр. - это вторично. В моем коде построение прямой y = kx + m. Т.е. то, что ты писал в первом посте. Ткни пальцем, что именно не понятно.
artes33 вне форума   Ответить с цитированием
Старый 29.07.2010, 18:52   #8 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Long Cat Посмотреть сообщение
От себя пять копеек добавлю.
Смысла в MoveTo нет, так как перо остается в той точке, куда его переместила LineTo.
Нет необходимости запоминать координаты пера в переменных ixPrev и iyPrev.
И от меня грошик: один раз надо использовать MoveTo. Перед циклом.

Последний раз редактировалось Long Cat; 29.07.2010 в 19:02
Vladimir_S вне форума   Ответить с цитированием
Старый 29.07.2010, 19:02   #9 (permalink)
Long Cat
Banned
 
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
И от меня грошик: один раз надо использовать MoveTo. Перед циклом.
Ну, я писал про то, что происходит внутри цикла :-).
Long Cat вне форума   Ответить с цитированием
Старый 29.07.2010, 19:08   #10 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Long Cat Посмотреть сообщение
Ну, я писал про то, что происходит внутри цикла :-).
Так я же не в порядке дискуссии, а исключительно в копилку.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 22:15.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.