Консультация № 198499
09.05.2020, 14:42
0.00 руб.
1 38 1
Здравствуйте! У меня возникли сложности с таким вопросом:
Необходимо:
1) Сформировать матрицу, количество строк и столбцов которой случайное число в интервале от 2 до 10, и заполнить её элементами ряда. Это задание я выполнил, но с формулой видимо накосячил.
2) Вывести указанные элементы в строку по правилу:
- при щелчке левой кнопкой мыши вывести строку по которой щелкнули;
- при щелчке правой мыши, вывести столбик на который щелкнули.
На данный момент имеют такой код, который необходим естественно в доработке...
[code lang=pascal]procedure TForm1.ButtonFirstClick(Sender: TObject);
var i,j:integer;
n:real;
begin
Randomize;
StringGridFirst.ColCount:=2+Random(8);
StringGridFirst.RowCount:=2+Random(8);
n:=1;
for i:=0 to StringGridFirst.ColCount -1 do
for j:=0 to StringGridFirst.ColCount -1 do
begin
StringGridFirst.Cells[i,j]:=FloatToStr(exp(n*ln(sqr(2*n))+3)/ sqr(n)+4);
StringGridStr.ColCount:= StringGridFirst.ColCount;
end;

end;

procedure TForm1.ButtonFirstMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin

end;
procedure TForm1.StringGridFirstClick(Sender: TObject);
begin

end;

procedure TForm1.StringGridFirstMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Var nc, nr:integer;
begin
StringGridFirst.MouseToCell(X,Y,nc,nr);
if (nc> StringGridFirst.ColCount-1) or (nr > StringGridFirst.ColCount-1) or
(nc<0) or (nr<0) then
begin
ShowMessage ('Неверное указание ячейки');
exit;
end;
end;

end.[/code]
Саму практическую можно посмотреть во вложении. 1 часть задания выполнил, спасибо огромное Зенченко Константину Николаевичу
Необходимо выполнить САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ 2 ЧАСТИ ДЛЯ 1 ВАРИАНТА...
Прикрепленные файлы:
ff9255a8e9fdb878e1a6874756213da7a19c6f44.pdf

Обсуждение

давно
Посетитель
404025
131
09.05.2020, 17:01
общий
Адресаты:
С Правой вот что происходит. Полный код программы приложу.
Прикрепленные файлы:
30e9f804e1c0e07cc4c204ece75a389d.PNG
давно
Посетитель
404025
131
09.05.2020, 17:02
общий
Адресаты:
[code lang=pascal]procedure TForm1.ButtonFirstClick(Sender: TObject);
var i,j,n:integer;
begin
Randomize;
StringGridFirst.ColCount:=2+Random(8);
StringGridFirst.RowCount:=2+Random(8);
n:=1;
for i:=0 to StringGridFirst.ColCount -1 do
for j:=0 to StringGridFirst.ColCount -1 do
begin
StringGridFirst.Cells[i,j]:=FloatToStr (exp(n*ln( ( 2*sqr(n)+3 )/( sqr(n)+4))));
Inc(n);
end;

end;

procedure TForm1.StringGridFirstMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Var i,nc,nr:integer;
begin
{}
StringGridStr.RowCount:=1;
case Button of
mbleft:begin
StringGridStr.ColCount:=StringGridFirst.ColCount;
for i:=0 to StringGridStr.ColCount -1 do
StringGridStr.Cells[i,0]:=StringGridFirst.Cells[i,StringGridFirst.Row];
end;
mbRight:begin
StringGridStr.ColCount:=StringGridFirst.RowCount;
for i:=0 to StringGridStr.ColCount -1 do
StringGridStr.Cells[0,i]:=StringGridFirst.Cells[i,StringGridFirst.Col];
end;
else ShowMessage('Error, please select again');
end;


end;
end.[/code]

Полный код
давно
Старший Модератор
31795
6196
09.05.2020, 17:03
общий
09.05.2020, 17:04
Адресаты:
Цитата: Nedix
На левую работает, на правой не выводит столбец...


