Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 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,011
По умолчанию

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

вы бы по проще писали, тогда и вопросы не появлялись, наверное
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
Сообщений: 17,351
По умолчанию

Разбейте это чудовище на нормальные шаги:
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
Сообщений: 18,922
По умолчанию

Как раз плохая читабельность и затрудняет поиск ошибки
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 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,011
По умолчанию

Цитата:
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
Сообщений: 17,351
По умолчанию

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

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

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

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


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


Купить рекламу на форуме - 42 тыс руб за месяц



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