Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 687
от 22.12.2006, 09:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 418, Экспертов: 65
В номере:Вопросов: 3, Ответов: 9


Вопрос № 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;

Но, если вам очень нужно, то пожалуйста:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

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
Комментарий оценки:
Интересно!!!


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.38 от 20.12.2006
Яндекс Rambler's Top100

В избранное