Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2009, 13:34   #1
Batonchik
Пользователь
 
Регистрация: 17.01.2009
Сообщений: 10
По умолчанию Программа в паскале

Помогите, пожалуйста, написать программу в Паскале
Требуется:
Написать программу, преобразующую словесное описание арифмитического действия в словесное описание его результата с учетом возможности выполнения одного из четырех арифмитических действий.
Входной файл:
in.txt
Входные данные:
Число N (N<10), а затем N строк, представляющих собой фразы, являющиеся арифмитическими выражениями (например, тридцать два плюс сорок). Для обозначения действия используются слова: плюс, минус, умножить на, разделить на. Операнды - целые, положительные числа, меньшие 1000.
Выходной файл:
out.txt
Выходные данные:
N строк, являющихся результатами расчета выражений записанных в виде числительных на русском языке.
Batonchik вне форума Ответить с цитированием
Старый 17.01.2009, 22:45   #2
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Я чего-то не знаю — или в Паскале появился русский язык?!
В операторах, очевидно, не хватает слов "равно" и "приблизительно".

Последний раз редактировалось Sasha_Smirnov; 17.01.2009 в 22:51.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 17.01.2009, 22:48   #3
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

ну если вы о раскладке - то есть русский язык
capta1n вне форума Ответить с цитированием
Старый 17.01.2009, 23:27   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Sasha_Smirnov, если я правильно понял, то речь идёт о том, чтобы преобразовать строку в арифметическое выражение, вычислить, и результат (число) выдать прописью... в принципе, это несложно...
и, как минимум, оригинально - я, например, впервые встречаю подобную задачу...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.01.2009, 07:52   #5
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Задача довольно интересная. Не зря до утра посидел )
Итак, собственно, ниже код.

- все строки должны быть в нижнем регистре
- все числа положительные (нельзя написать "минус один минус три")
- слова разделяются одним пробелом
- деление присутствует, но оно целочисленное! (5 / 2 = 2)
- Проверка деления на 0 не производится!!! (скорее всего, прога вылетит)
Еще можно много чего написать.. Все это, в принципе, не очень сложно исправить (скорее, доделать). Но я и так уже ночь просидел.. Спать охота )


Код:
{ 18.01.2009 Sazary }
uses crt;

const
s1 = 'один';
s2 = 'два';
s2dop = 'две';
s3 = 'три';
s4 = 'четыре';
s5 = 'пять';
s6 = 'шесть';
s7 = 'семь';
s8 = 'восемь';
s9 = 'девять';
s10 = 'десять';
s11 = 'одинадцать';
s12 = 'двенадцать';
s13 = 'тринадцать';
s14 = 'четырнадцать';
s15 = 'пятнадцать';
s16 = 'шестнадцать';
s17 = 'семнадцать';
s18 = 'восемнадцать';
s19 = 'девятнадцать';
s20 = 'двадцать';
s30 = 'тридцать';
s40 = 'сорок';
s50 = 'пятьдесят';
s60 = 'шестьдесят';
s70 = 'семьдесят';
s80 = 'восемьдесят';
s90 = 'девяносто';
s100 = 'сто';
s200 = 'двести';
s300 = 'триста';
s400 = 'четыреста';
s500 = 'пятьсот';
s600 = 'шестьсот';
s700 = 'семьсот';
s800 = 'восемьсот';
s900 = 'девятьсот';
s1000 = 'тысяча';
s2t4t = 'тысячи';
s5t9t = 'тысяч';
plus = 'плюс';
minus = 'минус';
umnozhit = 'умножить на';
delit = 'разделить на';
znakminus = 'минус';

{----------------------}
{ - consts for TEST -- }
{s1 = 'odin';
s2 = 'dva';
s2dop = 'dve';
s3 = 'tri';
s4 = 'chetyre';
s5 = 'pyat';
s6 = 'shest';
s7 = 'sem';
s8 = 'vosem';
s9 = 'devyat';
s10 = 'desyat';
s11 = 'odinadcat';
s12 = 'dvenadcat';
s13 = 'trinadcat';
s14 = 'chetyrnadcat';
s15 = 'pyatnadcat';
s16 = 'shestnadcat';
s17 = 'semnadcat';
s18 = 'vosemnadcat';
s19 = 'devyatnadcat';
s20 = 'dvadcat';
s30 = 'tridcat';
s40 = 'sorok';
s50 = 'pyatdesyat';
s60 = 'shestdesyat';
s70 = 'semdesyat';
s80 = 'vosemdesyat';
s90 = 'devyanosto';
s100 = 'sto';
s200 = 'dvesti';
s300 = 'trista';
s400 = 'chetyresta';
s500 = 'pyatsot';
s600 = 'shestsot';
s700 = 'semsot';
s800 = 'vosemsot';
s900 = 'devyatsot';
s1000 = 'tysyacha';
s2t4t = 'tysyachi';
s5t9t = 'tysyach';
plus = 'plus';
minus = 'minus';
umnozhit = 'umnozhit na';
delit = 'razdelit na';
znakminus = 'minus';
}
 {--end consts for TEST }

teststrtest = 'двести двадцать два умножить на двести двадцать два';
{----------------------}
var
i : integer;
soty : array[0..9] of string;
desya : array[2..9] of string;
cat : array[0..9] of string;
ed : array[0..9] of string;
deistv : array[1..4] of string;
N : integer;
masstr : array[1..9] of string;
fil : text;
str : string;
curnum : longint;

{ -- for TEST ---}
{  teststr : string;
   testlong : longint;      }
{-- end for TEST--}
{-------------------------}

procedure strinit;
 begin
 soty[0] := '';
soty[1] := s100;
soty[2] := s200;
soty[3] := s300;
soty[4] := s400;
soty[5] := s500;
soty[6] := s600;
soty[7] := s700;
soty[8] := s800;
soty[9] := s900;
desya[2] := s20;
desya[3] := s30;
desya[4] := s40;
desya[5] := s50;
desya[6] := s60;
desya[7] := s70;
desya[8] := s80;
desya[9] := s90;
cat[0] := s10;
cat[1] := s11;
cat[2] := s12;
cat[3] := s13;
cat[4] := s14;
cat[5] := s15;
cat[6] := s16;
cat[7] := s17;
cat[8] := s18;
cat[9] := s19;
ed[0] := '';
ed[1] := s1;
ed[2] := s2;
ed[3] := s3;
ed[4] := s4;
ed[5] := s5;
ed[6] := s6;
ed[7] := s7;
ed[8] := s8;
ed[9] := s9;
deistv[1] := plus;
deistv[2] := minus;
deistv[3] := umnozhit;
deistv[4] := delit;
 end;
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 18.01.2009, 07:53   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

продолжение:

Код:
{--------------- vyvod ---}
function ArsIntToStr(chislo : longint) : string;
 var ndig,vi : integer;
 m : array[1..6] of byte;
 fl : boolean;
 vres : string;
 begin
 fl := false;
 ndig := 0;
 if chislo >=0 then vres := ''
 else vres := znakminus + ' ';
{ vres := '';   }
 chislo := abs(chislo);
 while chislo <> 0 do
  begin
  inc(ndig);
  m[ndig] := chislo mod 10;
  chislo := chislo div 10;
  end;
{----}
for vi:=ndig downto 1 do
 begin
 case vi of
 6 : vres := vres + soty[m[vi]] + ' ';

 5 : begin
      if m[vi]>=2 then vres := vres + desya[m[vi]] + ' '
      else if m[vi]=0 then vres := vres + ''
      else
       begin
       fl := true;
       vres := vres + cat[m[vi-1]] + ' ';
       end;
     end;
 4 : begin
     if m[vi] = 0 then vres := vres + s5t9t + ' '
     else if m[vi] = 1 then vres := vres + s1000 + ' '
     else if m[vi] = 2 then vres := vres + s2dop + ' ' + s2t4t + ' '
     else if (m[vi]>=3) and (m[vi]<=4) then vres := vres + ed[m[vi]] + ' ' + s2t4t + ' '
     else vres := vres +  ed[m[vi]] + ' ' + s5t9t + ' ';
     end;

 3 : vres := vres + soty[m[vi]] + ' ';

 2 : begin
      if m[vi]>=2 then vres := vres + desya[m[vi]] + ' '
      else if m[vi]=0 then vres := vres + ''
      else
       begin
       fl := true;
       vres := vres + cat[m[vi-1]] + ' ';
       end;
     end;
 1 : if not fl then vres := vres + ed[m[vi]]
 end;
 {--}
 end;
ArsIntToStr := vres;
 end;

{-------------------------}

function ArsStrToInt(astr : string) : longint;
  var len : integer;
  ai,ak,aj : integer;
  afl : boolean;
  ares : longint;
  amas : array[1..4] of string;
  begin
  ares := 0;
  len := length(astr);
  ak := 1;
  ai := 1;
  while ai<=len do
   begin
   aj:=1;
   amas[ak] := '';
   while (astr[ai]<>' ') and (ai<=len) do
     begin
     amas[ak] := amas[ak] + astr[ai];
     inc(ai);
     inc(aj);
     end;
   inc(ai);
   inc(ak);
   end;
 {-------}
  for ai:=ak-1 downto 1 do
    begin
    afl := false;
    for aj:=1 to 9 do
     if amas[ai] = ed[aj] then
        begin
        ares := ares + aj;
        afl := true;
        break;
        end;
    if afl then continue;
    for aj:=0 to 9 do
     if amas[ai] = cat[aj] then
        begin
        ares := ares + 10+aj;
        afl := true;
        break;
        end;
    if afl then continue;
    for aj:=2 to 9 do
     if amas[ai] = desya[aj] then
        begin
        ares := ares + aj*10;
        afl := true;
        break;
        end;
    if afl then continue;
    for aj:=1 to 9 do
     if amas[ai] = soty[aj] then
        begin
        ares := ares + aj*100;
        afl := true;
        break;
        end;
    if afl then continue;
    if amas[ai] = s1000 then
      ares := ares + 1000;
    end;
  ArsStrToInt := ares;
  end;


{-------------------------}

function deistvie(dstr : string) : longint;
 var res : longint;
 nd : byte;
 kk,di : integer;
 sl1,sl2 : longint;
 begin
 nd := 1;
 { smotrim kakoe deistvie }
 for di:=1 to 4 do
   begin
   kk := pos(deistv[di],dstr);
   if kk <> 0 then
     begin
     nd := di;
     break;
     end;
   end;
{---------------}

  sl1 := ArsStrToInt(copy(dstr,1,kk-2));
  sl2 := ArsStrToInt(copy(dstr,kk+length(deistv[nd]),length(dstr)));
  case (nd) of
  1 : res := sl1 + sl2;
  2 : res := sl1 - sl2;
  3 : res := sl1 * sl2;
  4 : res := trunc(sl1/sl2);
  end;
 { writeln('sl1= ',sl1);
  writeln('sl2= ',sl2);
  writeln('res= ',res);   }
  deistvie := res;
 end;

{--------------------------}

begin
clrscr;

assign(fil,'in.txt');
{$I-}
reset(fil);
{$I+}
if IOResult <> 0 then
               begin
               writeln('File not open!');
               exit;
               end;
strinit;
readln(fil,N);
for i:=1 to N do
 readln(fil,masstr[i]);
close(fil);
assign(fil,'out.txt');
rewrite(fil);
for i:=1 to N do
 begin
{ writeln(masstr[i]);      }
 curnum := deistvie(masstr[i]);
 str := ArsIntToStr(curnum);
 writeln(fil,str);
 flush(fil);
 end;
close(fil);


{  ---- TEST     }
{strinit;
readln(teststr);
testlong := deistvie(teststr);
writeln(testlong);
teststr := ArsIntToStr(testlong);
writeln(teststr);    }

 {------- END TEST ----}

end.
Файл in.txt:
Код:
6
двадцать минус сорок два
девяносто умножить на тридцать
сто пятьдесят один плюс девятьсот тридцать девять
тридцать три разделить на одинадцать
три умножить на девять
сто плюс пять
Файл out.txt (после запуска программы):
Код:
минус двадцать два
две тысячи семьсот 
тысяча  девяносто 
три
двадцать семь
сто пять
------------
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 18.01.2009, 07:55   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Да..и еще:
все, что закомменчено, можно удалить.. Это для тестов..
+ варианты констант для транслита )

ps Еще бы название темы было нормальное, совсем было бы хорошо ) А то так и через поиск найти будет сложно..
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 18.01.2009, 13:10   #8
Batonchik
Пользователь
 
Регистрация: 17.01.2009
Сообщений: 10
По умолчанию

Огромное спасибо, Sazary!
Batonchik вне форума Ответить с цитированием
Старый 18.01.2009, 13:33   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Sazary, снимаю шляпу в глубочайшем почтении! Сильно!

p.s. пытался Вам отзыв добавить, но движок форума не даёт :-(
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.01.2009, 15:07   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Batonchik Пожалуйста )

Serge_Bliznykov, спасибо, что оценили )
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа в паскале Krjak Помощь студентам 2 15.10.2008 21:56
интересная программа на паскале kaka Общие вопросы Delphi 7 28.05.2008 22:23
программа в Паскале vitekbest Помощь студентам 4 17.12.2007 08:33
Программа по матрицам в паскале. drakon803 Помощь студентам 1 12.12.2007 20:11