Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Задачи на строки

Автор: Аристократ 6.06.2007 17:02

Дали контрольную. Три задачи расколоть не смог. Они достаточно своеобразны.

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

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 17:13

2 и 3 задачи вообще сводятся к одному и тому же - переводу числа в словесное представление... Смотри в Поиске, решалось, есть как минимум 3 варианта...

Автор: Аристократ 6.06.2007 19:36

volvo, ссылки не подскажешь? че-то не могу найти...(может плохо ищу)...

Автор: volvo 6.06.2007 19:47

Например, тут: http://forum.pascal.net.ru/index.php?s=&showtopic=5311&view=findpost&p=41693

Автор: Michael_Rybak 6.06.2007 20:17

Первая - примитивный парсер. Гугли обратную польскую запись.

Автор: klem4 6.06.2007 21:54

Цитата
унарный «минус» допускается


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

-3*-12

А такое ?

--3*---12 ?

или

4--3

Автор: Аристократ 7.06.2007 16:46

Volvo, я ознакомился с текстом проги, на который указывает данная тобой ссылка. Там задача, обратная, моей третьей проги.
Но честно говоря я не знаю как её устроить с точности до наоборот для выполнения моей задачи.

Автор: volvo 7.06.2007 17:07

А, ну да... Тебе же наоборот надо, число прописью... К сожалению на форуме есть только решение на С ( если хочешь перевести - вот тут: http://forum.pascal.net.ru/index.php?s=&showtopic=1338&view=findpost&p=11491 ), но в интернете есть и для Дельфи, например, здесь: http://www.books.ru/library/delphi_secrets/11.htm (в http://forum.pascal.net.ru/index.php?showtopic=6361 есть еще несколько вариантов)

Автор: Аристократ 7.06.2007 17:14

Цитата(volvo @ 7.06.2007 13:07) *

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

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

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




Прикрепленные файлы
Прикрепленный файл  5.6.PAS ( 5.16 килобайт ) Кол-во скачиваний: 244

Автор: мисс_граффити 7.06.2007 17:23

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

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

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

Надоело каждому говорить: ну почитай правила, пожааалуйста. Ну переменуй темку.
Не способны прочитать две строки вверху страницы - это не мои проблемы.

Автор: Аристократ 7.06.2007 17:49

я не вижу надписи- редактировать сообщение( в первом посте)

Автор: Аристократ 8.06.2007 12:52

отредактируйте пожалуйста сами тему, ну не получается редактировать первое сообщение

Автор: Аристократ 8.06.2007 23:52

спасибо, есть какие-нибудь предложения?

Автор: volvo 9.06.2007 0:05

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

Автор: klem4 9.06.2007 11:32

Цитата
спасибо, есть какие-нибудь предложения?



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

Автор: Аристократ 9.06.2007 18: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;
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®;
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 9.06.2007 19: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 23:11

спасибо. volvo, все хорошо работает , а по второй задаче есть что-нибудь?