[code lang=pascal]StringGridStr.Cells[0,i]:=StringGridFirst.Cells[i,StringGridFirst.Col];[/code]
Я просто скопировал и заменил название -
StringGridFirst.Cells[i <поменяйте местами> StringGridFirst.Col]
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
404025
131
09.05.2020, 17:13
общий
Адресаты:
Отлично работает) Спасибо Вам огромное. Единственный момент как сделать так, чтобы если за пределами матрицы если происходит нажатие выводить ошибку?
давно
Посетитель
404025
131
09.05.2020, 17:23
общий
Адресаты:
Все разобрался. Как мне вам программу перекинуть ? Могу на электронную почту, адрес нужен.
давно
Старший Модератор
31795
6196
13.05.2020, 15:43
общий
это ответ
Здравствуйте, iphone5s150!
Смотрите код:
[code lang=pascal h=400]//обработчик кнопки
procedure TForm1.ButtonFirstClick(Sender: TObject);
var
i,j:integer;
n:real;
begin
{случайный размер Грида}
Randomize;
StringGridFirst.ColCount:=2+Random(8);
StringGridFirst.RowCount:=2+Random(8);
{заполняем Грид}
n:=1;
for i:=0 to StringGridFirst.ColCount -1 do
for j:=0 to StringGridFirst.RowCount -1 do
StringGridFirst.Cells[i,j]:=FloatToStr(exp(n*ln( ( 2*sqr(n)+3 )/( sqr(n)+4 ) )));
end;
//обработчик кнопки мыши
procedure TForm1.ButtonFirstMouseDown(Sender: TObject;
Button: TMouseButton;Shift: TShiftState;X, Y: Integer);
begin
{строк в целевом Гриде всегда 1}
StringGridStr.RowCount:=1;
case Button of
mbleft:begin{нажата левая кнопка мыши}
StringGridStr.ColCount:=StringGridFirst.ColCount;{размер строки}
for i:=0 to StringGridStr.ColCount -1 do{копируем в цикле}
StringGridStr.Cells[i,0]:=StringGridFirst.Cells[i,StringGridFirst.Row];
end;
mbRight:begin{нажата правая кнопка мыши}
StringGridStr.ColCount:=StringGridFirst.RowCount;{размер столбца}
for i:=0 to StringGridStr.ColCount -1 do{копируем в цикле}
StringGridStr.Cells[0,i]:=StringGridFirst.Cells[StringGridFirst.Col,i];
else ShowMessage('Error, please select again');
end;
end;
end.[/code]
Удачи!
5
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
404025
131
14.05.2020, 14:02
общий
Адресаты:
[code lang=pascal]procedure TForm1.StringGridFirstMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Var i,j, nc,nr:integer;
begin
StringGridFirst.MouseToCell(X,Y,nc,nr);
if (nc> StringGridFirst.ColCount-1) or (nr > StringGridFirst.ColCount-1) or
(nc<0) or (nr<0) then
begin
ShowMessage ('Неверное указание ячейки');
exit;
end;
begin
{строк в целевом Гриде всегда 1}
StringGridStr.RowCount:=1;
case Button of
mbleft:begin{нажата левая кнопка мыши}
StringGridStr.ColCount:=StringGridFirst.ColCount;{размер строки}
for i:=0 to StringGridStr.ColCount -1 do{копируем в цикле}
StringGridStr.Cells[i,0]:=StringGridFirst.Cells[i,StringGridFirst.Row];
end;
mbRight:begin{нажата правая кнопка мыши}
StringGridStr.ColCount:=StringGridFirst.RowCount;{размер столбца}
for i:=0 to StringGridStr.ColCount -1 do{копируем в цикле}
StringGridStr.Cells[0,i]:=StringGridFirst.Cells[StringGridFirst.Col,i];
end;
end;
end;
end;
end.[/code]

Прописал код, строку выводит столбец по нажатию правой кнопкой мыши не правильно выводит...
Прикрепленные файлы:
1e4c1f4b00c00a4952090f0f272fc86c.PNG
давно
Посетитель
404025
131
14.05.2020, 14:03
общий
Адресаты:
Строку отлично выводит
Прикрепленные файлы:
46a6cbdd2f5674aee7efc8a4026e0647.PNG
давно
Старший Модератор
31795
6196
14.05.2020, 14:17
общий
Адресаты:
Все потому, что не проверял, а вирусный XE - снес.
[code lang=pascal]StringGridStr.Cells[i,0]:=StringGridFirst.Cells[StringGridFirst.Col,i];[/code]
Но могли бы и сами обнаружить, т.к. StringGridStr - одна строка и в ней меняются только колонки.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
404025
131
14.05.2020, 14:21
общий
Адресаты:
Так в итоге подскажите пожалуйста, что нужно заменить ?
давно
Старший Модератор
31795
6196
14.05.2020, 14:26
общий
Адресаты:
Вы хоть читаете, что Вам пишут?
[code lang=pascal]StringGridStr.Cells[i,0]:=StringGridFirst.Cells[i,StringGridFirst.Row];
StringGridStr.Cells[i,0]:=StringGridFirst.Cells[StringGridFirst.Col,i];[/code]
Или для Вас эти две строки равны?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
404025
131
14.05.2020, 14:42
общий
Адресаты:
Мм, правда не понял что именно я сделал, но сейчас считает. Для сравнения пришлю код. Спасибо вам.
давно
Посетитель
404025
131
14.05.2020, 14:42
общий
Адресаты:
.[code lang=pascal]procedure TForm1.StringGridFirstMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Var i,j,nc,nr:integer;
begin
StringGridFirst.MouseToCell(X,Y,nc,nr);
if (nc> StringGridFirst.ColCount-1) or (nr > StringGridFirst.ColCount-1) or
(nc<0) or (nr<0) then
begin
ShowMessage ('Неверное указание ячейки');
exit;
end;
begin
{}
StringGridStr.RowCount:=1;
case Button of
mbleft:begin
StringGridStr.ColCount:=StringGridFirst.ColCount;
for i:=0 to StringGridStr.ColCount -1 do
StringGridStr.Cells[i,0]:=StringGridFirst.Cells[i,StringGridFirst.Row];
end;
mbRight:begin
StringGridStr.ColCount:=StringGridFirst.RowCount;
for i:=0 to StringGridStr.ColCount -1 do
StringGridStr.Cells[i,0]:=StringGridFirst.Cells[StringGridFirst.Col,i];
end;

end;
end;
end;
end.[/code]
давно
Посетитель
404025
131
16.05.2020, 14:56
общий
Адресаты:
Добрый день. Небольшой вопрос к вам, как убрать нижнее строчки, которые в самом начале моделируются.
Прикрепленные файлы:
347522875f2aeeaaed544918d0f14bdf.JPG
давно
Старший Модератор
31795
6196
16.05.2020, 21:36
общий
Адресаты:
1) код, показывайте.
2) Ваши комменты в коде.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
404025
131
16.05.2020, 22:53
общий
Адресаты:
Полный код программы...
Код:
procedure TForm1.ButtonFirstClick(Sender: TObject);
var i,j,n:integer;
begin
StringGridFirst.FixedRows := 0;
StringGridFirst.FixedCols := 0;
Randomize;
StringGridFirst.ColCount:=2+Random(8);
StringGridFirst.RowCount:=2+Random(8);
n:=1;
for i:=0 to StringGridFirst.ColCount -1 do
for j:=0 to StringGridFirst.ColCount -1 do
begin
StringGridFirst.Cells[i,j]:=FloatToStr (power( ( 2*sqr(n)+3 )/( sqr(n)+4),n));
Inc(n);
end;
end;

