forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   В чем дело? (http://forum.boolean.name/showthread.php?t=8713)

ssman 25.07.2009 14:51

В чем дело?
 
Мне нужно вывести количество дней. Чтобы читалось "по-русски", нужно менять окончание у слова "день" в зависимости от последней цифры количества дней (см. правила русского языка :) ).

d- кол-во дней, integer.
t- real.
PHP код:

t:=Frac(d*0.1)*10;
    If 
t=1 then dney1:=' день'
    
ELSE 
        If (
t=2) OR (t=3) OR (t=4then dney1:=' дня'
        
ELSE dney1:=' дней'

В итоге когда например если d=22, то t=2 (можете проверить), а dney1=' дней'. В чем ошибка? t ведь считается правильно. Погрешность выставил в МР 0.000001.

ABTOMAT 25.07.2009 16:32

Ответ: В чем дело?
 
Разве в MP нету такой штуки, как MOD ? Что за черезжопство:
t:=Frac(d*0.1)*10;
З.Ы. Сам проверить не могу (MP нет), но что-то мне кааца, что t вычисляется неверно.
Ибо с использованием Mod (на бейсике) твой перебор If (t=2) OR (t=3) OR (t=4) работает отлично. Логика везде одинаковая, что в паскале, что в бейзике, так что у тебя t неверно вычисляется, перепроверь её значение.
PHP код:

Repeat 
    d 
+
    t 
d Mod 10
    
If (d/10Mod 10 <> 1
        
If 1 Then
            d1
$ = "день"
        
Else
            If 
Or Or t=4 Then
                d1
$ = "дня"
            
Else
                
d1$ = "дней"
            
End If
        
End If
    Else
        
d1$ = "дней"
    
End If
    Print 
" "+d1
    Delay 300
Until KeyHit
(1


12121 25.07.2009 17:54

Ответ: В чем дело?
 
Лучше обойтись без else
t:=Frac(d*0.1)*10;
If t=1 then dney1:='день';
If (t=2) OR (t=3) OR (t=4) then dney1:='дня';
If t>4 then dney1:='дней';

ABTOMAT 25.07.2009 18:01

Ответ: В чем дело?
 
Ну, тогда If t>4 then dney1:='дней'; будет работать неправильно, т.к. 'дней' будет и при 0, -> нужно ещё условие

ssman 26.07.2009 00:59

Ответ: В чем дело?
 
сам ты черезжопство, математику учи. Всё помоему элементарно. А t вычисляется 100% правильно. Ошибка в If идет, но изза чего не пойму.

Frac откидывает целую часть своего аргумента.

impersonalis 26.07.2009 01:15

Ответ: В чем дело?
 
Элементарно ещё не значит хорошо.
По-вашему 2+2+2+2 лучше чем 2*4?
Ведь первое же элементарнее!

ABTOMAT 26.07.2009 01:23

Ответ: В чем дело?
 
Цитата:

Ошибка в If идет, но изза чего не пойму.
У меня такой же (копированный из 1-го поста) if работает великолепно
Что говорит дебаггер по поводу t ?

abcdef 26.07.2009 04:22

Ответ: В чем дело?
 
тип real с большими погрешностями даже в элементарных операциях, используй преобразование trunc, а лучше сразу mod.

p.s.: сравнение на равенство ни когда не используй для дробных чисел, надо так: if abs(t-1)<0.001 then ...

Dj_Alex 26.07.2009 19:33

Ответ: В чем дело?
 
проще наверно перевести в string и брать символ крайний справа.

Cliffe Snake 27.07.2009 22:18

Ответ: В чем дело?
 
Вот, парни, не мучайтесь:

PHP код:

program dney;
var
d,integer;
dney1 string;
begin
delay
(1000); d:=0;
repeat
t
:= d mod 10;
dney1:=' дней';
   if (
d<10) or (d>14then
    begin 
       
If t=1 then dney1:=' день' ;
       If (
t>1) and (t<5then dney1:=' дня' 
    
end;
 
setcolor(255,255,255); fillrect(0,0,getwidth,getheight);
 
setcolor(0,0,0);       
 
drawtext(''+d+dney1+'   t='+t,2,2);
 
repaint;
 
delay(1000);
 
d:=d+1;
until (getkeyclicked<>0) or (d>31);
end

200% гарантия работы на МП ;)

Tronix 28.07.2009 11:51

Ответ: В чем дело?
 
Цитата:

Сообщение от impersonalis (Сообщение 111886)
Элементарно ещё не значит хорошо.
По-вашему 2+2+2+2 лучше чем 2*4?
Ведь первое же элементарнее!

Первое в некоторых случаях лучше (быстрее).

ssman 13.08.2009 12:47

Ответ: В чем дело?
 
Всем спасибо, раньше не было времени всё попробовать. Вариант с мод действительно лучший :)


Часовой пояс GMT +4, время: 16:31.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot