Парсер. Pascal

Ответить
brouken
Сообщения: 23
Зарегистрирован: 18 май 2008, 13:14

В строке заданы через двоеточие 2 оператора присваивания общего вида: "первый:=число1+число2:второй:=число3-число4" (например:"A:=3+4:B:=7-2"). Вычислить значения переменых и распечатать их.

Вот решение задачи примерно такова типа только для знаков +,-,*,/ и выражения вида "первый:=число1 знак число2"

Код: Выделить всё

program expression;
var s:string[50];ss:string[4];si:Char;a1,a2,is,i,p1,p2:integer;res:real;
begin
  writeln('‚ўҐ¤ЁвҐ бва®Єг б ўла ¦Ґ*ЁҐ¬.');
  readln(S);
  ss:='+-*/';si:=' ';
  for i:=1 to 4 do
  if pos(ss[i],s)>0then
   begin is:=pos(ss[i],s);
   si:=ss[i]
   end;
  if si=''then
   writeln('ЌҐЇа ўЁ«м*®Ґ ўла ¦Ґ*ЁҐ!')
  else
   begin
    val(copy(s,1,is-1),a1,p1);
    val(copy(s,is+1,length(s)-is),a2,p2);
    if (p1<>0) or (p2<>0) then
     writeln('ЌҐЇа ўЁ«м*®Ґ ўла ¦Ґ*ЁҐ!')
    else
     begin
      case si of
       '+': res:=a1+a2;
       '-': res:=a1-a2;
       '*': res:=a1*a2;
       '/': res:=a1 div a2
      end;
     writeln(s,'=',res)
    end
   end
  end.

Помогите пожалуйсто, как опираясь на решение этой задачи решить мою задачу?
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

А в чем проблема, если у вас строки разделены двоеточием? Найти это двоеточие функцией pos труда не составит. Все, что до него - одна строка (обрабатывается вашей функцией), после нее - вторая (аналогично)
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
brouken
Сообщения: 23
Зарегистрирован: 18 май 2008, 13:14

Вот решение:

Код: Выделить всё

program lab6zad3;
uses crt;
 var s,s1:string;
i,k,rez:integer;
procedure rezult(a:string;var rz:integer);
var ss:string[2];
si:char;
is,a1,a2,p1,p2,res:integer;
begin
ss:='+-';
for i:=1 to 2 do
if pos(ss[i],a)>0 then
begin
is:=pos(ss[i],a);
si:=ss[i];
end;
if si='' then writeln('error') else
begin
val(copy(a,4,is-4),a1,p1);
val(copy(a,is+1,length(s)-is),a2,p2);
if (p1<>0) or (p2<>0) then
writeln('error')
else
begin
case si of
'+':rz:=a1+a2;
'-':rz:=a1-a2;
end;
end;
end;
end;
begin
clrscr;
writeln('vvedite viragenie'); {a:=12+32:b:=43-12}
readln(s);
for i:=1 to length(s)do
if (s[i]=':')and(s[i+1]<>'=')then
begin
s1:=copy(s,1,i-1);
delete(s,1,i);
end;
writeln('rezultat:');
rezult(s1,rez);
writeln(s1[1]+'=',rez);
rezult(s,rez);
writeln;
writeln(s[1]+'=',rez);
readln;
end.
Решение верное, но необходимо записать его без процедур и функций. Помогите плиз.
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

brouken писал(а):Решение верное, но необходимо записать его без процедур и функций. Помогите плиз.

Принесите своему преподу ящик проводов, резисторов и конденсаторов и попросите его собрать из этого комп. Задача по смыслу ровно такая же.
Что значит "без процедур и функций"? writeln, readln и val тоже прикажете не использовать?

Заставлять учеников при программировании использовать процедуры и функции там, где они не нужны - это верх глупости. А запрещать их использовать там, где они нужны - это просто преступление!
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
brouken
Сообщения: 23
Зарегистрирован: 18 май 2008, 13:14

Мы просто ещё не проходили процедуры и функции, она говорит нивкакую нехочет проверять такое решение, и её даже неволнует что оно правильное
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Это самый идиотский подход к преподаванию программирования.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Ответить