• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Домашнее задание на лето.

  • Автор темы Автор темы Жан
  • Дата начала Дата начала

Жан

Ученик
Почётный участник
Регистрация
18 Апр 2010
Сообщения
744
Реакции
8
Баллы
0
Домашнее задание на лето.

Нам задали сделать программу на делфи для решения функций и + графики к ним помогите хоть с одним графиком разобратся y=kx+b, а то осенью преопод :tehnari_ru_093:
 
Нельзя решить функцию, можно подсчитать ее значение при заданных аргументах. А программу будем делать так: рисовать будет прямо на канве формы, для удобства возьмем самый естественный в данной ситуации масштаб: 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, либо добавить в программу работу с масштабом иным.
 
Стоп, стоп, но здесь же ведь чистая математика и почему объявление переменных так много ведь помоему проще объявить так
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.Height)
(рисуем оси координат)
Ну, а дальше я застреваю знаю, что надо писать наверное в цикле for и математическую формулу нахождения x:=-b/k. И у меня не получается объявить, что y=0 первоначально, а если честно, то я запутался можете объяснить, где, что я не правильно начал.
 
От себя пять копеек добавлю. В цикле имеем:
Код:
      Form1.Canvas.MoveTo(ixPrev, iyPrev);
      Form1.Canvas.LineTo(ix, iy);
Смысла в MoveTo нет, так как перо остается в той точке, куда его переместила LineTo.
Нет необходимости запоминать координаты пера в переменных ixPrev и iyPrev.
 
Если честно в моей голове уже каша! А поточнее можно разжевать информацию.
 
В OnKeyPress еще желательно добавить код клавиши Backspace.
не получается объявить, что y=0 первоначально
y:=0;
x, y,:integer;
k, b,:integer;
Переменные для аргумента, приращения аргумента и значения функции желательно задавать вещественным типом, так как неизвестно, какие значения будет задавать пользователь при использовании вашей программы и что будет получено в результате вычислений.
 
AlexZir, в OnKeyPress код бекспейса есть:

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

#8 - Вот он.

Жан, начал ты, может быть, и правильно, однако цвет пера, его толщина и пр. - это вторично. В моем коде построение прямой y = kx + m. Т.е. то, что ты писал в первом посте. Ткни пальцем, что именно не понятно.
 
От себя пять копеек добавлю.
Смысла в MoveTo нет, так как перо остается в той точке, куда его переместила LineTo.
Нет необходимости запоминать координаты пера в переменных ixPrev и iyPrev.
И от меня грошик: один раз надо использовать MoveTo. Перед циклом.
 
Последнее редактирование модератором:
Artes33, извиняюсь, но тогда нужно добавить код разделителя разрядов (запятую или точку) для ввода дробных значений :D
 
Мой пример работает только с целыми числами, поэтому там и отсутствуют эти символы.
 
Извените помогите мне написать хоть одну прогу я начал поновому писать её, но застреваю, когда надо рисовать оси координат и написании самой формулы, т.е. вставки её в прогу вот,что у меня получается:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label3.Caption:=DateToStr(Date);
Label5.Caption:=DateToStr(Date);
Label4.Caption:=TimeToStr(Time);
Label6.Caption:=TimeToStr(Time);
end;

procedure TForm1.N4Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.BitBtn4Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (key in ['0'..'9','-',#9]) then Key:=#0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:='';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Edit2.Text:='';
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var k,b:real;
x,y,i:integer;
begin
k:=StrToFloat(Edit1.Text);
b:=StrToFloat(Edit2.Text);
Image1.Canvas.Pen.Color:=clBlack;
Image1.Canvas.Pen.Width:=1;
Image1.Canvas.Brush.Color:=clWhite;
Image1.Canvas.Rectangle(0,0,Image1.Width,Image1.Height);
for i:=0 to 100 do begin
y:=k*x+b;
x:=-b/k
end;

end.
Разъясните неучу где какая ошибка? и что неправильно я делаю.
 
А в чем проблема? Вы просто не нарисовали сами линии осей. К тому же, в цикле выберите опорную и результирующую переменные, а то вы и аргумент и значение функции вычисляете, опираясь только на коэффициент и свободный член. Могу порекомендовать в первой формуле вместо x использовать значение переменной i, а вторую формулу вообще убрать, она излишняя.
 
А поподробней можете объяснить, что куда и как неправильно и где вписывать. ПЛИЗ!
 
Жан, почему не устраивает мой пример? А что неправильно... Попробуй построить свою функцию, которую ты указываешь программе, на бумаге. Уверяю, не получится. Грубо говоря, всегда будет получаться одна и та же точка. Почитай: _http://ru.wikipedia.org/wiki/Функция_(математика) . Тебе AlexZir правильно сказал, что нужно делать.

P. S. Где учишься?
 
Мне нужно понять построения написания проги. Помогите
 
Назад
Сверху