Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Delphi > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 02.05.2014, 13:10   #1
WeezyWayne
Пользователь
 
Регистрация: 26.04.2014
Сообщений: 26
По умолчанию Умножение\Сложение\Сравнение чисел

Код:

Код:
var
a:integer;
begin
for a:=Memo1.Lines.Count-1 downto 0 do
begin
if (StrToFloat(Copy(Memo1.Lines[a],Pos('[Price1]',Memo1.Lines[a])+14,Pos('[/Price1]',Memo1.Lines[a])
-Pos('[WithoutPrice]',Memo1.Lines[a])-14))<= StrToFloat(Format('%1.2f', [StrToFloat(Copy(Memo1.Lines[a],Pos('[Price]',Memo1.Lines[a])
+7,Pos('[/Price]',Memo1.Lines[a])-Pos('[Price]',Memo1.Lines[a])-7))*StrToFloat('0,'+Edit7.Text)
+StrToFloat(Copy(Memo1.Lines[a],Pos('[Price]',Memo1.Lines[a])+7,Pos('[/Price]',Memo1.Lines[a])-Pos('[Price]',Memo1.Lines[a])-7))])))  then

 begin
Memo1.Lines.Delete(a);
 end
 else
 begin
Memo2.Lines.Add(Memo1.Lines[a])
 end;
end;
end;
В Memo1 данные такого типа:

Код:
[Price]3,30[/Price][Price1]3,21[/Price1]
[Price]1,20[/Price][Price1]3,81[/Price1]
[Price]4,28[/Price][Price1]2,31[/Price1]
Код должен сравнивать 2 числа между тегами [Price][/Price] и [Price1][/Price1], но с начала он должен определить 30% от числа в теге [Price][/Price] и прибавить их к нему же, а потом уже сравнить.
Определяет по такой формуле :
Допустим что наше число 2 и нам нужно получить 30% от него 2*0,30+2.
Если число в тегах [Price][/Price] после добавления 30% меньше [Price][/Price1], то удаляем строку в memo1, если же наоборот, то добавляем всю строку в memo2.
Код проверял, вроде бы нормально состряпал, но как доходит до дела, то он не всегда правильно кидает в memo2.
Просмотрите его, может быть я что не так понял

Последний раз редактировалось Stilet; 02.05.2014 в 14:42.
WeezyWayne вне форума Ответить с цитированием
Старый 02.05.2014, 13:15   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

кто ж в этом ужасе разбираться будет?

вы бы по проще писали, тогда и вопросы не появлялись, наверное
eval вне форума Ответить с цитированием
Старый 02.05.2014, 14:29   #3
WeezyWayne
Пользователь
 
Регистрация: 26.04.2014
Сообщений: 26
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
кто ж в этом ужасе разбираться будет?

вы бы по проще писали, тогда и вопросы не появлялись, наверное
Не много подправил, но куда проще этого уже не знаю

Код:
var
a:integer;
price,price1:Extended;
begin
price:=StrToFloat(Copy(Memo1.Lines[a],Pos('[Price]',Memo1.Lines[a])+7,Pos('[/Price]',Memo1.Lines[a])-Pos('[Price]',Memo1.Lines[a])-7));
price1:=StrToFloat(Copy(Memo1.Lines[a],Pos('[Price1]',Memo1.Lines[a])+8,Pos('[/Price1]',Memo1.Lines[a])-Pos('[Price1]',Memo1.Lines[a])-8));
for a:=Memo1.Lines.Count-1 downto 0 do
begin
if price1 <= StrToFloat(Format('%1.2f', [price*StrToFloat('0,'+Edit7.Text)+price])) then
 begin
Memo1.Lines.Delete(a);
 end
 else
 begin
Memo2.Lines.Add(Memo1.Lines[a])
 end;
end;
end;

Последний раз редактировалось WeezyWayne; 02.05.2014 в 19:33.
WeezyWayne вне форума Ответить с цитированием
Старый 02.05.2014, 14:38   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,305
По умолчанию

Разбейте это чудовище на нормальные шаги:
1. Извлечение price
2. Извлечение price1
3. Ваша бизнес-логика, также разбитая на этапы
3a. к примеру priice30=price*1.3
Ну и так далее.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 02.05.2014, 14:50   #5
WeezyWayne
Пользователь
 
