Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите решить задачу с функцией
 
 автор: Исильдур   (20.02.2013 в 21:03)   письмо автору
 
 

Здравствуйте уважаемые форумчане!
Пробую написать функцию, которая принимает один параметр - целое число.
И возвращает это же число + слово "программистов" в нужном склонении.
Я написал так:
<?php
function myfunc($int){
//Число цифр
$count count($int);
//Отрезаем последнюю
$end_char substr($int, -11);
//Сравниваем окончание
switch($end_char){
    case 
'0'$end 'тов'; break;
    case 
'1'$end 'т';   break;
    case 
'2'$end 'та';  break;
    case 
'3'$end 'та';  break;
    case 
'4'$end 'та';  break;
    case 
'5'$end 'тов'; break;
    case 
'6'$end 'тов'; break;
    case 
'7'$end 'тов'; break;
    case 
'8'$end 'тов'; break;
    case 
'9'$end 'тов'; break;

    }
return 
$int.' программис'.$end;

}
echo 
myfunc(55);
?>

Но в таком случае если передать число 11, то результат будет "11 программист".
И с цифрами до 20 слово не правильно склоняется.
Буду благодарен за любую помощь.

  Ответить  
 
 автор: Северьян   (20.02.2013 в 23:04)   письмо автору
 
   для: Исильдур   (20.02.2013 в 21:03)
 

Могу предложить как-то так:

<?php
function myfunc($int) {
   
settype($int,"string");
   
$end_char substr($int,-1,1);
   
$count strlen($int);
   if(
$count >= 2) {
      
$dec_char $int[$count 2];
      if(
$dec_char == '1') {
         
$end_word 'тов';
         }
      }     
   else {
      switch(
$end_char) {
         case 
'1'$end_word 'т'; break;
         case 
'2'$end_word 'та'; break;
         case 
'3'$end_word 'та'; break;
         case 
'4'$end_word 'та'; break;    
         default: 
$end_word 'тов';
         }
       }
   return 
$int ' программис' $end_word;      
   }
   
echo 
myfunc(11);
?> 

  Ответить  
 
 автор: Valick   (20.02.2013 в 23:52)   письмо автору
 
   для: Северьян   (20.02.2013 в 23:04)
 

121 программис ? :)

  Ответить  
 
 автор: Северьян   (21.02.2013 в 00:19)   письмо автору
 
   для: Valick   (20.02.2013 в 23:52)
 

Приношу свои извинения. Я только учусь... Тогда как-то так:

<?php
function myfunc($int) {
   
settype($int,"string");
   
$end_char substr($int,-1,1);
   
$count strlen($int);
   if(
$count >= 2) {
      
$dec_char $int[$count 2];
      if(
$dec_char == '1') {
         
$end_word 'тов';
         }
      else {
         switch(
$end_char) {
            case 
'1'$end_word 'т'; break;
            case 
'2'$end_word 'та'; break;
            case 
'3'$end_word 'та'; break;
            case 
'4'$end_word 'та'; break;    
            default: 
$end_word 'тов';
            }
         }
      }  
   if(
$count == 1) {
      switch(
$end_char) {
         case 
'1'$end_word 'т'; break;
         case 
'2'$end_word 'та'; break;
         case 
'3'$end_word 'та'; break;
         case 
'4'$end_word 'та'; break;    
         default: 
$end_word 'тов';
         }
      }                
   return 
$int ' программис' $end_word;      
   };
echo 
myfunc(121);
?> 

  Ответить  
 
 автор: Исильдур   (20.02.2013 в 23:54)   письмо автору
 
   для: Северьян   (20.02.2013 в 23:04)
 

Спасибо за предоставленное решение, но и оно не работает должным образом)) При передаче числа 22 результат:
Notice: Undefined variable: end_word in /var/www/index.php on line 47 22 программис 

Завтра попробую еще порешать на свежую голову.

  Ответить  
 
 автор: Valick   (21.02.2013 в 00:08)   письмо автору
 
   для: Исильдур   (20.02.2013 в 23:54)
 

function NumberEnd($number, $titles) {
    $cases = array (2, 0, 1, 1, 1, 2);
    return $titles[ ($number%100>4 && $number%100<20)? 2 : $cases[min($number%10, 5)] ];
}
$a = 12;
echo $a.' программист'.NumberEnd($a, array('','а','ов'));

  Ответить  
 
 автор: Исильдур   (21.02.2013 в 00:15)   письмо автору
 
   для: Valick   (21.02.2013 в 00:08)
 

Большое Спасибо!
Мне бы пожалуй до такого было не додуматься))

  Ответить  
 
 автор: Valick   (21.02.2013 в 00:34)   письмо автору
 
   для: Исильдур   (21.02.2013 в 00:15)
 

я бы может и додумался, а может и другой вариант "родил"
хотя применить целочисленное деление была мысль

  Ответить  
 
 автор: Северьян   (21.02.2013 в 00:23)   письмо автору
 
   для: Valick   (21.02.2013 в 00:08)
 

Рука опытного - налицо. Нам учиться и учиться... Э-е-х..

  Ответить  
 
 автор: Valick   (21.02.2013 в 00:30)   письмо автору
 
   для: Северьян   (21.02.2013 в 00:23)
 

гугл первый помошник :)
Блог Вячеслава Волкова
Хотя я думаю и Вячеслав тоже не автор этого варианта

и только потом мозг ;)

  Ответить  
 
 автор: Северьян   (21.02.2013 в 00:36)   письмо автору
 
   для: Valick   (21.02.2013 в 00:30)
 

Спасибо, Valick, за ссылку. Будем учиться...

  Ответить  
 
 автор: Valick   (21.02.2013 в 00:48)   письмо автору
 
   для: Северьян   (21.02.2013 в 00:36)
 

Учиться это хорошо, вот откопал алгоритм столько лет прошло, а я его часто вспоминаю
http://softtime.ru/forum/read.php?id_forum=1&id_theme=57979
задача интересная
попробуйте реализовать
там конечно в конце есть мой вариант, но его не обязательно сразу подглядывать :)
____
есть еще не менее интересная, но немного более сложная задача
http://softtime.ru/forum/read.php?id_forum=3&id_theme=85595
имненно на таких достаточно специфических задачах и тренируется логика

  Ответить  
 
 автор: Исильдур   (21.02.2013 в 01:19)   письмо автору
 
   для: Valick   (21.02.2013 в 00:48)
 

Valick спасибо еще раз, будем алгоритмическое мышление развивать))

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования