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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2014, 22:32   #1
PaHaNjkee
Delphi 10 Seattle
Пользователь
 
Аватар для PaHaNjkee
 
Регистрация: 01.11.2010
Сообщений: 90
По умолчанию Правильное окончание слова

Писал программу, возникла проблема, написал функцию может кому-то нужна. Задает правильно окончание слову в зависимости от числа
Код:
function GetTrueEnd(i: integer; str1, str2, str3 : String): string;
begin
if (((i mod 10 = 1) and (i < 100)) and (i <> 11)) then result := str1
else if ((i > 1) and (i <5 )) or (((i mod 10 >= 2) and (i mod 10 <= 4)) and ((i mod 100 < 10) or (i mod 100 >= 20))) then result := str2
else result := str3;
end;
Использование:
Код:
GetTrueEnd(21,'день','дня','дней');
Вернёт: день

Код:
GetTrueEnd(44,'день','дня','дней');
Вернёт: дня

Код:
GetTrueEnd(58,'день','дня','дней');
Вернёт: дней

Последний раз редактировалось PaHaNjkee; 12.03.2014 в 16:01.
PaHaNjkee вне форума Ответить с цитированием
Старый 11.03.2014, 23:20   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

есть косячок.. попробуйте для 111 (а также 211, 311 и т.д):
Цитата:
Код:
111 день
p.s. а на форуме такая задачка неоднократно решалась.. ну, разве что не так универсально
например - тыц
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.03.2014, 16:01   #3
PaHaNjkee
Delphi 10 Seattle
Пользователь
 
Аватар для PaHaNjkee
 
Регистрация: 01.11.2010
Сообщений: 90
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
есть косячок.. попробуйте для 111 (а также 211, 311 и т.д):


p.s. а на форуме такая задачка неоднократно решалась.. ну, разве что не так универсально
например - тыц
Исправил
PaHaNjkee вне форума Ответить с цитированием
Старый 12.03.2014, 19:51   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Код:
Исправил
опять не вышло..
101, 121, 131 и т.д.
у Вас 101 дней, правильно 101 день.


проверял своей функцией:
Код:
function getPadezStr(b : integer; strOdin, strDva, strPyt : String) : string;
var c: integer;
begin
  if b <= 0 then getPadezStr := strPyt
  else begin
    c := b mod 100;
    if (c >= 10) and (c <= 20) then getPadezStr := strPyt
    else
      case (b mod 10) of
        1: getPadezStr := strOdin;
        2..4: getPadezStr := strDva;
        5..9, 0: getPadezStr := strPyt;
      end;
  end;
end;

....
вызывать так же:
getPadezStr(i, 'день','дня','дней');
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.03.2014, 20:34   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Ориентация на последнюю цифру не будет работать правильно.
Нужно брать две последние цифры в диапазоне 0 - 19.
Причём не важно, число меньше или больше 100.

Делим число на 100 и берём остаток от деления.
Проверяем, число больше 10 и меньше 20?
Если попадает в этот диапазон, то:
11 - 19 дней.
Иначе делим число на 10 и берём остаток: 0 дней, 1 день, 2 - 4 дня, 5 - 9 дней.
Вот и всё.
Проверяем:
121 % 100 = 21. 21 % 10 = 1. Получаем 121 день.
111 % 100 = 11. получаем 111 дней.

Код:
int b = dey % 100;
if(b > 10 && b < 20) rez = "дней";
else
{
 b = b % 10;
 switch(b)
   case 1: {rez = "день"; break;}
   case 2..4: {rez = "дня"; break;}
   case 5..9, 0: {rez = "дней";}
}
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 12.03.2014 в 22:04.
Smitt&Wesson вне форума Ответить с цитированием
Старый 12.03.2014, 21:01   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Ориентация на последнюю цифру не будет работать правильно.
Полностью согласен.
Более того, в моём коде именно такой алгорим и реализован

А Вы собственно к чему это написали?
и в коде TC и в моём коде анализируется не одна последняя цифра.

Или Вы это написали, чтобы помочь разобраться всем, кто будет эту тему читать?..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.03.2014, 21:04   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Или Вы это написали, чтобы помочь разобраться всем, кто будет эту тему читать?..
Типа того. Просто развернул это в словарный алгоритм, ну и для сишников это может быть не безынтересно.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 12.03.2014, 21:36   #8
PaHaNjkee
Delphi 10 Seattle
Пользователь
 
Аватар для PaHaNjkee
 
Регистрация: 01.11.2010
Сообщений: 90
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Типа того. Просто развернул это в словарный алгоритм, ну и для сишников это может быть не безынтересно.
Я лишь просто решил поделится, вдруг кому-то пригодится. В моей программе больше 100 переменная быть не может, поэтому мой алгоритм лично мне подходит, ну а так естественно Ваш алгоритм на высоте
PaHaNjkee вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести слова предложения в таком порядке, чтобы последняя буква каждого слова совпадала с первой буквой следующего слова ( java ) huhu Помощь студентам 0 06.04.2012 19:42
окончание работы ололошенько Visual C++ 26 27.09.2010 22:05
окончание ScrollBar Elfist Общие вопросы Delphi 6 26.07.2010 16:35
Окончание слова, в зависимости от числа. Bonio Помощь студентам 4 27.02.2010 19:40
[Delphi] Правильное окончание слова Derol Помощь студентам 2 01.06.2009 07:50