Новые книги

Скидки и распродажи – всего лишь самые простые и вовсе не самые эффективные методы увеличения объема продаж. В действительности арсенал стимулирования продаж огромен и разнообразен и позволяет разработать не просто промоакции, а настоящие маркетинговые шедевры. Причем некоторые из них – совершенно бесплатно. В этой книге вы найдете много идей для организации ярких промокампаний.
• The only project book on the PIC 18 series using the C programming language

• Features 20 complete, tried and test projects

• Includes a CD-ROM of all the programs, hex listings, diagrams, and data sheets

Вопрос и Ответ 54

Вопросы и Ответы


      54. Как представить число его прописным эквивалентом?

      Простых путей решения этой проблемы не существует и приходится писать процедуру разбора числа. Задача сводится к разбору числа на триады (...1,234,567) начиная с конца, а уже в них происходит конечный разбор трехзначного числа и формирование его прописного эквивалента с учетом добавления "тысяч", "миллионов" и т.д.

      Единственное, необходимо помнить о роде "добавки" (одна тысяча, один миллион) и разницы написания (одна тысяча, две тысячи и пять тысяч)...

      Пример:

      ............

      CONST

        MAX3 = 5; {Максимальное количество триад}

        A11: ARRAY[1..2] OF STRING[20] = ('одна ', 'две ');

        A1: ARRAY[0..19] OF STRING [20] = ('', 'один ', 'два ','три ', 'четыре ', 'пять ', 'шесть ', 'семь ', 'восемь ', 'девять ', 'десять ', 'одиннадцать ', 'двенадцать ', 'тринадцать ', 'четырнадцать ', 'пятнадцать ', 'шестнадцать ', 'семнадцать ', 'восемнадцать ', 'девятнадцать ');

        A10: ARRAY[0..9] OF STRING [20] = ('', 'десять ', 'двадцать ', 'тридцать ', 'сорок ', 'пятьдесят ', 'шестьдесят ', 'семьдесят ', 'восемьдесят ', 'девяносто ');

        A100: ARRAY[0..9] OF STRING[20]= ('', 'сто ', 'двести ', 'триста ', 'четыреста ', 'пятьсот ', 'шестьсот ', 'семьсот ', 'восемьсот ', 'девятьсот ');

        {четвертым параметром является обозначение мужского или женского рода,

          где '0' - женский род;
          '1' - мужской род.

        Это дает возможность, например, изменяя "рубли" на "штуки" просто поменять '1' на '0' не меняя кода.}
        A0: ARRAY[0..MAX3-1, 0..3] OF STRING[20]= (('рубль', 'рубля', 'рублей', '1'), ('тысяча', 'тысячи', 'тысяч', '0'), ('миллион', 'миллиона', 'миллионов', '1'), ('миллиард', 'миллиарда', 'миллиардов', '1'), ('триллион', 'триллиона', 'триллионов', '1'));

      procedure TForm1.Edit1Change(Sender: TObject);
      VAR

        Value: LongInt;
        i100, i10, i1: Integer;
        V, p, n, i: Integer;

      begin

        TRY

          Value := StrToInt(Edit1.Text);
          Memo1.Clear;
          n := 0;
          {Обработка отрицательного значения и нуля}
          IF Value <0 THEN BEGIN

            Memo1.Lines.Add('минус');
            Value := -Value;

          END
          ELSE

            IF Value = 0 THEN Memo1.Lines.Add('ноль')
            ELSE Memo1.Lines.Add('');

          REPEAT

            {Разбивка на триады с конца}
            V := Value MOD 1000;
            Value := Value DIV 1000;
            {Обработка}
            IF (V > 0) OR (n = 0) THEN BEGIN

              i100 := V DIV 100;
              V := V-(i100*100);
              IF V >= 20 THEN BEGIN

                i1 := V MOD 10;
                V := V DIV 10;
                i10 := V MOD 10;

              END
              ELSE BEGIN

                i1 := V;
                i10 := 0;

              END;
              CASE i1 OF

                1: p := 0;
                2..4: p := 1;
                ELSE p := 2;

              END;
              {Изменение в зависимости от женского или мужского рода}
              IF (A0[n,3] = '0') AND ((i1 = 1) OR (i1 = 2)) THEN

                Memo1.Lines.Insert(1, A100[i100]+A10[i10]+A11[i1]+A0[n,p])

              ELSE

                Memo1.Lines.Insert(1, A100[i100]+A10[i10]+A1[i1]+A0[n,p]);

            END;
            Inc(n);
            {Проверка выхода за максимальное количество триад}
            IF n > MAX3 THEN Exit;

          UNTIL Value <= 0;

        EXCEPT

          Memo1.Clear;
          Memo1.Lines.Add('Ошибка');

        END

      end;

      ............


...предыдущая страница следующая...
оглавление



"Вопрос и Ответ 54"
Copyright © "В помощь Веб-Мастеру" (Alexander D. Belyaev) 2005-2024 .
При перепечатке любого материала видимая ссылка на источник "В помощь Веб-Мастеру" и все имена, ссылки авторов обязательны!
Время генерации страницы: 0.006