procedure TForm1.StringGridFirstMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Var i,j,nc,nr:integer;
begin
StringGridFirst.MouseToCell(X,Y,nc,nr);
if (nc> StringGridFirst.ColCount-1) or (nr > StringGridFirst.ColCount-1) or
(nc<0) or (nr<0) then
begin
ShowMessage ('Неверное указание ячейки');
exit;
end;
begin
{}
StringGridStr.RowCount:=1;
case Button of
mbleft:begin
StringGridStr.ColCount:=StringGridFirst.ColCount;
for i:=0 to StringGridStr.ColCount -1 do
StringGridStr.Cells[i,0]:=StringGridFirst.Cells[i,StringGridFirst.Row];
end;
mbRight:begin
StringGridStr.ColCount:=StringGridFirst.RowCount;
for i:=0 to StringGridStr.ColCount -1 do
StringGridStr.Cells[i,0]:=StringGridFirst.Cells[StringGridFirst.Col,i];
end;

end;
end;

end;



end.
давно
Старший Модератор
31795
6196
16.05.2020, 23:25
общий
Адресаты:
Вы изменили код, не думая, что делаете.
Сравните его с моим ответом и найдете свою ошибку.
И начните писать комменты.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
404025
131
16.05.2020, 23:48
общий
Адресаты:
Я заменил только ButtonMouseDownClick на Строку с тем же кодом и программа работает, но вопрос в другом как убрать лишние строки, которые я отобразил на рисунке.
давно
Посетитель
404025
131
17.05.2020, 00:01
общий
Адресаты:
Они исчезают, но только если много раз по кнопке кликнешь, а как сделать, чтобы с первого нажатия пустые ячейки не отображались?
давно
Старший Модератор
31795
6196
17.05.2020, 00:03
общий
Адресаты:
Блин, Вы даже сравнить не можете:


Цитата: Зенченко Константин Николаевич
Вы изменили код, не думая, что делаете.

Ваш код:
[code lang=pascal] for i:=0 to StringGridFirst.ColCount -1 do
for j:=0 to StringGridFirst.ColCount -1 do
begin[/code]


Цитата: Зенченко Константин Николаевич
Сравните его с моим ответом и найдете свою ошибку

[code lang=pascal]for i:=0 to StringGridFirst.ColCount -1 do
for j:=0 to StringGridFirst.RowCount -1 do
StringGridFirst.Cells[i,j]:=FloatToStr(exp(n*ln( ( 2*sqr(n)+3 )/( sqr(n)+4 ) )));[/code]

Нашли 10-ть отличий?



Цитата: Nedix
Я заменил только ButtonMouseDownClick

Не только.
Что угодно делайте, но думайте при этом.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
17.05.2020, 00:08
общий
Адресаты:
Это был последний раз, когда я ответил на код без комментариев.
Потом буду игнорировать. А могу еще "БАН" выписать
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
404025
131
17.05.2020, 00:14
общий
Адресаты:
Я вас понял, спасибо вам большое)
давно
Посетитель
404025
131
17.05.2020, 00:18
общий
Адресаты:
[code lang=pascal]StringGridFirst.Cells[i,j]:=FloatToStr (power( ( 2*sqr(n)+3 )/( sqr(n)+4),n));
Inc(n);[/code]
Это функцию расчёта сказали использовать в таком виде, я не спорю, что и в вашем случае она правильная.
давно
Старший Модератор
31795
6196
17.05.2020, 00:20
общий
Адресаты:
сообщение №3 внимательно читайте и Вы найдете ответ на свой вопрос.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
404025
131
17.05.2020, 00:24
общий
Адресаты:
Да нет вы правы, но с нас требуют возведение в степень используя Power, поэтому я и заменил там ваш расчёт немного.
давно
Старший Модератор
31795
6196
17.05.2020, 00:29
общий
Адресаты:
Можно и
[code lang=pascal]{** A power function from Jack Lyle. Said to be more powerful than the
Pow function that comes with Delphi. }
function Power2(Base, Exponent : Double) : Double;
{ raises the base to the exponent }
CONST
cTiny = 1e-15;

VAR
Power : Double; { Value before sign correction }

BEGIN
Power := 0;
{ Deal with the near zero special cases }
IF (Abs(Base) < cTiny) THEN BEGIN
Base := 0.0;
END; { IF }
IF (Abs(Exponent) < cTiny) THEN BEGIN
Exponent := 0.0;
END; { IF }

