Вопрос № 67218: Здравствуйте.
Подскажите плиз в чем ошибка?
Возникает при расчете, когда уже запущена программа, на строке lg := ln(x) / ln(10);
.Вопрос № 67223: Вопрос чисто теоритический, поэтому буду предпочтителнее словесное подробное описание, хотя и от кода программы не откажусь. Нужно вычислить опредилитель например 10 порядка, подскажите метод с помощью которого это можно сделать можно конечно свести ...Вопрос № 67263: Уважаемые эксперты подскажите как по нажатию кнопки посимвольно скопировать строчку из Edit'а в динамический массив. Спасибо....
Вопрос № 67.218
Здравствуйте.
Подскажите плиз в чем ошибка?
Возникает при расчете, когда уже запущена программа, на строке lg := ln(x) / ln(10);
Приложение:
Отправлен: 16.12.2006, 11:53
Вопрос задал: Sarymian (статус: 3-ий класс)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Bouffon
Здравствуйте, Sarymian!
"ар" у вас определено перед циклом вызывающим процедуру lg(x)... и при даном значении ар=0.5 lg(x) не
должна вызывать ошибку. но при "с" приближающемся к маленькому числу возникае
90; ситуация "ар"<0 и логарифм отрицательного числа выдает ошибку...
совет:
поставте в процедуре lg(x) проверку параметра х на отрицательность...
Приложение:
Ответ отправил: Bouffon (статус: 1-ый класс)
Ответ отправлен: 16.12.2006, 12:26
Отвечает: KiberZero
Здравствуйте, Sarymian!
Прежде всего, я ещё раз хочу отметить, что логарифмов отрицательных чисел не существует.После первого присвоения ар:05 вы получаете отрицательное число(-0,130735666.....) приблизительно -0,13074.При очередном присваивании отрицательного числа, вы получаете логарифм отрицательного числа и пытаетесь его найти,чего делать нельзя.Возникает ошибка.Я не знаю, для чего вам нужно использовать такие операции,но если в них существует такая уж необходимость, то воспользуйтесь не "естественной формой" логарифма,
а "искусственной".Десятичные логарифмы чисел 0,1; 0,01; 0,001 и т.д. равны соответственно -1, -2, -3 и т.д., то есть имеют столько отрицательных единиц, сколько нулей стоит перед единицей.Другими словами, числа, большие единицы,имеют положительные логарифмы, а положительные числа, меньшие единицы - отрицательные логарифмы.Так вот, я предлагаю вам перевести "естественную форму" отрицательного логарифма в "искусственную", которая даёт положит
ельный результат.После этого вы находите логарифм этого числа и переводите полученный результат из "искусственной формы" в "естественную". Таким образом ваш цикл в программе всегда будет работать правильно и компилятор не будет выдавать ошибок,тем самым вы получаете верное решение. Ну, а теперь о самом способе перевода.
Чтобы перевести отрицательный логарифм из "естесственной" формы в "искусственную" необходимо:
1) на единицу увеличить абсолютную величину его характеристики;
2) все цифры мантиссы, кроме последней из цифр, не равных нулю,вычитать из девяти; последнюю, не равную 0, вычесть из десяти.Получаемые разности записываем на тех же местах матиссы,где стояли вычитаемые цифры.
Например: lg 0,5=-0,30102(в естественной форме) приведём к искусственной.Увеличиваем на единицу, получаем 1,30102; далее вычитаем из 9 первую цифру матиссы (3), записываем 1,60102 и т.д. В результате получаем 1,69897.Таким образом результат таков: lg 0,5=-0,30102=1,69897. Далее делаете с числом нужные операции.
Чтобы перевести отрицательный логарифм из "искусственной" формы в "естественную" необходимо:
1) на единицу уменьшить абсолютную величину;
2) полученное число снабдить знаком минус(в Delphi это решается обычным циклом,уменьшая число до тех пор,пока не получится такая же асолютная величина числа,но являющаяся отрицательной);
3) все цифры мантиссы, кроме последней из цифр, не равных нулю,вычитать из девяти; последнюю, не равную 0, вычесть из десяти.Получаемые разности записываем на тех же местах матиссы,где стояли вычитаемые цифры.
Например: 1,81650=-0,18350.
Конечно код в Delphi получается не много запутанным, но составить его не я думаю вас не затруднит.Не отвлекаясь,всё продумывая,код можно составить в течении часа.
На этом всё!
Если же у вас нет такой необходимости расчёта чисел, то просто установите ограничения на ввод чисел, по вашему коду, меньших 1,например, так:
procedure TForm1.Button1Click(Sender: TObject);
var e,a,ap:real;
i,c: integer;
Label Close;
begin
e:= StrToFloat(Edit1.Text);
i:=0;
c:=0;
ap:=0.5;
if e<1 then
begin
Application.MessageBox('Введённое число даст сбой!','Информация');
goto close;
end
else
While c=0 do
begin
i:=i+1;
a:= ((1/2)*lg(ap));
If ABS(a-ap) < e Then
c:=1;
ap:=a;
end;
label1.Caption:= IntToStr(i);
Close:
end;
end.
Если что-то не понятно,возникнут трудности - спрашивайте.
Удачи!
Ответ отправил: KiberZero (статус: 5-ый класс)
Ответ отправлен: 16.12.2006, 18:48
Вопрос № 67.223
Вопрос чисто теоритический, поэтому буду предпочтителнее словесное подробное описание, хотя и от кода программы не откажусь. Нужно вычислить опредилитель например 10 порядка, подскажите метод с помощью которого это можно сделать можно конечно свести к сумме опредилителей 9 порядка м так далее пока не получим сумму опредилителей 3 порядка а их могу вычислить. Но код получится большой и быстродействие маленькое (программа по моим прикидкам будет медлено работать) и вообще опредилитель 10 порядка не должен быть
приделом для программы.
Отправлен: 16.12.2006, 12:43
Вопрос задал: Mikutu (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Алтунин Василий Владимирович
Здравствуйте, Mikutu!
Вот ссылочка там описывается несколько методов вычисления определителя n-го порядка. Имея описание реализовать алгоритм не составит труда http://aig.imi.sitc.ru/study/algebradist/opredn2.pdf
--------- ... Дорогу осилит Идущий ...
Ответ отправил: Алтунин Василий Владимирович (статус: 3-ий класс)
Ответ отправлен: 16.12.2006, 12:50 Оценка за ответ: 5 Комментарий оценки: Спасибо за оперативность
Отвечает: Bouffon
Здравствуйте, Mikutu!
нужно использовать циклы
3 подряд
чтобы правильно переходить по строкам
сейчас у меня нет времени но если нужно я пришлю паскалевскую прогу на эту тему..
пиши 458786618
Ответ отправил: Bouffon (статус: 1-ый класс)
Ответ отправлен: 16.12.2006, 13:54 Оценка за ответ: 5 Комментарий оценки: Спасибо
Отвечает: Morgen_krsk
Здравствуйте, Mikutu!
Нужно привести матрицу в верхнедиагональному виду (метод Гаусса) и определитель будет равен произведению элементов главной диагонали.
Ответ отправил: Morgen_krsk (статус: 2-ой класс)
Ответ отправлен: 16.12.2006, 17:56 Оценка за ответ: 4 Комментарий оценки: Ведь в опредилителе 10 порядка придется приводит к 0 - 36 элементов. По моему не очень оптимальный метод.
Вопрос № 67.263
Уважаемые эксперты подскажите как по нажатию кнопки посимвольно скопировать строчку из Edit'а в динамический массив. Спасибо.
Приложение:
Отправлен: 16.12.2006, 17:13
Вопрос задал: MIXAIL (статус: Посетитель)
Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Minor
Здравствуйте, MIXAIL!
все просто, создаете массив, устанавливаете длинну и копируете как из одного массива в другой, см приложение
Приложение:
--------- Не руби сук, на котором сидишь! Вообще слезь с дерева, человек!
Ответ отправил: Minor (статус: 2-ой класс)
Ответ отправлен: 16.12.2006, 20:22 Оценка за ответ: 5 Комментарий оценки: Спасибо. Попробую.
Отвечает: KiberZero
Здравствуйте, MIXAIL!
Не знаю, для чего, какую цель вы преследуете,но пожалуй, для работы со строкой вполне достаточно функции Length(s).
Например:
procedure TForm1.Button1Click(Sender: TObject);
var i,n:integer;
s:string;
begin
s:=Edit1.Text;
n:=Length(s); //измеряем длину строки
for i:=1 to n do
Edit2.Text:=s[5]; //выводим в Edit2 символ под номером пять
end;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
mas=array of integer; //объявляем массив
var
Form1: TForm1;
a:mas; //объявляем переменную массива
n:integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var i,n:integer;
s:string;
begin
s:=Edit1.Text;
s:=Trim(s);
n:=Length(s); //измеряем длину строки
SetLength(a,n); //Задаём размерность массива
begin
for i:=0 to n-1 do
a[i]:=i+1; //заполняем массив- тут в принципи всё!
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Clear;
Edit2.Clear;
SetLength(a,0); //устанавливаем началбную границу массива
end;
end.
Ещё добавлю, после заполнения массива,то к переменной этого массива можно применять функции Length,Higth(наибольшее значение индекса), Low(наименьшее значение индекса).
И помните, что индексы динамического массива - всегда целые числа, начинающиеся с нуля.
Удачи!
Ответ отправил: KiberZero (статус: 5-ый класс)
Ответ отправлен: 16.12.2006, 23:21 Оценка за ответ: 5 Комментарий оценки: Спасибо. Попробую разобраться
Отвечает: Bouffon
Здравствуйте, MIXAIL!
присваиваешь значение едита строке например s;
s:=edit1.text;
у тебя есть массив например
d:array of char; // прописываешь в переменных
в коде до присвоения массиву значений пропиши определение размера массива
setlength(d,(length(s)+1));
теперь цикл
ну вобщем смотри процедуру
если что непонятно пиши 458786618
procedure TForm1.Button1Click(Sender: TObject);
var
d:array of char;
i:integer;
s:string;
begin
s:=edit1.Text;
setlength(d,length(s)+1);
for i:=0 to high(d)-1 do
begin
d[i]:=s[i+1];
end;
end;
Ответ отправил: Bouffon (статус: 1-ый класс)
Ответ отправлен: 17.12.2006, 04:29 Оценка за ответ: 5 Комментарий оценки: Спасибо
Отвечает: PaVeL_Ekt
Здравствуйте, MIXAIL!
К выше изложенным ответам добавлю копирование символа в массив при вводе в едит нового символа: хотя в принципе структура переменной типа String и является массивом.
Где MasStr Массив (либо String либо Char) Объявленный глобально.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
setlength(MasStr,length(MasStr)+1);
MasStr[Length(MasStr)-1]:=key;
end;
--------- Да поможет Вам F1, да сохранит Вас F2, во имя CTRL, ALT и святого DEL
Ответ отправил: PaVeL_Ekt (статус: 10-ый класс)
Ответ отправлен: 18.12.2006, 13:33 Оценка за ответ: 5 Комментарий оценки: Интересно!!!