Помощь - Поиск - Пользователи - Календарь
Полная версия: Задачи на строки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Аристократ
Дали контрольную. Три задачи расколоть не смог. Они достаточно своеобразны.

Помогите пожалуйста решить следующие задачи.

1)Строка содержит арифметическое выражение, состоящее из целых чисел и знаков операций: +, -, *,/ (без скобок). Проверить корректность выражения (в смысле последовательности чисел и знаков операций, унарный «минус» допускается). В случае корректности выражения вычислить его значение.

2)Пусть значение функции f(n) равно количеству символов в русской записи количественного числительного n: f(1) = 4 («один»), f(3) = 3 («три»), f(42) = 9 («сорок два») и т.д. Найти все натуральные n, для которых f(n) = n.


3)Заданное натуральное число n, не превосходящее 1000, записать прописью, то есть вывести соответствующее количественное числительное.
volvo
2 и 3 задачи вообще сводятся к одному и тому же - переводу числа в словесное представление... Смотри в Поиске, решалось, есть как минимум 3 варианта...
Аристократ
volvo, ссылки не подскажешь? че-то не могу найти...(может плохо ищу)...
volvo
Например, тут: цифры
Michael_Rybak
Первая - примитивный парсер. Гугли обратную польскую запись.
klem4
Цитата
унарный «минус» допускается


тоесть такое выражение допустимо:

-3*-12

А такое ?

--3*---12 ?

или

4--3
Аристократ
Volvo, я ознакомился с текстом проги, на который указывает данная тобой ссылка. Там задача, обратная, моей третьей проги.
Но честно говоря я не знаю как её устроить с точности до наоборот для выполнения моей задачи.
volvo
А, ну да... Тебе же наоборот надо, число прописью... К сожалению на форуме есть только решение на С ( если хочешь перевести - вот тут: Задача на строки ), но в интернете есть и для Дельфи, например, здесь: http://www.books.ru/library/delphi_secrets/11.htmDrkb есть еще несколько вариантов)
Аристократ
Цитата(volvo @ 7.06.2007 13:07) *

если хочешь перевести - вот тут: [url=http://forum.pascalnet.ru/index.php?

я слишком слаб для этого. Не изучал никакого другого языка.

Нашел исходник строкового калькулятора. (Очень сложный). Он работает с учетом скобок. Но мне этого не надо. Можно переделать его так, чтобы скобки не учитывались?

мисс_граффити
!
Внимание! Тема нарушает Правила Форума. Вам дается один час на исправление темы. Для изменения заголовка редактируйте первый пост. Тему будет закрыта или удалена в случае невыполнения требований Правил.

К посетителям просьба: не отвечать в тему, нарушающую Правила. Спасибо.

мисс_граффити

Надоело каждому говорить: ну почитай правила, пожааалуйста. Ну переменуй темку.
Не способны прочитать две строки вверху страницы - это не мои проблемы.
Аристократ
я не вижу надписи- редактировать сообщение( в первом посте)
Аристократ
отредактируйте пожалуйста сами тему, ну не получается редактировать первое сообщение
Аристократ
спасибо, есть какие-нибудь предложения?
volvo
Я тебе дал ссылку на Дельфи-реализацию того, что ты просил (сообщение №8, предпоследняя ссылка - программа с минимальными изменениями компилируется в Турбо-Паскале, проверено только что), тебе не понравилось, или ты не соизволил посмотреть (это не имеет в данном случае значения) - что еще ты хочешь? Чтобы тебе опять что-нибудь сделали, и тебе опять не понравилось? Спасибо, уже было такое...
klem4
Цитата
спасибо, есть какие-нибудь предложения?



Они также могу появиться, когда ты перестанешь игнорироваться вопросы, которые тебе задают.
Аристократ
Цитата(klem4 @ 9.06.2007 7:32) *

Они также могу появиться, когда ты перестанешь игнорироваться вопросы, которые тебе задают.

klem4.спасибо , строковый калькулятор уже есть. А вот другие проги мне еще предстоить приготовить


Добавлено через 19 мин.
Цитата(volvo @ 8.06.2007 20:05) *

Я тебе дал ссылку на Дельфи-реализацию того, что ты просил (сообщение №8, предпоследняя ссылка - программа с минимальными изменениями компилируется в Турбо-Паскале, проверено только что), тебе не понравилось, или ты не соизволил посмотреть (это не имеет в данном случае значения) - что еще ты хочешь? Чтобы тебе опять что-нибудь сделали, и тебе опять не понравилось? Спасибо, уже было такое...

Volvo, я смотрел исходник на дельфи строка
t := t + IntToStr(i) + ' коп.';
компилятор Pascal естественно вызывает ошибку неизвестный идентификатор . Как избавиться от этого. Чтобы применить данную тобой программу надо, как я понял надо исправить применять данную функцию
и применить следующим образом

Var k: Integer;
Begin 
Write(‘vvedite stroku’);
Readln(k);
TextSum(k);
Readln;
End; 


Вот решил еще раз разместить эту функцию

function TextSum(S: double): string;

  function Conv999(M: longint; fm: integer): string;
  const
    c1to9m: array [1..9] of string[6] =
      ('один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь','девять');
    c1to9f: array [1..9] of string[6] = ('одна', 'две', 'три', 'четыре', 'пять',
                                          'шесть', 'семь', 'восемь', 'девять');
    c11to19: array [1..9] of string[12] =
       ('одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать',
        'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать');
    c10to90: array [1..9] of string[11] =
       ('десять', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят',
        'семьдесят', 'восемьдесят', 'девяносто');
    c100to900: array [1..9] of string[9] =
       ('сто', 'двести', 'триста', 'четыреста', 'пятьсот',
        'шестьсот', 'семьсот', 'восемьсот', 'девятьсот');

var
  s: String;
  i: Longint;
begin
  s := '';
  i := M div 100;
  if I <> 0 then s := c100to900[i] + ' ';
  M := M mod 100;
  i := M div 10;
  if (M > 10) and (M < 20) then
    s := s + c11to19[M - 10] + ' '
  else begin
    if I <> 0 then s := s + c10to90[i] + ' ';
    M := M mod 10;
    if M <> 0 then
      if fm = 0 then s := s + c1to9f[M] + ' '
      else s := s + c1to9m[M] + ' ';
  end;
  Conv999 := s;
end;

var
  i: Longint;
  j: Longint;
  r: Real;
  t: String;
begin
  t := '';
  j := Trunc(S / 1000000000.0);
  r := j;
  r := S - r*1000000000.0;
  i := Trunc(r);
  if j <> 0 then begin
    t := t + Conv999(j, 1) + 'миллиард';
    j := j mod 100;
    if (j > 10) and (j < 20) then t := t + 'ов '
    else
      case j mod 10 of
         0:  t := t + 'ов ';
         1:  t := t + ' ';
      2..4:  t := t + 'а ';
      5..9:  t := t + 'ов ';
      end;
  end;
  j := i div 1000000;
  if j <> 0 then begin
    t := t + Conv999(j, 1) + 'миллион';
    j := j mod 100;
    if (j > 10) and (j < 20) then t := t + 'ов '
    else
      case j mod 10 of
         0:  t := t + 'ов ';
         1:  t := t + ' ';
      2..4:  t := t + 'а ';
      5..9:  t := t + 'ов ';
      end;
  end;
  i := i mod 1000000;
  j := i div 1000;
  if j <> 0 then begin
    t := t + Conv999(j, 0) + 'тысяч';
    j := j mod 100;
    if (j > 10) and (j < 20) then t := t + ' '
    else
      case j mod 10 of
           0:  t := t + ' ';
           1:  t := t + 'а ';
        2..4:  t := t + 'и ';
        5..9:  t := t + ' ';
      end;
  end;
  i := i mod 1000;
  j := i;
  if j <> 0 then t := t + Conv999(j, 1);
  t := t + 'руб. ';
  i := Round(Frac(S)*100.0);
  t := t + IntToStr(i) + ' коп.';
  TextSum := t;
end;


volvo
Цитата
Как избавиться от этого.
Смотреть Help на процедуру Str, там приведена реализация IntToStr:
function IntToStr(I: Longint): String;
{ Convert any integer type to a string }
var S: string[11];
begin
  Str(I, S);
  IntToStr := S;
end;

begin
  Writeln(IntToStr(-5322));
end.

Аристократ
спасибо. volvo, все хорошо работает , а по второй задаче есть что-нибудь?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.