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

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

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

Код:

Код:
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
Репутация: 422
По умолчанию

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

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

Цитата:
Сообщение от 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
Адрес: DuckBurg
Сообщений: 18,296
Репутация: 3917
По умолчанию

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

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

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

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

Код:
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
Репутация: 422
По умолчанию

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

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

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

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

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

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


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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу, выполняющую по выбору сложение, вычитание, умножение или деление нацело двух многоразрядных чисел. dmitriy20104 Паскаль 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 Паскаль 3 20.05.2010 19:01


15:09.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.