Регистрация: 26.04.2014
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Разбейте это чудовище на нормальные шаги:
1. Извлечение price
2. Извлечение price1
3. Ваша бизнес-логика, также разбитая на этапы
3a. к примеру priice30=price*1.3
Ну и так далее.
Дак по сути не чего не изменится, только лишь код станет более читабелен.
Или же я ошибаюсь ?
Просто не когда не задумывался что объём функции может повлиять на работоспособность.
WeezyWayne вне форума Ответить с цитированием
Старый 02.05.2014, 14:58   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

Как раз плохая читабельность и затрудняет поиск ошибки
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.05.2014, 19:38   #7
WeezyWayne
Пользователь
 
Регистрация: 26.04.2014
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Как раз плохая читабельность и затрудняет поиск ошибки
Вот что намалевал

Код:
var
a:integer;
price,price1,calc:Extended;
begin
price:=StrToFloat(Copy(Memo1.Lines[a],Pos('[Price]',Memo1.Lines[a])+7,Pos('[/Price]',Memo1.Lines[a])-Pos('[Price]',Memo1.Lines[a])-7));
price1:=StrToFloat(Copy(Memo1.Lines[a],Pos('[Price1]',Memo1.Lines[a])+8,Pos('[/Price1]',Memo1.Lines[a])-Pos('[Price1]',Memo1.Lines[a])-8));
calc:=price + (price/100*20);
for a:=Memo1.Lines.Count-1 downto 0 do
begin
if price1 <= StrToFloat(Format('%1.2f', [calc])) then
 begin
Memo1.Lines.Delete(a);
 end
 else
 begin
Memo2.Lines.Add(Memo1.Lines[a])
 end;
end;
end;
Щас по другому вычисляю. Надеюсь будет работать, пока что нет возможности проверить
WeezyWayne вне форума Ответить с цитированием
Старый 02.05.2014, 20:07   #8
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

Цитата:
StrToFloat(Format('%1.2f', [calc]))
это лажа, переливание из пустого в порожнее
eval вне форума Ответить с цитированием
Старый 02.05.2014, 20:15   #9
WeezyWayne
Пользователь
 
Регистрация: 26.04.2014
Сообщений: 26
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
это лажа, переливание из пустого в порожнее
Мне нужно ограничить числа после запятой и это первое что я нагуглил)
WeezyWayne вне форума Ответить с цитированием
Старый 02.05.2014, 20:32   #10
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,305
По умолчанию

Цитата:
Для начала нужно подключить модуль математических функций Math, чтобы получить доступ к интересующим нас функциям.

Синтаксис функции RoundTo() таков:

RoundTo(число; кол-во_знаков);

function RoundTo(const AValue: Double; const ADigit: TRoundToRange): Double;


Здесь AValue – округляемое число типа Double, объявленное как константа. ADigit – порядок округления, то есть фактически количество знаков, которое должно остаться в дробной части после округления. ADigit также объявлен как константа типа TRoundToRange. Сама функция тоже имеет тип Double. На будущее заметим, что опытные программисты используют для хранения вещественных чисел не Double, а Extended, как более точный тип. Кроме того, для чисел, округляемых не более чем до четвертого знака после запятой, можно использовать тип Currency, который хранит данные как масштабированное целое значение, исключая проблему с погрешностями при вычислениях.
Как бэ нагуглилось - лень самому описывать.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу, выполняющую по выбору сложение, вычитание, умножение или деление нацело двух многоразрядных чисел. dmitriy20104 Паскаль, Turbo Pascal, PascalABC.NET 1 20.08.2012 19:12
Уважаемые программисты, отзовитесь. (С++) Арифметические действия для комплексных чисел (сложение, вычитание, умножение и деление) Meurtre Помощь студентам 4 19.12.2011 01:15
[Tasm]Сложение/Умножение длинных чисел falcon92 Помощь студентам 0 17.11.2010 16:34
Сложение и умножение korzunmaria Помощь студентам 3 20.05.2010 20:07
Сложение и умножение korzunmaria Паскаль, Turbo Pascal, PascalABC.NET 3 20.05.2010 19:01


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS