1. Си / Говнокод #3428

    +133

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    #include<stdio.h>
    int main()
    {
    	int a;
    	printf("Vvedite svoy vozrast (0-200 let)");
    	scanf("%d",&a);
    	if ((a==11)||(a==12)||(a==13)||(a==14)){printf("mne %d let",a); return 0;}
    	if ((a==111)||(a==112)||(a==113)||(a==114)){printf("mne %d let",a); return 0;}
    	if (a%10==1){printf("mne %d god",a); return 0;}
    	if (a%10==2){printf("mne %d goda",a); return 0;}
    	if (a%10==3){printf("mne %d goda",a); return 0;}
    	if (a%10==4){printf("mne %d goda",a); return 0;}
    	if ((a%10==0)||(a%10==5)||(a%10==6)||(a%10==7)||(a%10==8)||(a%10==9)){printf("mne %d let",a); return 0;}
    	return 0;
    }

    Программа выводит год/года/лет. То есть возраст синтаксически правильно. Вопрос. Это как-нибудь можно написать покороче? Это считается говнокодом?

    Запостил: ForEveR, 09 Июня 2010

    Комментарии (53) RSS

    • На C# когда-то так делал:
      if (age == 1) Console.WriteLine("{0} год!", age);
      else if (age > 2 && age < 5) Console.WriteLine("{0} года!", age);
      else Console.WriteLine("{0} лет!"age);


      Но тут максимум до 20 лет, а тебе ещё можно так сделать:
      if (a%10==1||a%10==2||a%10==3||a%10==4){printf("mne %d god",a); return 0;}
      Ответить
      • ....
        else if (age > 20) Console.WriteLine("Это программа не для старперов");

        ....
        Ответить
        • ...
          else if (age < 20) Console.WriteLine("Это программа для школоты");
          ...
          Ответить
      • Mne 22 god?
        Ответить
        • Читайте внимательнее мой комментарий, комментарий Nagg'а
          Ответить
          • Прочитал, все равно нивукурил. А отвечал на уровень выше Nagg-а.
            Ответить
            • Ну, psina-from-ua говорил про максимум до 20.
              Однако всё равно должно быть :
              else if (age >= 2 && age < 5) Console.WriteLine("{0} года!", age);
              Ответить
    • I am <n> years old
      Ответить
    • Это понятно. Но задача была именно такая.
      Ответить
    • function plural($n, $con, $s1, $s2, $s5)
      {
        if ($n > floor($n)) // если число дробное
        {
          return $con.$s2;
        }
        
        $n = abs($n);
        $i = $n % 10;
        return $con.(
          (floor(($n % 100) / 10) == 1) ? $s5 : (
            ($i == 1) ? $s1 : (
              (($i > 1) && ($i < 5)) ? $s2 : $s5
            )
          )
        );
      }

      Писал когда-то. Выглядит жутко, знаю =3
      echo 'Мне '.$a.plural($a, ' ', 'год', 'года', 'лет');
      Ответить
      • Какой язык?) А то что-то понять не могу
        Ответить
        • PHP
          Ответить
        • подсказка: он здесь популярен
          Ответить
          • а где минус за незнание популярного языка ? ха-ха
            Ответить
            • ну получай
              -1
              Ответить
              • мдя .. логика на высоте
                Ответить
                • ну ты же хуйней страдать любишь, дай и другим пострадать
                  Ответить
                  • Чтоб те всю жизнь страдать.
                    Ответить
                    • атата, батхерт свой напоказ не выставляй, приличное место все же..
                      ты так серьезно относишься к плюсам-минусам, что это уже похоже на плюсоебство, или того хуже - манию. стоит полечится.
                      Ответить
                      • Ну ты мне ещё будешь советовать что делать, а что нет.
                        На плюсы-минусы стало как бы пох, они не объективны в силу несерьёзности данного места. Тут только фан, о чем сказано прямо в заголовке сайта. Однако, не смотря на это можно вести себя культурно, но ты провоцируешь на безобразия.
                        Ответить
      • > echo 'Мне '.$a.plural($a, ' ', 'год', 'года', 'лет');

        Смысл? В разных языках совершено разные правила. Такое АПИ будет работать только для части славянских языков. Для языков, простых в отношении числительных (английский, германский там какой-нибудь), будет ненужный оверхед + лишние аргументы. Для некоторых языков функция будет нерабочая. Поэтому смысла выствалять так на показ вариации нет.

        По уму надо для каждого языка делать отдельный языковой класс и переопределять метод что-то вроде string ::GetYearsString(int n).
        Ответить
        • Э-э-э, а я разве где-то говорил, что собирался писать универсальную функцию под разные языки? Всего лишь скопипастил свой старый код, писавшийся под русский язык и ни под что другое. Всё остальное Вы додумали сами и зачем-то начали от этого вести рассуждения. Я с ними даже соглашусь, но всё-таки к чему они здесь?
          Ответить
          • > разве где-то говорил, что собирался писать универсальную функцию под разные языки

            Замени static string getAgeString(int n) на override string getAgeString(int n) и уверуй!
            Ответить
            • Ну да, так из Вашего-то кода становится понятно стремление. Но
              > а я разве где-то говорил, что собирался писать универсальную функцию под разные языки?
              Как можно было из прямого вопроса про мой код внаглую переключить тему на собственный?..
              Ответить
          • не знаю почему я должен всё расжёвывать, но вот так в псевдоязыке:

            class Language
            {
                   virtual function GetAgeString(int n): String;
            }
            
            factory GetLanguage(langCode: String): Language;
            
            class RussianLanguage
            {
                  override function GetAgeString(int n): String
                  {
                          /* ... */
                  }
            }


            Отдельные модули для отдельных языков реализуют нужный функционал...
            И то этого не хватит, ибо может быть разделение по постпозиции/препозиции...
            Ответить
            • Ты тролль?) Он спрашивает ЗАЧЕМ ему твоя информация, если он НЕ думал писать такую программу
              Ответить
            • Да понял я, понял, могу то же самое на PHP написать, мне не жалко. Но я ещё раз объясняю, я просто скопипастил свой старый код, даже описал, под что он затачивался, И ВСЁ, на кой вокруг этого какие-то языковые рассуждения городить? Какой-то ерундой мы тут занимаемся, честное слово... Всё равно как если взять любые исходники, где есть хардкодные текстовые константы, и начать рассуждать, что реализация i18n - говно. А может, она тут вообще не планировалась?..
              Ответить
              • а нафиг копипастить криво написанный код из какого-то дремучего проекта если можно за две минуты написать нормальный пример?
                Ответить
                • Можно. Но я этого делать не хотел. Просто не хотел, имею право. Посему ожидать от меня "нормальных примеров" как минимум странно, я ничего не должен никому. Я уж не говорю про субъективность понятия "нормальный" и про то, что я не телепат.

                  Ну, блин, клиника, а не обсуждение...
                  Ответить
    • static string getAgeString(int n)
              {
                  if (n <= 0 || n > 120)
                      throw new ArgumentOutOfRangeException();
      
                  if (n > 100)
                      n -= 100;
      
                  if (n >= 11 && n <= 14)
                      return "лет";
      
                  int mod = n % 10;
      
                  if (mod == 1)
                      return "год";
                  else if (mod == 0 || mod >= 5)
                      return "лет";
                  else
                      return "года";
              }
      Ответить
      • Бьярни, чтож ты позоришься-то. Язычок говно, эксепшн этот говнокодерский (всё равно, что c:\\windows хардкодить). У пыхпыхера выше функция куда юзабельнее.
        Ответить
        • > Язычок говно

          И что? Это как-то влияет на алгоритм?

          > эксепшн этот говнокодерский (всё равно, что c:\\windows хардкодить).

          Что за бред? Обычный контракт на аргументы. Люди выше 120 лет не живут.

          > У пыхпыхера выше функция куда юзабельнее.

          Как вышеуказанная "критика" соотносится с юзабельностью? Юзабельность это API, а не внутренняя реализация.
          Ответить
          • >И что? Это как-то влияет на алгоритм?
            Нет, но с твоим ником не гармонирует.

            >Люди выше 120 лет не живут.
            640кб хватит для каждого.

            >Как вышеуказанная "критика" соотносится с юзабельностью?
            Это три разных претензии. Просто не вижу смысла привязываться к слову "год". Бывает, надо и в попугаях мерить, и в килограммах и в бутылках.
            Ответить
            • >>Люди выше 120 лет не живут.
              >640кб хватит для каждого.

              Вы думаете что через 25 лет люди будут жить 120 лет?
              Ответить
              • Люди, прожившие больше 120 лет известны уже сейчас. w:Долгожитель
                И я бы понял ограничение, если бы реализовать сабж для возрастов >120 было бы сложно. Но это не так, поддержка долгожителей делается короче, чем этот эксцепшен. Так какого хрена за просто так делать программу убогой?
                Ответить
      • Обижаете наших (кавказских) старожилов! Что такое, нельзя больше 120 лет жить?!
        Вот из-за таких, как Вы, у нас демографический кризис!!!
        Ответить
      • if (n > 120)
                        throw new ArgumentOutOfRangeException();

        Что-за дискриминация долгожителей? О_о
        Вот купит твою програмку пожилой человек и начнёт юзать, а она в ответ возмёт, да упадёт.
        Ответить
    • Говнокод.ру стал местом для консультаций студентов?
      Ответить
      • Нет, это по-прежнему место самовыражения для школьников.
        Ответить
        • Нужно сделать редирект на хабр, пусть там ЧСВ повышают.
          Ответить
          • Ещё на хабре такого г не хватало, пусть лучше сразу на баш.
            Ответить
      • Я не консультировался, а выкинул несколько необычный код на сайт. А про студентов... Где-то написано что студентам нельзя находится на сайте и скидывать коды?
        Ответить
        • > Я не консультировался
          > Вопрос. Это как-нибудь можно написать покороче?

          а это что?

          > Где-то написано что студентам нельзя находится на сайте и скидывать коды?

          Смотреть на лабы уже всем надоело. Сами такое писали, потому не интересно.
          Ответить
      • Действительно.
        Ответить
    • printf (ngettext ("I'm one year old\n", "I'm %d years old\n", a), a);
      Дополнительный бонус: работает с любым языком через gettext и даже обрабатывает кодировки.
      Ответить

    Добавить комментарий