Дали контрольную. Три задачи расколоть не смог. Они достаточно своеобразны.
Помогите пожалуйста решить следующие задачи.
1)Строка содержит арифметическое выражение, состоящее из целых чисел и знаков операций: +, -, *,/ (без скобок). Проверить корректность выражения (в смысле последовательности чисел и знаков операций, унарный «минус» допускается). В случае корректности выражения вычислить его значение.
2)Пусть значение функции f(n) равно количеству символов в русской записи количественного числительного n: f(1) = 4 («один»), f(3) = 3 («три»), f(42) = 9 («сорок два») и т.д. Найти все натуральные n, для которых f(n) = n.
3)Заданное натуральное число n, не превосходящее 1000, записать прописью, то есть вывести соответствующее количественное числительное.
volvo
6.06.2007 13:13
2 и 3 задачи вообще сводятся к одному и тому же - переводу числа в словесное представление... Смотри в Поиске, решалось, есть как минимум 3 варианта...
Аристократ
6.06.2007 15:36
volvo, ссылки не подскажешь? че-то не могу найти...(может плохо ищу)...
Первая - примитивный парсер. Гугли обратную польскую запись.
klem4
6.06.2007 17:54
Цитата
унарный «минус» допускается
тоесть такое выражение допустимо:
-3*-12
А такое ?
--3*---12 ?
или
4--3
Аристократ
7.06.2007 12:46
Volvo, я ознакомился с текстом проги, на который указывает данная тобой ссылка. Там задача, обратная, моей третьей проги. Но честно говоря я не знаю как её устроить с точности до наоборот для выполнения моей задачи.
volvo
7.06.2007 13:07
А, ну да... Тебе же наоборот надо, число прописью... К сожалению на форуме есть только решение на С ( если хочешь перевести - вот тут: Задача на строки ), но в интернете есть и для Дельфи, например, здесь: http://www.books.ru/library/delphi_secrets/11.htm (в Drkb есть еще несколько вариантов)
Аристократ
7.06.2007 13:14
Цитата(volvo @ 7.06.2007 13:07)
если хочешь перевести - вот тут: [url=http://forum.pascalnet.ru/index.php?
я слишком слаб для этого. Не изучал никакого другого языка.
Нашел исходник строкового калькулятора. (Очень сложный). Он работает с учетом скобок. Но мне этого не надо. Можно переделать его так, чтобы скобки не учитывались?
мисс_граффити
7.06.2007 13:23
!
Внимание! Тема нарушает Правила Форума. Вам дается один час на исправление темы. Для изменения заголовка редактируйте первый пост. Тему будет закрыта или удалена в случае невыполнения требований Правил.
К посетителям просьба: не отвечать в тему, нарушающую Правила. Спасибо.
мисс_граффити
Надоело каждому говорить: ну почитай правила, пожааалуйста. Ну переменуй темку. Не способны прочитать две строки вверху страницы - это не мои проблемы.
Аристократ
7.06.2007 13:49
я не вижу надписи- редактировать сообщение( в первом посте)
Аристократ
8.06.2007 8:52
отредактируйте пожалуйста сами тему, ну не получается редактировать первое сообщение
Аристократ
8.06.2007 19:52
спасибо, есть какие-нибудь предложения?
volvo
8.06.2007 20:05
Я тебе дал ссылку на Дельфи-реализацию того, что ты просил (сообщение №8, предпоследняя ссылка - программа с минимальными изменениями компилируется в Турбо-Паскале, проверено только что), тебе не понравилось, или ты не соизволил посмотреть (это не имеет в данном случае значения) - что еще ты хочешь? Чтобы тебе опять что-нибудь сделали, и тебе опять не понравилось? Спасибо, уже было такое...
klem4
9.06.2007 7:32
Цитата
спасибо, есть какие-нибудь предложения?
Они также могу появиться, когда ты перестанешь игнорироваться вопросы, которые тебе задают.
Аристократ
9.06.2007 14:38
Цитата(klem4 @ 9.06.2007 7:32)
Они также могу появиться, когда ты перестанешь игнорироваться вопросы, которые тебе задают.
klem4.спасибо , строковый калькулятор уже есть. А вот другие проги мне еще предстоить приготовить
Добавлено через 19 мин.
Цитата(volvo @ 8.06.2007 20:05)
Я тебе дал ссылку на Дельфи-реализацию того, что ты просил (сообщение №8, предпоследняя ссылка - программа с минимальными изменениями компилируется в Турбо-Паскале, проверено только что), тебе не понравилось, или ты не соизволил посмотреть (это не имеет в данном случае значения) - что еще ты хочешь? Чтобы тебе опять что-нибудь сделали, и тебе опять не понравилось? Спасибо, уже было такое...
Volvo, я смотрел исходник на дельфи строка t := t + IntToStr(i) + ' коп.'; компилятор Pascal естественно вызывает ошибку неизвестный идентификатор . Как избавиться от этого. Чтобы применить данную тобой программу надо, как я понял надо исправить применять данную функцию и применить следующим образом
Var k: Integer;
BeginWrite(‘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] ofstring[6] =
('один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь','девять');
c1to9f: array [1..9] ofstring[6] = ('одна', 'две', 'три', 'четыре', 'пять',
'шесть', 'семь', 'восемь', 'девять');
c11to19: array [1..9] ofstring[12] =
('одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать',
'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать');
c10to90: array [1..9] ofstring[11] =
('десять', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят',
'семьдесят', 'восемьдесят', 'девяносто');
c100to900: array [1..9] ofstring[9] =
('сто', 'двести', 'триста', 'четыреста', 'пятьсот',
'шестьсот', 'семьсот', 'восемьсот', 'девятьсот');
var
s: String;
i: Longint;
begin
s := '';
i := M div100;
if I <> 0then s := c100to900[i] + ' ';
M := M mod100;
i := M div10;
if (M > 10) and (M < 20) then
s := s + c11to19[M - 10] + ' 'elsebeginif I <> 0then s := s + c10to90[i] + ' ';
M := M mod10;
if M <> 0thenif fm = 0then 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 <> 0thenbegin
t := t + Conv999(j, 1) + 'миллиард';
j := j mod100;
if (j > 10) and (j < 20) then t := t + 'ов 'elsecase j mod10of0: t := t + 'ов ';
1: t := t + ' ';
2..4: t := t + 'а ';
5..9: t := t + 'ов ';
end;
end;
j := i div1000000;
if j <> 0thenbegin
t := t + Conv999(j, 1) + 'миллион';
j := j mod100;
if (j > 10) and (j < 20) then t := t + 'ов 'elsecase j mod10of0: t := t + 'ов ';
1: t := t + ' ';
2..4: t := t + 'а ';
5..9: t := t + 'ов ';
end;
end;
i := i mod1000000;
j := i div1000;
if j <> 0thenbegin
t := t + Conv999(j, 0) + 'тысяч';
j := j mod100;
if (j > 10) and (j < 20) then t := t + ' 'elsecase j mod10of0: t := t + ' ';
1: t := t + 'а ';
2..4: t := t + 'и ';
5..9: t := t + ' ';
end;
end;
i := i mod1000;
j := i;
if j <> 0then t := t + Conv999(j, 1);
t := t + 'руб. ';
i := Round(Frac(S)*100.0);
t := t + IntToStr(i) + ' коп.';
TextSum := t;
end;
volvo
9.06.2007 15:25
Цитата
Как избавиться от этого.
Смотреть 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.
Аристократ
9.06.2007 19:11
спасибо. volvo, все хорошо работает , а по второй задаче есть что-нибудь?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.