{ Deal with the exactly zero cases }
IF (Base = 0.0) THEN BEGIN
Power := 0.0;
END; { IF }
IF (Exponent = 0.0) THEN BEGIN
Power := 1.0;
END; { IF }

{ Cover everything else }
IF ((Base < 0) AND (Exponent < 0)) THEN
Power := 1/Exp(-Exponent*Ln(-Base))
ELSE IF ((Base < 0) AND (Exponent >= 0)) THEN
Power := Exp(Exponent*Ln(-Base))
ELSE IF ((Base > 0) AND (Exponent < 0)) THEN
Power := 1/Exp(-Exponent*Ln(Base))
ELSE IF ((Base > 0) AND (Exponent >= 0)) THEN
Power := Exp(Exponent*Ln(Base));

{ Correct the sign }
IF ((Base < 0) AND (Frac(Exponent/2.0) <> 0.0)) THEN
Result := -Power
ELSE
Result := Power;
END; { FUNCTION Pow }[/code]
Это почти тоже, но без проверок, т.к. n=1 - зарание известный факт, то зачем нужны лишние телодвижения, если все равно будете считать Exp(Exponent*Ln(Base));
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
17.05.2020, 00:32
общий
Адресаты:
Цитата: Nedix
Да нет вы правы, но с нас требуют возведение в степень используя Power, поэтому я и заменил там ваш расчёт немного.

Меняйте, но ошибка не в расчетах а циклах.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
404025
131
17.05.2020, 00:39
общий
Адресаты:
Да нет, вы в любом случае очень сильно мне помогли, спасибо вам большое.
давно
Посетитель
404025
131
18.05.2020, 15:19
общий
Адресаты:
Добрый день. Не подскажите как данную функцию записать в коде ? У меня получается вот так: [code lang=pascal]elemseq := -elemseq * sqr(x) / (4 * sqr(kol) + 2 * kol);[/code]

Прикрепленные файлы:
948bf55c5fb0cf6e3f12e45898bfa4f3.JPG
давно
Посетитель
404025
131
18.05.2020, 15:22
общий
Адресаты:
[code lang=pascal]procedure TForm1.Button_CalcClick(Sender: TObject);
var x, //значение аргумента
Eps, //требуемая точность вычисления
Func, //значение функции
Sum, //переменная для подсчёта суммы
Fact, //переменная для подсчёта факториала
ElemSeq:Real; //переменная для подсчёта очередного элемента ряда
Kol:Integer; //количество интераций
begin
if (StrtoFloat(Edit_Eps.Text)<= 1) xor (StrtoFloat(Edit_Eps.Text) > 0) then

begin
ShowMessage('Введите число из интервала (0;1).');
end;
x:=StrtoFloat(Edit_X.Text);//значение аргумента
eps:=StrtoFloat(Edit_Eps.Text); // значение точности
Memo_ChSum.Clear;
Sum:=0;
Func:= Exp(x); // присваиваем значения переменным
Fact:=1;
Kol:=0;
ElemSeq:=Eps+1;
sum := x;
elemseq := x;
memo_chsum.lines.add(floattostr(elemseq)); // выполняем очистку
kol := 1;
repeat
elemseq := -elemseq * sqr(x) / (4 * sqr(kol) + 2 * kol);
memo_chsum.lines.add(floattostr(elemseq));
Sum:=Sum+ElemSeq;
inc(kol);
until abs(elemseq) < eps;
Label_Func.Caption:='Значение функции:'+ FloatToStr(Func);
Label_Func.Visible:=True;
Label_Sum.Caption:='Сумма ряда:'+FloatToStr(Sum);
Label_Sum.Visible:=True;
Label_AbsE.Caption:='Погрешность:'+FloatToStr(abs(Func-Sum));
Label_AbsE.Visible:=True;
Label_Kol.Caption:='Количество интераций:'+FloatToStr(Kol);
Label_Kol.Visible:=True;
end;[/code]

Суть работы в части 2. Прикрепил код с метками.
Прикрепленные файлы:
06337e8c7cca0bb2480eb637cea0a454.pdf
Форма ответа